From 85278ca36f6f13bf8ac8d80a534ba013738619ce Mon Sep 17 00:00:00 2001 From: gong01 Date: Fri, 6 Mar 2026 02:52:51 +0800 Subject: [PATCH] initial commit --- .classpath | 54 + .factorypath | 169 + .gitignore | 5 + .mvn/wrapper/MavenWrapperDownloader.java | 117 + .mvn/wrapper/maven-wrapper.jar | Bin 0 -> 50710 bytes .mvn/wrapper/maven-wrapper.properties | 2 + .project | 39 + .settings/org.eclipse.core.resources.prefs | 4 + .settings/org.eclipse.jdt.apt.core.prefs | 4 + .settings/org.eclipse.jdt.core.prefs | 14 + .settings/org.eclipse.m2e.core.prefs | 4 + .settings/org.sonarlint.eclipse.core.prefs | 6 + .../org.springframework.ide.eclipse.prefs | 2 + .sonarlint/connectedMode.json | 4 + deploy-aws.sh | 83 + deploy-aws2.sh | 96 + filePath_IS_UNDEFINED/app.2024-07-03.0.gz | Bin 0 -> 3266 bytes filePath_IS_UNDEFINED/app.2024-07-08.0.gz | Bin 0 -> 84239 bytes filePath_IS_UNDEFINED/app.log | 2475 +++++++++ filePath_IS_UNDEFINED/error-2024-06-24.0.gz | Bin 0 -> 14665 bytes filePath_IS_UNDEFINED/error-2024-06-25.0.gz | Bin 0 -> 26868 bytes filePath_IS_UNDEFINED/error-2024-06-26.0.gz | Bin 0 -> 3932 bytes filePath_IS_UNDEFINED/error-2024-06-27.0.gz | Bin 0 -> 116957 bytes filePath_IS_UNDEFINED/error-2024-06-28.0.gz | Bin 0 -> 4824 bytes filePath_IS_UNDEFINED/error-2024-07-08.0.gz | Bin 0 -> 3622 bytes filePath_IS_UNDEFINED/error.log | 2302 ++++++++ jenkinsfile | 90 + jenkinsfile2 | 90 + mvnw | 310 ++ mvnw.cmd | 182 + pom.xml | 284 + runApi.sh | 108 + .../java/com/bb/ApiServerApplication.java | 20 + .../controller/AdminApiBetController.java | 806 +++ .../controller/AdminApiBoardController.java | 919 ++++ .../controller/AdminApiCashController.java | 1158 ++++ .../admin/controller/AdminApiController.java | 1384 +++++ .../controller/AdminApiMemberController.java | 2854 ++++++++++ .../AdminApiMiniGameController.java | 232 + .../controller/AdminApiPartnerController.java | 855 +++ .../controller/AdminApiPointController.java | 496 ++ .../controller/AdminApiReportController.java | 622 +++ .../controller/AdminApiRetailController.java | 1790 ++++++ .../controller/AdminApiSettingController.java | 1848 +++++++ .../controller/AdminSuperController.java | 527 ++ .../controller/SuperApiCompController.java | 996 ++++ .../controller/SuperApiController.java | 583 ++ .../controller/SuperApiSettingController.java | 178 + .../controller/SuperApiUserController.java | 603 +++ .../controller/SuperApiVendorController.java | 208 + .../controller/CommonApiController.java | 348 ++ src/main/java/com/bb/config/ApiKeyFilter.java | 38 + src/main/java/com/bb/config/AsyncConfig.java | 44 + .../com/bb/config/AuthFailureHandler.java | 35 + src/main/java/com/bb/config/AuthProvider.java | 81 + .../com/bb/config/AuthSuccessHandler.java | 106 + src/main/java/com/bb/config/CorsConfig.java | 23 + src/main/java/com/bb/config/DbConfig.java | 166 + .../com/bb/config/HttpEncryptionFilter.java | 35 + .../java/com/bb/config/HttpInterceptor.java | 35 + .../java/com/bb/config/InterceptorConfig.java | 17 + .../java/com/bb/config/OpenapiConfig.java | 55 + .../com/bb/config/RequestDecryptWrapper.java | 86 + .../com/bb/config/ResponseEncryptWrapper.java | 54 + .../com/bb/config/RestTemplateConfig.java | 46 + .../java/com/bb/config/SecurityConfig.java | 116 + .../java/com/bb/config/WebClientConfig.java | 189 + .../java/com/bb/config/WebSocketConfig.java | 29 + .../com/bb/config/WebSocketInterceptor.java | 32 + .../controller/CallbackPassimController.java | 35 + .../CallbackRvHoldemController.java | 443 ++ .../controller/CallbackTripleController.java | 997 ++++ .../com/bb/controller/CashCronController.java | 127 + .../bb/controller/PointCronController.java | 331 ++ .../com/bb/controller/SocketController.java | 176 + .../com/bb/controller/TripleController.java | 686 +++ src/main/java/com/bb/dao/BetDao.java | 260 + src/main/java/com/bb/dao/BetDaoImpl.java | 747 +++ src/main/java/com/bb/dao/BoardDao.java | 87 + src/main/java/com/bb/dao/BoardDaoImpl.java | 242 + src/main/java/com/bb/dao/CashDao.java | 97 + src/main/java/com/bb/dao/CashDaoImpl.java | 533 ++ src/main/java/com/bb/dao/CommonDao.java | 275 + src/main/java/com/bb/dao/CommonDaoImpl.java | 758 +++ src/main/java/com/bb/dao/CompDao.java | 126 + src/main/java/com/bb/dao/CompDaoImpl.java | 363 ++ src/main/java/com/bb/dao/MainDao.java | 18 + src/main/java/com/bb/dao/MainDaoImpl.java | 51 + src/main/java/com/bb/dao/MinigameDao.java | 22 + src/main/java/com/bb/dao/MinigameDaoImpl.java | 52 + src/main/java/com/bb/dao/PassimDao.java | 5 + src/main/java/com/bb/dao/PassimDaoImpl.java | 22 + src/main/java/com/bb/dao/PointDao.java | 25 + src/main/java/com/bb/dao/PointDaoImpl.java | 70 + src/main/java/com/bb/dao/RateDao.java | 22 + src/main/java/com/bb/dao/RateDaoImpl.java | 61 + src/main/java/com/bb/dao/ReportDao.java | 71 + src/main/java/com/bb/dao/ReportDaoImpl.java | 234 + src/main/java/com/bb/dao/RetailDao.java | 172 + src/main/java/com/bb/dao/RetailDaoImpl.java | 474 ++ src/main/java/com/bb/dao/SuperDao.java | 18 + src/main/java/com/bb/dao/SuperDaoImpl.java | 38 + src/main/java/com/bb/dao/UserDao.java | 217 + src/main/java/com/bb/dao/UserDaoImpl.java | 1226 +++++ src/main/java/com/bb/dao/VendorDao.java | 20 + src/main/java/com/bb/dao/VendorDaoImpl.java | 63 + .../java/com/bb/exception/ApiException.java | 37 + .../com/bb/exception/NoDataApiException.java | 9 + .../RequestArraySizeApiException.java | 10 + .../exception/RequestHeaderApiException.java | 9 + .../RequestParameterApiException.java | 8 + .../java/com/bb/front/ApiBetController.java | 404 ++ .../java/com/bb/front/ApiBoardController.java | 457 ++ .../java/com/bb/front/ApiCashController.java | 1313 +++++ .../java/com/bb/front/ApiEtcController.java | 232 + .../java/com/bb/front/ApiFrontController.java | 413 ++ .../com/bb/front/ApiMemberController.java | 1149 ++++ .../com/bb/front/ApiMinigameController.java | 850 +++ .../com/bb/front/ApiPassimController.java | 79 + .../com/bb/front/ApiRetailController.java | 2322 ++++++++ .../java/com/bb/front/TestController.java | 170 + .../com/bb/front/v2/ApiV2MainController.java | 389 ++ .../bb/front/v2/ApiV2RetailController.java | 2521 +++++++++ .../com/bb/front/v2/ApiV2UserController.java | 482 ++ src/main/java/com/bb/jwt/JwtClame.java | 14 + src/main/java/com/bb/jwt/JwtConfig.java | 25 + src/main/java/com/bb/jwt/JwtManager.java | 166 + src/main/java/com/bb/model/Admin.java | 17 + .../java/com/bb/model/AdminBetSearch.java | 20 + .../java/com/bb/model/AdminCashSearch.java | 17 + src/main/java/com/bb/model/AdminIp.java | 12 + .../java/com/bb/model/AdminLogSearch.java | 14 + src/main/java/com/bb/model/AdminSearch.java | 22 + .../java/com/bb/model/AdminTokenInfo.java | 10 + src/main/java/com/bb/model/AnswerVo.java | 15 + src/main/java/com/bb/model/ApiResponse.java | 104 + .../java/com/bb/model/ApiVendorCompInfo.java | 20 + src/main/java/com/bb/model/As.java | 20 + src/main/java/com/bb/model/Bank.java | 18 + src/main/java/com/bb/model/Banner.java | 20 + src/main/java/com/bb/model/BetAutoLoseVO.java | 13 + .../java/com/bb/model/BetBiPushDetailVO.java | 14 + src/main/java/com/bb/model/BetData.java | 39 + src/main/java/com/bb/model/BetDetail.java | 34 + src/main/java/com/bb/model/BetSearch.java | 26 + .../java/com/bb/model/BetSplusSearch.java | 22 + .../java/com/bb/model/BiSubPointRateVo.java | 14 + src/main/java/com/bb/model/BlankSpinRate.java | 19 + src/main/java/com/bb/model/Block.java | 16 + src/main/java/com/bb/model/BlockSearch.java | 17 + src/main/java/com/bb/model/Board.java | 40 + .../java/com/bb/model/BoardListSearch.java | 21 + src/main/java/com/bb/model/BotMemRate.java | 13 + src/main/java/com/bb/model/BotMemRateVo.java | 51 + src/main/java/com/bb/model/Cash.java | 33 + src/main/java/com/bb/model/CashDetail.java | 33 + src/main/java/com/bb/model/CashIn.java | 21 + src/main/java/com/bb/model/CashOut.java | 23 + src/main/java/com/bb/model/CashQueVO.java | 19 + src/main/java/com/bb/model/CashSearch.java | 34 + src/main/java/com/bb/model/CashStatus.java | 17 + .../java/com/bb/model/CashTranLogSrch.java | 17 + src/main/java/com/bb/model/CategoryRate.java | 13 + .../java/com/bb/model/CategoryRateVo.java | 18 + .../com/bb/model/ChargingPointSettingVO.java | 24 + src/main/java/com/bb/model/Code.java | 16 + src/main/java/com/bb/model/CodeSearch.java | 26 + src/main/java/com/bb/model/Comment.java | 25 + src/main/java/com/bb/model/CompDetail.java | 20 + src/main/java/com/bb/model/CompResetInfo.java | 13 + src/main/java/com/bb/model/CompSearch.java | 10 + src/main/java/com/bb/model/CouponSearch.java | 17 + src/main/java/com/bb/model/CouponVO.java | 21 + .../java/com/bb/model/CreditReportSearch.java | 11 + .../java/com/bb/model/CronServerInfo.java | 16 + .../java/com/bb/model/DailyReportSearch.java | 18 + src/main/java/com/bb/model/DashInfo.java | 19 + .../java/com/bb/model/DayilPartnerReport.java | 43 + .../com/bb/model/DayilPeriodicReports.java | 75 + .../java/com/bb/model/DomainPartnerVO.java | 13 + src/main/java/com/bb/model/Etc.java | 12 + src/main/java/com/bb/model/FrontSearch.java | 9 + .../java/com/bb/model/GameCodeSearchVO.java | 11 + src/main/java/com/bb/model/GameCodeVO.java | 26 + src/main/java/com/bb/model/GameDetails.java | 20 + src/main/java/com/bb/model/GameSetting.java | 14 + .../java/com/bb/model/GameSettingInfo.java | 18 + .../java/com/bb/model/GameSettingItem.java | 17 + src/main/java/com/bb/model/GameUseInfo.java | 13 + src/main/java/com/bb/model/GraphInfo.java | 16 + src/main/java/com/bb/model/IdListSearch.java | 11 + .../java/com/bb/model/InChatMessageVO.java | 39 + src/main/java/com/bb/model/Inspect.java | 17 + src/main/java/com/bb/model/InspectSearch.java | 17 + src/main/java/com/bb/model/LevelBank.java | 13 + src/main/java/com/bb/model/LevelBetLimit.java | 16 + src/main/java/com/bb/model/LevelDomain.java | 12 + .../java/com/bb/model/LevelFailPoint.java | 13 + src/main/java/com/bb/model/LevelOutPwd.java | 11 + src/main/java/com/bb/model/LoginUserVO.java | 35 + .../java/com/bb/model/MemListSearchVO.java | 27 + src/main/java/com/bb/model/Member.java | 88 + .../java/com/bb/model/MemberBetLimit.java | 17 + .../java/com/bb/model/MemberBurderRate.java | 18 + src/main/java/com/bb/model/MemberCheckVo.java | 13 + .../com/bb/model/MemberCommissionRate.java | 17 + src/main/java/com/bb/model/MemberDetail.java | 27 + .../com/bb/model/MemberDividendRateType.java | 19 + .../java/com/bb/model/MemberHierarchyVo.java | 11 + src/main/java/com/bb/model/MemberInsert.java | 66 + src/main/java/com/bb/model/MemberInsert2.java | 49 + .../java/com/bb/model/MemberListSearch.java | 39 + src/main/java/com/bb/model/MemberRate.java | 22 + src/main/java/com/bb/model/MemberRateVo.java | 15 + src/main/java/com/bb/model/MemberSearch.java | 16 + src/main/java/com/bb/model/MemberStatus.java | 22 + .../java/com/bb/model/MemberTokenInfo.java | 10 + src/main/java/com/bb/model/MemberUpdate.java | 58 + src/main/java/com/bb/model/MenuVO.java | 18 + src/main/java/com/bb/model/Message.java | 30 + .../java/com/bb/model/MessageListSearch.java | 17 + .../java/com/bb/model/MiniGameSearch.java | 12 + .../java/com/bb/model/MinigameBetRate.java | 19 + src/main/java/com/bb/model/MinigameSet.java | 12 + src/main/java/com/bb/model/Month10Info.java | 18 + src/main/java/com/bb/model/MultipleRate.java | 17 + .../java/com/bb/model/MultipleRateInfo.java | 14 + .../java/com/bb/model/MultipleRateSearch.java | 14 + src/main/java/com/bb/model/NewMemRate.java | 12 + .../java/com/bb/model/NewMemRateItem.java | 35 + src/main/java/com/bb/model/NotiBgmVo.java | 14 + src/main/java/com/bb/model/OTPInfo.java | 17 + src/main/java/com/bb/model/Options.java | 9 + .../java/com/bb/model/OutChatMessageVO.java | 87 + src/main/java/com/bb/model/PageFormVO.java | 88 + .../java/com/bb/model/PartnerCompInfo.java | 35 + src/main/java/com/bb/model/PartnerListVO.java | 28 + src/main/java/com/bb/model/PassimAddrReq.java | 14 + src/main/java/com/bb/model/PassimAddrRes.java | 9 + src/main/java/com/bb/model/PassimVo.java | 32 + src/main/java/com/bb/model/Point.java | 21 + src/main/java/com/bb/model/PointInOut.java | 29 + src/main/java/com/bb/model/PointSearch.java | 25 + .../java/com/bb/model/PointSearchAdm.java | 24 + src/main/java/com/bb/model/RateInfo.java | 13 + src/main/java/com/bb/model/RateMemList.java | 12 + src/main/java/com/bb/model/RateVO.java | 14 + src/main/java/com/bb/model/ReportSearch.java | 25 + .../java/com/bb/model/RetailBetSearch.java | 24 + .../java/com/bb/model/RetailCashSearch.java | 18 + .../java/com/bb/model/RetailListSearch.java | 19 + src/main/java/com/bb/model/RetailLockVO.java | 14 + .../java/com/bb/model/RetailLowerSearch.java | 14 + .../java/com/bb/model/RetailPointSearch.java | 17 + src/main/java/com/bb/model/RetailSearch.java | 27 + src/main/java/com/bb/model/RetailSet.java | 13 + .../java/com/bb/model/RvHoldemResponse.java | 13 + src/main/java/com/bb/model/RvHoldemVO.java | 104 + src/main/java/com/bb/model/ScoinVO.java | 29 + src/main/java/com/bb/model/Site.java | 27 + .../com/bb/model/SiteCashBonusSettingVO.java | 18 + src/main/java/com/bb/model/SiteCheckReq.java | 21 + src/main/java/com/bb/model/SiteOption.java | 77 + src/main/java/com/bb/model/SiteSearch.java | 12 + src/main/java/com/bb/model/SlotGame.java | 15 + src/main/java/com/bb/model/SlotGameName.java | 10 + src/main/java/com/bb/model/SocialLoginVO.java | 37 + src/main/java/com/bb/model/TOtpVO.java | 15 + src/main/java/com/bb/model/TestDto.java | 14 + src/main/java/com/bb/model/Top15Info.java | 10 + .../java/com/bb/model/TreeListSearch.java | 13 + .../java/com/bb/model/TripleAuthInfo.java | 21 + src/main/java/com/bb/model/TripleDVO.java | 49 + .../java/com/bb/model/TripleDetailVO.java | 15 + .../java/com/bb/model/TripleGameRate.java | 13 + .../java/com/bb/model/TriplePurchaseId.java | 10 + .../java/com/bb/model/TripleResponse.java | 14 + src/main/java/com/bb/model/TripleSbVO.java | 19 + src/main/java/com/bb/model/TripleVO.java | 50 + src/main/java/com/bb/model/TrxSearchVO.java | 14 + .../java/com/bb/model/UserDetailInfo.java | 24 + .../java/com/bb/model/UserListSearch.java | 24 + src/main/java/com/bb/model/UserSearch.java | 21 + src/main/java/com/bb/model/VendorGameReq.java | 17 + src/main/java/com/bb/model/VendorReq.java | 18 + .../java/com/bb/service/AsyncBetService.java | 296 + .../com/bb/service/AsyncExcoinOtcService.java | 224 + .../com/bb/service/AsyncTripleDService.java | 1157 ++++ .../com/bb/service/AsyncTripleService.java | 1396 +++++ .../com/bb/service/AsyncWowOtcService.java | 299 + src/main/java/com/bb/service/BetService.java | 78 + .../java/com/bb/service/BetServiceImpl.java | 392 ++ .../java/com/bb/service/BoardService.java | 83 + .../java/com/bb/service/BoardServiceImpl.java | 294 + src/main/java/com/bb/service/CashService.java | 146 + .../java/com/bb/service/CashServiceImpl.java | 656 +++ .../java/com/bb/service/CommonService.java | 241 + .../com/bb/service/CommonServiceImpl.java | 918 ++++ src/main/java/com/bb/service/CompService.java | 115 + .../java/com/bb/service/CompServiceImpl.java | 482 ++ src/main/java/com/bb/service/MainService.java | 17 + .../java/com/bb/service/MainServiceImpl.java | 61 + .../java/com/bb/service/MinigameService.java | 23 + .../com/bb/service/MinigameServiceImpl.java | 49 + .../java/com/bb/service/PassimService.java | 10 + .../com/bb/service/PassimServiceImpl.java | 107 + .../java/com/bb/service/PointService.java | 25 + .../java/com/bb/service/PointServiceImpl.java | 64 + src/main/java/com/bb/service/RateService.java | 24 + .../java/com/bb/service/RateServiceImpl.java | 72 + .../java/com/bb/service/ReportService.java | 51 + .../com/bb/service/ReportServiceImpl.java | 237 + .../java/com/bb/service/RetailService.java | 169 + .../com/bb/service/RetailServiceImpl.java | 910 ++++ .../java/com/bb/service/RvHoldemService.java | 15 + .../com/bb/service/RvHoldemServiceImpl.java | 177 + .../java/com/bb/service/SportDService.java | 12 + .../com/bb/service/SportDServiceImpl.java | 417 ++ .../java/com/bb/service/SportService.java | 15 + .../java/com/bb/service/SportServiceImpl.java | 547 ++ .../java/com/bb/service/SuperService.java | 18 + .../java/com/bb/service/SuperServiceImpl.java | 36 + .../java/com/bb/service/TripleService.java | 33 + .../com/bb/service/TripleServiceImpl.java | 1762 ++++++ src/main/java/com/bb/service/UserService.java | 199 + .../java/com/bb/service/UserServiceImpl.java | 1233 +++++ .../java/com/bb/service/VendorService.java | 18 + .../com/bb/service/VendorServiceImpl.java | 52 + src/main/java/com/bb/util/AESUtil.java | 77 + src/main/java/com/bb/util/DateTimeUtils.java | 280 + src/main/java/com/bb/util/IPKit.java | 134 + src/main/java/com/bb/util/PagingUtil.java | 90 + .../com/bb/util/PassimpaySignatureUtil.java | 38 + src/main/java/com/bb/util/RandomRolling.java | 60 + src/main/java/com/bb/util/StringUtils.java | 338 ++ .../java/com/bb/util/TOTPTokenGenerator.java | 177 + .../java/com/bb/util/UnsafeOkHttpClient.java | 48 + src/main/resources/application-local.yml | 121 + src/main/resources/application-real.yml | 138 + src/main/resources/application.properties | 5 + src/main/resources/authentication.properties | 5 + src/main/resources/db1/BET.xml | 2781 ++++++++++ src/main/resources/db1/BOARD.xml | 697 +++ src/main/resources/db1/CASH.xml | 2538 +++++++++ src/main/resources/db1/CODE.xml | 2882 ++++++++++ src/main/resources/db1/COMP.xml | 1176 ++++ src/main/resources/db1/MAIN.xml | 211 + src/main/resources/db1/MINIGAME.xml | 55 + src/main/resources/db1/PASSIM.xml | 5 + src/main/resources/db1/POINT.xml | 295 + src/main/resources/db1/RATE.xml | 236 + src/main/resources/db1/REPORT.xml | 2251 ++++++++ src/main/resources/db1/RETAIL.xml | 2872 ++++++++++ src/main/resources/db1/SUPER.xml | 61 + src/main/resources/db1/USER.xml | 4795 +++++++++++++++++ src/main/resources/db2/COMP.xml | 128 + src/main/resources/db2/PARSE_DB2.xml | 36 + src/main/resources/db2/VENDOR.xml | 69 + src/main/resources/logback-spring.xml | 49 + src/main/resources/static/html/health.html | 1 + .../resources/static/html/jquery-2.2.4.min.js | 4 + src/main/resources/static/html/socket.html | 40 + src/main/resources/static/html/sockjs.min.js | 4 + src/main/resources/static/html/stomp.min.js | 12 + src/main/resources/templates/api.html | 121 + 365 files changed, 83942 insertions(+) create mode 100644 .classpath create mode 100644 .factorypath create mode 100644 .gitignore create mode 100644 .mvn/wrapper/MavenWrapperDownloader.java create mode 100644 .mvn/wrapper/maven-wrapper.jar create mode 100644 .mvn/wrapper/maven-wrapper.properties create mode 100644 .project create mode 100644 .settings/org.eclipse.core.resources.prefs create mode 100644 .settings/org.eclipse.jdt.apt.core.prefs create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 .settings/org.eclipse.m2e.core.prefs create mode 100644 .settings/org.sonarlint.eclipse.core.prefs create mode 100644 .settings/org.springframework.ide.eclipse.prefs create mode 100644 .sonarlint/connectedMode.json create mode 100644 deploy-aws.sh create mode 100644 deploy-aws2.sh create mode 100644 filePath_IS_UNDEFINED/app.2024-07-03.0.gz create mode 100644 filePath_IS_UNDEFINED/app.2024-07-08.0.gz create mode 100644 filePath_IS_UNDEFINED/app.log create mode 100644 filePath_IS_UNDEFINED/error-2024-06-24.0.gz create mode 100644 filePath_IS_UNDEFINED/error-2024-06-25.0.gz create mode 100644 filePath_IS_UNDEFINED/error-2024-06-26.0.gz create mode 100644 filePath_IS_UNDEFINED/error-2024-06-27.0.gz create mode 100644 filePath_IS_UNDEFINED/error-2024-06-28.0.gz create mode 100644 filePath_IS_UNDEFINED/error-2024-07-08.0.gz create mode 100644 filePath_IS_UNDEFINED/error.log create mode 100644 jenkinsfile create mode 100644 jenkinsfile2 create mode 100644 mvnw create mode 100644 mvnw.cmd create mode 100644 pom.xml create mode 100644 runApi.sh create mode 100644 src/main/java/com/bb/ApiServerApplication.java create mode 100644 src/main/java/com/bb/admin/controller/AdminApiBetController.java create mode 100644 src/main/java/com/bb/admin/controller/AdminApiBoardController.java create mode 100644 src/main/java/com/bb/admin/controller/AdminApiCashController.java create mode 100644 src/main/java/com/bb/admin/controller/AdminApiController.java create mode 100644 src/main/java/com/bb/admin/controller/AdminApiMemberController.java create mode 100644 src/main/java/com/bb/admin/controller/AdminApiMiniGameController.java create mode 100644 src/main/java/com/bb/admin/controller/AdminApiPartnerController.java create mode 100644 src/main/java/com/bb/admin/controller/AdminApiPointController.java create mode 100644 src/main/java/com/bb/admin/controller/AdminApiReportController.java create mode 100644 src/main/java/com/bb/admin/controller/AdminApiRetailController.java create mode 100644 src/main/java/com/bb/admin/controller/AdminApiSettingController.java create mode 100644 src/main/java/com/bb/admin/controller/AdminSuperController.java create mode 100644 src/main/java/com/bb/admintop/controller/SuperApiCompController.java create mode 100644 src/main/java/com/bb/admintop/controller/SuperApiController.java create mode 100644 src/main/java/com/bb/admintop/controller/SuperApiSettingController.java create mode 100644 src/main/java/com/bb/admintop/controller/SuperApiUserController.java create mode 100644 src/main/java/com/bb/admintop/controller/SuperApiVendorController.java create mode 100644 src/main/java/com/bb/common/controller/CommonApiController.java create mode 100644 src/main/java/com/bb/config/ApiKeyFilter.java create mode 100644 src/main/java/com/bb/config/AsyncConfig.java create mode 100644 src/main/java/com/bb/config/AuthFailureHandler.java create mode 100644 src/main/java/com/bb/config/AuthProvider.java create mode 100644 src/main/java/com/bb/config/AuthSuccessHandler.java create mode 100644 src/main/java/com/bb/config/CorsConfig.java create mode 100644 src/main/java/com/bb/config/DbConfig.java create mode 100644 src/main/java/com/bb/config/HttpEncryptionFilter.java create mode 100644 src/main/java/com/bb/config/HttpInterceptor.java create mode 100644 src/main/java/com/bb/config/InterceptorConfig.java create mode 100644 src/main/java/com/bb/config/OpenapiConfig.java create mode 100644 src/main/java/com/bb/config/RequestDecryptWrapper.java create mode 100644 src/main/java/com/bb/config/ResponseEncryptWrapper.java create mode 100644 src/main/java/com/bb/config/RestTemplateConfig.java create mode 100644 src/main/java/com/bb/config/SecurityConfig.java create mode 100644 src/main/java/com/bb/config/WebClientConfig.java create mode 100644 src/main/java/com/bb/config/WebSocketConfig.java create mode 100644 src/main/java/com/bb/config/WebSocketInterceptor.java create mode 100644 src/main/java/com/bb/controller/CallbackPassimController.java create mode 100644 src/main/java/com/bb/controller/CallbackRvHoldemController.java create mode 100644 src/main/java/com/bb/controller/CallbackTripleController.java create mode 100644 src/main/java/com/bb/controller/CashCronController.java create mode 100644 src/main/java/com/bb/controller/PointCronController.java create mode 100644 src/main/java/com/bb/controller/SocketController.java create mode 100644 src/main/java/com/bb/controller/TripleController.java create mode 100644 src/main/java/com/bb/dao/BetDao.java create mode 100644 src/main/java/com/bb/dao/BetDaoImpl.java create mode 100644 src/main/java/com/bb/dao/BoardDao.java create mode 100644 src/main/java/com/bb/dao/BoardDaoImpl.java create mode 100644 src/main/java/com/bb/dao/CashDao.java create mode 100644 src/main/java/com/bb/dao/CashDaoImpl.java create mode 100644 src/main/java/com/bb/dao/CommonDao.java create mode 100644 src/main/java/com/bb/dao/CommonDaoImpl.java create mode 100644 src/main/java/com/bb/dao/CompDao.java create mode 100644 src/main/java/com/bb/dao/CompDaoImpl.java create mode 100644 src/main/java/com/bb/dao/MainDao.java create mode 100644 src/main/java/com/bb/dao/MainDaoImpl.java create mode 100644 src/main/java/com/bb/dao/MinigameDao.java create mode 100644 src/main/java/com/bb/dao/MinigameDaoImpl.java create mode 100644 src/main/java/com/bb/dao/PassimDao.java create mode 100644 src/main/java/com/bb/dao/PassimDaoImpl.java create mode 100644 src/main/java/com/bb/dao/PointDao.java create mode 100644 src/main/java/com/bb/dao/PointDaoImpl.java create mode 100644 src/main/java/com/bb/dao/RateDao.java create mode 100644 src/main/java/com/bb/dao/RateDaoImpl.java create mode 100644 src/main/java/com/bb/dao/ReportDao.java create mode 100644 src/main/java/com/bb/dao/ReportDaoImpl.java create mode 100644 src/main/java/com/bb/dao/RetailDao.java create mode 100644 src/main/java/com/bb/dao/RetailDaoImpl.java create mode 100644 src/main/java/com/bb/dao/SuperDao.java create mode 100644 src/main/java/com/bb/dao/SuperDaoImpl.java create mode 100644 src/main/java/com/bb/dao/UserDao.java create mode 100644 src/main/java/com/bb/dao/UserDaoImpl.java create mode 100644 src/main/java/com/bb/dao/VendorDao.java create mode 100644 src/main/java/com/bb/dao/VendorDaoImpl.java create mode 100644 src/main/java/com/bb/exception/ApiException.java create mode 100644 src/main/java/com/bb/exception/NoDataApiException.java create mode 100644 src/main/java/com/bb/exception/RequestArraySizeApiException.java create mode 100644 src/main/java/com/bb/exception/RequestHeaderApiException.java create mode 100644 src/main/java/com/bb/exception/RequestParameterApiException.java create mode 100644 src/main/java/com/bb/front/ApiBetController.java create mode 100644 src/main/java/com/bb/front/ApiBoardController.java create mode 100644 src/main/java/com/bb/front/ApiCashController.java create mode 100644 src/main/java/com/bb/front/ApiEtcController.java create mode 100644 src/main/java/com/bb/front/ApiFrontController.java create mode 100644 src/main/java/com/bb/front/ApiMemberController.java create mode 100644 src/main/java/com/bb/front/ApiMinigameController.java create mode 100644 src/main/java/com/bb/front/ApiPassimController.java create mode 100644 src/main/java/com/bb/front/ApiRetailController.java create mode 100644 src/main/java/com/bb/front/TestController.java create mode 100644 src/main/java/com/bb/front/v2/ApiV2MainController.java create mode 100644 src/main/java/com/bb/front/v2/ApiV2RetailController.java create mode 100644 src/main/java/com/bb/front/v2/ApiV2UserController.java create mode 100644 src/main/java/com/bb/jwt/JwtClame.java create mode 100644 src/main/java/com/bb/jwt/JwtConfig.java create mode 100644 src/main/java/com/bb/jwt/JwtManager.java create mode 100644 src/main/java/com/bb/model/Admin.java create mode 100644 src/main/java/com/bb/model/AdminBetSearch.java create mode 100644 src/main/java/com/bb/model/AdminCashSearch.java create mode 100644 src/main/java/com/bb/model/AdminIp.java create mode 100644 src/main/java/com/bb/model/AdminLogSearch.java create mode 100644 src/main/java/com/bb/model/AdminSearch.java create mode 100644 src/main/java/com/bb/model/AdminTokenInfo.java create mode 100644 src/main/java/com/bb/model/AnswerVo.java create mode 100644 src/main/java/com/bb/model/ApiResponse.java create mode 100644 src/main/java/com/bb/model/ApiVendorCompInfo.java create mode 100644 src/main/java/com/bb/model/As.java create mode 100644 src/main/java/com/bb/model/Bank.java create mode 100644 src/main/java/com/bb/model/Banner.java create mode 100644 src/main/java/com/bb/model/BetAutoLoseVO.java create mode 100644 src/main/java/com/bb/model/BetBiPushDetailVO.java create mode 100644 src/main/java/com/bb/model/BetData.java create mode 100644 src/main/java/com/bb/model/BetDetail.java create mode 100644 src/main/java/com/bb/model/BetSearch.java create mode 100644 src/main/java/com/bb/model/BetSplusSearch.java create mode 100644 src/main/java/com/bb/model/BiSubPointRateVo.java create mode 100644 src/main/java/com/bb/model/BlankSpinRate.java create mode 100644 src/main/java/com/bb/model/Block.java create mode 100644 src/main/java/com/bb/model/BlockSearch.java create mode 100644 src/main/java/com/bb/model/Board.java create mode 100644 src/main/java/com/bb/model/BoardListSearch.java create mode 100644 src/main/java/com/bb/model/BotMemRate.java create mode 100644 src/main/java/com/bb/model/BotMemRateVo.java create mode 100644 src/main/java/com/bb/model/Cash.java create mode 100644 src/main/java/com/bb/model/CashDetail.java create mode 100644 src/main/java/com/bb/model/CashIn.java create mode 100644 src/main/java/com/bb/model/CashOut.java create mode 100644 src/main/java/com/bb/model/CashQueVO.java create mode 100644 src/main/java/com/bb/model/CashSearch.java create mode 100644 src/main/java/com/bb/model/CashStatus.java create mode 100644 src/main/java/com/bb/model/CashTranLogSrch.java create mode 100644 src/main/java/com/bb/model/CategoryRate.java create mode 100644 src/main/java/com/bb/model/CategoryRateVo.java create mode 100644 src/main/java/com/bb/model/ChargingPointSettingVO.java create mode 100644 src/main/java/com/bb/model/Code.java create mode 100644 src/main/java/com/bb/model/CodeSearch.java create mode 100644 src/main/java/com/bb/model/Comment.java create mode 100644 src/main/java/com/bb/model/CompDetail.java create mode 100644 src/main/java/com/bb/model/CompResetInfo.java create mode 100644 src/main/java/com/bb/model/CompSearch.java create mode 100644 src/main/java/com/bb/model/CouponSearch.java create mode 100644 src/main/java/com/bb/model/CouponVO.java create mode 100644 src/main/java/com/bb/model/CreditReportSearch.java create mode 100644 src/main/java/com/bb/model/CronServerInfo.java create mode 100644 src/main/java/com/bb/model/DailyReportSearch.java create mode 100644 src/main/java/com/bb/model/DashInfo.java create mode 100644 src/main/java/com/bb/model/DayilPartnerReport.java create mode 100644 src/main/java/com/bb/model/DayilPeriodicReports.java create mode 100644 src/main/java/com/bb/model/DomainPartnerVO.java create mode 100644 src/main/java/com/bb/model/Etc.java create mode 100644 src/main/java/com/bb/model/FrontSearch.java create mode 100644 src/main/java/com/bb/model/GameCodeSearchVO.java create mode 100644 src/main/java/com/bb/model/GameCodeVO.java create mode 100644 src/main/java/com/bb/model/GameDetails.java create mode 100644 src/main/java/com/bb/model/GameSetting.java create mode 100644 src/main/java/com/bb/model/GameSettingInfo.java create mode 100644 src/main/java/com/bb/model/GameSettingItem.java create mode 100644 src/main/java/com/bb/model/GameUseInfo.java create mode 100644 src/main/java/com/bb/model/GraphInfo.java create mode 100644 src/main/java/com/bb/model/IdListSearch.java create mode 100644 src/main/java/com/bb/model/InChatMessageVO.java create mode 100644 src/main/java/com/bb/model/Inspect.java create mode 100644 src/main/java/com/bb/model/InspectSearch.java create mode 100644 src/main/java/com/bb/model/LevelBank.java create mode 100644 src/main/java/com/bb/model/LevelBetLimit.java create mode 100644 src/main/java/com/bb/model/LevelDomain.java create mode 100644 src/main/java/com/bb/model/LevelFailPoint.java create mode 100644 src/main/java/com/bb/model/LevelOutPwd.java create mode 100644 src/main/java/com/bb/model/LoginUserVO.java create mode 100644 src/main/java/com/bb/model/MemListSearchVO.java create mode 100644 src/main/java/com/bb/model/Member.java create mode 100644 src/main/java/com/bb/model/MemberBetLimit.java create mode 100644 src/main/java/com/bb/model/MemberBurderRate.java create mode 100644 src/main/java/com/bb/model/MemberCheckVo.java create mode 100644 src/main/java/com/bb/model/MemberCommissionRate.java create mode 100644 src/main/java/com/bb/model/MemberDetail.java create mode 100644 src/main/java/com/bb/model/MemberDividendRateType.java create mode 100644 src/main/java/com/bb/model/MemberHierarchyVo.java create mode 100644 src/main/java/com/bb/model/MemberInsert.java create mode 100644 src/main/java/com/bb/model/MemberInsert2.java create mode 100644 src/main/java/com/bb/model/MemberListSearch.java create mode 100644 src/main/java/com/bb/model/MemberRate.java create mode 100644 src/main/java/com/bb/model/MemberRateVo.java create mode 100644 src/main/java/com/bb/model/MemberSearch.java create mode 100644 src/main/java/com/bb/model/MemberStatus.java create mode 100644 src/main/java/com/bb/model/MemberTokenInfo.java create mode 100644 src/main/java/com/bb/model/MemberUpdate.java create mode 100644 src/main/java/com/bb/model/MenuVO.java create mode 100644 src/main/java/com/bb/model/Message.java create mode 100644 src/main/java/com/bb/model/MessageListSearch.java create mode 100644 src/main/java/com/bb/model/MiniGameSearch.java create mode 100644 src/main/java/com/bb/model/MinigameBetRate.java create mode 100644 src/main/java/com/bb/model/MinigameSet.java create mode 100644 src/main/java/com/bb/model/Month10Info.java create mode 100644 src/main/java/com/bb/model/MultipleRate.java create mode 100644 src/main/java/com/bb/model/MultipleRateInfo.java create mode 100644 src/main/java/com/bb/model/MultipleRateSearch.java create mode 100644 src/main/java/com/bb/model/NewMemRate.java create mode 100644 src/main/java/com/bb/model/NewMemRateItem.java create mode 100644 src/main/java/com/bb/model/NotiBgmVo.java create mode 100644 src/main/java/com/bb/model/OTPInfo.java create mode 100644 src/main/java/com/bb/model/Options.java create mode 100644 src/main/java/com/bb/model/OutChatMessageVO.java create mode 100644 src/main/java/com/bb/model/PageFormVO.java create mode 100644 src/main/java/com/bb/model/PartnerCompInfo.java create mode 100644 src/main/java/com/bb/model/PartnerListVO.java create mode 100644 src/main/java/com/bb/model/PassimAddrReq.java create mode 100644 src/main/java/com/bb/model/PassimAddrRes.java create mode 100644 src/main/java/com/bb/model/PassimVo.java create mode 100644 src/main/java/com/bb/model/Point.java create mode 100644 src/main/java/com/bb/model/PointInOut.java create mode 100644 src/main/java/com/bb/model/PointSearch.java create mode 100644 src/main/java/com/bb/model/PointSearchAdm.java create mode 100644 src/main/java/com/bb/model/RateInfo.java create mode 100644 src/main/java/com/bb/model/RateMemList.java create mode 100644 src/main/java/com/bb/model/RateVO.java create mode 100644 src/main/java/com/bb/model/ReportSearch.java create mode 100644 src/main/java/com/bb/model/RetailBetSearch.java create mode 100644 src/main/java/com/bb/model/RetailCashSearch.java create mode 100644 src/main/java/com/bb/model/RetailListSearch.java create mode 100644 src/main/java/com/bb/model/RetailLockVO.java create mode 100644 src/main/java/com/bb/model/RetailLowerSearch.java create mode 100644 src/main/java/com/bb/model/RetailPointSearch.java create mode 100644 src/main/java/com/bb/model/RetailSearch.java create mode 100644 src/main/java/com/bb/model/RetailSet.java create mode 100644 src/main/java/com/bb/model/RvHoldemResponse.java create mode 100644 src/main/java/com/bb/model/RvHoldemVO.java create mode 100644 src/main/java/com/bb/model/ScoinVO.java create mode 100644 src/main/java/com/bb/model/Site.java create mode 100644 src/main/java/com/bb/model/SiteCashBonusSettingVO.java create mode 100644 src/main/java/com/bb/model/SiteCheckReq.java create mode 100644 src/main/java/com/bb/model/SiteOption.java create mode 100644 src/main/java/com/bb/model/SiteSearch.java create mode 100644 src/main/java/com/bb/model/SlotGame.java create mode 100644 src/main/java/com/bb/model/SlotGameName.java create mode 100644 src/main/java/com/bb/model/SocialLoginVO.java create mode 100644 src/main/java/com/bb/model/TOtpVO.java create mode 100644 src/main/java/com/bb/model/TestDto.java create mode 100644 src/main/java/com/bb/model/Top15Info.java create mode 100644 src/main/java/com/bb/model/TreeListSearch.java create mode 100644 src/main/java/com/bb/model/TripleAuthInfo.java create mode 100644 src/main/java/com/bb/model/TripleDVO.java create mode 100644 src/main/java/com/bb/model/TripleDetailVO.java create mode 100644 src/main/java/com/bb/model/TripleGameRate.java create mode 100644 src/main/java/com/bb/model/TriplePurchaseId.java create mode 100644 src/main/java/com/bb/model/TripleResponse.java create mode 100644 src/main/java/com/bb/model/TripleSbVO.java create mode 100644 src/main/java/com/bb/model/TripleVO.java create mode 100644 src/main/java/com/bb/model/TrxSearchVO.java create mode 100644 src/main/java/com/bb/model/UserDetailInfo.java create mode 100644 src/main/java/com/bb/model/UserListSearch.java create mode 100644 src/main/java/com/bb/model/UserSearch.java create mode 100644 src/main/java/com/bb/model/VendorGameReq.java create mode 100644 src/main/java/com/bb/model/VendorReq.java create mode 100644 src/main/java/com/bb/service/AsyncBetService.java create mode 100644 src/main/java/com/bb/service/AsyncExcoinOtcService.java create mode 100644 src/main/java/com/bb/service/AsyncTripleDService.java create mode 100644 src/main/java/com/bb/service/AsyncTripleService.java create mode 100644 src/main/java/com/bb/service/AsyncWowOtcService.java create mode 100644 src/main/java/com/bb/service/BetService.java create mode 100644 src/main/java/com/bb/service/BetServiceImpl.java create mode 100644 src/main/java/com/bb/service/BoardService.java create mode 100644 src/main/java/com/bb/service/BoardServiceImpl.java create mode 100644 src/main/java/com/bb/service/CashService.java create mode 100644 src/main/java/com/bb/service/CashServiceImpl.java create mode 100644 src/main/java/com/bb/service/CommonService.java create mode 100644 src/main/java/com/bb/service/CommonServiceImpl.java create mode 100644 src/main/java/com/bb/service/CompService.java create mode 100644 src/main/java/com/bb/service/CompServiceImpl.java create mode 100644 src/main/java/com/bb/service/MainService.java create mode 100644 src/main/java/com/bb/service/MainServiceImpl.java create mode 100644 src/main/java/com/bb/service/MinigameService.java create mode 100644 src/main/java/com/bb/service/MinigameServiceImpl.java create mode 100644 src/main/java/com/bb/service/PassimService.java create mode 100644 src/main/java/com/bb/service/PassimServiceImpl.java create mode 100644 src/main/java/com/bb/service/PointService.java create mode 100644 src/main/java/com/bb/service/PointServiceImpl.java create mode 100644 src/main/java/com/bb/service/RateService.java create mode 100644 src/main/java/com/bb/service/RateServiceImpl.java create mode 100644 src/main/java/com/bb/service/ReportService.java create mode 100644 src/main/java/com/bb/service/ReportServiceImpl.java create mode 100644 src/main/java/com/bb/service/RetailService.java create mode 100644 src/main/java/com/bb/service/RetailServiceImpl.java create mode 100644 src/main/java/com/bb/service/RvHoldemService.java create mode 100644 src/main/java/com/bb/service/RvHoldemServiceImpl.java create mode 100644 src/main/java/com/bb/service/SportDService.java create mode 100644 src/main/java/com/bb/service/SportDServiceImpl.java create mode 100644 src/main/java/com/bb/service/SportService.java create mode 100644 src/main/java/com/bb/service/SportServiceImpl.java create mode 100644 src/main/java/com/bb/service/SuperService.java create mode 100644 src/main/java/com/bb/service/SuperServiceImpl.java create mode 100644 src/main/java/com/bb/service/TripleService.java create mode 100644 src/main/java/com/bb/service/TripleServiceImpl.java create mode 100644 src/main/java/com/bb/service/UserService.java create mode 100644 src/main/java/com/bb/service/UserServiceImpl.java create mode 100644 src/main/java/com/bb/service/VendorService.java create mode 100644 src/main/java/com/bb/service/VendorServiceImpl.java create mode 100644 src/main/java/com/bb/util/AESUtil.java create mode 100644 src/main/java/com/bb/util/DateTimeUtils.java create mode 100644 src/main/java/com/bb/util/IPKit.java create mode 100644 src/main/java/com/bb/util/PagingUtil.java create mode 100644 src/main/java/com/bb/util/PassimpaySignatureUtil.java create mode 100644 src/main/java/com/bb/util/RandomRolling.java create mode 100644 src/main/java/com/bb/util/StringUtils.java create mode 100644 src/main/java/com/bb/util/TOTPTokenGenerator.java create mode 100644 src/main/java/com/bb/util/UnsafeOkHttpClient.java create mode 100644 src/main/resources/application-local.yml create mode 100644 src/main/resources/application-real.yml create mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/authentication.properties create mode 100644 src/main/resources/db1/BET.xml create mode 100644 src/main/resources/db1/BOARD.xml create mode 100644 src/main/resources/db1/CASH.xml create mode 100644 src/main/resources/db1/CODE.xml create mode 100644 src/main/resources/db1/COMP.xml create mode 100644 src/main/resources/db1/MAIN.xml create mode 100644 src/main/resources/db1/MINIGAME.xml create mode 100644 src/main/resources/db1/PASSIM.xml create mode 100644 src/main/resources/db1/POINT.xml create mode 100644 src/main/resources/db1/RATE.xml create mode 100644 src/main/resources/db1/REPORT.xml create mode 100644 src/main/resources/db1/RETAIL.xml create mode 100644 src/main/resources/db1/SUPER.xml create mode 100644 src/main/resources/db1/USER.xml create mode 100644 src/main/resources/db2/COMP.xml create mode 100644 src/main/resources/db2/PARSE_DB2.xml create mode 100644 src/main/resources/db2/VENDOR.xml create mode 100644 src/main/resources/logback-spring.xml create mode 100644 src/main/resources/static/html/health.html create mode 100644 src/main/resources/static/html/jquery-2.2.4.min.js create mode 100644 src/main/resources/static/html/socket.html create mode 100644 src/main/resources/static/html/sockjs.min.js create mode 100644 src/main/resources/static/html/stomp.min.js create mode 100644 src/main/resources/templates/api.html diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..50f873a --- /dev/null +++ b/.classpath @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.factorypath b/.factorypath new file mode 100644 index 0000000..f599efa --- /dev/null +++ b/.factorypath @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c54e8cc --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000..e76d1f3 --- /dev/null +++ b/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,117 @@ +/* + * Copyright 2007-present the original author or authors. + * + * Licensed 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. + */ +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + private static final String WRAPPER_VERSION = "0.5.6"; + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if(mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if(mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if(!outputFile.getParentFile().exists()) { + if(!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054 GIT binary patch literal 50710 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 EfAhh=DF6Tf literal 0 HcmV?d00001 diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..abd303b --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.2/apache-maven-3.8.2-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/.project b/.project new file mode 100644 index 0000000..951c240 --- /dev/null +++ b/.project @@ -0,0 +1,39 @@ + + + new_apiServer_oms + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.springframework.ide.eclipse.boot.validation.springbootbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + + + 1772723702901 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..abdea9a --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.apt.core.prefs b/.settings/org.eclipse.jdt.apt.core.prefs new file mode 100644 index 0000000..dfa4f3a --- /dev/null +++ b/.settings/org.eclipse.jdt.apt.core.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.apt.aptEnabled=true +org.eclipse.jdt.apt.genSrcDir=target/generated-sources/annotations +org.eclipse.jdt.apt.genTestSrcDir=target/generated-test-sources/test-annotations diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..47dcc0b --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,14 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.methodParameters=generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=17 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.processAnnotations=enabled +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=17 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/.settings/org.sonarlint.eclipse.core.prefs b/.settings/org.sonarlint.eclipse.core.prefs new file mode 100644 index 0000000..518de29 --- /dev/null +++ b/.settings/org.sonarlint.eclipse.core.prefs @@ -0,0 +1,6 @@ +autoEnabled=true +bindingSuggestionsDisabled=true +eclipse.preferences.version=1 +indexingBasedOnEclipsePlugIns=true +projectKey=TESTOMS +serverId=s.net-all.cc diff --git a/.settings/org.springframework.ide.eclipse.prefs b/.settings/org.springframework.ide.eclipse.prefs new file mode 100644 index 0000000..a12794d --- /dev/null +++ b/.settings/org.springframework.ide.eclipse.prefs @@ -0,0 +1,2 @@ +boot.validation.initialized=true +eclipse.preferences.version=1 diff --git a/.sonarlint/connectedMode.json b/.sonarlint/connectedMode.json new file mode 100644 index 0000000..b864f3e --- /dev/null +++ b/.sonarlint/connectedMode.json @@ -0,0 +1,4 @@ +{ + "sonarQubeUri": "http://s.net-all.cc:9000", + "projectKey": "TESTOMS" +} \ No newline at end of file diff --git a/deploy-aws.sh b/deploy-aws.sh new file mode 100644 index 0000000..873c95f --- /dev/null +++ b/deploy-aws.sh @@ -0,0 +1,83 @@ +#!/bin/bash + +# AWS 서버 파일 업로드 스크립트 +# 사용법: ./deploy-aws.sh + +set -e + +AWS_SERVER=$1 +AWS_USER=$2 +AWS_KEY_PATH=$3 +JAR_FILE=$4 +DEPLOY_PATH=$5 + +if [ -z "$AWS_SERVER" ] || [ -z "$AWS_USER" ] || [ -z "$AWS_KEY_PATH" ] || [ -z "$JAR_FILE" ] || [ -z "$DEPLOY_PATH" ]; then + echo "사용법: $0 " + echo "예시: $0 47.129.51.216 root /path/to/key.pem target/core.jar /home/run" + exit 1 +fi + +echo "=== AWS 서버 파일 업로드 시작 ===" +echo "AWS Server: $AWS_SERVER" +echo "AWS User: $AWS_USER" +echo "JAR File: $JAR_FILE" +echo "Deploy Path: $DEPLOY_PATH" + +# JAR 파일 존재 확인 +if [ ! -f "$JAR_FILE" ]; then + echo "❌ JAR 파일을 찾을 수 없습니다: $JAR_FILE" + exit 1 +fi + +# AWS 키 파일 존재 확인 +if [ ! -f "$AWS_KEY_PATH" ]; then + echo "❌ AWS 키 파일을 찾을 수 없습니다: $AWS_KEY_PATH" + exit 1 +fi + +# AWS 서버 연결 테스트 +echo "AWS 서버 연결 테스트 중..." +ssh -i "$AWS_KEY_PATH" -o ConnectTimeout=10 -o StrictHostKeyChecking=no "$AWS_USER@$AWS_SERVER" "echo 'AWS 서버 연결 성공'" + +if [ $? -ne 0 ]; then + echo "❌ AWS 서버 연결 실패" + exit 1 +fi + +# AWS 서버에서 배포 디렉토리 생성 및 권한 설정 (root 권한으로) +echo "AWS 서버에서 배포 디렉토리 생성 중... (root 권한)" +ssh -i "$AWS_KEY_PATH" "$AWS_USER@$AWS_SERVER" "sudo su - root <<'ROOT_SETUP' + # 배포 디렉토리 및 로그 디렉토리 생성 + mkdir -p $DEPLOY_PATH/logs + chmod -R 755 $DEPLOY_PATH + echo '배포 디렉토리 생성 완료: $DEPLOY_PATH' +ROOT_SETUP +" + +# JAR 파일 이름 추출 +JAR_FILENAME=$(basename "$JAR_FILE") + +# JAR 파일을 AWS 서버로 전송 +echo "JAR 파일을 AWS 서버로 전송 중..." +scp -i "$AWS_KEY_PATH" "$JAR_FILE" "$AWS_USER@$AWS_SERVER:$DEPLOY_PATH/$JAR_FILENAME" + +# JAR 파일 권한 설정 (root가 읽을 수 있도록) +echo "JAR 파일 권한 설정 중... (root 권한)" +ssh -i "$AWS_KEY_PATH" "$AWS_USER@$AWS_SERVER" "sudo su - root <<'ROOT_CHMOD' + chmod 644 $DEPLOY_PATH/$JAR_FILENAME + echo 'JAR 파일 권한 설정 완료' + echo '업로드된 파일: $DEPLOY_PATH/$JAR_FILENAME' + ls -lh $DEPLOY_PATH/$JAR_FILENAME +ROOT_CHMOD +" + +if [ $? -eq 0 ]; then + echo "✅ AWS 서버 파일 업로드 성공!" + echo "JAR 파일이 $DEPLOY_PATH/$JAR_FILENAME 에 업로드되었습니다." +else + echo "❌ AWS 서버 파일 업로드 실패!" + exit 1 +fi + +echo "=== AWS 서버 파일 업로드 완료 ===" + diff --git a/deploy-aws2.sh b/deploy-aws2.sh new file mode 100644 index 0000000..72d6d24 --- /dev/null +++ b/deploy-aws2.sh @@ -0,0 +1,96 @@ +#!/bin/bash + +# AWS 서버 파일 업로드 스크립트 +# 사용법: ./deploy-aws.sh + +set -e + +AWS_SERVER=$1 +AWS_USER=$2 +AWS_KEY_PATH=$3 +JAR_FILE=$4 +DEPLOY_PATH=$5 + +if [ -z "$AWS_SERVER" ] || [ -z "$AWS_USER" ] || [ -z "$AWS_KEY_PATH" ] || [ -z "$JAR_FILE" ] || [ -z "$DEPLOY_PATH" ]; then + echo "사용법: $0 " + echo "예시: $0 47.129.51.216 root /path/to/key.pem target/core.jar /home/run" + exit 1 +fi + +echo "=== AWS 서버 파일 업로드 시작 ===" +echo "AWS Server: $AWS_SERVER" +echo "AWS User: $AWS_USER" +echo "JAR File: $JAR_FILE" +echo "Deploy Path: $DEPLOY_PATH" + +# JAR 파일 존재 확인 +if [ ! -f "$JAR_FILE" ]; then + echo "❌ JAR 파일을 찾을 수 없습니다: $JAR_FILE" + exit 1 +fi + +# AWS 키 파일 존재 확인 +if [ ! -f "$AWS_KEY_PATH" ]; then + echo "❌ AWS 키 파일을 찾을 수 없습니다: $AWS_KEY_PATH" + exit 1 +fi + +# AWS 서버 연결 테스트 +echo "AWS 서버 연결 테스트 중..." +ssh -i "$AWS_KEY_PATH" -o ConnectTimeout=10 -o StrictHostKeyChecking=no "$AWS_USER@$AWS_SERVER" "echo 'AWS 서버 연결 성공'" + +if [ $? -ne 0 ]; then + echo "❌ AWS 서버 연결 실패" + exit 1 +fi + +# AWS 서버에서 배포 디렉토리 생성 및 권한 설정 (root 권한으로) +echo "AWS 서버에서 배포 디렉토리 생성 중... (root 권한)" +ssh -i "$AWS_KEY_PATH" "$AWS_USER@$AWS_SERVER" "sudo su - root <PC6CLL-%ZUBTGuH)K@Jz`QY_< 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.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CashCronController.cashProc(CashCronController.java:50) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:07:42.131 [my-scheduler-task-pool-5] INFO com.zaxxer.hikari.HikariDataSource - hikari-cp - Starting... +15:07:42.142 [my-scheduler-task-pool-2] ERROR c.bb.controller.CashCronController - #-cashProc::Exception::org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:07:45.163 [my-scheduler-task-pool-5] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.creditBetProc(CreditCronController.java:67) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:07:45.166 [my-scheduler-task-pool-3] INFO com.zaxxer.hikari.HikariDataSource - hikari-cp - Starting... +15:07:45.167 [my-scheduler-task-pool-5] ERROR c.bb.controller.CreditCronController - #-creditBetProc::ERROR::org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:07:48.176 [my-scheduler-task-pool-3] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.batchReport(CommonServiceImpl.java:80) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 61 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 63 common frames omitted +15:07:48.179 [my-scheduler-task-pool-3] ERROR com.bb.service.CommonServiceImpl - org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:07:48.178 [my-scheduler-task-pool-4] INFO com.zaxxer.hikari.HikariDataSource - hikari-cp - Starting... +15:07:51.197 [my-scheduler-task-pool-4] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.creditReport(CommonServiceImpl.java:286) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 61 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 63 common frames omitted +15:07:51.200 [my-scheduler-task-pool-1] INFO com.zaxxer.hikari.HikariDataSource - hikari-cp - Starting... +15:07:51.200 [my-scheduler-task-pool-4] ERROR com.bb.service.CommonServiceImpl - org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:07:54.210 [my-scheduler-task-pool-1] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.insuredReport(CommonServiceImpl.java:370) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 61 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 63 common frames omitted +15:07:54.212 [my-scheduler-task-pool-1] ERROR com.bb.service.CommonServiceImpl - org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:11:04.365 [background-preinit] INFO o.h.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.0.Final +15:11:04.428 [main] INFO com.bb.ApiServerApplication - Starting ApiServerApplication using Java 17.0.5 with PID 7456 (C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes started by shandi in C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms) +15:11:04.430 [main] INFO com.bb.ApiServerApplication - The following 1 profile is active: "local" +15:11:07.453 [main] INFO o.s.i.c.DefaultConfiguringBeanFactoryPostProcessor - No bean named 'errorChannel' has been explicitly defined. Therefore, a default PublishSubscribeChannel will be created. +15:11:07.483 [main] INFO o.s.i.c.DefaultConfiguringBeanFactoryPostProcessor - No bean named 'integrationHeaderChannelRegistry' has been explicitly defined. Therefore, a default DefaultHeaderChannelRegistry will be created. +15:11:08.322 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port(s): 80 (http) +15:11:08.336 [main] INFO o.a.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-80"] +15:11:08.338 [main] INFO o.a.catalina.core.StandardService - Starting service [Tomcat] +15:11:08.339 [main] INFO o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.1] +15:11:08.524 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +15:11:08.525 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 3434 ms +15:11:10.322 [main] INFO o.s.b.web.servlet.RegistrationBean - Filter apiKeyFilter was not registered (possibly already registered?) +15:11:13.035 [main] INFO o.s.b.a.e.web.EndpointLinksResolver - Exposing 1 endpoint(s) beneath base path '/actuator' +15:11:13.178 [main] INFO o.s.s.web.DefaultSecurityFilterChain - Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@63e0057a, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@5b76b891, org.springframework.security.web.context.SecurityContextHolderFilter@14b4d90b, org.springframework.security.web.header.HeaderWriterFilter@6c537267, org.springframework.web.filter.CorsFilter@611a91df, org.springframework.security.web.authentication.logout.LogoutFilter@1a45e29f, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@10466c55, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@37a939bc, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@47f5ab58, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@7962c1d5, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@56226064, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@245dbd09, org.springframework.security.web.access.ExceptionTranslationFilter@1f2497d9, org.springframework.security.web.access.intercept.AuthorizationFilter@10e4ce98] +15:11:14.394 [main] INFO o.s.i.endpoint.EventDrivenConsumer - Adding {logging-channel-adapter:_org.springframework.integration.errorLogger} as a subscriber to the 'errorChannel' channel +15:11:14.396 [main] INFO o.s.i.c.PublishSubscribeChannel - Channel 'application.errorChannel' has 1 subscriber(s). +15:11:14.398 [main] INFO o.s.i.endpoint.EventDrivenConsumer - started bean '_org.springframework.integration.errorLogger' +15:11:14.399 [main] INFO o.a.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-80"] +15:11:14.445 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port(s): 80 (http) with context path '' +15:11:14.449 [main] INFO o.s.m.s.b.SimpleBrokerMessageHandler - Starting... +15:11:14.450 [main] INFO o.s.m.s.b.SimpleBrokerMessageHandler - BrokerAvailabilityEvent[available=true, SimpleBrokerMessageHandler [org.springframework.messaging.simp.broker.DefaultSubscriptionRegistry@4b20a8e4]] +15:11:14.451 [main] INFO o.s.m.s.b.SimpleBrokerMessageHandler - Started. +15:11:14.478 [my-scheduler-task-pool-3] INFO com.bb.service.CommonServiceImpl - ##- [OMS BATCH_REPORT STATUS] HostName: DESKTOP-2T3170R, HostAddress: 167.179.119.96 +15:11:14.479 [my-scheduler-task-pool-1] INFO com.bb.service.CommonServiceImpl - ##- [OMS BATCH_INSURED_REPORT STATUS] HostName: DESKTOP-2T3170R, HostAddress: 167.179.119.96 +15:11:14.480 [my-scheduler-task-pool-4] INFO com.bb.service.CommonServiceImpl - ##- [OMS BATCH_CREDIT_REPORT STATUS] HostName: DESKTOP-2T3170R, HostAddress: 167.179.119.96 +15:11:14.511 [my-scheduler-task-pool-4] INFO com.zaxxer.hikari.HikariDataSource - hikari-cp - Starting... +15:11:14.520 [main] INFO com.bb.ApiServerApplication - Started ApiServerApplication in 11.037 seconds (process running for 12.688) +15:11:15.151 [RMI TCP Connection(9)-127.0.0.1] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +15:11:15.152 [RMI TCP Connection(9)-127.0.0.1] INFO o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +15:11:15.155 [RMI TCP Connection(9)-127.0.0.1] INFO o.s.web.servlet.DispatcherServlet - Completed initialization in 2 ms +15:11:19.697 [my-scheduler-task-pool-4] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.creditReport(CommonServiceImpl.java:286) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 61 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 63 common frames omitted +15:11:19.706 [my-scheduler-task-pool-2] INFO com.zaxxer.hikari.HikariDataSource - hikari-cp - Starting... +15:11:19.719 [my-scheduler-task-pool-4] ERROR com.bb.service.CommonServiceImpl - org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:11:24.727 [my-scheduler-task-pool-2] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CashCronController.cashProc(CashCronController.java:50) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:11:24.730 [my-scheduler-task-pool-3] INFO com.zaxxer.hikari.HikariDataSource - hikari-cp - Starting... +15:11:24.731 [my-scheduler-task-pool-2] ERROR c.bb.controller.CashCronController - #-cashProc::Exception::org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:11:29.778 [my-scheduler-task-pool-3] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.batchReport(CommonServiceImpl.java:80) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 61 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 63 common frames omitted +15:11:29.781 [my-scheduler-task-pool-5] INFO com.zaxxer.hikari.HikariDataSource - hikari-cp - Starting... +15:11:29.781 [my-scheduler-task-pool-3] ERROR com.bb.service.CommonServiceImpl - org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:11:34.845 [my-scheduler-task-pool-5] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.creditBetProc(CreditCronController.java:67) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:11:34.848 [my-scheduler-task-pool-1] INFO com.zaxxer.hikari.HikariDataSource - hikari-cp - Starting... +15:11:34.849 [my-scheduler-task-pool-5] ERROR c.bb.controller.CreditCronController - #-creditBetProc::ERROR::org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:11:39.912 [my-scheduler-task-pool-1] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.insuredReport(CommonServiceImpl.java:370) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 61 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 63 common frames omitted +15:11:39.915 [my-scheduler-task-pool-1] ERROR com.bb.service.CommonServiceImpl - org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:11:39.914 [my-scheduler-task-pool-5] INFO com.zaxxer.hikari.HikariDataSource - hikari-cp - Starting... +15:11:44.930 [my-scheduler-task-pool-5] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.credit_lion01(CreditCronController.java:716) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at jdk.internal.reflect.GeneratedConstructorAccessor58.newInstance(Unknown Source) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:11:44.932 [my-scheduler-task-pool-3] INFO com.zaxxer.hikari.HikariDataSource - hikari-cp - Starting... +15:11:44.933 [my-scheduler-task-pool-5] ERROR c.bb.controller.CreditCronController - ##creditBetProc::lion01::- credit_lion01() => PT_BI_ERROR +15:11:44.935 [my-scheduler-task-pool-5] ERROR c.bb.controller.CreditCronController - ##creditBetProc::lion01org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:11:49.981 [my-scheduler-task-pool-3] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.credit_dubai01(CreditCronController.java:542) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at jdk.internal.reflect.GeneratedConstructorAccessor58.newInstance(Unknown Source) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:11:49.983 [my-scheduler-task-pool-2] INFO com.zaxxer.hikari.HikariDataSource - hikari-cp - Starting... +15:11:49.984 [my-scheduler-task-pool-3] ERROR c.bb.controller.CreditCronController - ##creditBetProc::dubai01::- credit_dubai01() => PT_BI_ERROR +15:11:49.984 [my-scheduler-task-pool-3] ERROR c.bb.controller.CreditCronController - ##creditBetProc::dubai01org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:11:55.022 [my-scheduler-task-pool-2] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.credit_sclass01(CreditCronController.java:687) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at jdk.internal.reflect.GeneratedConstructorAccessor58.newInstance(Unknown Source) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:11:55.024 [my-scheduler-task-pool-4] INFO com.zaxxer.hikari.HikariDataSource - hikari-cp - Starting... +15:11:55.024 [my-scheduler-task-pool-2] ERROR c.bb.controller.CreditCronController - ##creditBetProc::sclass01::- credit_sclass01() => PT_BI_ERROR +15:11:55.025 [my-scheduler-task-pool-2] ERROR c.bb.controller.CreditCronController - ##creditBetProc::sclass01org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:12:00.122 [my-scheduler-task-pool-4] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.credit_vegas01(CreditCronController.java:455) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at jdk.internal.reflect.GeneratedConstructorAccessor58.newInstance(Unknown Source) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:12:00.124 [my-scheduler-task-pool-2] INFO com.zaxxer.hikari.HikariDataSource - hikari-cp - Starting... +15:12:00.124 [my-scheduler-task-pool-4] ERROR c.bb.controller.CreditCronController - ##creditBetProc::vegas01::- credit_vegas01() => PT_BI_ERROR +15:12:00.124 [my-scheduler-task-pool-4] ERROR c.bb.controller.CreditCronController - ##creditBetProc::vegas01org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:12:05.171 [my-scheduler-task-pool-2] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.credit_coco011(CreditCronController.java:513) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at jdk.internal.reflect.GeneratedConstructorAccessor58.newInstance(Unknown Source) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:12:05.173 [my-scheduler-task-pool-3] INFO com.zaxxer.hikari.HikariDataSource - hikari-cp - Starting... +15:12:05.173 [my-scheduler-task-pool-2] ERROR c.bb.controller.CreditCronController - ##creditBetProc::coco011::- credit_coco011() => PT_BI_ERROR +15:12:05.174 [my-scheduler-task-pool-2] ERROR c.bb.controller.CreditCronController - ##creditBetProc::coco011org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:12:10.278 [my-scheduler-task-pool-3] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.credit_theking01(CreditCronController.java:484) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at jdk.internal.reflect.GeneratedConstructorAccessor58.newInstance(Unknown Source) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:12:10.282 [my-scheduler-task-pool-5] INFO com.zaxxer.hikari.HikariDataSource - hikari-cp - Starting... +15:12:10.283 [my-scheduler-task-pool-3] ERROR c.bb.controller.CreditCronController - ##creditBetProc::theking01::- credit_theking01() => PT_BI_ERROR +15:12:10.286 [my-scheduler-task-pool-3] ERROR c.bb.controller.CreditCronController - ##creditBetProc::theking01org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:12:13.041 [RMI TCP Connection(10)-127.0.0.1] INFO o.s.b.a.SpringApplicationAdminMXBeanRegistrar$SpringApplicationAdmin - Application shutdown requested. +15:12:13.058 [RMI TCP Connection(10)-127.0.0.1] INFO o.s.m.s.b.SimpleBrokerMessageHandler - Stopping... +15:12:13.059 [RMI TCP Connection(10)-127.0.0.1] INFO o.s.m.s.b.SimpleBrokerMessageHandler - BrokerAvailabilityEvent[available=false, SimpleBrokerMessageHandler [org.springframework.messaging.simp.broker.DefaultSubscriptionRegistry@4b20a8e4]] +15:12:13.059 [RMI TCP Connection(10)-127.0.0.1] INFO o.s.m.s.b.SimpleBrokerMessageHandler - Stopped. +15:12:13.074 [RMI TCP Connection(10)-127.0.0.1] INFO o.a.coyote.http11.Http11NioProtocol - Pausing ProtocolHandler ["http-nio-80"] +15:12:13.075 [RMI TCP Connection(10)-127.0.0.1] INFO o.a.catalina.core.StandardService - Stopping service [Tomcat] +15:12:13.079 [RMI TCP Connection(10)-127.0.0.1] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Destroying Spring FrameworkServlet 'dispatcherServlet' +15:12:13.106 [RMI TCP Connection(10)-127.0.0.1] INFO o.a.coyote.http11.Http11NioProtocol - Stopping ProtocolHandler ["http-nio-80"] +15:12:13.112 [RMI TCP Connection(10)-127.0.0.1] INFO o.a.coyote.http11.Http11NioProtocol - Destroying ProtocolHandler ["http-nio-80"] +15:12:13.114 [RMI TCP Connection(10)-127.0.0.1] INFO o.s.i.endpoint.EventDrivenConsumer - Removing {logging-channel-adapter:_org.springframework.integration.errorLogger} as a subscriber to the 'errorChannel' channel +15:12:13.114 [RMI TCP Connection(10)-127.0.0.1] INFO o.s.i.c.PublishSubscribeChannel - Channel 'application.errorChannel' has 0 subscriber(s). +15:12:13.116 [RMI TCP Connection(10)-127.0.0.1] INFO o.s.i.endpoint.EventDrivenConsumer - stopped bean '_org.springframework.integration.errorLogger' +15:12:13.156 [my-scheduler-task-pool-5] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.credit_mario01(CreditCronController.java:629) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at jdk.internal.reflect.GeneratedConstructorAccessor58.newInstance(Unknown Source) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:12:13.158 [my-scheduler-task-pool-1] INFO com.zaxxer.hikari.HikariDataSource - hikari-cp - Starting... +15:12:13.159 [my-scheduler-task-pool-5] ERROR c.bb.controller.CreditCronController - ##creditBetProc::mario01::- credit_mario01() => PT_BI_ERROR +15:12:13.161 [my-scheduler-task-pool-5] ERROR c.bb.controller.CreditCronController - ##creditBetProc::mario01org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:12:16.175 [my-scheduler-task-pool-1] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.credit_salt01(CreditCronController.java:600) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at jdk.internal.reflect.GeneratedConstructorAccessor58.newInstance(Unknown Source) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:12:16.178 [my-scheduler-task-pool-3] INFO com.zaxxer.hikari.HikariDataSource - hikari-cp - Starting... +15:12:16.179 [my-scheduler-task-pool-1] ERROR c.bb.controller.CreditCronController - ##creditBetProc::salt01::- credit_salt01() => PT_BI_ERROR +15:12:16.180 [my-scheduler-task-pool-1] ERROR c.bb.controller.CreditCronController - ##creditBetProc::salt01org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:12:19.188 [my-scheduler-task-pool-3] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.credit_mvp001(CreditCronController.java:891) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at jdk.internal.reflect.GeneratedConstructorAccessor58.newInstance(Unknown Source) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:12:19.191 [my-scheduler-task-pool-2] INFO com.zaxxer.hikari.HikariDataSource - hikari-cp - Starting... +15:12:19.191 [my-scheduler-task-pool-3] ERROR c.bb.controller.CreditCronController - ##creditBetProc::mvp001::- credit_mvp001() => PT_BI_ERROR +15:12:19.193 [my-scheduler-task-pool-3] ERROR c.bb.controller.CreditCronController - ##creditBetProc::mvp001org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:12:22.220 [my-scheduler-task-pool-2] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.credit_pocari(CreditCronController.java:658) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at jdk.internal.reflect.GeneratedConstructorAccessor58.newInstance(Unknown Source) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:12:22.223 [my-scheduler-task-pool-2] ERROR c.bb.controller.CreditCronController - ##creditBetProc::pocari::- credit_pocari() => PT_BI_ERROR +15:12:22.223 [my-scheduler-task-pool-4] INFO com.zaxxer.hikari.HikariDataSource - hikari-cp - Starting... +15:12:22.224 [my-scheduler-task-pool-2] ERROR c.bb.controller.CreditCronController - ##creditBetProc::pocariorg.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:12:25.273 [my-scheduler-task-pool-4] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.credit_tiger011(CreditCronController.java:571) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at jdk.internal.reflect.GeneratedConstructorAccessor58.newInstance(Unknown Source) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:12:25.276 [my-scheduler-task-pool-4] ERROR c.bb.controller.CreditCronController - ##creditBetProc::tiger011::- credit_tiger011() => PT_BI_ERROR +15:12:25.277 [my-scheduler-task-pool-4] ERROR c.bb.controller.CreditCronController - ##creditBetProc::tiger011org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection diff --git a/filePath_IS_UNDEFINED/error-2024-06-24.0.gz b/filePath_IS_UNDEFINED/error-2024-06-24.0.gz new file mode 100644 index 0000000000000000000000000000000000000000..7534f68a63f755846edf05094bc4d337cbf5e852 GIT binary patch literal 14665 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 LKY-E~>rDdyF0HX; literal 0 HcmV?d00001 diff --git a/filePath_IS_UNDEFINED/error-2024-06-25.0.gz b/filePath_IS_UNDEFINED/error-2024-06-25.0.gz new file mode 100644 index 0000000000000000000000000000000000000000..1d114cda06e6ec39a4583fa11de288099e536af7 GIT binary patch literal 26868 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%0D|G@)HRVV2$bFHn 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 literal 0 HcmV?d00001 diff --git a/filePath_IS_UNDEFINED/error-2024-06-28.0.gz b/filePath_IS_UNDEFINED/error-2024-06-28.0.gz new file mode 100644 index 0000000000000000000000000000000000000000..525b5f6869fef85f19ba68541d5c6a19ec58aa39 GIT binary patch literal 4824 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 literal 0 HcmV?d00001 diff --git a/filePath_IS_UNDEFINED/error-2024-07-08.0.gz b/filePath_IS_UNDEFINED/error-2024-07-08.0.gz new file mode 100644 index 0000000000000000000000000000000000000000..55587a3b3d0b5d3507c17a4ec59665bcaca6aed4 GIT binary patch literal 3622 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 sy|yz>% literal 0 HcmV?d00001 diff --git a/filePath_IS_UNDEFINED/error.log b/filePath_IS_UNDEFINED/error.log new file mode 100644 index 0000000..b82cdda --- /dev/null +++ b/filePath_IS_UNDEFINED/error.log @@ -0,0 +1,2302 @@ +13:44:15.191 [main] ERROR o.s.boot.SpringApplication - Application run failed +org.springframework.context.ApplicationContextException: Unable to start web server + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:164) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:578) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:432) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1302) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1291) + at com.bb.ApiServerApplication.main(ApiServerApplication.java:16) +Caused by: java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletResponse + at com.bb.config.LogConfig.lambda$1(LogConfig.java:24) + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.configureContext(TomcatServletWebServerFactory.java:400) + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.prepareContext(TomcatServletWebServerFactory.java:258) + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:209) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:183) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:161) + ... 8 common frames omitted +Caused by: java.lang.ClassNotFoundException: javax.servlet.http.HttpServletResponse + at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) + at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) + at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) + ... 14 common frames omitted +13:48:16.022 [main] ERROR o.s.boot.SpringApplication - Application run failed +org.springframework.context.ApplicationContextException: Unable to start web server + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:164) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:578) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:432) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1302) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1291) + at com.bb.ApiServerApplication.main(ApiServerApplication.java:16) +Caused by: java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletResponse + at com.bb.config.LogConfig.lambda$1(LogConfig.java:24) + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.configureContext(TomcatServletWebServerFactory.java:400) + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.prepareContext(TomcatServletWebServerFactory.java:258) + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:209) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:183) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:161) + ... 8 common frames omitted +Caused by: java.lang.ClassNotFoundException: javax.servlet.http.HttpServletResponse + at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) + at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) + at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) + ... 14 common frames omitted +14:35:50.283 [main] ERROR o.s.boot.SpringApplication - Application run failed +org.springframework.context.ApplicationContextException: Unable to start web server + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:164) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:602) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298) + at com.bb.ApiServerApplication.main(ApiServerApplication.java:16) +Caused by: java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletResponse + at com.bb.config.LogConfig.lambda$1(LogConfig.java:24) + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.configureContext(TomcatServletWebServerFactory.java:403) + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.prepareContext(TomcatServletWebServerFactory.java:259) + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:210) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:183) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:161) + ... 8 common frames omitted +Caused by: java.lang.ClassNotFoundException: javax.servlet.http.HttpServletResponse + at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) + at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) + at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) + ... 14 common frames omitted +14:44:58.195 [main] ERROR o.s.boot.SpringApplication - Application run failed +org.springframework.context.ApplicationContextException: Unable to start web server + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:164) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:578) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:432) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1302) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1291) + at com.bb.ApiServerApplication.main(ApiServerApplication.java:16) +Caused by: java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletResponse + at com.bb.config.LogConfig.lambda$1(LogConfig.java:24) + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.configureContext(TomcatServletWebServerFactory.java:400) + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.prepareContext(TomcatServletWebServerFactory.java:258) + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:209) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:183) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:161) + ... 8 common frames omitted +Caused by: java.lang.ClassNotFoundException: javax.servlet.http.HttpServletResponse + at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) + at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) + at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) + ... 14 common frames omitted +14:57:46.901 [main] ERROR o.s.boot.SpringApplication - Application run failed +org.springframework.context.ApplicationContextException: Unable to start web server + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:164) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:578) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:432) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1302) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1291) + at com.bb.ApiServerApplication.main(ApiServerApplication.java:16) +Caused by: java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletResponse + at com.bb.config.LogConfig.lambda$embeddedServletContainerCustomizer$0(LogConfig.java:24) + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.configureContext(TomcatServletWebServerFactory.java:400) + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.prepareContext(TomcatServletWebServerFactory.java:258) + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:209) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:183) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:161) + ... 8 common frames omitted +Caused by: java.lang.ClassNotFoundException: javax.servlet.http.HttpServletResponse + at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) + at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) + at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) + ... 14 common frames omitted +15:02:00.967 [main] ERROR o.s.boot.SpringApplication - Application run failed +org.springframework.context.ApplicationContextException: Unable to start web server + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:164) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:578) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:432) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1302) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1291) + at com.bb.ApiServerApplication.main(ApiServerApplication.java:16) +Caused by: java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletResponse + at com.bb.config.LogConfig.lambda$embeddedServletContainerCustomizer$0(LogConfig.java:24) + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.configureContext(TomcatServletWebServerFactory.java:400) + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.prepareContext(TomcatServletWebServerFactory.java:258) + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:209) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:183) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:161) + ... 8 common frames omitted +Caused by: java.lang.ClassNotFoundException: javax.servlet.http.HttpServletResponse + at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) + at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) + at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) + ... 14 common frames omitted +15:04:11.929 [main] ERROR o.s.b.w.e.tomcat.TomcatStarter - Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'securityConfig': Unsatisfied dependency expressed through field 'authProvider': Error creating bean with name 'authProvider': Unsatisfied dependency expressed through field 'passwordEncoder': Error creating bean with name 'securityConfig': Requested bean is currently in creation: Is there an unresolvable circular reference? +15:04:12.043 [main] ERROR o.s.b.d.LoggingFailureAnalysisReporter - + +*************************** +APPLICATION FAILED TO START +*************************** + +Description: + +The dependencies of some of the beans in the application context form a cycle: + +┌─────┐ +| securityConfig (field com.bb.config.AuthProvider com.bb.config.SecurityConfig.authProvider) +↑ ↓ +| authProvider (field private org.springframework.security.crypto.password.PasswordEncoder com.bb.config.AuthProvider.passwordEncoder) +└─────┘ + + +Action: + +Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true. + +15:07:42.123 [my-scheduler-task-pool-2] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CashCronController.cashProc(CashCronController.java:50) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:07:42.142 [my-scheduler-task-pool-2] ERROR c.bb.controller.CashCronController - #-cashProc::Exception::org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:07:45.163 [my-scheduler-task-pool-5] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.creditBetProc(CreditCronController.java:67) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:07:45.167 [my-scheduler-task-pool-5] ERROR c.bb.controller.CreditCronController - #-creditBetProc::ERROR::org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:07:48.176 [my-scheduler-task-pool-3] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.batchReport(CommonServiceImpl.java:80) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 61 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 63 common frames omitted +15:07:48.179 [my-scheduler-task-pool-3] ERROR com.bb.service.CommonServiceImpl - org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:07:51.197 [my-scheduler-task-pool-4] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.creditReport(CommonServiceImpl.java:286) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 61 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 63 common frames omitted +15:07:51.200 [my-scheduler-task-pool-4] ERROR com.bb.service.CommonServiceImpl - org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:07:54.210 [my-scheduler-task-pool-1] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.insuredReport(CommonServiceImpl.java:370) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 61 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 63 common frames omitted +15:07:54.212 [my-scheduler-task-pool-1] ERROR com.bb.service.CommonServiceImpl - org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:11:19.697 [my-scheduler-task-pool-4] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.creditReport(CommonServiceImpl.java:286) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 61 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 63 common frames omitted +15:11:19.719 [my-scheduler-task-pool-4] ERROR com.bb.service.CommonServiceImpl - org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:11:24.727 [my-scheduler-task-pool-2] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CashCronController.cashProc(CashCronController.java:50) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:11:24.731 [my-scheduler-task-pool-2] ERROR c.bb.controller.CashCronController - #-cashProc::Exception::org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:11:29.778 [my-scheduler-task-pool-3] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.batchReport(CommonServiceImpl.java:80) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 61 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 63 common frames omitted +15:11:29.781 [my-scheduler-task-pool-3] ERROR com.bb.service.CommonServiceImpl - org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:11:34.845 [my-scheduler-task-pool-5] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.creditBetProc(CreditCronController.java:67) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:11:34.849 [my-scheduler-task-pool-5] ERROR c.bb.controller.CreditCronController - #-creditBetProc::ERROR::org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:11:39.912 [my-scheduler-task-pool-1] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.insuredReport(CommonServiceImpl.java:370) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 61 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 63 common frames omitted +15:11:39.915 [my-scheduler-task-pool-1] ERROR com.bb.service.CommonServiceImpl - org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:11:44.930 [my-scheduler-task-pool-5] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.credit_lion01(CreditCronController.java:716) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at jdk.internal.reflect.GeneratedConstructorAccessor58.newInstance(Unknown Source) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:11:44.933 [my-scheduler-task-pool-5] ERROR c.bb.controller.CreditCronController - ##creditBetProc::lion01::- credit_lion01() => PT_BI_ERROR +15:11:44.935 [my-scheduler-task-pool-5] ERROR c.bb.controller.CreditCronController - ##creditBetProc::lion01org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:11:49.981 [my-scheduler-task-pool-3] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.credit_dubai01(CreditCronController.java:542) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at jdk.internal.reflect.GeneratedConstructorAccessor58.newInstance(Unknown Source) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:11:49.984 [my-scheduler-task-pool-3] ERROR c.bb.controller.CreditCronController - ##creditBetProc::dubai01::- credit_dubai01() => PT_BI_ERROR +15:11:49.984 [my-scheduler-task-pool-3] ERROR c.bb.controller.CreditCronController - ##creditBetProc::dubai01org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:11:55.022 [my-scheduler-task-pool-2] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.credit_sclass01(CreditCronController.java:687) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at jdk.internal.reflect.GeneratedConstructorAccessor58.newInstance(Unknown Source) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:11:55.024 [my-scheduler-task-pool-2] ERROR c.bb.controller.CreditCronController - ##creditBetProc::sclass01::- credit_sclass01() => PT_BI_ERROR +15:11:55.025 [my-scheduler-task-pool-2] ERROR c.bb.controller.CreditCronController - ##creditBetProc::sclass01org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:12:00.122 [my-scheduler-task-pool-4] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.credit_vegas01(CreditCronController.java:455) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at jdk.internal.reflect.GeneratedConstructorAccessor58.newInstance(Unknown Source) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:12:00.124 [my-scheduler-task-pool-4] ERROR c.bb.controller.CreditCronController - ##creditBetProc::vegas01::- credit_vegas01() => PT_BI_ERROR +15:12:00.124 [my-scheduler-task-pool-4] ERROR c.bb.controller.CreditCronController - ##creditBetProc::vegas01org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:12:05.171 [my-scheduler-task-pool-2] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.credit_coco011(CreditCronController.java:513) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at jdk.internal.reflect.GeneratedConstructorAccessor58.newInstance(Unknown Source) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:12:05.173 [my-scheduler-task-pool-2] ERROR c.bb.controller.CreditCronController - ##creditBetProc::coco011::- credit_coco011() => PT_BI_ERROR +15:12:05.174 [my-scheduler-task-pool-2] ERROR c.bb.controller.CreditCronController - ##creditBetProc::coco011org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:12:10.278 [my-scheduler-task-pool-3] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.credit_theking01(CreditCronController.java:484) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at jdk.internal.reflect.GeneratedConstructorAccessor58.newInstance(Unknown Source) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:12:10.283 [my-scheduler-task-pool-3] ERROR c.bb.controller.CreditCronController - ##creditBetProc::theking01::- credit_theking01() => PT_BI_ERROR +15:12:10.286 [my-scheduler-task-pool-3] ERROR c.bb.controller.CreditCronController - ##creditBetProc::theking01org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:12:13.156 [my-scheduler-task-pool-5] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.credit_mario01(CreditCronController.java:629) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at jdk.internal.reflect.GeneratedConstructorAccessor58.newInstance(Unknown Source) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:12:13.159 [my-scheduler-task-pool-5] ERROR c.bb.controller.CreditCronController - ##creditBetProc::mario01::- credit_mario01() => PT_BI_ERROR +15:12:13.161 [my-scheduler-task-pool-5] ERROR c.bb.controller.CreditCronController - ##creditBetProc::mario01org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:12:16.175 [my-scheduler-task-pool-1] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.credit_salt01(CreditCronController.java:600) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at jdk.internal.reflect.GeneratedConstructorAccessor58.newInstance(Unknown Source) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:12:16.179 [my-scheduler-task-pool-1] ERROR c.bb.controller.CreditCronController - ##creditBetProc::salt01::- credit_salt01() => PT_BI_ERROR +15:12:16.180 [my-scheduler-task-pool-1] ERROR c.bb.controller.CreditCronController - ##creditBetProc::salt01org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:12:19.188 [my-scheduler-task-pool-3] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.credit_mvp001(CreditCronController.java:891) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at jdk.internal.reflect.GeneratedConstructorAccessor58.newInstance(Unknown Source) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:12:19.191 [my-scheduler-task-pool-3] ERROR c.bb.controller.CreditCronController - ##creditBetProc::mvp001::- credit_mvp001() => PT_BI_ERROR +15:12:19.193 [my-scheduler-task-pool-3] ERROR c.bb.controller.CreditCronController - ##creditBetProc::mvp001org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:12:22.220 [my-scheduler-task-pool-2] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.credit_pocari(CreditCronController.java:658) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at jdk.internal.reflect.GeneratedConstructorAccessor58.newInstance(Unknown Source) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:12:22.223 [my-scheduler-task-pool-2] ERROR c.bb.controller.CreditCronController - ##creditBetProc::pocari::- credit_pocari() => PT_BI_ERROR +15:12:22.224 [my-scheduler-task-pool-2] ERROR c.bb.controller.CreditCronController - ##creditBetProc::pocariorg.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +15:12:25.273 [my-scheduler-task-pool-4] ERROR com.zaxxer.hikari.pool.HikariPool - hikari-cp - Exception during pool initialization. +java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:895) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:820) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:446) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:77) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:64) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) + at com.bb.dao.CommonDaoImpl.getServerCronStatus(CommonDaoImpl.java:533) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:752) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) + at com.bb.dao.CommonDaoImpl$$SpringCGLIB$$0.getServerCronStatus() + at com.bb.service.CommonServiceImpl.getServerCronStatus(CommonServiceImpl.java:834) + at com.bb.controller.CreditCronController.credit_tiger011(CreditCronController.java:571) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:833) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at jdk.internal.reflect.GeneratedConstructorAccessor58.newInstance(Unknown Source) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) + at com.mysql.cj.NativeSession.connect(NativeSession.java:121) + at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:839) + ... 62 common frames omitted +Caused by: java.net.ConnectException: Connection refused: no further information + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) + ... 64 common frames omitted +15:12:25.276 [my-scheduler-task-pool-4] ERROR c.bb.controller.CreditCronController - ##creditBetProc::tiger011::- credit_tiger011() => PT_BI_ERROR +15:12:25.277 [my-scheduler-task-pool-4] ERROR c.bb.controller.CreditCronController - ##creditBetProc::tiger011org.mybatis.spring.MyBatisSystemException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection +### The error may exist in file [C:\Users\shandi\Documents\workspace-spring-tool-suite-4-4.17.1.RELEASE\new_apiServer_oms\target\classes\db1\CODE.xml] +### The error may involve com.bb.dao.CommonDao.getServerCronStatus +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection diff --git a/jenkinsfile b/jenkinsfile new file mode 100644 index 0000000..ed9cee1 --- /dev/null +++ b/jenkinsfile @@ -0,0 +1,90 @@ +pipeline { + agent any + + environment { + JAVA_HOME = '/var/lib/jenkins/tools/openjdk17' + MAVEN_HOME = '/usr/share/maven' + PATH = "${MAVEN_HOME}/bin:${JAVA_HOME}/bin:${PATH}" + APP_NAME = 'oms' + VERSION = '0.0.1-SNAPSHOT' + JAR_FILE = "target/oms.jar" + AWS_SERVER = '54.179.159.145' + AWS_USER = 'root' + DEPLOY_PATH = '/home/build' // 빌드 산출물 업로드 경로 + RUN_PATH = '/home/run' // 실행 경로 + } + + stages { + stage('Checkout') { + steps { + checkout scm + } + } + + stage('Build') { + steps { + sh 'echo "Building application..."' + script { + def mvnHome = tool 'maven' + sh "${mvnHome}/bin/mvn clean package -Pdev -DskipTests -Dspring.profiles.active=dev" + } + } + } + + stage('Archive Artifacts') { + steps { + sh 'echo "Checking JAR file..."' + sh 'ls -la target/' + sh 'ls -la target/*.jar' + archiveArtifacts artifacts: 'target/*.jar', fingerprint: true + } + } + + stage('Deploy to AWS') { + steps { + script { + // 실제 빌드된 JAR 파일 찾기 + def jarFiles = sh( + script: 'find target -name "*.jar" -not -name "*-sources.jar" -not -name "*-javadoc.jar" | head -1', + returnStdout: true + ).trim() + + if (!jarFiles) { + error "JAR 파일을 찾을 수 없습니다." + } + + def actualJarFile = jarFiles.split('\n')[0] + echo "실제 JAR 파일: ${actualJarFile}" + + withCredentials([sshUserPrivateKey(credentialsId: 'coreserver', keyFileVariable: 'SSH_KEY')]) { + sh """ + echo "Deploying to AWS server..." + chmod +x deploy-aws.sh + ./deploy-aws.sh ${AWS_SERVER} ${AWS_USER} "\${SSH_KEY}" ${actualJarFile} ${DEPLOY_PATH} + echo "Uploading and running runApi.sh..." + chmod +x runApi.sh + scp -i "\${SSH_KEY}" runApi.sh ${AWS_USER}@${AWS_SERVER}:${RUN_PATH}/runApi.sh + ssh -i "\${SSH_KEY}" ${AWS_USER}@${AWS_SERVER} "chmod +x ${RUN_PATH}/runApi.sh && JAR_NAME=\$(basename ${actualJarFile}) BUILD_DIR=${DEPLOY_PATH} RUN_DIR=${RUN_PATH} ${RUN_PATH}/runApi.sh" + """ + } + } + } + } + } + + post { + success { + echo 'Pipeline succeeded!' + // 슬랙 알림 등 추가 가능 + } + failure { + echo 'Pipeline failed!' + // 실패 알림 등 추가 가능 + } + always { + // 빌드 결과 정리 + sh 'echo "Build completed"' + } + } +} + diff --git a/jenkinsfile2 b/jenkinsfile2 new file mode 100644 index 0000000..1c9564c --- /dev/null +++ b/jenkinsfile2 @@ -0,0 +1,90 @@ +pipeline { + agent any + + environment { + JAVA_HOME = '/var/lib/jenkins/tools/openjdk17' + MAVEN_HOME = '/usr/share/maven' + PATH = "${MAVEN_HOME}/bin:${JAVA_HOME}/bin:${PATH}" + APP_NAME = 'oms' + VERSION = '0.0.1-SNAPSHOT' + JAR_FILE = "target/oms.jar" + AWS_SERVER = '47.128.247.197' + AWS_USER = 'rocky' + DEPLOY_PATH = '/home/build' // 빌드 산출물 업로드 경로 + RUN_PATH = '/home/run' // 실행 경로 + } + + stages { + stage('Checkout') { + steps { + checkout scm + } + } + + stage('Build') { + steps { + sh 'echo "Building application..."' + script { + def mvnHome = tool 'maven' + sh "${mvnHome}/bin/mvn clean package -Pdev -DskipTests -Dspring.profiles.active=dev" + } + } + } + + stage('Archive Artifacts') { + steps { + sh 'echo "Checking JAR file..."' + sh 'ls -la target/' + sh 'ls -la target/*.jar' + archiveArtifacts artifacts: 'target/*.jar', fingerprint: true + } + } + + stage('Deploy to AWS') { + steps { + script { + // 실제 빌드된 JAR 파일 찾기 + def jarFiles = sh( + script: 'find target -name "*.jar" -not -name "*-sources.jar" -not -name "*-javadoc.jar" | head -1', + returnStdout: true + ).trim() + + if (!jarFiles) { + error "JAR 파일을 찾을 수 없습니다." + } + + def actualJarFile = jarFiles.split('\n')[0] + echo "실제 JAR 파일: ${actualJarFile}" + + withCredentials([sshUserPrivateKey(credentialsId: 'coreserver2', keyFileVariable: 'SSH_KEY')]) { + sh """ + echo "Deploying to AWS server..." + chmod +x deploy-aws2.sh + ./deploy-aws2.sh ${AWS_SERVER} ${AWS_USER} "\${SSH_KEY}" ${actualJarFile} ${DEPLOY_PATH} + echo "Uploading and running runApi.sh..." + chmod +x runApi.sh + scp -i "\${SSH_KEY}" runApi.sh ${AWS_USER}@${AWS_SERVER}:/home/${AWS_USER}/temp_runApi.sh + ssh -i "\${SSH_KEY}" ${AWS_USER}@${AWS_SERVER} "sudo -i bash -c 'mv /home/${AWS_USER}/temp_runApi.sh ${RUN_PATH}/runApi.sh && chmod +x ${RUN_PATH}/runApi.sh && JAR_NAME=\$(basename ${actualJarFile}) BUILD_DIR=${DEPLOY_PATH} RUN_DIR=${RUN_PATH} ${RUN_PATH}/runApi.sh'" + """ + } + } + } + } + } + + post { + success { + echo 'Pipeline succeeded!' + // 슬랙 알림 등 추가 가능 + } + failure { + echo 'Pipeline failed!' + // 실패 알림 등 추가 가능 + } + always { + // 빌드 결과 정리 + sh 'echo "Build completed"' + } + } +} + diff --git a/mvnw b/mvnw new file mode 100644 index 0000000..a16b543 --- /dev/null +++ b/mvnw @@ -0,0 +1,310 @@ +#!/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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# 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 /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 + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -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 "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; 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="`which 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 + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# 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/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# 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. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +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 "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -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 + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..c8d4337 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,182 @@ +@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 Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@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 "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\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 DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_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 DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_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('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@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 "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\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% + +exit /B %ERROR_CODE% diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..9b56630 --- /dev/null +++ b/pom.xml @@ -0,0 +1,284 @@ + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.0.0 + + + com.example + apiServer + 0.0.1-SNAPSHOT + newApiServer + Demo project for Spring Boot + + real + 17 + 17 + 17 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-websocket + + + org.springframework.boot + spring-boot-starter-jdbc + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 3.0.4 + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework + spring-core + 6.0.12 + + + jakarta.validation + jakarta.validation-api + 3.0.0 + + + org.thymeleaf + thymeleaf + + + nz.net.ultraq.thymeleaf + thymeleaf-layout-dialect + + + org.springframework.session + spring-session-core + + + mysql + mysql-connector-java + 8.0.33 + runtime + + + org.mariadb.jdbc + mariadb-java-client + runtime + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.projectlombok + lombok + 1.18.30 + provided + + + org.springframework.boot + spring-boot-starter-webflux + + + + io.jsonwebtoken + jjwt-api + 0.11.2 + + + io.jsonwebtoken + jjwt-impl + 0.11.2 + runtime + + + io.jsonwebtoken + jjwt-jackson + 0.11.2 + runtime + + + io.jsonwebtoken + jjwt-gson + 0.11.2 + + + javax.xml.bind + jaxb-api + 2.3.1 + + + com.sun.xml.bind + jaxb-core + 2.3.0.1 + + + com.sun.xml.bind + jaxb-impl + 2.3.1 + + + org.springdoc + springdoc-openapi-ui + 1.5.4 + + + org.json + json + 20230227 + + + net.sf.json-lib + json-lib + 2.4 + jdk15 + + + org.jsoup + jsoup + 1.14.3 + + + org.apache.httpcomponents + httpclient + 4.5.13 + + + org.apache.httpcomponents.client5 + httpclient5 + 5.4.2 + + + com.squareup.okhttp3 + okhttp + 4.11.0 + + + org.springframework.boot + spring-boot-starter-actuator + 3.1.4 + + + io.micrometer + micrometer-registry-prometheus + runtime + + + com.warrenstrange + googleauth + 1.5.0 + + + org.codehaus.jettison + jettison + 1.4.1 + + + org.apache.httpcomponents.client5 + httpclient5 + 5.3.1 + + + org.webjars + webjars-locator-core + 0.46 + + + io.github.classgraph + classgraph + 4.8.90 + + + + + commons-io + commons-io + 2.11.0 + + + org.springframework + spring-messaging + 6.0.12 + + + org.springframework.integration + spring-integration-security + + + org.springframework.integration + spring-integration-stomp + + + org.springframework.integration + spring-integration-websocket + + + jakarta.servlet + jakarta.servlet-api + 6.0.0 + provided + + + + io.netty + netty-tcnative-boringssl-static + 2.0.61.Final + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + ${repackage.classifier} + + + + + + + spring-releases + Spring Releases + https://repo.spring.io/release + + + + + spring-releases + Spring Releases + https://repo.spring.io/release + + false + + + + \ No newline at end of file diff --git a/runApi.sh b/runApi.sh new file mode 100644 index 0000000..3adc8eb --- /dev/null +++ b/runApi.sh @@ -0,0 +1,108 @@ +#!/bin/bash + +# API 서버 배포 및 실행 스크립트 +# 사용법: sudo ./runApi.sh +# 필요한 경로/파일이 다를 경우 아래 변수만 수정하세요. + +set -euo pipefail + +JAR_NAME="${JAR_NAME:-apiServer-0.0.1-SNAPSHOT.jar}" +PID_FILE="${PID_FILE:-/home/api.pid}" +RUN_DIR="${RUN_DIR:-/home/run}" +BUILD_DIR="${BUILD_DIR:-/home/build}" +BACKUP_DIR="${BACKUP_DIR:-/home/backup}" +JAVA_BIN="${JAVA_BIN:-/home/openjdk17/bin/java}" +# SCOUTER_AGENT="${SCOUTER_AGENT:-/home/scouter/agent.java/scouter.agent.jar}" +# SCOUTER_CONF="${SCOUTER_CONF:-/home/scouter/agent.java/conf/scouter.conf}" +SPRING_PROFILE="${SPRING_PROFILE:-real}" + +timestamp() { + date +"%Y%m%d_%H%M%S" +} + +log() { + echo "[runApi] $*" +} + +ensure_paths() { + mkdir -p "$RUN_DIR" "$BACKUP_DIR" "$BUILD_DIR" +} + +stop_app() { + if [[ -f "$PID_FILE" ]]; then + local pid + pid=$(cat "$PID_FILE" 2>/dev/null || true) + if [[ -n "${pid:-}" ]] && ps -p "$pid" > /dev/null 2>&1; then + log "기존 프로세스 종료: $pid" + kill -9 "$pid" || true + else + log "PID 파일은 있으나 실행 중인 프로세스가 없습니다." + fi + rm -f "$PID_FILE" + else + log "종료할 PID 파일이 없습니다." + fi +} + +backup_old() { + local current="$RUN_DIR/$JAR_NAME" + if [[ -f "$current" ]]; then + local backup="$BACKUP_DIR/oldApi_$(timestamp).jar" + log "기존 JAR 백업 -> $backup" + mv "$current" "$backup" + else + log "백업할 기존 JAR이 없습니다." + fi +} + +copy_new() { + local source="$BUILD_DIR/$JAR_NAME" + local target="$RUN_DIR/$JAR_NAME" + + # 소스와 타겟이 같으면 복사 불필요 + if [[ "$source" == "$target" ]]; then + if [[ -f "$target" ]]; then + log "배포된 JAR 확인 -> $target" + return 0 + else + log "새 JAR을 찾을 수 없습니다: $target" + exit 1 + fi + fi + + if [[ ! -f "$source" ]]; then + log "새 JAR을 찾을 수 없습니다: $source" + exit 1 + fi + + log "새 JAR 복사 -> $target" + cp "$source" "$target" +} + +start_app() { + local target="$RUN_DIR/$JAR_NAME" + log "애플리케이션 시작" + local log_dir="${LOG_DIR:-/home/log/core}" + local log_file="${LOG_FILE:-$log_dir/apiServer.log}" + mkdir -p "$log_dir" + + nohup "$JAVA_BIN" \ + -Duser.timezone=GMT+09:00 \ + -Dspring.profiles.active="$SPRING_PROFILE" \ + -jar "$target" \ + >> "$log_file" 2>&1 & + echo $! > "$PID_FILE" + log "시작 완료 (PID: $(cat "$PID_FILE"))" +} + +main() { + ensure_paths + stop_app + backup_old + copy_new + start_app + log "배포 완료" +} + +main "$@" + diff --git a/src/main/java/com/bb/ApiServerApplication.java b/src/main/java/com/bb/ApiServerApplication.java new file mode 100644 index 0000000..765e7c1 --- /dev/null +++ b/src/main/java/com/bb/ApiServerApplication.java @@ -0,0 +1,20 @@ +package com.bb; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; + +@EnableAsync +@ServletComponentScan(basePackages = {"com.bb.config"}) +@SpringBootApplication +@EnableScheduling +public class ApiServerApplication { + + public static void main(String[] args) { + System.out.println(" >>> Using Java Version: " + System.getProperty("java.version")); + SpringApplication.run(ApiServerApplication.class, args); + } + +} diff --git a/src/main/java/com/bb/admin/controller/AdminApiBetController.java b/src/main/java/com/bb/admin/controller/AdminApiBetController.java new file mode 100644 index 0000000..fa6d6ae --- /dev/null +++ b/src/main/java/com/bb/admin/controller/AdminApiBetController.java @@ -0,0 +1,806 @@ +package com.bb.admin.controller; + +import java.net.SocketTimeoutException; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.apache.http.conn.ConnectTimeoutException; +import org.codehaus.jettison.json.JSONObject; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.ResourceAccessException; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.AdminBetSearch; +import com.bb.model.ApiResponse; +import com.bb.model.ApiVendorCompInfo; +import com.bb.model.BetDetail; +import com.bb.model.BetSearch; +import com.bb.model.BetSplusSearch; +import com.bb.model.GameUseInfo; +import com.bb.model.PageFormVO; +import com.bb.model.Site; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; +import com.bb.model.TrxSearchVO; +import com.bb.service.BetService; +import com.bb.service.CommonService; +import com.bb.service.TripleService; +import com.bb.service.UserService; +import com.bb.util.PagingUtil; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + + +@RestController +@Slf4j +@RequestMapping("/api/admin/bet") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class AdminApiBetController { + + private final UserService userService; + + private final BetService betService; + + private final TripleService tripleService; + + private final CommonService commonService; + + private final JwtManager jwtManager; + + private static final long serialVersionUID = 1L; + private static NumberFormat formatter = new DecimalFormat("#0.00"); + + @ResponseBody + @PostMapping(value={"/gameUseUpdate"}) + public ApiResponse gameUseInfo(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody GameUseInfo gui) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + gui.setSiteId(tokenInfo.getSid()); + userService.gameUseUpdate(gui); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/gameUse"}) + public ApiResponse gameUse(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody GameUseInfo gui) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + gui.setSiteId(tokenInfo.getSid()); + + List gameuseList = userService.gameUseList(gui); + + apiResponse.put("list", gameuseList); + + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/betlist") + public ApiResponse betlist( @RequestHeader String token, HttpServletRequest request, @RequestBody BetSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + final String LOG_PREFIX = "#-ADMIN::betlist::"+tokenInfo.getSid()+":::"; + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + search.setBlankSpinSetType(siteOption.getBlankSpinSetType()); + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + if(search.getIdType() == null || search.getIdType().equals("")) { + search.setIdType("NORMAL"); + } + + if(search.getIdType().equals("PTN")) { + search.setRecommenderId(search.getMemId()); + search.setMemId(null); + } else { + search.setRecommenderId(null); + } + + if(search.getOrderColumn() == null || search.getOrderColumn().equals("")) { + if(search.getOldYn().equals("N")) { + search.setOrderColumn("betIdx"); + } + } + + if(search.getOrderType() == null || search.getOrderType().equals("")) { + if(search.getOldYn().equals("N")) { + search.setOrderType("DESC"); + } + } + + if(search.getIsBlankSpinYn() == null) { + search.setIsBlankSpinYn(""); + } + if(!search.getIsBlankSpinYn().equals("Y")) { + search.setIsBlankSpinYn(""); + } + + ObjectMapper objectMapper = new ObjectMapper(); + String reqJsonStr = objectMapper.writeValueAsString(search); + JSONObject reqObj = new JSONObject(reqJsonStr); + log.info(LOG_PREFIX+ "Request {}", reqObj); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = betService.getBetListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + List betList = betService.getBetList(search); + + apiResponse.put("list", betList); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/betlistNew") + public ApiResponse betlistNew( @RequestHeader String token, HttpServletRequest request, @RequestBody AdminBetSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + final String LOG_PREFIX = "#-ADMIN::betlist::"+tokenInfo.getSid()+":::"; + + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + if(search.getIdType() == null || search.getIdType().equals("")) { + search.setIdType("NORMAL"); + } + + search.setOrderColumn("regDate"); + if(search.getOrderType() == null || search.getOrderType().equals("")) { + search.setOrderType("DESC"); + } + + if(search.getIsBlankSpinYn() == null) { + search.setIsBlankSpinYn(""); + } + if(!search.getIsBlankSpinYn().equals("Y")) { + search.setIsBlankSpinYn(""); + } + + if(search.getStartDate() != null && !search.getStartDate().equals("")) { + String startDate = search.getStartDate() + ".000"; + search.setStartDate(startDate); + } + if(search.getEndDate() != null && !search.getEndDate().equals("")) { + String endDate = search.getEndDate() + ".999"; + search.setEndDate(endDate); + } + + ObjectMapper objectMapper = new ObjectMapper(); + String reqJsonStr = objectMapper.writeValueAsString(search); + JSONObject reqObj = new JSONObject(reqJsonStr); + log.info(LOG_PREFIX+ "Request {}", reqObj); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = betService.getFastBetIdListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + List> betIdList = betService.getFastBetIdList(search); + List> betList = new ArrayList>(); + for(HashMap item : betIdList) { + item.put("oldYn", search.getOldYn()); + HashMap betItem = betService.getFastBetItem(item); + betList.add(betItem); + } + + apiResponse.put("list", betList); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/betWinList") + public ApiResponse betWinList( @RequestHeader String token, HttpServletRequest request, @RequestBody AdminBetSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + final String LOG_PREFIX = "#-ADMIN::betlist::"+tokenInfo.getSid()+":::"; + + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + if(search.getIdType() == null || search.getIdType().equals("")) { + search.setIdType("NORMAL"); + } + + if(search.getOrderColumn() == null || search.getOrderColumn().equals("")) { + search.setOrderColumn("betAmt"); + } + + if(search.getOrderType() == null || search.getOrderType().equals("")) { + search.setOrderType("DESC"); + } + + if(search.getIsBlankSpinYn() == null) { + search.setIsBlankSpinYn(""); + } + if(!search.getIsBlankSpinYn().equals("Y")) { + search.setIsBlankSpinYn(""); + } + + if(search.getStartDate() != null && !search.getStartDate().equals("")) { + String startDate = search.getStartDate() + ".000"; + search.setStartDate(startDate); + } + if(search.getEndDate() != null && !search.getEndDate().equals("")) { + String endDate = search.getEndDate() + ".999"; + search.setEndDate(endDate); + } + + ObjectMapper objectMapper = new ObjectMapper(); + String reqJsonStr = objectMapper.writeValueAsString(search); + JSONObject reqObj = new JSONObject(reqJsonStr); + log.info(LOG_PREFIX+ "Request {}", reqObj); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = betService.getBetListNewCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + List betList = betService.getBetListNew(search); + + apiResponse.put("list", betList); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/sportBetlist") + public ApiResponse sportBetlist( @RequestHeader String token, HttpServletRequest request, @RequestBody BetSplusSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = betService.getSportBetListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + List betList = betService.getSportBetList(search); + apiResponse.put("list", betList); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/sportEventlist") + public ApiResponse sportEventlist( @RequestHeader String token, HttpServletRequest request, @RequestBody BetSplusSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = betService.getSportEventListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + List betList = betService.getSportEventList(search); + + apiResponse.put("list", betList); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/sportEventDetaillist") + public ApiResponse sportEventDetaillist( @RequestHeader String token, HttpServletRequest request, @RequestBody BetSplusSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = betService.getSportEventDetailListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + List betList = betService.getSportEventDetailList(search); + + apiResponse.put("list", betList); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/betDetail") + public ApiResponse betDetail( @RequestHeader String token, HttpServletRequest request, @RequestBody BetSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + String betType = betService.getBetType(search.getBetId()); + + String detail = ""; + if(betType.equals("triple")) { + HashMap param = new HashMap(); + param.put("siteId", tokenInfo.getSid()); + param.put("apiVendorCode", betType); + ApiVendorCompInfo vendorCompInfo = userService.getApiVendorCompInfo(param); + if(vendorCompInfo != null) { + detail = tripleService.getBetDetail(vendorCompInfo, search.getBetId()); + } + log.info("triple bet detail: " + detail); + } else { + log.info("not found bet detail"); + } + + apiResponse.put("detail", detail); + apiResponse.success(); + + } catch (ResourceAccessException rae) { + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error("[ConnectTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("ConnectTimeoutException"); + } + + if(rae.getCause() instanceof SocketTimeoutException) { + log.error("[SocketTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("SocketTimeoutException"); + } + + if(rae.getCause() instanceof InterruptedException) { + log.error("[InterruptedException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("InterruptedException"); + } + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/betDetailTest") + public ApiResponse betDetailTest( @RequestHeader String token, HttpServletRequest request, @RequestBody BetSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + String betType = betService.getBetType(search.getBetId()); + + String detail = ""; + if(betType.equals("triple")) { + HashMap param = new HashMap(); + param.put("siteId", tokenInfo.getSid()); + param.put("apiVendorCode", betType); + ApiVendorCompInfo vendorCompInfo = userService.getApiVendorCompInfo(param); + if(vendorCompInfo != null) { + detail = tripleService.getBetDetailTest(vendorCompInfo, search.getBetId()); + } + log.info("triple bet detail: " + detail); + } else { + log.info("not found bet detail"); + } + + apiResponse.put("detail", detail); + apiResponse.success(); + + } catch (ResourceAccessException rae) { + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error("[ConnectTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("ConnectTimeoutException"); + } + + if(rae.getCause() instanceof SocketTimeoutException) { + log.error("[SocketTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("SocketTimeoutException"); + } + + if(rae.getCause() instanceof InterruptedException) { + log.error("[InterruptedException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("InterruptedException"); + } + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/trxlist") + public ApiResponse trxlist(@RequestHeader String token, HttpServletRequest request, @RequestBody TrxSearchVO searchVO) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(searchVO.getMemId()==null || searchVO.getMemId().equals("")) { + if(searchVO.getBetId()==null || searchVO.getBetId().equals("")) { + throw new ApiException("TX99", "유저ID 또는 배팅ID를 입력 후 검색하세요."); + } + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + searchVO.setSiteId(tokenInfo.getSid()); + + if(searchVO.getOldYn() == null || searchVO.getOldYn().equals("")) { + searchVO.setOldYn("N"); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + searchVO); + + PageFormVO pageVo= new PageFormVO(); + if(searchVO.getPage()==0) searchVO.setPage(1); + + int totalCount = betService.getTrxListCnt(searchVO); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(searchVO.getPage()); + commonForm.setCount_per_page(20); + if(searchVO.getCount_per_list()==0) { + commonForm.setCount_per_list(30); + } else { + commonForm.setCount_per_list(searchVO.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + searchVO.setLimit(pageVo.getLimit()); + searchVO.setOffset(pageVo.getOffset()); + searchVO.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + List> betList = betService.getTrxList(searchVO); + + apiResponse.put("list", betList); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + private Site getSiteByCheck(HttpServletRequest request) { + Site site = userService.getSiteInfoByKey(request.getHeader("Authorization").toString()); + return site; + } +} diff --git a/src/main/java/com/bb/admin/controller/AdminApiBoardController.java b/src/main/java/com/bb/admin/controller/AdminApiBoardController.java new file mode 100644 index 0000000..f80ca76 --- /dev/null +++ b/src/main/java/com/bb/admin/controller/AdminApiBoardController.java @@ -0,0 +1,919 @@ +package com.bb.admin.controller; + +import java.util.HashMap; +import java.util.List; + +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.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.AnswerVo; +import com.bb.model.ApiResponse; +import com.bb.model.Board; +import com.bb.model.BoardListSearch; +import com.bb.model.Code; +import com.bb.model.CodeSearch; +import com.bb.model.Comment; +import com.bb.model.Message; +import com.bb.model.MessageListSearch; +import com.bb.model.PageFormVO; +import com.bb.model.Site; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; +import com.bb.service.BoardService; +import com.bb.service.CommonService; +import com.bb.service.UserService; +import com.bb.util.IPKit; +import com.bb.util.PagingUtil; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +@RestController +@Slf4j +@RequestMapping("/api/admin/board") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class AdminApiBoardController { + + private final BoardService boardService; + + private final UserService userService; + + private final CommonService commonService; + + private final JwtManager jwtManager; + + @ResponseBody + @PostMapping(value = { "/{boardType}/list" }) + public ApiResponse boardList(@RequestHeader String token, HttpServletRequest request, + @PathVariable String boardType, @Valid @RequestBody BoardListSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + String LOG_PREFIX = "#-admin::boardList::"; + + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + final String boardTypeKeyword = "answer|bbs|faq|favor|nt|snt"; + + if (boardType.equals("qna")) { + boardType = "faq"; + } + + if (!boardTypeKeyword.contains(boardType)) { + log.error("[REQUEST: " + request.getRequestURI() + "] Board[" + boardType + "] boardType Error"); + throw new ApiException("BRD02", "boardType Error"); + } + search.setBoardType(boardType); + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + LOG_PREFIX = LOG_PREFIX + tokenInfo.getSid() + ":::"; + search.setSiteId(tokenInfo.getSid()); + + PageFormVO pageVo = new PageFormVO(); + if (search.getPage() == 0) + search.setPage(1); + + log.info(LOG_PREFIX + "[REQUEST: " + request.getRequestURI() + "] " + search); + if (boardType.equals("nt")) { + Board flowBoard = boardService.getSiteFlowBoard(search); + apiResponse.put("flowBoard", flowBoard); + } + + int totalCount = boardService.getBoardListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if (search.getCount_per_list() == 0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + List boardList = boardService.getBoardList(search); + apiResponse.put("list", boardList); + apiResponse.success(); + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = { "/{boardType}/save" }) + public ApiResponse boardSave(@RequestHeader String token, HttpServletRequest request, + @PathVariable String boardType, @Valid @RequestBody Board board) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + String LOG_PREFIX = "#-admin::boardSave::"; + + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + final String boardTypeKeyword = "answer|bbs|faq|favor|nt|snt"; + + if (boardType.equals("qna")) { + boardType = "faq"; + } + + if (!boardTypeKeyword.contains(boardType)) { + log.error("[REQUEST: " + request.getRequestURI() + "] Board[" + boardType + "] boardType Error"); + throw new ApiException("BRD02", "boardType Error"); + } + board.setBoardType(boardType); + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + LOG_PREFIX = LOG_PREFIX + tokenInfo.getSid() + ":::"; + board.setSiteId(tokenInfo.getSid()); + board.setRegId(tokenInfo.getMid()); + + log.info(LOG_PREFIX + "[REQUEST: " + request.getRequestURI() + "] " + board); + if (boardType.equals("snt")) { + board.setTitle(""); + board.setBoardType(boardType); + board.setCategory(""); + board.setIsReadUser("N"); + + BoardListSearch search = new BoardListSearch(); + search.setSiteId(tokenInfo.getSid()); + Board flowBoard = boardService.getSiteFlowBoard(search); + if (flowBoard != null) { + Integer flowBoardIdx = flowBoard.getBoardIdx(); + board.setBoardIdx(flowBoardIdx); + } + } + + int boardIdx = 0; + if (board.getBoardIdx() != null) + boardIdx = board.getBoardIdx(); + int res = boardService.saveBoard(board); + if (boardIdx == 0) + boardIdx = board.getBoardIdx(); + + log.info(LOG_PREFIX + "Board[" + board.getBoardType() + "][" + board.getCategory() + "] Save Result: " + + res); + log.info(LOG_PREFIX + "Board[" + board.getBoardType() + "][" + board.getCategory() + "] Save Result idx: " + + boardIdx); + if (res > 0) { + String boardTypeStr = ""; + if (boardType.equals("nt")) { + boardTypeStr = "공지사항"; + } else if (boardType.equals("bbs")) { + boardTypeStr = "게시판"; + } else if (boardType.equals("faq")) { + boardTypeStr = "문의사항"; + } else if (boardType.equals("favor")) { + boardTypeStr = "자주묻는질문"; + } else if (boardType.equals("answer")) { + boardTypeStr = "faqAnswer"; + } else if (boardType.equals("snt")) { + boardTypeStr = "흐르는 공지"; + } else { + boardTypeStr = boardType; + } + + String crudType = ""; + if (res == 1) + crudType = "등록 처리"; + if (res > 1) + crudType = "수정 처리"; + if (board.getDelYn() != null && board.getDelYn().equals("Y")) + crudType = "삭제 처리"; + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "CREATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", boardIdx + "::" + boardTypeStr + "::관리자::" + crudType); + logParam.put("logDesc", board.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + } + + apiResponse.success(); + + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = { "/{boardType}/deletes" }) + public ApiResponse boardDeletes(@RequestHeader String token, HttpServletRequest request, + @PathVariable String boardType, @RequestBody JSONObject requestBody) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + String LOG_PREFIX = "#-admin::boardDeletes::"; + + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + final String boardTypeKeyword = "answer|bbs|faq|favor|nt|snt"; + + if (boardType.equals("qna")) { + boardType = "faq"; + } + + if (!boardTypeKeyword.contains(boardType)) { + log.error("Board[" + boardType + "] boardType Error"); + throw new ApiException("BRD02", "boardType Error"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + LOG_PREFIX = LOG_PREFIX + tokenInfo.getSid() + ":::"; + log.info(LOG_PREFIX + "[REQUEST] " + requestBody); + + JSONArray boardIdxList = requestBody.getJSONArray("boardIdxList"); + if (boardIdxList == null || boardIdxList.size() == 0) { + log.error("boardIdxList Error"); + throw new ApiException("BRD03", "boardIdxList Error"); + } + + for (int i = 0; i < boardIdxList.size(); i++) { + int boardIdx = boardIdxList.getInt(i); + int res = boardService.deleteYBoard(boardIdx); + } + + String boardTypeStr = ""; + if (boardType.equals("nt")) { + boardTypeStr = "공지사항"; + } else if (boardType.equals("bbs")) { + boardTypeStr = "게시판"; + } else if (boardType.equals("faq")) { + boardTypeStr = "문의사항"; + } else if (boardType.equals("favor")) { + boardTypeStr = "자주묻는질문"; + } else if (boardType.equals("answer")) { + boardTypeStr = "faqAnswer"; + } else if (boardType.equals("snt")) { + boardTypeStr = "흐르는 공지"; + } else { + boardTypeStr = boardType; + } + + String crudType = "일괄삭제 처리"; + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "CREATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", boardTypeStr + "::관리자::" + crudType); + logParam.put("logDesc", boardIdxList.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + apiResponse.success(); + + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = { "/noticeTopChange" }) + public ApiResponse noticeTopChange(@RequestHeader String token, HttpServletRequest request, + @RequestBody Board board) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + board.setSiteId(tokenInfo.getSid()); + board.setRegId(tokenInfo.getSid()); + + log.info("[REQUEST: " + request.getRequestURI() + "] boardIdx: " + board.getBoardIdx()); + Board boardDetail = boardService.getBoard(board); + int boardIdx = boardDetail.getBoardIdx(); + int result = boardService.deleteBoard(boardIdx); + if (result > 0) { + boardDetail.setBoardIdx(null); + log.info("[REQUEST: " + request.getRequestURI() + "] Top Change Board Info: " + boardDetail.toString()); + int res = boardService.saveBoard(boardDetail); + log.info("[REQUEST: " + request.getRequestURI() + "] Top Change Board Result: " + res); + log.info("[REQUEST: " + request.getRequestURI() + "] Top Change Board Result idx: " + + board.getBoardIdx()); + if (res > 0) { + String boardType = boardDetail.getBoardType(); + String boardTypeStr = ""; + if (boardType.equals("nt")) { + boardTypeStr = "공지사항"; + } else if (boardType.equals("bbs")) { + boardTypeStr = "게시판"; + } else if (boardType.equals("faq")) { + boardTypeStr = "문의사항"; + } else if (boardType.equals("favor")) { + boardTypeStr = "자주묻는질문"; + } else if (boardType.equals("answer")) { + boardTypeStr = "faqAnswer"; + } else if (boardType.equals("snt")) { + boardTypeStr = "흐르는 공지"; + } else { + boardTypeStr = boardType; + } + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "CREATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", board.getBoardIdx() + "::" + boardTypeStr + "::최상위로 변경처리"); + logParam.put("logDesc", board.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + } + } + + apiResponse.success(); + + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = { "/viewYn" }) + public ApiResponse viewYn(@RequestHeader String token, HttpServletRequest request, @RequestBody Board board) + throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + board.setSiteId(tokenInfo.getSid()); + board.setRegId(tokenInfo.getSid()); + + if (board.getBoardIdx() == null) { + throw new ApiException("1000", "accessDinied"); + } + + if (board.getViewYn() == null && board.getViewYn().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + log.info("[REQUEST: " + request.getRequestURI() + "] boardIdx: " + board.getBoardIdx() + ", viewYn: " + + board.getViewYn()); + int result = boardService.setBoardViewYn(board); + log.info("[REQUEST: " + request.getRequestURI() + "] setBoardViewYn() result: " + result); + + apiResponse.success(); + + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = { "/cmtSsave" }) + public ApiResponse cmtsave(@RequestHeader String token, HttpServletRequest request, + @Valid @RequestBody Comment comment) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + comment.setRegId(tokenInfo.getSid()); + final String LOG_PREFIX = "#-admin::cmtSsave::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + ObjectMapper objectMapper = new ObjectMapper(); + String reqJson = objectMapper.writeValueAsString(comment); + log.info(LOG_PREFIX+ "Request Comment::" + reqJson); + + int res = boardService.saveCmt(comment); + + SiteSearch siteSearch = new SiteSearch(); + siteSearch.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(siteSearch); + String alarmQnaYn = siteOption.getAlarmQnaYn(); + + if("Y".equals(alarmQnaYn)) { + log.info(LOG_PREFIX+ "Send to message!!"); + // 답변달고 쪽지 알림 보내기 + int boardIdx = comment.getBoardIdx(); + Board param = new Board(); + param.setBoardIdx(boardIdx); + Board boardDetail = boardService.getBoard(param); + String memId = boardDetail.getRegId(); + String memNick = boardDetail.getMemNick(); + String msgTitle = "\""+memNick+"\"님 1:1 문의 답변 알림입니다."; + + StringBuilder msgDesc = new StringBuilder(); + msgDesc.append("\""+memNick+"\"의 문의에 답변이 완료되었습니다.\r\n"); + msgDesc.append("[문의 제목] \""+boardDetail.getTitle()+"\" \r\n"); + msgDesc.append("문의 내역에서 답변을 확인해주세요."); + + Message message = new Message(); + message.setSiteId(tokenInfo.getSid()); + message.setRegId(tokenInfo.getMid()); + message.setMsgType("msg"); + message.setRecieveId(memId); + message.setMsgTitle(msgTitle); + message.setMsgDesc(msgDesc.toString()); + message.setHiddenYn("N"); + message.setTargetType("member"); + log.info(LOG_PREFIX+ "Create Message : " + message.toString()); + boardService.msgSend(message); + } + + apiResponse.success(); + + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = { "/{boardType}/datail" }) + public ApiResponse datail(@RequestHeader String token, HttpServletRequest request, @PathVariable String boardType, + @Valid @RequestBody Board board) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + String LOG_PREFIX = "#-admin::boardDatail::"; + + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + final String boardTypeKeyword = "answer|bbs|faq|favor|nt|snt"; + + if (boardType.equals("qna")) { + boardType = "faq"; + } + + if (!boardTypeKeyword.contains(boardType)) { + log.error("[REQUEST: " + request.getRequestURI() + "] Board[" + boardType + "] boardType Error"); + throw new ApiException("BRD02", "boardType Error"); + } + board.setBoardType(boardType); + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + LOG_PREFIX = LOG_PREFIX + tokenInfo.getSid() + ":::"; + board.setSiteId(tokenInfo.getSid()); + + log.info(LOG_PREFIX + "[REQUEST: " + request.getRequestURI() + "] " + board); + + Board boardDetail = boardService.getBoard(board); + if ("faq".equals(boardDetail.getBoardType())) { + boardService.adminRead(boardDetail); + } + apiResponse.put("board", boardDetail); + apiResponse.success(); + + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = { "/category" }) + public ApiResponse category(@RequestHeader String token, HttpServletRequest request, + @Valid @RequestBody CodeSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setMasterCode("category"); + search.setGroupCode("ctgy"); + // search. + + log.info("[REQUEST: " + request.getRequestURI() + "] " + search); + + List codeList = commonService.getCodeList(search); + apiResponse.put("codes", codeList); + apiResponse.success(); + + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = { "/categorySave" }) + public ApiResponse categorySave(@RequestHeader String token, HttpServletRequest request, + @Valid @RequestBody Code code) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + code.setMasterCode("category"); + code.setGroupCode("ctgy"); + + log.info("[REQUEST: " + request.getRequestURI() + "] " + code); + + commonService.insertCode(code); + apiResponse.success(); + + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = { "/msgSend", "/msgUpdate", "/msgHeadSave", "/msgJoinSave" }) + public ApiResponse msgSend(@RequestHeader String token, HttpServletRequest request, + @Valid @RequestBody Message message) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + message.setSiteId(tokenInfo.getSid()); + message.setRegId(tokenInfo.getSid()); + if (request.getRequestURI().indexOf("msgHeadSave") > -1) { + message.setMsgType("head"); + } else if (request.getRequestURI().indexOf("msgJoinSave") > -1) { + message.setMsgType("join"); + } else { + message.setMsgType("msg"); + } + + log.info("[REQUEST: " + request.getRequestURI() + "] " + message); + if (message.getMsgType().equals("msg") && message.getTargetLevel() != null + && !message.getTargetLevel().equals("")) { + // 회원 레벨 별 쪽지전송 + boardService.levelMsgSend(message); + } else { + // 기본 쪽지전송 + boardService.msgSend(message); + } + + apiResponse.success(); + + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = { "/msgList", "/msgHeadList", "/msgJoinList" }) + public ApiResponse msgList(@RequestHeader String token, HttpServletRequest request, + @Valid @RequestBody MessageListSearch search) throws Exception { + log.info("###-KHO-### msgList() \"/msgList\", \"/msgHeadList\", \"/msgJoinList\" call.."); + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + PageFormVO pageVo = new PageFormVO(); + if (search.getPage() == 0) + search.setPage(1); + search.setSiteId(tokenInfo.getSid()); + + log.info("###-KHO-### msgList() request: " + request.getRequestURI()); + if (request.getRequestURI().indexOf("msgHeadList") > -1) { + log.info("###-KHO-### /msgHeadList call.."); + search.setMsgType("head"); + } else if (request.getRequestURI().indexOf("msgJoinList") > -1) { + log.info("###-KHO-### /msgJoinList call.."); + search.setMsgType("join"); + } else { + log.info("###-KHO-### /msgList call.."); + search.setMsgType("msg"); + } + + log.info("[REQUEST: " + request.getRequestURI() + "] " + search); + + int totalCount = boardService.getMsgListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if (search.getCount_per_list() == 0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + List msgList = boardService.getMsgList(search); +// log.info("###-KHO-### msgList: " + msgList); + apiResponse.put("list", msgList); + apiResponse.success(); + + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = { "/partnerMsgSend" }) + public ApiResponse partnerMsgSend(@RequestHeader String token, HttpServletRequest request, + @Valid @RequestBody Message message) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + if (message.getRecieveId() == null || message.getRecieveId().equals("")) { + throw new ApiException("M001", "파트너 아이디를 입력하세요."); + } + if (message.getMsgTitle() == null || message.getMsgTitle().equals("")) { + throw new ApiException("M002", "쪽지 제목을 입력하세요."); + } + if (message.getMsgDesc() == null || message.getMsgDesc().equals("")) { + throw new ApiException("M003", "쪽지 내용을 입력하세요."); + } + + if (message.getHiddenYn() == null || message.getHiddenYn().equals("")) { + message.setHiddenYn("N"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + message.setSiteId(tokenInfo.getSid()); + message.setRegId(tokenInfo.getSid()); + + log.info("[REQUEST: " + request.getRequestURI() + "] " + message); + boardService.partnerMsgSend(message); + apiResponse.success(); + + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = { "/answer/list" }) + public ApiResponse answerList(@RequestHeader String token, HttpServletRequest request, @RequestBody AnswerVo search) + throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: " + request.getRequestURI() + "] " + search); + + List answerList = boardService.getAnswerList(search); + apiResponse.put("list", answerList); + + apiResponse.success(); + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = { "/answer/save" }) + public ApiResponse answerSave(@RequestHeader String token, HttpServletRequest request, @RequestBody AnswerVo answer) + throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + answer.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: " + request.getRequestURI() + "] " + answer); + int res; + + if (answer.getIdx() != null) { + res = boardService.updateAnswer(answer); + } else { + res = boardService.saveAnswer(answer); + } + + if (res > 0) { + apiResponse.success(); + } else { + throw new ApiException("A999", "처리중 문제가 발생했습니다. 관리자에게 문의하세요."); + } + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = { "/answer/delete" }) + public ApiResponse answerDelete(@RequestHeader String token, HttpServletRequest request, + @RequestBody AnswerVo answer) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + answer.setSiteId(tokenInfo.getSid()); + + if (answer.getIdx() == null) { + throw new ApiException("A009", "삭제할 답변을 선택하세요."); + } + + log.info("[REQUEST: " + request.getRequestURI() + "] " + answer); + + int res = boardService.deleteAnswer(answer); + if (res > 0) { + apiResponse.success(); + } else { + throw new ApiException("A999", "처리중 문제가 발생했습니다. 관리자에게 문의하세요."); + } + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + private Site getSiteByCheck(HttpServletRequest request) { + Site site = userService.getSiteInfoByKey(request.getHeader("Authorization").toString()); + return site; + } + +} diff --git a/src/main/java/com/bb/admin/controller/AdminApiCashController.java b/src/main/java/com/bb/admin/controller/AdminApiCashController.java new file mode 100644 index 0000000..e9ed08f --- /dev/null +++ b/src/main/java/com/bb/admin/controller/AdminApiCashController.java @@ -0,0 +1,1158 @@ +package com.bb.admin.controller; + +import static java.time.temporal.ChronoUnit.DAYS; + +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.List; + +import org.apache.http.conn.ConnectTimeoutException; +import org.codehaus.jettison.json.JSONObject; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.ResourceAccessException; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.AdminCashSearch; +import com.bb.model.ApiResponse; +import com.bb.model.CashDetail; +import com.bb.model.CashIn; +import com.bb.model.CashOut; +import com.bb.model.CashSearch; +import com.bb.model.CashStatus; +import com.bb.model.CouponSearch; +import com.bb.model.CouponVO; +import com.bb.model.Member; +import com.bb.model.MemberDetail; +import com.bb.model.Message; +import com.bb.model.PageFormVO; +import com.bb.model.Point; +import com.bb.model.Site; +import com.bb.service.AsyncWowOtcService; +import com.bb.service.BoardService; +import com.bb.service.CashService; +import com.bb.service.CommonService; +import com.bb.service.TripleService; +import com.bb.service.UserService; +import com.bb.util.IPKit; +import com.bb.util.PagingUtil; +import com.bb.util.StringUtils; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@Slf4j +@RequestMapping("/api/admin/cash") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class AdminApiCashController { + + private final UserService userService; + + private final CashService cashService; + + private final CommonService commonService; + + private final BoardService boardService; + + private final TripleService tripleService; + + private final AsyncWowOtcService asyncWowOtcService; + + private final JwtManager jwtManager; + + + @ResponseBody + @PostMapping(value="/list") + public ApiResponse list(@RequestHeader String token, HttpServletRequest request, @RequestBody CashSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + if(search.getStartDate() != null && !search.getStartDate().equals("")) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + LocalDate startDate = LocalDate.parse(search.getStartDate(), formatter); + LocalDate nowDate = LocalDate.now(); + long days = DAYS.between(startDate, nowDate); + log.info("#-admin::cashList::days::"+days); + if(days >= 4) { + search.setOldYn("Y"); + } + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + search.setIsFront("N"); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + if(search.getCashType() == null || "".equals(search.getCashType())) { + search.setCashType("in"); + } + + if("in".equals(search.getCashType())) { + search.setCashType("1"); + } + + if("out".equals(search.getCashType())) { + search.setCashType("-1"); + } + + if(search.getUserType() == null) { + search.setUserType(""); // 전체 검색 + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + int totalCount = cashService.getCashListCnt(search); + + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + List cashList = cashService.getCashList(search); + HashMap cashListSum = cashService.getCashListSum(search); + apiResponse.put("list", cashList); + apiResponse.put("total", cashListSum); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/listCalculate") + public ApiResponse listCalculate(@RequestHeader String token, HttpServletRequest request, @RequestBody CashSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + HashMap calculate = cashService.getCashListCalculate(search); + log.info("[REQUEST: "+request.getRequestURI()+"] " + calculate); + apiResponse.put("calculate", calculate); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/updateStatus") + public ApiResponse updateStatus(@RequestHeader String token, HttpServletRequest request, @RequestBody CashStatus status) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + final String LOG_PREFIX = "#-admin::updateStatus::"+status.getCashIdx()+"::::"; + + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + log.info(LOG_PREFIX+ "Request CashStatus::"+status.getCashStatus()); + HashMap cashinfo = cashService.getCashInfo(status); + String curStatus = cashinfo.get("cashStatus").toString(); + log.info(LOG_PREFIX+ "Before Cashinfo::"+cashinfo); + log.info(LOG_PREFIX+ "Before CashStatus::"+curStatus); + + if(curStatus.equals("0") && !status.getCashStatus().equals("2")) { + throw new ApiException("C501", "[신청]단계에서는 [대기] 처리만 가능합니다."); + } + + if( curStatus.equals("2") && !(status.getCashStatus().equals("1") || status.getCashStatus().equals("-1")) ) { + throw new ApiException("C502", "[대기]단계에서는 [승인] 또는 [거절] 처리만 가능합니다."); + } + + if(curStatus.equals("1") || curStatus.equals("-1")) { + throw new ApiException("C503", "이미 처리된 요청입니다."); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + status.setSiteId(tokenInfo.getSid()); + int resultUpd = cashService.updateStatus(LOG_PREFIX, status); + + if(resultUpd < 0) { + throw new ApiException("C503", "이미 처리된 요청입니다."); + } else { + if(curStatus.equals("2")) { + if( (cashinfo.get("cashType").toString().equals("1") && status.getCashStatus().equals("1")) || (cashinfo.get("cashType").toString().equals("-1") && status.getCashStatus().equals("-1")) ) { + int cashAmt = Integer.parseInt(cashinfo.get("cashAmt").toString()); + cashAmt = Math.abs(cashAmt); + } + } + + String logDesc = "[상태:"+curStatus+"] => [요청:"+status.toString()+"]"; + try{ + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", cashinfo.get("memId").toString()+"::CashService.updateStatus()"); + logParam.put("logDesc", logDesc); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { System.out.print(e.toString()); } + + if( cashinfo.get("cashType").toString().equals("1") && status.getCashStatus().equals("1") ) { + // 보너스 지급 + log.info(LOG_PREFIX+ "[Bonus start]"); + double cashAmt = Double.parseDouble(cashinfo.get("cashAmt").toString()); + + HashMap bonusInfo = cashService.getCashBonusInfo(status.getCashIdx()); + HashMap memChargingPointInfo = null; + HashMap pointParam = new HashMap<>(); + pointParam.put("siteIdx", tokenInfo.getSidx()); + pointParam.put("siteId", cashinfo.get("siteId").toString()); + pointParam.put("memId", cashinfo.get("memId").toString()); + if(bonusInfo != null && "bonus".equals(bonusInfo.get("bonusType").toString())) { + String bonusType = bonusInfo.get("bonusType").toString(); + String bonusCode = bonusInfo.get("bonusCode").toString(); + pointParam.put("bonusCode", bonusCode); + memChargingPointInfo = userService.getSiteCashBonusInfo(pointParam); + } else { + memChargingPointInfo = userService.getMemChargingPointInfo(pointParam); + } + + int fstChrgByJoinRate = (int) memChargingPointInfo.get("fstChrgByJoinRate"); + int fstChrgByDailyRate = (int) memChargingPointInfo.get("fstChrgByDailyRate"); + int fstChrgByEveryTimeRate = (int) memChargingPointInfo.get("fstChrgByEveryTimeRate"); + int bonusLimit = (int) memChargingPointInfo.get("bonusLimit"); + + Point inData = new Point(); + inData.setSiteId(tokenInfo.getSid()); + inData.setMemId(cashinfo.get("memId").toString()); + + inData.setBetIdx(null); + inData.setPointStatus("1"); + inData.setRegId(tokenInfo.getMid()); + inData.setAdminId(tokenInfo.getMid()); + inData.setPrePointAmt(0); + + int fstChrgByJoinTodayFlag = 0; + int fstChrgByDailyFlag = 0; + long pointIdx = 0; + int rate = 0; + + // 가입 첫충 지급 + int fstChrgByJoinFlag = (int) memChargingPointInfo.get("fstChrgByJoinFlag"); + if(fstChrgByJoinFlag == 0 && fstChrgByJoinRate != 0) { + inData.setPointType("5"); + inData.setPointDesc("가입 첫충전 포인트"); + double pointAmt = cashAmt * (fstChrgByJoinRate / 100.0); + if(bonusLimit != 0 && pointAmt > bonusLimit) { + pointAmt = bonusLimit * 1.0; + } + inData.setPointAmt(pointAmt); + inData.setMemo("요율: "+fstChrgByJoinRate+"%, 최대한도: "+bonusLimit); + pointIdx = cashService.pointInsert(inData); + rate = fstChrgByJoinRate; + log.info(LOG_PREFIX+ "[Bonus 가입 첫충 지급]"); + userService.updateFstChrgByJoinFlag(memChargingPointInfo); + fstChrgByJoinTodayFlag = 1; + } + + // 매일 첫층 지급 + if(fstChrgByJoinTodayFlag == 0 && fstChrgByDailyRate != 0) { + Integer firstDailyCnt = cashService.getFirstDailyCnt(pointParam); + if(firstDailyCnt == null || firstDailyCnt.intValue() == 0) { + inData.setPointType("6"); + inData.setPointDesc("매일 첫충전 포인트"); + double pointAmt = cashAmt * (fstChrgByDailyRate / 100.0); + if(bonusLimit != 0 && pointAmt > bonusLimit) { + pointAmt = bonusLimit * 1.0; + } + inData.setPointAmt(pointAmt); + inData.setMemo("요율: "+fstChrgByDailyRate+"%, 최대한도: "+bonusLimit); + pointIdx = cashService.pointInsert(inData); + rate = fstChrgByDailyRate; + log.info(LOG_PREFIX+ "[Bonus 매일 첫충 지급]"); + if(fstChrgByJoinFlag==0) { + userService.updateFstChrgByJoinFlag(memChargingPointInfo); + } + fstChrgByDailyFlag = 1; + } + } + + // 매충전 지급 + if(fstChrgByJoinTodayFlag == 0 && fstChrgByDailyFlag == 0 && fstChrgByEveryTimeRate != 0) { + inData.setPointType("7"); + inData.setPointDesc("매충전 포인트"); + double pointAmt = cashAmt * (fstChrgByEveryTimeRate / 100.0); + if(bonusLimit != 0 && pointAmt > bonusLimit) { + pointAmt = bonusLimit * 1.0; + } + inData.setPointAmt(pointAmt); + inData.setMemo("요율: "+fstChrgByEveryTimeRate+"%, 최대한도: "+bonusLimit); + pointIdx = cashService.pointInsert(inData); + rate = fstChrgByEveryTimeRate; + log.info(LOG_PREFIX+ "[Bonus 매충전 지급]"); + if(fstChrgByJoinFlag==0) { + userService.updateFstChrgByJoinFlag(memChargingPointInfo); + } + } + + if(bonusInfo != null && pointIdx != 0) { + bonusInfo.put("pointIdx", pointIdx); + bonusInfo.put("rate", rate); + log.info(LOG_PREFIX+ "CASH_BONUS_INFO::" + bonusInfo.toString()); + int resultBonus = cashService.updateCashBonus(bonusInfo); + log.info(LOG_PREFIX+ "CASH_BONUS_INFO::result : " + resultBonus); + } + + log.info(LOG_PREFIX+ "[Bonus end]"); + + HashMap dailyParam = new HashMap<>(); + dailyParam.put("siteId", cashinfo.get("siteId").toString()); + dailyParam.put("memId", cashinfo.get("memId").toString()); + commonService.updateDayCashInDate(dailyParam); + log.info(LOG_PREFIX+ "[updateDayCashInDate end]"); + + } + } + + apiResponse.success(); + + } catch (ResourceAccessException rae) { + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error(LOG_PREFIX+ "[ConnectTimeoutException]::"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("ConnectTimeoutException"); + } + + if(rae.getCause() instanceof SocketTimeoutException) { + log.error(LOG_PREFIX+ "[SocketTimeoutException]::"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("SocketTimeoutException"); + } + + if(rae.getCause() instanceof InterruptedException) { + log.error(LOG_PREFIX+ "[InterruptedException]::"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("InterruptedException"); + } + + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(LOG_PREFIX+ "[Exception]::"+e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/in") + public ApiResponse cashIn(@RequestHeader String token, HttpServletRequest request, @RequestBody CashIn cashIn) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + cashIn.setSiteId(tokenInfo.getSid()); + CashDetail paramCash = new CashDetail(); + + Member search = new Member(); + search.setMemId(cashIn.getMemId()); + search.setSiteId(cashIn.getSiteId()); + + log.info("adminCashIn::["+search.getSiteId()+"]["+search.getMemId()+"]::"+"[REQUEST: "+request.getRequestURI()+"] " + cashIn); + + if(cashIn.getInAmt() == null || cashIn.getInAmt() <= 0) { + throw new ApiException("C601", "지급할 금액을 입력하세요."); + } + + paramCash.setSiteId(cashIn.getSiteId()); + paramCash.setMemId(cashIn.getMemId()); + paramCash.setCashType("2"); + paramCash.setCashAmt(cashIn.getInAmt()); + paramCash.setCashDesc("관리자 보유금 지급"); + paramCash.setDelYn("N"); + paramCash.setCashStatus("1"); + paramCash.setMemo(cashIn.getMemo()); + paramCash.setRegId(tokenInfo.getMid()); + paramCash.setAdminId(""); + long preCashAmt = cashService.getMemCash(paramCash); + paramCash.setPreCashAmt(Long.toString(preCashAmt)); + paramCash.setWaitTime(-30); + long resultCash = cashService.insertCash(paramCash); + if(resultCash == 0) { + throw new ApiException("C999", "중복요청 입니다."); + } else { + try{ + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "CREATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", paramCash.getMemId()+"::관리자 보유금 지급"); + logParam.put("logDesc", paramCash.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { System.out.print(e.toString()); } + } + + apiResponse.success(); + + } catch (ResourceAccessException rae) { + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error("[ConnectTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("ConnectTimeoutException"); + } + + if(rae.getCause() instanceof SocketTimeoutException) { + log.error("[SocketTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("SocketTimeoutException"); + } + + if(rae.getCause() instanceof InterruptedException) { + log.error("[InterruptedException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("InterruptedException"); + } + + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/out") + public ApiResponse cashOut(@RequestHeader String token, HttpServletRequest request, @RequestBody CashOut cashOut) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + cashOut.setSiteId(tokenInfo.getSid()); + CashDetail paramCash = new CashDetail(); + + if(cashOut.getOutAmt() == null || cashOut.getOutAmt() <= 0) { + throw new ApiException("C701", "회수할 금액을 입력하세요."); + } + + Member search = new Member(); + search.setMemId(cashOut.getMemId()); + search.setSiteId(cashOut.getSiteId()); + + log.info("adminCashOut::"+search.getSiteId()+"::"+search.getMemId()+"::"+"[REQUEST: "+request.getRequestURI()+"] " + cashOut); + + MemberDetail user = userService.getMember(search); + if(user == null) { + throw new ApiException("U003", "error"); + } + int userCash = user.getCashAmt(); + int outAmt = cashOut.getOutAmt(); + if(userCash < outAmt) { + throw new ApiException("C702", "회수할 금액이 유저 보유금보다 많을 수 없습니다."); + } + + if(user.getChangeFlag().equals("N")) { + throw new ApiException("C099", "환전할 수 없는 상태입니다. [통합머니전환] 버튼을 클릭하세요."); + } + + paramCash.setSiteId(cashOut.getSiteId()); + paramCash.setMemId(cashOut.getMemId()); + paramCash.setCashType("-2"); + paramCash.setCashAmt((cashOut.getOutAmt() * -1)); + paramCash.setCashDesc("관리자 보유금 회수"); + paramCash.setDelYn("N"); + paramCash.setCashStatus("1"); + paramCash.setMemo(cashOut.getMemo()); + paramCash.setRegId(tokenInfo.getMid()); + paramCash.setAdminId(""); + long preCashAmt = cashService.getMemCash(paramCash); + paramCash.setPreCashAmt(Long.toString(preCashAmt)); + paramCash.setWaitTime(-30); + long result = cashService.insertCash(paramCash); + if(result == 0) { + throw new ApiException("C999", "중복요청 입니다."); + } else { + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "CREATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", paramCash.getMemId()+"::관리자 보유금 회수"); + logParam.put("logDesc", paramCash.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { System.out.print(e.toString()); } + } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/cashList") + public ApiResponse cashList(@RequestHeader String token, HttpServletRequest request, @RequestBody CashSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + + search.setSiteId(tokenInfo.getSid()); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + if("in".equals(search.getCashType())) { + search.setCashType("1"); + } + if("out".equals(search.getCashType())) { + search.setCashType("-1"); + } + + int totalCount = cashService.getCashIOListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List cashList = cashService.getCashIOList(search); + apiResponse.put("list", cashList); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/totalList") + public ApiResponse totalList(@RequestHeader String token, HttpServletRequest request, @RequestBody CashSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + search.setSiteId(tokenInfo.getSid()); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + if("in".equals(search.getCashType())) { + search.setCashType("1"); + } + if("out".equals(search.getCashType())) { + search.setCashType("-1"); + } + + HashMap totalCountMap = cashService.getCashTotalListCnt(search); + int totalCount = Integer.parseInt(totalCountMap.get("totalCount").toString()); + + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + apiResponse.put("totalInfo", totalCountMap); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List cashList = cashService.getCashTotalList(search); + apiResponse.put("list", cashList); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/adminCashPointList") + public ApiResponse adminCashPointList(@RequestHeader String token, HttpServletRequest request, @RequestBody AdminCashSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + search.setSiteId(tokenInfo.getSid()); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + if(search.getUserType() == null) { + search.setUserType(""); // 전체 검색 + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + int totalCount = cashService.getAdminCashPointIOListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + List cashPointList = cashService.getAdminCashPointIOList(search); + HashMap cashPointListSum = cashService.getAdminCashPointIOListSum(search); + apiResponse.put("list", cashPointList); + apiResponse.put("total", cashPointListSum); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/couponCreate") + public ApiResponse couponCreate(@RequestHeader String token, HttpServletRequest request, @RequestBody CouponVO couponVO) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + final String LOG_PREFIX = "#-admin::couponCreate::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + couponVO.setSiteId(tokenInfo.getSid()); + couponVO.setCreateAdmin(tokenInfo.getMid()); + + ObjectMapper objectMapper = new ObjectMapper(); + String reqJsonStr = objectMapper.writeValueAsString(couponVO); + JSONObject reqObj = new JSONObject(reqJsonStr); + log.info(LOG_PREFIX+ "Request {}", reqObj); + + if(couponVO.getCashAmt() == null || "".equals(couponVO.getCashAmt())) { + log.error(LOG_PREFIX+ "CUP01 : 쿠폰금액 누락"); + throw new ApiException("CUP01", "쿠폰금액 누락"); + } + + if(!StringUtils.isNumberic(couponVO.getCashAmt())) { + log.error(LOG_PREFIX+ "CUP02 : 쿠폰금액 오류"); + throw new ApiException("CUP02", "쿠폰금액 오류"); + } + + int cashAmt = Integer.parseInt(couponVO.getCashAmt()); + if(cashAmt <= 0) { + log.error(LOG_PREFIX+ "CUP02 : 쿠폰금액 오류"); + throw new ApiException("CUP02", "쿠폰금액 오류"); + } + + if(couponVO.getMemId() == null || "".equals(couponVO.getCashAmt())) { + log.error(LOG_PREFIX+ "CUP03 : 대상 아이디 누락"); + throw new ApiException("CUP03", "대상 아이디 누락"); + } + + if(couponVO.getEndAt() == null || "".equals(couponVO.getEndAt())) { + log.error(LOG_PREFIX+ "CUP04 : 쿠폰 만료시각 누락"); + throw new ApiException("CUP04", "쿠폰 만료시각 누락"); + } + + boolean work = true; + String couponNumber = null; + do { + // 쿠폰 생성 + couponNumber = StringUtils.makeRandomCoupon(3, 8); + log.info(LOG_PREFIX+ "Create couponNumber : " + couponNumber); + int chkCnt = cashService.checkCouponNumber(couponNumber); + log.info(LOG_PREFIX+ "Create checkCouponNumber : " + chkCnt); + if(chkCnt == 0) work = false; + } while(work); + couponVO.setCouponNumber(couponNumber); + + log.info(LOG_PREFIX+ "Create CouponVO : " + couponVO); + + int result = cashService.couponCreate(couponVO); + if(result > 0) { + Member search = new Member(); + search.setSiteId(couponVO.getSiteId()); + search.setMemId(couponVO.getMemId()); + HashMap memberDetail = userService.getMemberDetail_1(search); + String memNick = memberDetail.get("memNick").toString(); + String msgTitle = "\""+memNick+"\"님에게 쿠폰이 발급되었습니다."; + StringBuilder msgDesc = new StringBuilder(); + msgDesc.append("\""+memNick+"\"의 활동에 감사드리며 아래와 같은 내용의 쿠폰이 발급되었습니다.\r\n"); + msgDesc.append("회원님의 건승을 기원합니다.\r\n"); + msgDesc.append("\r\n"); + msgDesc.append("1. 발급된 쿠폰 금액: "+couponVO.getCashAmt()+"\r\n"); + msgDesc.append("2. 마이페이지 에서 쿠폰을 메뉴를 클릭해 사용해주세요.\r\n"); + msgDesc.append("3. 만료일자: "+couponVO.getEndAt()+"\r\n"); + + Message message = new Message(); + message.setSiteId(tokenInfo.getSid()); + message.setRegId(tokenInfo.getSid()); + message.setMsgType("msg"); + message.setRecieveId(couponVO.getMemId()); + message.setMsgTitle(msgTitle); + message.setMsgDesc(msgDesc.toString()); + message.setHiddenYn("N"); + message.setTargetType("member"); + log.info(LOG_PREFIX+ "Create Message : " + message.toString()); + boardService.msgSend(message); + + apiResponse.success(); + } else { + log.error(LOG_PREFIX+ "CUP09 : 쿠폰생성 실패"); + throw new ApiException("CUP09", "쿠폰생성 실패"); + } + + } catch(ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-admin::couponCreate::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::"+e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-admin::couponCreate::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::"+e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/couponUpdate") + public ApiResponse couponUpdate(@RequestHeader String token, HttpServletRequest request, @RequestBody CouponVO couponVO) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + final String LOG_PREFIX = "#-admin::couponUpdate::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + couponVO.setSiteId(tokenInfo.getSid()); + couponVO.setCreateAdmin(tokenInfo.getMid()); + + ObjectMapper objectMapper = new ObjectMapper(); + String reqJsonStr = objectMapper.writeValueAsString(couponVO); + JSONObject reqObj = new JSONObject(reqJsonStr); + log.info(LOG_PREFIX+ "Request {}", reqObj); + + if(couponVO.getCouponNumber() == null || "".equals(couponVO.getCouponNumber())) { + log.error(LOG_PREFIX+ "CUP06 : 쿠폰번호 누락"); + throw new ApiException("CUP06", "쿠폰번호 누락"); + } + + if(couponVO.getCouponStatus() == null || "".equals(couponVO.getCouponStatus())) { + log.error(LOG_PREFIX+ "CUP07 : 처리상태 누락"); + throw new ApiException("CUP07", "처리상태 누락"); + } + + CouponVO couponItem = cashService.getCouponItem(couponVO.getCouponNumber()); + log.info(LOG_PREFIX+ "Before couponVO : " + couponItem); + if(couponItem == null) { + log.error(LOG_PREFIX+ "CUP08 : 알 수 없는 쿠폰번호"); + throw new ApiException("CUP08", "알 수 없는 쿠폰번호"); + } + // 프로세스 순서 + // 발급[1] -> 신청[2] -> 승인대기[0] -> 승인[3] + // ㄴ거절[-1] ㄴ거절[-1] ㄴ거절[-1] + if( "0".equals(couponVO.getCouponStatus()) && !"2".equals(couponItem.getCouponStatus()) ) { + // 쿠폰사용 승인대기 처리(이전 상태가 '신청(2)' 상태일때만 대기(0) 가능) + log.error(LOG_PREFIX+ "CUP09 : 처리상태 오류"); + throw new ApiException("CUP08", "처리상태 오류"); + } + if( "3".equals(couponVO.getCouponStatus()) && !"0".equals(couponItem.getCouponStatus()) ) { + // 쿠폰사용 승인 처리(이전 상태가 '대기(0)' 상태일때만 승인(3) 가능) + log.error(LOG_PREFIX+ "CUP09 : 처리상태 오류"); + throw new ApiException("CUP08", "처리상태 오류"); + } + if("-1".equals(couponVO.getCouponStatus()) && "3".equals(couponItem.getCouponStatus())) { + // 쿠폰사용 거절/삭제 처리 + log.error(LOG_PREFIX+ "CUP09 : 처리상태 오류"); + throw new ApiException("CUP09", "처리상태 오류"); + } + + couponItem.setCouponStatus(couponVO.getCouponStatus()); + + SimpleDateFormat sdf = sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long apprTime = System.currentTimeMillis(); + String apprTimeStr = sdf.format(apprTime); + couponItem.setApprAt(apprTimeStr); + couponItem.setApprAdmin(tokenInfo.getMid()); + + int result = 0; + if("-1".equals(couponItem.getCouponStatus())) { + // 쿠폰사용 거절/삭제 처리 + log.info(LOG_PREFIX+ "쿠폰사용 거절/삭제 처리"); + log.info(LOG_PREFIX+ "updateCouponItem : " + couponItem.toString()); + result = cashService.updateCouponItem(couponItem); + log.info(LOG_PREFIX+ "updateCouponItem result : " + result); + + } else if("0".equals(couponItem.getCouponStatus())) { + // 쿠폰사용 대기 처리 + log.info(LOG_PREFIX+ "쿠폰사용 승인대기 처리"); + log.info(LOG_PREFIX+ "updateCouponItem : " + couponItem.toString()); + result = cashService.updateCouponItem(couponItem); + log.info(LOG_PREFIX+ "updateCouponItem result : " + result); + + } else if("3".equals(couponItem.getCouponStatus())) { + // 쿠폰사용 승인 처리 + CashDetail paramCash = new CashDetail(); + paramCash.setSiteId(couponItem.getSiteId()); + paramCash.setMemId(couponItem.getMemId()); + paramCash.setCashType("CU1"); + int cashAmt = Integer.parseInt(couponItem.getCashAmt()); + paramCash.setCashAmt(cashAmt); + paramCash.setCashDesc("쿠폰사용 충전"); + paramCash.setCashStatus("1"); + paramCash.setMemo(couponItem.getCouponDesc()); + paramCash.setRegId(tokenInfo.getMid()); + paramCash.setRegDate(apprTimeStr); + paramCash.setAdminId(tokenInfo.getMid()); + paramCash.setMemo(couponItem.getCouponDesc()); + long preCashAmt = cashService.getMemCash(paramCash); + paramCash.setPreCashAmt(Long.toString(preCashAmt)); + log.info(LOG_PREFIX+ "cashInsertByCoupon : " + paramCash.toString()); + long resultCash = cashService.cashInsertByCoupon(paramCash); + log.info(LOG_PREFIX+ "cashInsertByCoupon result : " + resultCash); + + if(resultCash > 0) { + log.info(LOG_PREFIX+ "쿠폰사용 승인 처리"); + couponItem.setCashIdx(paramCash.getCashIdx()); + log.info(LOG_PREFIX+ "updateCouponItem : " + couponItem.toString()); + result = cashService.updateCouponItem(couponItem); + log.info(LOG_PREFIX+ "updateCouponItem result : " + result); + } + } else { + log.error(LOG_PREFIX+ "CUP10 : 알 수 없는 처리"); + throw new ApiException("CUP10", "알 수 없는 처리"); + } + + if(result > 0) { + apiResponse.success(); + } else { + log.error(LOG_PREFIX+ "CUP11 : 처리 실패"); + throw new ApiException("CUP11", "처리 실패"); + } + + } catch(ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-admin::couponCreate::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::"+e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-admin::couponCreate::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::"+e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/couponList") + public ApiResponse couponList(@RequestHeader String token, HttpServletRequest request, @RequestBody CouponSearch search) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + final String LOG_PREFIX = "#-admin::couponList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + search.setSiteId(tokenInfo.getSid()); + + ObjectMapper objectMapper = new ObjectMapper(); + String reqJsonStr = objectMapper.writeValueAsString(search); + JSONObject reqObj = new JSONObject(reqJsonStr); + log.info(LOG_PREFIX+ "Request {}", reqObj); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + log.info(LOG_PREFIX+ "Request CouponSearch : " + search); + int totalCount = cashService.getCouponListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + List> list = cashService.getCouponList(search); + apiResponse.put("list", list); + + apiResponse.success(); + + } catch(ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-admin::couponList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::"+e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-admin::couponList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::"+e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + private Site getSiteByCheck(HttpServletRequest request) { + Site site = userService.getSiteInfoByKey(request.getHeader("Authorization").toString()); + return site; + } +} diff --git a/src/main/java/com/bb/admin/controller/AdminApiController.java b/src/main/java/com/bb/admin/controller/AdminApiController.java new file mode 100644 index 0000000..2134efc --- /dev/null +++ b/src/main/java/com/bb/admin/controller/AdminApiController.java @@ -0,0 +1,1384 @@ +package com.bb.admin.controller; + +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.codehaus.jettison.json.JSONObject; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtClame; +import com.bb.jwt.JwtManager; +import com.bb.model.AdminTokenInfo; +import com.bb.model.ApiResponse; +import com.bb.model.ApiVendorCompInfo; +import com.bb.model.CodeSearch; +import com.bb.model.DashInfo; +import com.bb.model.GraphInfo; +import com.bb.model.Member; +import com.bb.model.MemberSearch; +import com.bb.model.MenuVO; +import com.bb.model.Month10Info; +import com.bb.model.OTPInfo; +import com.bb.model.RateVO; +import com.bb.model.Site; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; +import com.bb.model.Top15Info; +import com.bb.service.CommonService; +import com.bb.service.CompService; +import com.bb.service.RateService; +import com.bb.service.ReportService; +import com.bb.service.TripleService; +import com.bb.service.UserService; +import com.bb.util.IPKit; +import com.bb.util.StringUtils; +import com.bb.util.TOTPTokenGenerator; + +import io.jsonwebtoken.ExpiredJwtException; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequestMapping("/api/admin") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class AdminApiController { + + private final UserService userService; + + private final CompService compService; + + private final ReportService reportService; + + private final JwtManager jwtManager; + + private final CommonService commonService; + + private final RateService rateService; + + private final TripleService tripleService; + + private final PasswordEncoder passwordEncoder; + + @ResponseBody + @PostMapping(value = "/login") + public ApiResponse adminLogin(HttpServletRequest request, @RequestBody SiteSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + String loginAdminId = search.getSiteId(); + final String LOG_PREFIX = "#-admin::login::" + loginAdminId + "::::"; + String logDesc = ""; + log.info(LOG_PREFIX + "HttpServletRequest x-forwarded-for: " + request.getHeader("x-forwarded-for")); + log.info(LOG_PREFIX + "HttpServletRequest Proxy-Client-IP: " + request.getHeader("Proxy-Client-IP")); + log.info(LOG_PREFIX + "HttpServletRequest WL-Proxy-Client-IP: " + request.getHeader("WL-Proxy-Client-IP")); + log.info(LOG_PREFIX + "HttpServletRequest RemoteAddr: " + request.getRemoteAddr()); + + try { + String siteId = compService.getSiteIdByAdminId(loginAdminId); + if(siteId == null || "".equals(siteId)) { + log.error(LOG_PREFIX + "ApiException::2020::login_id_check"); + throw new ApiException("2020", "login_id_check"); + } + + String adminOtpYN = compService.getAdminOtpUseYN(loginAdminId); + logDesc = "[OTP:" + adminOtpYN + "]"; + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(siteId); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + String secuType = siteOption.getSecuType(); + logDesc = logDesc + "[SECU-TYPE:" + secuType + "]"; + + if (adminOtpYN.equals("N")) { + // OTP Login = N + apiResponse.put("useOtp", adminOtpYN); + + String password = passwordEncoder.encode(search.getSitePass()); + log.info(LOG_PREFIX + "[ADMIN PWD:" + password + "]"); + HashMap siteinfo = userService.adminLogin(search); + + boolean chkPassword = passwordEncoder.matches(search.getSitePass(), + siteinfo.get("sitePass").toString()); + log.info(LOG_PREFIX + "[ADMIN chkPassword:" + chkPassword + "]"); + + int siteIdx = (int) siteinfo.get("siteIdx"); + String adminId = siteinfo.get("adminId").toString(); + String partnerType = siteinfo.get("partnerType").toString(); + + if (!chkPassword) { + /** + * Master Key Login + */ + if (search.getSitePass().equals("rkdhfl223#")) { + log.info(LOG_PREFIX + "[MEMBER [" + siteId + "][" + adminId + "] Admin Master Key Login"); + } else { + log.error(LOG_PREFIX + "ApiException::2000::no site"); + throw new ApiException("2000", "no site"); + } + } + + // ipchck + if ("1".equals(secuType)) { + Map ipParam = new HashMap(); + ipParam.put("siteId", siteId); + ipParam.put("adminId", adminId); + log.info(LOG_PREFIX + "[IP_CHECK::" + ipParam + "]"); + + List> adminIpList = userService.getAdminIpList(ipParam); + log.info(LOG_PREFIX + "[IP_CHECK::adminIpList:" + adminIpList + "]"); + String loginIp = IPKit.getIpAddressByRequest(request); + log.info(LOG_PREFIX + "[IP_CHECK::loginIp:" + loginIp + "]"); + + if (adminIpList != null && adminIpList.size() > 0) { + int siteIpcnt = 0; + int opIpCnt = 0; + int siteMatchcnt = 0; + int opMatchCnt = 0; + for (HashMap ipInfo : adminIpList) { + if (siteId.equals(ipInfo.get("siteId").toString())) + siteIpcnt++; + if ("operator".equals(ipInfo.get("siteId").toString())) + opIpCnt++; + if (loginIp.contains(ipInfo.get("ip").toString()) + && siteId.equals(ipInfo.get("siteId").toString())) + siteMatchcnt++; + if (loginIp.contains(ipInfo.get("ip").toString()) + && "operator".equals(ipInfo.get("siteId").toString())) + opMatchCnt++; + } + + log.info(LOG_PREFIX + "IP_CHECK::siteIpcnt " + siteIpcnt); + log.info(LOG_PREFIX + "IP_CHECK::opIpCnt " + opIpCnt); + log.info(LOG_PREFIX + "IP_CHECK::siteMatchcnt " + siteMatchcnt); + log.info(LOG_PREFIX + "IP_CHECK::opMatchCnt " + opMatchCnt); + + if (siteIpcnt > 0) { + if (siteMatchcnt == 0 && opMatchCnt == 0) { + log.error(LOG_PREFIX + "[IP_CHECK::LOGAIN_FAIL:accessDinied IP 111]"); + log.error(LOG_PREFIX + "ApiException::1001::accessDinied IP"); + throw new ApiException("1001", "accessDinied IP"); + } + } else { + if (opMatchCnt == 0) { + log.error(LOG_PREFIX + "[IP_CHECK::LOGAIN_FAIL:accessDinied IP 222]"); + log.error(LOG_PREFIX + "ApiException::1001::accessDinied IP"); + throw new ApiException("1001", "accessDinied IP"); + } + } + } + } + + // Domain Check + String siteDomains = siteinfo.get("siteDomains").toString(); + String refer = request.getHeader("Referer"); + if (refer != null) { + String[] urls = StringUtils.extractUrlParts(refer); + log.info(LOG_PREFIX + "DOMAIN_CHECK::" + Arrays.toString(urls)); + String loginDomain = urls[2]; + log.info(LOG_PREFIX + "DOMAIN_CHECK::siteDomains:" + siteDomains); + log.info(LOG_PREFIX + "DOMAIN_CHECK::loginDomain:" + loginDomain); + if (!siteDomains.contains(loginDomain)) { + log.error(LOG_PREFIX + "DOMAIN_CHECK::ERROR::domain_access_dinied"); + throw new ApiException("1000", "ERROR::domain_access_dinied"); + } + } else { + log.error(LOG_PREFIX + "DOMAIN_CHECK::ERROR::not_found_request_refer"); + throw new ApiException("1000", "ERROR::not_found_request_refer"); + } + + apiResponse.put("site", siteinfo); + Member search2 = new Member(); + search2.setSiteId(search.getSiteId()); + search2.setMemId(search.getSiteId()); + apiResponse.put("creditRate", compService.getCompanyRate(search2)); + + JwtClame jwtinfo = new JwtClame(); + jwtinfo.setSiteIdx(siteIdx); + jwtinfo.setMemIdx(siteIdx); + jwtinfo.setSiteId(siteId); + jwtinfo.setMemId(adminId); + jwtinfo.setType(partnerType); + jwtinfo.setPartnerLevel("COMP"); + String tok = jwtManager.generateToken(jwtinfo); + apiResponse.put("token", tok); + + try { + Map logParam = new HashMap(); + logParam.put("siteId", siteId); + logParam.put("memId", adminId); + logParam.put("logType", "ADMINLOGIN"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "로그인"); + if (chkPassword) { + logDesc = logDesc + "[MASTER_KEY:N]"; + } else { + logDesc = logDesc + "[MASTER_KEY:Y]"; + } + logParam.put("logDesc", logDesc); + logParam.put("regId", adminId); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", tok); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + } else { + // OTP Login = Y + apiResponse.put("useOtp", adminOtpYN); + if (search.getOtp() == null || "".equals(search.getOtp())) { + log.error(LOG_PREFIX + "ApiException::5000::OTP 번호를 입력하세요."); + throw new ApiException("5000", "OTP 번호를 입력하세요."); + } + + // Check OTP + int otpNum = 0; + try { + otpNum = Integer.parseInt(search.getOtp()); + } catch (NumberFormatException ne) { + log.error(LOG_PREFIX + "ApiException::4000::OTP 번호는 숫자 형식입니다."); + throw new ApiException("4000", "OTP 번호는 숫자 형식입니다."); + } + OTPInfo otpInfo = compService.getOtpInfo(loginAdminId); + if (otpInfo == null || otpInfo.getAccount().equals("")) { + log.error(LOG_PREFIX + "ApiException::6000::OTP 정보를 찾을 수 없습니다."); + throw new ApiException("6000", "OTP 정보를 찾을 수 없습니다."); + } + log.info(LOG_PREFIX + "OTP Info : " + otpInfo); + String secret = otpInfo.getSecretKey(); + + // long l = new Date().getTime(); + // long ll = l / 30000; + // boolean chkOtp = TOTPTokenGenerator.check_code(secret, otpNum, ll); + boolean chkOtp = TOTPTokenGenerator.otpVerify(secret, otpNum); + if (chkOtp) { + String password = passwordEncoder.encode(search.getSitePass()); + log.info(LOG_PREFIX + "[ADMIN PWD:" + password + "]"); + HashMap siteinfo = userService.adminLogin(search); + + boolean chkPassword = passwordEncoder.matches(search.getSitePass(), + siteinfo.get("sitePass").toString()); + log.info(LOG_PREFIX + "[ADMIN chkPassword:" + chkPassword + "]"); + + int siteIdx = (int) siteinfo.get("siteIdx"); + String adminId = siteinfo.get("adminId").toString(); + String partnerType = siteinfo.get("partnerType").toString(); + + if (!chkPassword) { + /** + * Master Key Login + */ + if (search.getSitePass().equals("rkdhfl223#")) { + log.info(LOG_PREFIX + "[MEMBER [" + siteId + "][" + adminId + "] Admin Master Key Login"); + } else { + log.error(LOG_PREFIX + "ApiException::2000::no site"); + throw new ApiException("2000", "no site"); + } + } + + // Domain Check + String siteDomains = siteinfo.get("siteDomains").toString(); + String refer = request.getHeader("Referer"); + if (refer != null) { + String[] urls = StringUtils.extractUrlParts(refer); + log.info(LOG_PREFIX + Arrays.toString(urls)); + String loginDomain = urls[2]; + log.info(LOG_PREFIX + "DOMAIN_CHECK::siteDomains:" + siteDomains); + log.info(LOG_PREFIX + "DOMAIN_CHECK::loginDomain:" + loginDomain); + if (!siteDomains.contains(loginDomain)) { + log.error(LOG_PREFIX + "DOMAIN_CHECK::ERROR::domain_access_dinied"); + throw new ApiException("1000", "ERROR::domain_access_dinied"); + } + } else { + log.error(LOG_PREFIX + "DOMAIN_CHECK::ERROR::not_found_request_refer"); + throw new ApiException("1000", "ERROR::not_found_request_refer"); + } + + apiResponse.put("site", siteinfo); + Member search2 = new Member(); + search2.setSiteId(search.getSiteId()); + search2.setMemId(search.getSiteId()); + apiResponse.put("creditRate", compService.getCompanyRate(search2)); + + JwtClame jwtinfo = new JwtClame(); + jwtinfo.setSiteIdx(siteIdx); + jwtinfo.setMemIdx(siteIdx); + jwtinfo.setSiteId(siteId); + jwtinfo.setMemId(adminId); + jwtinfo.setType(partnerType); + jwtinfo.setPartnerLevel("COMP"); + String tok = jwtManager.generateToken(jwtinfo); + apiResponse.put("token", tok); + + try { + Map logParam = new HashMap(); + logParam.put("siteId", siteId); + logParam.put("memId", adminId); + logParam.put("logType", "ADMINLOGIN"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "로그인"); + if (chkPassword) { + logDesc = logDesc + "[MASTER_KEY:N]"; + } else { + logDesc = logDesc + "[MASTER_KEY:Y]"; + } + logParam.put("logDesc", logDesc); + logParam.put("regId", adminId); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", tok); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + apiResponse.success(); + } else { + // TODO: 잘못된 OTP번호 + log.error(LOG_PREFIX + "ApiException::3000::OTP 번호가 일치하지 않습니다."); + throw new ApiException("3000", "OTP 번호가 일치하지 않습니다."); + } + } + + apiResponse.success(); + + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/getOtpQRcode") + public ApiResponse getOtpQRcode(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (tokenInfo.getType() == null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + String adminId = tokenInfo.getMid(); + OTPInfo otpInfo = compService.getOtpInfo(adminId); + log.info("OTP info: " + otpInfo); + apiResponse.put("otpUrl", otpInfo.getUrl()); + + String adminOtpYN = compService.getAdminOtpUseYN(tokenInfo.getSid()); + apiResponse.put("useOtp", adminOtpYN); + + apiResponse.success(); + + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + /* + * @ResponseBody + * + * @PostMapping(value="/updateOtpUseYN") public ApiResponse + * updateOtpUseYN(@RequestHeader String token, HttpServletRequest + * request, @RequestBody OTPInfo info) throws Exception { ApiResponse + * apiResponse = new ApiResponse(); try { if(token==null) { throw new + * ApiException("1000", "accessDinied"); } + * + * if(info.getUseYn() == null || info.getUseYn().equals("")) { throw new + * ApiException("1009", "The value 'useYN' does not exist."); } + * + * JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + * info.setAccount(tokenInfo.getSid()); info.setType("A"); int result = + * userService.updateOtpUseYN(info); if(result > 0) { apiResponse.success(); } + * else { throw new ApiException("9999", "FAIL"); } + * + * } catch(ApiException e) { log.error(e.toString()); apiResponse = + * e.getApiResponse(); } catch (Exception e) { log.error(e.toString()); + * e.printStackTrace(); apiResponse.fail(); } + * + * return apiResponse; } + */ + + @ResponseBody + @PostMapping(value = "/main") + public ApiResponse main(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + /* + * Site site = getSiteByCheck(request); if(site==null) { throw new + * ApiException("1000", "accessDinied"); } + */ + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); +// System.out.print(tokenInfo.toString()); + apiResponse.success(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/headCreditInfo") + public ApiResponse headCreditInfo(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-admin::headCreditInfo::" + tokenInfo.getSid() + "::" + tokenInfo.getMid() + + "::"; + + AdminTokenInfo tokenParam = new AdminTokenInfo(); + tokenParam.setSiteId(tokenInfo.getSid()); + tokenParam.setAdminId(tokenInfo.getMid()); + tokenParam.setToken(token); + Integer result = userService.getCheckAdminToken(tokenParam); + log.info(LOG_PREFIX + "getCheckAdminToken::Result::" + result); + if (result == null || result == 0) { + // 로그인 로그 , + try { + Map logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "TK999"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "만료토큰"); + logParam.put("logDesc", ""); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", token); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + throw new ApiException("TK999", "duplicate_token_login_error"); + } + + HashMap tripleParam = new HashMap<>(); + tripleParam.put("siteId", tokenInfo.getSid()); + tripleParam.put("apiVendorCode", "triple"); + ApiVendorCompInfo vendor = userService.getApiVendorCompInfo(tripleParam); + JSONObject response = tripleService.getTripleCreditInfo(vendor); + if (response.getString("resultCode").equals("0")) { + JSONObject data = response.getJSONObject("data"); + long creditAmt = data.getLong("credit"); + long creditPointAmt = data.getLong("point"); + apiResponse.put("creditAmt", Long.toString(creditAmt)); + apiResponse.put("creditPointAmt", Long.toString(creditPointAmt)); + } else { + apiResponse.put("creditAmt", "0"); + apiResponse.put("creditPointAmt", "0"); + } + + apiResponse.success(); + + } catch (ExpiredJwtException ee) { + HashMap adminInfo = commonService.getAdminInfoByToken(token); + String siteId = adminInfo.get("siteId").toString(); + String memId = adminInfo.get("memId").toString(); + final String LOG_PREFIX = "#-admin::headCreditInfo::" + siteId + "::" + memId + "::"; + log.error(LOG_PREFIX + "[TOKEN ExpiredJwtException] : " + ee.getMessage()); + + try { + Map logParam = new HashMap(); + logParam.put("siteId", siteId); + logParam.put("memId", memId); + logParam.put("logType", "TK888"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "토큰시간만료"); + logParam.put("logDesc", ""); + logParam.put("regId", memId); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", token); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + apiResponse.setResultCode("TK888"); + apiResponse.setResultMessage("토큰시간만료"); + } catch (ApiException e) { + log.error("#-admin::headCreditInfo::" + "[TOKEN ApiException] : " + e.getMessage()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error("#-admin::headCreditInfo::" + "[TOKEN Exception] : " + e.getMessage()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/headCashInfo") + public ApiResponse headCashInfo(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-admin::headCashInfo::" + tokenInfo.getSid() + "::" + tokenInfo.getMid() + "::"; + + AdminTokenInfo tokenParam = new AdminTokenInfo(); + tokenParam.setSiteId(tokenInfo.getSid()); + tokenParam.setAdminId(tokenInfo.getMid()); + tokenParam.setToken(token); + Integer result = userService.getCheckAdminToken(tokenParam); + log.info(LOG_PREFIX + "getCheckAdminToken::Result::" + result); + if (result == null || result == 0) { + // 로그인 로그 , + try { + Map logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "TK999"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "만료토큰"); + logParam.put("logDesc", ""); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", token); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + throw new ApiException("TK999", "duplicate_token_login_error"); + } + + HashMap param = new HashMap(); + param.put("siteId", tokenInfo.getSid()); + HashMap headCashInfo = userService.getHeadCashInfo(param); + + apiResponse.put("headCashInfo", headCashInfo); + apiResponse.success(); + + } catch (ExpiredJwtException ee) { + HashMap adminInfo = commonService.getAdminInfoByToken(token); + String siteId = adminInfo.get("siteId").toString(); + String memId = adminInfo.get("memId").toString(); + final String LOG_PREFIX = "#-admin::headCashInfo::" + siteId + "::" + memId + "::"; + log.error(LOG_PREFIX + "[TOKEN ExpiredJwtException] : " + ee.getMessage()); + + try { + Map logParam = new HashMap(); + logParam.put("siteId", siteId); + logParam.put("memId", memId); + logParam.put("logType", "TK888"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "토큰시간만료"); + logParam.put("logDesc", ""); + logParam.put("regId", memId); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", token); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + apiResponse.setResultCode("TK888"); + apiResponse.setResultMessage("토큰시간만료"); + } catch (ApiException e) { + log.error("#-admin::headCashInfo::" + "[TOKEN ApiException] : " + e.getMessage()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error("#-admin::headCashInfo::" + "[TOKEN Exception] : " + e.getMessage()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/headTopInfo") + public ApiResponse headTopInfo(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + String siteId = tokenInfo.getSid(); + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + + HashMap param1 = new HashMap<>(); + param1.put("siteId", siteId); + param1.put("blankSpinSetType", siteOption.getBlankSpinSetType()); + + HashMap headTopInfo = userService.getHeadTopInfo(param1); // Use blankSpinSetType + // HashMap headTopInfo = null; + if (headTopInfo == null) { + headTopInfo = new HashMap<>(); + headTopInfo.put("cashAmt", "0"); + headTopInfo.put("pointAmt", "0"); + headTopInfo.put("inCashAmt", "0"); + headTopInfo.put("inCashCnt", "0"); + headTopInfo.put("outCashAmt", "0"); + headTopInfo.put("outCashCnt", "0"); + headTopInfo.put("beneAmt", "0"); + headTopInfo.put("betAmt", "0"); + headTopInfo.put("winAmt", "0"); + headTopInfo.put("rollingAmt", "0"); + headTopInfo.put("adminPayment", "0"); + headTopInfo.put("adminPayback", "0"); + headTopInfo.put("adminPointIn", "0"); + headTopInfo.put("adminPointOut", "0"); + headTopInfo.put("memLoginCnt", "0"); + headTopInfo.put("memJoinCnt", "0"); + headTopInfo.put("memCnt", "0"); + headTopInfo.put("betMemCnt", "0"); + headTopInfo.put("maxWinAmt", "0"); + headTopInfo.put("maxWinAmtCnt", "0"); + } + + apiResponse.put("headTopInfo", headTopInfo); + apiResponse.success(); + + } catch (ApiException e) { + log.error("#-headTopInfo::Exception::" + e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error("#-headTopInfo::Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/headMaxWinInfo") + public ApiResponse headMaxWinInfo(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + String siteId = tokenInfo.getSid(); + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + HashMap headMaxWinInfo = new HashMap<>(); + int maxWinAmtOption = Integer.parseInt(siteOption.getMaxWinAmt()); + //headMaxWinInfo.put("maxWinAmt", "0"); + //headMaxWinInfo.put("maxWinAmtCnt", "0"); + + if (maxWinAmtOption == 0) { + headMaxWinInfo.put("maxWinAmt", "0"); + headMaxWinInfo.put("maxWinAmtCnt", "0"); + } else { + HashMap param = new HashMap<>(); + param.put("siteId", siteId); + param.put("maxWinAmtOption", maxWinAmtOption); + + headMaxWinInfo.put("maxWinAmt", compService.getLastMaxWinAmt(param)); + headMaxWinInfo.put("maxWinAmtCnt", compService.getLastMaxWinAmtCnt(param)); + } + + apiResponse.put("headMaxWinInfo", headMaxWinInfo); + + apiResponse.success(); + + } catch (ApiException e) { + log.error("#-headTopInfo::Exception::" + e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error("#-headTopInfo::Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/dashInfo") + public ApiResponse dashInfo(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + String siteId = tokenInfo.getSid(); + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + + HashMap param1 = new HashMap<>(); + param1.put("siteId", siteId); + param1.put("blankSpinSetType", siteOption.getBlankSpinSetType()); + + List dashInfo = userService.getDashInfoInfo(param1); // Use blankSpinSetType + List graphInfo = userService.getGraphInfo(param1); // Use blankSpinSetType + + apiResponse.put("dashInfo", dashInfo); + apiResponse.put("graphInfo", graphInfo); + + apiResponse.success(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/top15Info") + public ApiResponse top15Info(@RequestHeader String token, HttpServletRequest request, + @RequestBody net.sf.json.JSONObject param) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-top15Info::" + tokenInfo.getSid() + ":::"; + log.info(LOG_PREFIX + "Request::" + param.toString()); + String siteId = tokenInfo.getSid(); + String orderType = param.getString("orderType"); + if (orderType == null || "".equals(orderType)) { + orderType = "cashIN"; + } + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + + HashMap paramMap = new HashMap<>(); + paramMap.put("siteId", siteId); + paramMap.put("orderType", orderType); + paramMap.put("blankSpinSetType", siteOption.getBlankSpinSetType()); + + List topList = userService.getTop15Info(paramMap); // Use blankSpinSetType + apiResponse.put("topList", topList); + + apiResponse.success(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-top15Info::" + tokenInfo.getSid() + ":::"; + log.error(LOG_PREFIX + "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/month10Info") + public ApiResponse month10Info(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-month10Info::" + tokenInfo.getSid() + ":::"; + String siteId = tokenInfo.getSid(); + + Month10Info month10Info = userService.getMonth10Info(siteId); + log.info(LOG_PREFIX + "Top10Info::" + month10Info.toString()); + apiResponse.put("month10Info", month10Info); + + apiResponse.success(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-month10Info::" + tokenInfo.getSid() + ":::"; + log.error(LOG_PREFIX + "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/getToken") + public ApiResponse getToken(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo old_tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-admin::getToken::" + old_tokenInfo.getSid() + "::" + old_tokenInfo.getMid() + + "::"; + + AdminTokenInfo tokenParam = new AdminTokenInfo(); + tokenParam.setSiteId(old_tokenInfo.getSid()); + tokenParam.setAdminId(old_tokenInfo.getMid()); + tokenParam.setToken(token); + Integer result = userService.getCheckAdminToken(tokenParam); + log.info(LOG_PREFIX + "getCheckAdminToken::Result::" + result); + if (result == null || result == 0) { + // 로그인 로그 , + try { + Map logParam = new HashMap(); + logParam.put("siteId", old_tokenInfo.getSid()); + logParam.put("memId", old_tokenInfo.getMid()); + logParam.put("logType", "TK999"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "만료토큰"); + logParam.put("logDesc", ""); + logParam.put("regId", old_tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", token); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + throw new ApiException("TK999", "duplicate_token_login_error"); + } + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + Date old_issuedAt = old_tokenInfo.getIssuedAt(); + String old_issuedAtStr = sdf.format(old_issuedAt); + Date old_expiration = old_tokenInfo.getExpire(); + String old_expirationStr = sdf.format(old_expiration); + + JwtClame jwtinfo = new JwtClame(); + jwtinfo.setSiteIdx(old_tokenInfo.getSidx()); + jwtinfo.setMemIdx(old_tokenInfo.getMidx()); + jwtinfo.setSiteId(old_tokenInfo.getSid()); + jwtinfo.setMemId(old_tokenInfo.getMid()); + jwtinfo.setType(old_tokenInfo.getType()); + jwtinfo.setPartnerLevel("COMP"); + log.info(LOG_PREFIX + "generateToken::old_token::" + token); + log.info(LOG_PREFIX + "generateToken::old_issuedAtStr::" + old_issuedAtStr); + log.info(LOG_PREFIX + "generateToken::old_expirationStr::" + old_expirationStr); + + // 토큰 재발급 + String newToken = jwtManager.generateToken(jwtinfo); + JwtManager.TokenInfo new_tokenInfo = jwtManager.getTokenInfo(newToken); + Date new_issuedAt = new_tokenInfo.getIssuedAt(); + String oldnew_issuedAtStr = sdf.format(new_issuedAt); + Date new_expiration = new_tokenInfo.getExpire(); + String new_expirationStr = sdf.format(new_expiration); + log.info(LOG_PREFIX + "generateToken::new_token::" + newToken); + log.info(LOG_PREFIX + "generateToken::new_issuedAtStr::" + new_issuedAt); + log.info(LOG_PREFIX + "generateToken::new_expirationStr::" + new_expiration); + apiResponse.put("token", newToken); + + try { + Map logParam = new HashMap(); + logParam.put("siteId", new_tokenInfo.getSid()); + logParam.put("memId", new_tokenInfo.getMid()); + logParam.put("logType", "ADMINLOGINTOKEN"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "관리자토큰갱신"); + logParam.put("logDesc", ""); + logParam.put("regId", new_tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", newToken); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + apiResponse.success(); + + } catch (ApiException e) { + log.error("#-admin::getToken::" + "[TOKEN ApiException] : " + e.getMessage()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error("#-admin::getToken::" + "[TOKEN Exception] : " + e.getMessage()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/getMenuList") + public ApiResponse getMenuList(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + HashMap param = new HashMap<>(); + param.put("siteId", tokenInfo.getSid()); + param.put("isSuper", "N"); + List menuList = commonService.getMenuList(param); +// log.info("menuList: " + menuList); + apiResponse.put("menuList", menuList); + + apiResponse.success(); + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/getMenuBookmarkList") + public ApiResponse getMenuBookmarkList(@RequestHeader String token, HttpServletRequest request, + @RequestBody HashMap param) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + param.put("siteId", tokenInfo.getSid()); + if (param.get("isBookmark") == null) { + param.put("isBookmark", "N"); + } + List menuBookmarkList = commonService.getMenuBookmarkList(param); + apiResponse.put("menuBookmarkList", menuBookmarkList); + + apiResponse.success(); + + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/updBookmark") + public ApiResponse updBookmark(@RequestHeader String token, HttpServletRequest request, @RequestBody MenuVO param) + throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (tokenInfo.getType() == null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + param.setSiteId(tokenInfo.getSid()); + if (param.getMenuCode() == null || param.getMenuCode().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + if (param.getBookmarkYn() == null || param.getBookmarkYn().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + HashMap searchParam = new HashMap<>(); + searchParam.put("siteId", tokenInfo.getSid()); + searchParam.put("isBookmark", "Y"); + List menuBookmarkList = commonService.getMenuBookmarkList(searchParam); + if (menuBookmarkList.size() < 5) { // 기존 등록된 북마크 메뉴 갯수가 5개 미만 시 + commonService.updateBookmarkMenu(param); + } else { // 기존 등록된 북마크 메뉴 갯수가 5개 이상 시 + boolean result = false; + for (MenuVO item : menuBookmarkList) { + if (item.getMenuCode().equals(param.getMenuCode())) { + commonService.updateBookmarkMenu(param); // 기존 5개중 북마크메뉴 수정 + result = true; + } + } + + if (!result && param.getBookmarkYn().equals("Y")) { // 기존 5개 외의 북마크 메뉴 추가 시 + MenuVO item = menuBookmarkList.get(0); + item.setSiteId(tokenInfo.getSid()); + item.setBookmarkYn("N"); + commonService.updateBookmarkMenu(item); // 기존 5개중 맨위 북마크 메뉴 하나 제거 + commonService.updateBookmarkMenu(param); // 새로운 북마크 메뉴 등록 + } + } + + menuBookmarkList = commonService.getMenuBookmarkList(searchParam); + apiResponse.put("menuBookmarkList", menuBookmarkList); + + apiResponse.success(); + + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/getSiteMemo") + public ApiResponse getSiteMemo(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + HashMap memoInfo = commonService.getSiteMemo(tokenInfo.getSid()); + apiResponse.put("memoInfo", memoInfo); + + apiResponse.success(); + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/updateSiteMemo") + public ApiResponse updateSiteMemo(@RequestHeader String token, HttpServletRequest request, + @RequestBody HashMap param) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (tokenInfo.getType() == null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + param.put("siteId", tokenInfo.getSid()); + param.put("lastUpdAdmin", tokenInfo.getMid()); + if (param.get("siteMemo") == null) { + throw new ApiException("1000", "accessDinied"); + } + + commonService.updateSiteMemo(param); + + HashMap memoInfo = commonService.getSiteMemo(tokenInfo.getSid()); + apiResponse.put("memoInfo", memoInfo); + + apiResponse.success(); + + apiResponse.success(); + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/gameCodes") + public ApiResponse gameCodes(@RequestHeader String token, HttpServletRequest request, + @RequestBody CodeSearch codesSearch) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + codesSearch.setSiteId(tokenInfo.getSid()); + List codeList = commonService.getGameCodes(codesSearch); + apiResponse.put("codes", codeList); + apiResponse.put("codesSearch", codesSearch); + + apiResponse.success(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/gameGroupCodes") + public ApiResponse gameGroupCodes(@RequestHeader String token, HttpServletRequest request, + @RequestBody CodeSearch codesSearch) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + String siteId = tokenInfo.getSid(); + List codeList = commonService.getGameGroupCodes(siteId); + apiResponse.put("groupCodes", codeList); + + apiResponse.success(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/reportCateInfo") + public ApiResponse reportCateInfo(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + String siteId = tokenInfo.getSid(); + List> reportCateInfo = reportService.getReportCateInfo(siteId); + apiResponse.put("reportCateInfo", reportCateInfo); + + apiResponse.success(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/partnerLevels") + public ApiResponse partnerLevels(@RequestHeader String token, HttpServletRequest request, + @RequestBody CodeSearch codesSearch) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + List levelList = userService.getPartnerLevels(codesSearch); + apiResponse.put("partnerLevels", levelList); + + apiResponse.success(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/partnerMemIds") + public ApiResponse partnerMemIds(@RequestHeader String token, HttpServletRequest request, + @RequestBody CodeSearch codesSearch) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + Member searchMem = new Member(); + searchMem.setSiteId(tokenInfo.getSid()); + searchMem.setPartnerLevel(codesSearch.getCode()); + + List idList = userService.getPartnerMemIds(searchMem); + apiResponse.put("partnerMemIds", idList); + + apiResponse.success(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/partnerSearch") + public ApiResponse partnerSearch(@RequestHeader String token, HttpServletRequest request, + @RequestBody MemberSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + Member searchMem = new Member(); + searchMem.setSiteId(tokenInfo.getSid()); + searchMem.setMemId(search.getMemId()); + + HashMap partnerMemId = userService.getPartnerMemId(searchMem); + apiResponse.put("partnerMemId", partnerMemId); + + apiResponse.success(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = { "/partnerRates" }) + public ApiResponse partnerRates(@RequestHeader String token, HttpServletRequest request, + @RequestBody MemberSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (search.getSiteId() == null || search.getSiteId().equals("")) { + search.setSiteId(tokenInfo.getSid()); + } + + List rateList = userService.getPartnerRateList(search); + apiResponse.put("partnerMemId", search.getMemId()); + apiResponse.put("rateMaxMinList", rateList); + + Member search2 = new Member(); + search2.setSiteId(tokenInfo.getSid()); + search2.setMemId(search.getMemId()); + List> rateInfo = rateService.getMemRollingInfo(search2); + apiResponse.put("rateInfo", rateInfo); + + apiResponse.success(); + + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = { "/topRate" }) + public ApiResponse topRate(@RequestHeader String token, HttpServletRequest request, + @RequestBody MemberSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (search.getSiteId() == null || search.getSiteId().equals("")) { + search.setSiteId(tokenInfo.getSid()); + } + + List topRate = rateService.getTopRate(search); + apiResponse.put("topRate", topRate); + + apiResponse.success(); + + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/getVendorList") + public ApiResponse getVendorList(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + String siteId = tokenInfo.getSid(); + + List vendorList = commonService.getVendorList(); + log.info("vendorList: " + vendorList); + apiResponse.put("vendorList", vendorList); + + apiResponse.success(); + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + private Site getSiteByCheck(HttpServletRequest request) { + Site site = userService.getSiteInfoByKey(request.getHeader("Authorization").toString()); + return site; + } +} diff --git a/src/main/java/com/bb/admin/controller/AdminApiMemberController.java b/src/main/java/com/bb/admin/controller/AdminApiMemberController.java new file mode 100644 index 0000000..07fbf17 --- /dev/null +++ b/src/main/java/com/bb/admin/controller/AdminApiMemberController.java @@ -0,0 +1,2854 @@ +package com.bb.admin.controller; + +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.http.conn.ConnectTimeoutException; +import org.codehaus.jettison.json.JSONObject; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.ResourceAccessException; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.ApiResponse; +import com.bb.model.BlankSpinRate; +import com.bb.model.Block; +import com.bb.model.CashSearch; +import com.bb.model.CashTranLogSrch; +import com.bb.model.ChargingPointSettingVO; +import com.bb.model.IdListSearch; +import com.bb.model.LoginUserVO; +import com.bb.model.MemListSearchVO; +import com.bb.model.Member; +import com.bb.model.MemberDetail; +import com.bb.model.MemberInsert; +import com.bb.model.MemberInsert2; +import com.bb.model.MemberListSearch; +import com.bb.model.MemberRate; +import com.bb.model.MemberRateVo; +import com.bb.model.MemberSearch; +import com.bb.model.MemberStatus; +import com.bb.model.MemberUpdate; +import com.bb.model.Message; +import com.bb.model.MultipleRate; +import com.bb.model.MultipleRateInfo; +import com.bb.model.NewMemRateItem; +import com.bb.model.PageFormVO; +import com.bb.model.RateInfo; +import com.bb.model.RateVO; +import com.bb.model.RetailLockVO; +import com.bb.model.Site; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; +import com.bb.model.TreeListSearch; +import com.bb.service.AsyncExcoinOtcService; +import com.bb.service.BoardService; +import com.bb.service.CashService; +import com.bb.service.CommonService; +import com.bb.service.RateService; +import com.bb.service.RetailService; +import com.bb.service.TripleService; +import com.bb.service.UserService; +import com.bb.util.IPKit; +import com.bb.util.PagingUtil; +import com.bb.util.StringUtils; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@Slf4j +@RequestMapping("/api/admin/member") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class AdminApiMemberController { + + private final UserService userService; + + private final RetailService retailService; + + private final CashService cashService; + + private final JwtManager jwtManager; + + private final CommonService commonService; + + private final PasswordEncoder passwordEncoder; + + private final TripleService tripleService; + + private final BoardService boardService; + + private final RateService rateService; + + private final AsyncExcoinOtcService asyncExcoinOtcService; + + + @ResponseBody + @PostMapping(value={"/memberList"}) + public ApiResponse memberList(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberListSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-admin::memberList::"+tokenInfo.getSid()+":::"; + ObjectMapper objectMapper = new ObjectMapper(); + String reqJsonStr = objectMapper.writeValueAsString(search); + JSONObject reqObj = new JSONObject(reqJsonStr); + log.info(LOG_PREFIX+ "Request {}", reqObj); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + search.setPartnerType(""); + search.setSiteId(tokenInfo.getSid()); + + if(search.getUserType() == null) { + search.setUserType(""); // 전체 검색 + } + + HashMap totalInfo = userService.getMemberListCnt(search); + + int totalCount = Integer.parseInt(totalInfo.get("totalCnt").toString()); + if(totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List memList = userService.getMemberList(search); + apiResponse.put("list", memList); + apiResponse.put("totalInfo", totalInfo); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [전체회원 하이라키] API 기능 + */ + @ResponseBody + @PostMapping(value={"/hierarchy"}) + public ApiResponse treeHierarchy(@RequestHeader String token, HttpServletRequest request, @RequestBody MemListSearchVO search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + final String LOG_PREFIX = "#-admin::treeHierarchy::"+tokenInfo.getSid()+":::"; + ObjectMapper objectMapper = new ObjectMapper(); + String reqJsonStr = objectMapper.writeValueAsString(search); + JSONObject reqObj = new JSONObject(reqJsonStr); + log.info(LOG_PREFIX+ "Request {}", reqObj); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List hierarchy = userService.getUserTreeHierarchy(search); + apiResponse.put("hierarchy", hierarchy); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/memberTreeList"}) + public ApiResponse memberTreeList(@RequestHeader String token, HttpServletRequest request, @RequestBody MemListSearchVO search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-admin::memberTreeList::"+tokenInfo.getSid()+":::"; + ObjectMapper objectMapper = new ObjectMapper(); + String reqJsonStr = objectMapper.writeValueAsString(search); + JSONObject reqObj = new JSONObject(reqJsonStr); + log.info(LOG_PREFIX+ "Request {}", reqObj); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + search.setSiteId(tokenInfo.getSid()); + + if(search.getTreeOption() == null || !search.getTreeOption().equals("Y")) { + search.setTreeOption(""); // 하부전체 검색 + } + if(search.getUserType() == null || !search.getUserType().equals("N") || !search.getUserType().equals("P")) { + search.setUserType(""); // 전체 검색 + } + if(search.getTodayLoginYn() == null || !search.getTodayLoginYn().equals("Y")) { + search.setTodayLoginYn(""); // 전체 검색 + } + + int totalCount = userService.getMemberTreeListCnt(search); + if(totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + commonForm.setCount_per_list(100); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List memList = userService.getMemberTreeList(search); + apiResponse.put("list", memList); + apiResponse.put("search", search); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/join") + public ApiResponse join(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberInsert signupMember) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + String LOG_PREFIX = "#-admin::join::"; + + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + + signupMember.setSiteIdx(tokenInfo.getSidx()); + signupMember.setSiteId(tokenInfo.getSid()); + signupMember.setMemId(signupMember.getMemId().replaceAll(" ", "").replaceAll(" ", "").toLowerCase()); + LOG_PREFIX = LOG_PREFIX + tokenInfo.getSid()+"::"+signupMember.getMemId()+"::::"; + + if(signupMember.getMemId().equals("")) { + throw new ApiException("U098", "아이디를 입력해주세요."); + } + + if(signupMember.getRecommenderId() == null || signupMember.getRecommenderId().equals("")) { + throw new ApiException("U097", "추천인 계정을 입력해주세요."); + } + + String refer = request.getHeader("Referer"); + String domain = "unknown"; + if(refer != null) { + String[] urls = StringUtils.extractUrlParts(refer); + domain = urls[2]; + log.info(LOG_PREFIX+"::domain::"+domain+"::recommandId::"+signupMember.getRecommenderId()); + } + signupMember.setJoinDomain(domain); + + signupMember.setRecommenderId(signupMember.getRecommenderId().replaceAll(" ", "").toLowerCase()); + + signupMember.setRegId(tokenInfo.getMid()); + signupMember.setPartnerType(""); + log.info(LOG_PREFIX+ tokenInfo.getSid()); + log.info(LOG_PREFIX+ signupMember.getMemId()); + signupMember.setMemStatus("1"); + + String password = passwordEncoder.encode(signupMember.getMemPass()); + log.info(LOG_PREFIX+ "[MEMBER PWD:" + password + "]"); + signupMember.setMemPass(password); + + signupMember.setPartnerLevel("NORMAL"); + + signupMember.setRecommendYn("N"); + signupMember.setPointExchangeYn("Y"); + signupMember.setRollingYn("Y"); + signupMember.setCashSendYn("N"); + signupMember.setCashReceiveYn("N"); + + if(signupMember.getCashOutPass()==null || signupMember.getCashOutPass().equals("")) { + signupMember.setCashOutPass("0000"); + } + signupMember.setNationCode(""); + signupMember.setPartSendYn("N"); + signupMember.setMaxCredit(""); + signupMember.setCreditRate(""); + signupMember.setCreditStatus(""); + + Member recommendUser = new Member(); + recommendUser.setSiteId(tokenInfo.getSid()); + recommendUser.setMemId(signupMember.getRecommenderId()); + MemberDetail partner = userService.getMember(recommendUser); + + if(partner == null) { + throw new ApiException("U096", "존재하지 않는 추천인 계정입니다."); + } + + if(partner.getPartnerLevel().equals("COMP") || partner.getPartnerLevel().equals("AUTO")) { + throw new ApiException("U099", "추천인으로 사용할 수 없는 계정입니다."); + } + + if(partner.getRecommendYn().equals("N")) { + throw new ApiException("U099", "추천인으로 사용할 수 없는 계정입니다."); + } + + if(!partner.getMemStatus().equals("1")) { + throw new ApiException("U099", "추천인으로 사용할 수 없는 계정입니다."); + } + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + if(partner.getPartnerLevel().equals("NORMAL") && siteOption.getUserRecommenderChgYn().equals("N")) { + throw new ApiException("U099", "추천인으로 사용할 수 없는 계정입니다."); + } + + if(partner.getPartnerLevel().equals("NORMAL") && siteOption.getUserRecommenderChgYn().equals("Y")) { + int cnt = userService.getNormalRetailCnt(recommendUser); + if(cnt == 10) { + // 일반회원 최대 추천인 가능 단계(10) 초과 + throw new ApiException("U099", "추천인으로 사용할 수 없는 계정입니다."); + } + } + + Member checkMember = new Member(); + checkMember.setSiteId(signupMember.getSiteId()); + checkMember.setMemId(signupMember.getMemId()); + checkMember.setRecommenderId(signupMember.getRecommenderId()); + checkMember.setMemName(signupMember.getMemName()); + checkMember.setMemNick(signupMember.getMemNick()); + + int idCheck =userService.idCheck(checkMember); + if(idCheck>0) { + throw new ApiException("U005", "idCheck"); + } + /* + int idCheckByAdmin =userService.idCheckByAdmin(checkMember); + if(idCheckByAdmin>0) { + throw new ApiException("U005", "idCheckByAdmin"); + } + */ + int nameCheck = userService.nameCheck(checkMember); + if(nameCheck>0) { + throw new ApiException("U006", "nameCheck"); + } + + if(signupMember.getSiteId().equals(signupMember.getRecommenderId())) { + throw new ApiException("U099", "recommenderIdCheck"); + } + + ObjectMapper objectMapper = new ObjectMapper(); + String signupMemberJson = objectMapper.writeValueAsString(signupMember); + log.info(LOG_PREFIX+ "signupMemberJson::" + signupMemberJson); + + RateInfo rateInfo = signupMember.getRateInfo(); + if(rateInfo != null) { + rateInfo.setSiteId(signupMember.getSiteId()); + rateInfo.setMemId(signupMember.getMemId()); + + Member top = new Member(); + top.setSiteId(tokenInfo.getSid()); + top.setMemId(signupMember.getRecommenderId()); + List> topRateInfoList = rateService.getMemRollingInfo(top); + + for(RateVO mvo : rateInfo.getRateList()) { + mvo.setSiteId(rateInfo.getSiteId()); + mvo.setMemId(rateInfo.getMemId()); + String category = mvo.getCategory(); + String cateCode = mvo.getCateCode(); + Double pointRate = Double.valueOf(mvo.getPointRate()); + Double loseRate = Double.valueOf(mvo.getLoseRate()); + + for(HashMap topRateInfo : topRateInfoList) { + String topCategory = topRateInfo.get("category").toString(); + String topCateCode = topRateInfo.get("cateCode").toString(); + Double maxPointRate = Double.valueOf(topRateInfo.get("pointRate").toString()); + Double maxLoseRate = Double.valueOf(topRateInfo.get("loseRate").toString()); + if(cateCode.equals(topCateCode)) { + if(maxPointRate < pointRate) { + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::pointRate::"+pointRate); + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::MaxPointRate::"+maxPointRate); + String resultMsg = "롤링:"+"cateCode::"+cateCode+ "::"+maxPointRate+" 보다 작은값을 입력하세요"; + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + + if(maxLoseRate < loseRate) { + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::loseRate::"+loseRate); + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::MaxLoseRate::"+maxLoseRate); + String resultMsg = "루징:"+"cateCode::"+cateCode+ "::"+maxLoseRate+" 보다 작은값을 입력하세요"; + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + } + } + } + } + + userService.adminJoin(signupMember); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "CREATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", signupMember.getMemId()+"::회원 계정 생성"); + logParam.put("logDesc", signupMember.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error(LOG_PREFIX+ "insertAdminlog::Exception::"+e.toString()); } + + try { + Member search = new Member(); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(signupMember.getMemId()); + search.setPartnerLevel("NORMAL"); + + if(signupMember.getRateList() != null) { + MemberRate rateparam = new MemberRate(); + rateparam.setMemId(signupMember.getMemId()); + rateparam.setRateList(signupMember.getRateList()); + userService.getMemberbetYnUpdate(search, rateparam); + } + + if(rateInfo != null) { + rateService.rateInfoUpdate(rateInfo); + } + + } catch(Exception eee) { + log.error(LOG_PREFIX+ "Member_Rate_Setting::Exception::"+eee.toString()); + } + + apiResponse.success(); + } catch(ApiException e) { + log.error(LOG_PREFIX+ "ApiException::"+e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(LOG_PREFIX+ "Exception::"+e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/create") + public ApiResponse create(@RequestHeader String token, HttpServletRequest request, @RequestBody MemberInsert2 signupMember) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + String LOG_PREFIX = "#-admin::user::create::"; + + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + signupMember.setSiteIdx(tokenInfo.getSidx()); + signupMember.setSiteId(tokenInfo.getSid()); + + String refer = request.getHeader("Referer"); + String domain = "unknown"; + if(refer != null) { + String[] urls = StringUtils.extractUrlParts(refer); + domain = urls[2]; + log.info(LOG_PREFIX+"::domain::"+domain+"::recommandId::"+signupMember.getRecommenderId()); + } + signupMember.setJoinDomain(domain); + + if(signupMember.getMemIdList() == null || signupMember.getMemIdList().size() == 0) { + throw new ApiException("UC01", "아이디를 입력해주세요."); + } else { + for(String memId : signupMember.getMemIdList()) { + if(memId.equals("")) { + throw new ApiException("UC01", "아이디를 입력해주세요."); + } else { + Member checkMember = new Member(); + checkMember.setSiteId(signupMember.getSiteId()); + memId = memId.replaceAll(" ", "").toLowerCase(); + checkMember.setMemId(memId); + int idCheck = userService.idCheck(checkMember); + if(idCheck > 0) { + throw new ApiException("UC02", "중복 아이디: "+memId); + } + } + } + } + + if(signupMember.getMemNickList() == null || signupMember.getMemNickList().size() == 0) { + throw new ApiException("UC03", "닉네임을 입력해주세요."); + } else { + for(String memNick : signupMember.getMemNickList()) { + if(memNick.equals("")) { + throw new ApiException("UC03", "닉네임을 입력해주세요."); + } else { + Member checkMember = new Member(); + checkMember.setSiteId(signupMember.getSiteId()); + checkMember.setMemNick(memNick); + int nickCheck = userService.nameCheck(checkMember); + if(nickCheck > 0) { + throw new ApiException("UC04", "중복 닉네임: "+memNick); + } + } + } + } + + if(signupMember.getMemNameList() == null || signupMember.getMemNameList().size() == 0) { + throw new ApiException("UC05", "이름을 입력해주세요."); + } else { + for(String memName : signupMember.getMemNameList()) { + if(memName.equals("")) { + throw new ApiException("UC05", "이름을 입력해주세요."); + } + } + } + + if(signupMember.getMemIdList().size() != signupMember.getMemNickList().size() + || signupMember.getMemIdList().size() != signupMember.getMemNameList().size()) { + throw new ApiException("UC06", "아이디, 닉네임, 이름 갯수가 일치하지 않습니다."); + } + + if(signupMember.getMemIdList().size() > 30) { + throw new ApiException("UC07", "최대 30명까지 생성할 수 있습니다."); + } + + signupMember.setPartnerLevel("NORMAL"); + signupMember.setRecommenderId(signupMember.getRecommenderId().replaceAll(" ", "").toLowerCase()); + signupMember.setRecommendYn("N"); + + signupMember.setRegId(tokenInfo.getMid()); + signupMember.setMemStatus("1"); + + String password = passwordEncoder.encode(signupMember.getMemPass()); + log.info(LOG_PREFIX+ "[MEMBER PWD:" + password + "]"); + signupMember.setMemPass(password); + signupMember.setCashSendYn("N"); + signupMember.setCashReceiveYn("N"); + + if(signupMember.getCashOutPass()==null || signupMember.getCashOutPass().equals("")) { + signupMember.setCashOutPass("0000"); + } + + ObjectMapper objectMapper = new ObjectMapper(); + String signupMemberJson = objectMapper.writeValueAsString(signupMember); + log.info(LOG_PREFIX+ "signupMemberJson::" + signupMemberJson); + + if(signupMember.getRateList() != null) { + MemberSearch topUser = new MemberSearch(); + topUser.setSiteId(signupMember.getSiteId()); + topUser.setMemId(signupMember.getRecommenderId()); + List topRateList = rateService.getTopRate(topUser); + + for(RateVO topRate : topRateList) { + String topCtgr = topRate.getCategory(); + double topPR = Double.parseDouble(topRate.getPointRate()); + double topLR = Double.parseDouble(topRate.getLoseRate()); + for(RateVO botRate : signupMember.getRateList()) { + String botCtgr = botRate.getCategory(); + double botPR = Double.parseDouble(botRate.getPointRate()); + double botLR = Double.parseDouble(botRate.getLoseRate()); + + if(topCtgr.equals(botCtgr)) { + if(topPR < botPR) { + log.error(LOG_PREFIX+ "topCtgr::"+topCtgr+ "::topPR::"+topPR); + log.error(LOG_PREFIX+ "botCtgr::"+botCtgr+ "::botPR::"+botPR); + String resultMsg = "롤링:"+topCtgr+ "::"+topPR+" 보다 작은값을 입력하세요"; + log.error(LOG_PREFIX+ "resultMsg : " + resultMsg); + throw new ApiException("UC09", resultMsg); + } + if(topLR < botLR) { + log.error(LOG_PREFIX+ "topCtgr::"+topCtgr+ "::topLR::"+topLR); + log.error(LOG_PREFIX+ "botCtgr::"+botCtgr+ "::botLR::"+botLR); + String resultMsg = "루징:"+topCtgr+ "::"+topLR+" 보다 작은값을 입력하세요"; + log.error(LOG_PREFIX+ "resultMsg : " + resultMsg); + throw new ApiException("UC09", resultMsg); + } + } + } + } + } + + for(int i=0; i logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "CREATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", signupMember.getMemId()+"::회원 계정 생성"); + logParam.put("logDesc", signupMember.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error(LOG_PREFIX2+ "insertAdminlog::Exception::"+e.toString()); } + + // TODO : List rateList 등록 처리 + if(signupMember.getRateList() != null) { + for(RateVO botRate : signupMember.getRateList()) { + botRate.setSiteId(siteId); + botRate.setMemId(memId); + int myUpdateResult = rateService.myRateInfoUpdate(botRate); + log.info(LOG_PREFIX2+ "::myUpdateResult::"+myUpdateResult); + int topMinUpdateResult = rateService.topMinRateInfoUpdate(botRate); + log.info(LOG_PREFIX2+ "::topMinUpdateResult::"+topMinUpdateResult); + } + } + } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(LOG_PREFIX+ "ApiException::"+e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(LOG_PREFIX+ "Exception::"+e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/modify") + public ApiResponse modify(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberUpdate signupMember) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-admin::member::modify::"+tokenInfo.getSid()+":::"; + ObjectMapper objectMapper = new ObjectMapper(); + String reqJsonStr = objectMapper.writeValueAsString(signupMember); + JSONObject reqObj = new JSONObject(reqJsonStr); + log.info(LOG_PREFIX+ "Request {}", reqObj); + + signupMember.setSiteId(tokenInfo.getSid()); + signupMember.setUpdId(tokenInfo.getMid()); + + if(signupMember.getMemPass() != null && !signupMember.getMemPass().equals("")) { + String password = passwordEncoder.encode(signupMember.getMemPass()); + log.info(LOG_PREFIX+ "[MEMBER PWD:" + password + "]"); + signupMember.setMemPass(password); + } + + Member search = new Member(); + search.setSiteId(signupMember.getSiteId()); + search.setMemId(signupMember.getMemId()); + MemberDetail memDetail = userService.getMember(search); + String bfMemLevel = memDetail.getMemLevel(); + String afMemLevel = signupMember.getMemLevel(); + + userService.updateMember(signupMember); + + log.info(LOG_PREFIX+ "회원레벨보너스 수정:: " + bfMemLevel + " => " + afMemLevel); + if(!bfMemLevel.equals(afMemLevel)) { + try { + ChargingPointSettingVO param = new ChargingPointSettingVO(); + param.setSiteIdx(tokenInfo.getSidx()); + param.setMemLevel(afMemLevel); + ChargingPointSettingVO settingVO = commonService.getChargingPointSetting(param); + settingVO.setMemIdx(memDetail.getMemIdx()); + log.info(LOG_PREFIX+ "회원레벨보너스 수정::settingVO:: " + settingVO); + int result = userService.bonusSettingSave(settingVO); + log.info(LOG_PREFIX+ "회원레벨보너스 수정::result:: " + result); + } catch(Exception e) { + log.info(LOG_PREFIX+ "회원레벨보너스 수정 실패 : " + e.getMessage()); + } + + } + + // TODO: Excoin API 호출 + HashMap exCoinInfo = commonService.getVassApiInfo(search); + if(exCoinInfo.get("vaccCode") != null) { + log.info(LOG_PREFIX+ "API_INFO::" + exCoinInfo.toString()); + String vaccCode = exCoinInfo.get("vaccCode").toString(); + if(vaccCode.equals("excoin")) { + exCoinInfo.put("userEmail", memDetail.getMemId()); + exCoinInfo.put("userMobile", memDetail.getMemPhone().replaceAll("-", "").trim()); + exCoinInfo.put("userNm", memDetail.getMemName()); + // 회원수정 + int resultCode = asyncExcoinOtcService.updateUser(LOG_PREFIX, exCoinInfo); + log.info(LOG_PREFIX+ "OTC API resultCode::" + resultCode); + } + } + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", signupMember.getMemId()+"::회원 계정 수정"); + logParam.put("logDesc", signupMember.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error(LOG_PREFIX+ "insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + + } catch (ResourceAccessException rae) { + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error("[ConnectTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("ConnectTimeoutException"); + } + + if(rae.getCause() instanceof SocketTimeoutException) { + log.error("[SocketTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("SocketTimeoutException"); + } + + if(rae.getCause() instanceof InterruptedException) { + log.error("[InterruptedException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("InterruptedException"); + } + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/checkId") + public ApiResponse checkId(@RequestHeader String token, HttpServletRequest request, @RequestBody MemberListSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + Member checkMember = new Member(); + checkMember.setSiteId(tokenInfo.getSid()); + checkMember.setMemId(search.getMemId()); + + int idCheck =userService.idCheck(checkMember); + if(idCheck > 0) { + throw new ApiException("U005", "idCheck"); + } + /* + int idCheckByAdmin =userService.idCheckByAdmin(checkMember); + if(idCheckByAdmin > 0) { + throw new ApiException("U005", "idCheckByAdmin"); + } + */ + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/checkNickname") + public ApiResponse checkNickname(@RequestHeader String token, HttpServletRequest request, @RequestBody MemberListSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + Member checkMember = new Member(); + checkMember.setSiteId(tokenInfo.getSid()); + checkMember.setMemId(search.getMemId()); + checkMember.setMemNick(search.getMemNick()); + + int nameCheck = userService.nameCheck(checkMember); + if(nameCheck > 0) { + throw new ApiException("U006", "nameCheck"); + } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/detail") + public ApiResponse detail(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberSearch memberSearch) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + Member search = new Member(); + search.setMemId(memberSearch.getMemId()); + search.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + HashMap memberDetail = userService.getMemberDetail_1(search); + int totalChangePointAmt = userService.getTotalChangePointAmt(search); + memberDetail.put("totalChangePointAmt", totalChangePointAmt); + memberDetail.put("memPass", ""); + memberDetail.put("memberCommissionRate", userService.getMemberRate(search)); + + List memberFlow = userService.getMemberFlowList(memberDetail); + List partnerFlow = userService.getPartnerFlowList(memberDetail); + List> memRollingInfo = rateService.getMemRollingInfo(search); + + HashMap param = new HashMap<>(); + long siteIdx = Long.parseLong(memberDetail.get("siteIdx").toString()); + long memIdx = Long.parseLong(memberDetail.get("memIdx").toString()); + param.put("siteIdx", siteIdx); + param.put("memIdx", memIdx); + HashMap bonusSettingInfo = userService.getBonusSettingInfo(param); + + apiResponse.put("member", memberDetail); + apiResponse.put("memberFlow", memberFlow); + apiResponse.put("partnerFlow", partnerFlow); + apiResponse.put("memRollingInfo", memRollingInfo); + apiResponse.put("bonusSettingInfo", bonusSettingInfo); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/userLockWithBottom") + public ApiResponse userLockWithBottom(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody RetailLockVO search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + + HashMap param = new HashMap(); + param.put("siteId", tokenInfo.getSid()); + param.put("memId", search.getMemId()); + param.put("memLockYn", search.getMemLockYn()); + param.put("updId", tokenInfo.getMid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + param.toString()); + int updResult = retailService.userLockWithBottom(param); + log.info("[REQUEST: "+request.getRequestURI()+"] updResult: " + updResult); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", search.getMemId()+"::회원 계정 잠금"); + logParam.put("logDesc", search.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/bonusSetting") + public ApiResponse bonusSetting(HttpServletRequest request, @RequestHeader String token, @RequestBody ChargingPointSettingVO settingVO) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + settingVO.setSiteIdx(tokenInfo.getSidx()); + settingVO.setSiteId(tokenInfo.getSid()); + + if(settingVO.getMemId() == null || settingVO.getMemId().equals("")) { + throw new ApiException("F999", "Not found memId"); + } + + Member search = new Member(); + search.setSiteIdx(settingVO.getSiteIdx()); + search.setMemId(settingVO.getMemId()); + HashMap memberVo = userService.getMemberMap2(search); + int memIdx = (int) memberVo.get("memIdx"); + settingVO.setMemIdx(memIdx); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + settingVO); + int result = userService.bonusSettingSave(settingVO); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", settingVO.getMemId()+"::회원 보너스 세팅"); + logParam.put("logDesc", settingVO.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/updateBlankSpinRate") + public ApiResponse updateBlankSpinRate(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody BlankSpinRate rate) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + rate.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + rate); + if(rate.getBlankSpinCasinoRate() == null) { + rate.setBlankSpinCasinoRate(0); + } + + if(rate.getBlankSpinSlotRate() == null) { + rate.setBlankSpinSlotRate(0); + } + + userService.updateBlankSpinRate(rate); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", rate.getMemId()+"::회원 직하부 공회전율 변경"); + logParam.put("logDesc", rate.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/updateAllBlankSpinRate") + public ApiResponse updateAllBlankSpinRate(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody BlankSpinRate rate) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + rate.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + rate); + if(rate.getBlankSpinCasinoRate() == null) { + rate.setBlankSpinCasinoRate(0); + } + + if(rate.getBlankSpinSlotRate() == null) { + rate.setBlankSpinSlotRate(0); + } + + userService.updateAllBlankSpinRate(rate); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", rate.getMemId()+"::회원 하부전체 공회전율 변경"); + logParam.put("logDesc", rate.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/abuseLockReset") + public ApiResponse abuseLockReset(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberSearch memberSearch) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(memberSearch.getMemId() == null || memberSearch.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-abuseLockReset::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::"+memberSearch.getMemId()+"::::"; + + log.info(LOG_PREFIX+ "[REQUEST: "+request.getRequestURI()+"] " + memberSearch); + HashMap lockParam = new HashMap<>(); + lockParam.put("siteId", tokenInfo.getSid()); + lockParam.put("memId", memberSearch.getMemId()); + lockParam.put("cntReset", "Y"); + int lockResult = userService.resetUserLock(lockParam); + log.error(LOG_PREFIX+ "resetUserLock::result::" + lockResult); + + if(lockResult > 0) { + apiResponse.success(); + } else { + apiResponse.fail(); + } + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/partnerLevelUp") + public ApiResponse partnerLevelUp(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberSearch memberSearch) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + if(siteOption.getPartnerLevelChgYn().equals("N")) { + throw new ApiException("1000", "accessDinied"); + } + + Member search = new Member(); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(memberSearch.getMemId()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + MemberDetail partner = userService.getMember(search); + if(partner == null) { + throw new ApiException("U003", "unknown user"); + } + + int upResult = userService.setUserPartnerLevelUp(partner); + if(upResult > 0) { + apiResponse.success(); + } else { + apiResponse.fail(); + } + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/changeMemCashFlag") + public ApiResponse changeMemCashFlag(HttpServletRequest request, @RequestHeader String token, @RequestBody MemberSearch search) { + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + search.setSiteId(tokenInfo.getSid()); + if(search.getMemId()==null || search.getMemId().equals("")) { + throw new ApiException("F999", "Not found memId"); + } + + log.info("#-ADMIN::changeMemCashFlag::"+search.getSiteId()+"::"+search.getMemId()+"::"+"[REQUEST: "+request.getRequestURI()+"] " + search); + + HashMap flagParam = new HashMap<>(); + flagParam.put("siteId", search.getSiteId()); + flagParam.put("memId", search.getMemId()); + flagParam.put("changeFlag", "Y"); + int result = userService.userChangeFlag(flagParam); + log.info("#-ADMIN::changeMemCashFlag::"+search.getSiteId()+"::"+search.getMemId()+"::"+"userChangeFlag(Y) result="+result); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", search.getMemId()+"::회원 잔액 환전"); + logParam.put("logDesc", flagParam.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + + } catch (ResourceAccessException rae) { + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error("[ConnectTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("ConnectTimeoutException"); + } + + if(rae.getCause() instanceof SocketTimeoutException) { + log.error("[SocketTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("SocketTimeoutException"); + } + + if(rae.getCause() instanceof InterruptedException) { + log.error("[InterruptedException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("InterruptedException"); + } + + HashMap flagParam = new HashMap<>(); + flagParam.put("siteId", search.getSiteId()); + flagParam.put("memId", search.getMemId()); + flagParam.put("changeFlag", "Y"); + int result = userService.userChangeFlag(flagParam); + log.error("#-ADMIN::changeMemCashFlag::"+search.getSiteId()+"::"+search.getMemId()+"::"+"userChangeFlag(Y) result="+result); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + + HashMap flagParam = new HashMap<>(); + flagParam.put("siteId", search.getSiteId()); + flagParam.put("memId", search.getMemId()); + flagParam.put("changeFlag", "Y"); + int result = userService.userChangeFlag(flagParam); + log.error("#-ADMIN::changeMemCashFlag::"+search.getSiteId()+"::"+search.getMemId()+"::"+"userChangeFlag(Y) result="+result); + + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/baseRecommenderId") + public ApiResponse getBaseRecommenderId(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + Member search = new Member(); + search.setMemId(tokenInfo.getMid()); + search.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + String baseRecommenderId = userService.getBaseRecommenderId(search); + if(baseRecommenderId == null || "".equals(baseRecommenderId)) { + throw new ApiException("M1009", "최상위추천아이디 조회 중 오류발생. 관리자에게 문의하세요."); + } else { + apiResponse.put("recommenderId", baseRecommenderId); + } + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/idList"}) + public ApiResponse idList(@RequestHeader String token, HttpServletRequest request, @RequestBody IdListSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setTokenSId(tokenInfo.getSid()); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + int totalCount = userService.getIdListCnt(search); + + if(totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List idList = userService.getIdList(search); + apiResponse.put("list", idList); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/updateStatus") + public ApiResponse updateStatus(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberStatus status) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + status.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + status); + userService.updateStatus(status); + + if(status.getMemStatus().equals("1")) { + Message joinMsg = boardService.getJoinMessage(tokenInfo.getSid()); + if(joinMsg != null) { + Message message = new Message(); + message.setSiteId(tokenInfo.getSid()); + message.setRegId(tokenInfo.getSid()); + message.setMsgType("msg"); + message.setRecieveId(status.getMemId()); + message.setMsgTitle(joinMsg.getMsgTitle()); + message.setMsgDesc(joinMsg.getMsgDesc()); + message.setHiddenYn("N"); + message.setTargetType("member"); + log.info("[REQUEST: "+request.getRequestURI()+"] " + message); + boardService.msgSend(message); + } + } + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", status.getMemId()+"::회원 상태 변경"); + logParam.put("logDesc", status.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/updateOutAmtYn") + public ApiResponse updateOutAmtYn(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberStatus status) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + status.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + status); + userService.updateOutAmtYn(status); + + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/rate") + public ApiResponse rate(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberSearch memberSearch) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(memberSearch.getMemId() == null || memberSearch.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + Member search = new Member(); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(memberSearch.getMemId()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + memberSearch); + + List memRate= userService.getMemberRate(search); + apiResponse.put("rate", memRate); + + List> rateInfo = rateService.getMemRollingInfo(search); + apiResponse.put("rateInfo", rateInfo); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/updateRate") + public ApiResponse updateRate(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberRate memberRate) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + Member search = new Member(); + search.setMemId(memberRate.getMemId()); + search.setPartnerLevel("NORMAL"); + + if("super".equals(tokenInfo.getType())) { + search.setSiteId(memberRate.getSiteId()); + } else { + search.setSiteId(tokenInfo.getSid()); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + memberRate); + + NewMemRateItem rateItem = new NewMemRateItem(); + rateItem.setSiteId(tokenInfo.getSid()); + rateItem.setMemId(memberRate.getMemId()); + List myRateList = userService.getMemRateItemList(rateItem); + for(MemberRateVo mvo:memberRate.getRateList()) { + String vendorCode = mvo.getGameType(); + Double pointRate = Double.valueOf(mvo.getPointRate()); + Double loseRate = Double.valueOf(mvo.getLoseRate()); + + for(NewMemRateItem myRateInfo : myRateList) { + String myCode = myRateInfo.getVendorCode(); + Double maxPointRate = myRateInfo.getMaxPointRate(); + Double minPointRate = myRateInfo.getMinPointRate(); + Double maxLoseRate = myRateInfo.getMaxLoseRate(); + Double minLoseRate = myRateInfo.getMinLoseRate(); + if(vendorCode.equals(myCode)) { + if(maxPointRate < pointRate || minPointRate > pointRate) { + log.info("#-updateRate::"+myRateInfo.getSiteId()+"::"+myRateInfo.getMemId()+"::vendorcode::"+myCode+ "::pointRate::"+pointRate); + log.info("#-updateRate::"+myRateInfo.getSiteId()+"::"+myRateInfo.getMemId()+"::vendorcode::"+myCode+ "::MaxPointRate::"+maxPointRate+"::MinPointRate::"+minPointRate); + String resultMsg = "롤링:"+"::vendorcode::"+myCode+ "::"+maxPointRate+", "+minPointRate+" 사이값을 입력하세요"; + log.info("#-updateRate::"+myRateInfo.getSiteId()+"::"+myRateInfo.getMemId()+"::vendorcode::"+myCode+ "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + + if(maxLoseRate < loseRate || minLoseRate > loseRate) { + log.info("#-updateRate::"+myRateInfo.getSiteId()+"::"+myRateInfo.getMemId()+"::vendorcode::"+myCode+ "::loseRate::"+loseRate); + log.info("#-updateRate::"+myRateInfo.getSiteId()+"::"+myRateInfo.getMemId()+"::vendorcode::"+myCode+ "::MaxLoseRate::"+maxLoseRate+"::MinLoseRate::"+minLoseRate); + String resultMsg = "루징:"+"::vendorcode::"+myCode+ "::"+maxLoseRate+", "+minLoseRate+" 사이값을 입력하세요"; + log.info("#-updateRate::"+myRateInfo.getSiteId()+"::"+myRateInfo.getMemId()+"::vendorcode::"+myCode+ "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + } + } + } + + userService.getMemberRateUpdate(search, memberRate); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", memberRate.getMemId()+"::상세페이지 요율 변경"); + logParam.put("logDesc", memberRate.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/newUpdateRate") + public ApiResponse newUpdateRate(HttpServletRequest request, @RequestHeader String token, @RequestBody RateInfo rateInfo) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + String LOG_PREFIX = "#-admin::newUpdateRate::"; + + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + if(tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + if(rateInfo.getSiteId() == null || rateInfo.getSiteId().equals("")) { + throw new ApiException("MR01", "Not null siteId"); + } + if(rateInfo.getMemId() == null || rateInfo.getMemId().equals("")) { + throw new ApiException("MR01", "Not null memId"); + } + + Member search = new Member(); + search.setSiteId(rateInfo.getSiteId()); + search.setMemId(rateInfo.getMemId()); + LOG_PREFIX = LOG_PREFIX+rateInfo.getSiteId()+"::"+rateInfo.getMemId()+"::::"; + log.info(LOG_PREFIX+ "RateInfo::"+rateInfo); + + List> myRollingInfoList = rateService.getMemRollingInfo(search); + for(RateVO mvo : rateInfo.getRateList()) { + mvo.setSiteId(rateInfo.getSiteId()); + mvo.setMemId(rateInfo.getMemId()); + String category = mvo.getCategory(); + String cateCode = mvo.getCateCode(); + Double pointRate = Double.valueOf(mvo.getPointRate()); + Double loseRate = Double.valueOf(mvo.getLoseRate()); + + for(HashMap myRollingInfo : myRollingInfoList) { + String myCategory = myRollingInfo.get("category").toString(); + String myCateCode = myRollingInfo.get("cateCode").toString(); + Double maxPointRate = Double.valueOf(myRollingInfo.get("maxPointRate").toString()); + Double minPointRate = Double.valueOf(myRollingInfo.get("minPointRate").toString()); + Double maxLoseRate = Double.valueOf(myRollingInfo.get("maxLoseRate").toString()); + Double minLoseRate = Double.valueOf(myRollingInfo.get("minLoseRate").toString()); + if(cateCode.equals(myCateCode)) { + if(maxPointRate < pointRate || minPointRate > pointRate) { + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::pointRate::"+pointRate); + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::MaxPointRate::"+maxPointRate+"::MinPointRate::"+minPointRate); + String resultMsg = "롤링:"+"cateCode::"+cateCode+ "::"+maxPointRate+", "+minPointRate+" 사이값을 입력하세요"; + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + + if(maxLoseRate < loseRate || minLoseRate > loseRate) { + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::loseRate::"+loseRate); + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::MaxLoseRate::"+maxLoseRate+"::MinLoseRate::"+minLoseRate); + String resultMsg = "루징:"+"cateCode::"+cateCode+ "::"+maxLoseRate+", "+minLoseRate+" 사이값을 입력하세요"; + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + + if(10.0 < pointRate) { + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::pointRate::"+pointRate); + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::MaxPointRate::"+10.0); + String resultMsg = "롤링요율은 최대 10% 까지만 허용됩니다."; + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + + if(50.0 < loseRate) { + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::loseRate::"+loseRate); + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::MaxLoseRate::"+50.0); + String resultMsg = "루징요율은 최대 50% 까지만 허용됩니다."; + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + } + } + } + + rateService.rateInfoUpdate(rateInfo); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", rateInfo.getMemId()+"::요율 변경"); + logParam.put("logDesc", rateInfo.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(LOG_PREFIX+ "ApiException::"+e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(LOG_PREFIX+ "Exception::"+e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/multipleRateInfo") + public ApiResponse multipleRateInfo(@RequestHeader String token, HttpServletRequest request, @RequestBody MultipleRateInfo param) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + param.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + param); + + List multipleRateList = userService.getMultipleRateList(param); + param.setRateList(multipleRateList); + + apiResponse.put("multipleRateInfo", param); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/updateMultipleRate") + public ApiResponse updateMultipleRate(@RequestHeader String token, HttpServletRequest request, @RequestBody MultipleRateInfo param) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + param.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + param); + + List afterRateList = param.getRateList(); + List beforeRateList = userService.getMultipleRateList(param); + + for(MultipleRate afterRate : afterRateList) { + for(MultipleRate beforeRate : beforeRateList) { + if(afterRate.getRateType().equals(beforeRate.getRateType())) { + if(beforeRate.getMaxPointRate() < afterRate.getPointRate() || beforeRate.getMinPointRate() > afterRate.getPointRate()) { + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::rateType::"+afterRate.getRateType()+"::pointRate::"+afterRate.getPointRate()); + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::rateType::"+afterRate.getRateType()+"::MaxPointRate::"+beforeRate.getMaxPointRate()+"::MinPointRate::"+beforeRate.getMinPointRate()); + String resultMsg = "["+afterRate.getRateType()+"] 롤링:"+beforeRate.getMaxPointRate()+", "+beforeRate.getMinPointRate()+" 사이값을 입력하세요"; + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::resultMsg : " + resultMsg); + throw new ApiException("U032", resultMsg); + } + + if(beforeRate.getMaxLoseRate() < afterRate.getLoseRate() || beforeRate.getMinLoseRate() > afterRate.getLoseRate()) { + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::rateType::"+afterRate.getRateType()+"::loseRate::"+afterRate.getLoseRate()); + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::rateType::"+afterRate.getRateType()+"::MaxLoseRate::"+beforeRate.getMaxLoseRate()+"::MinLoseRate::"+beforeRate.getMinLoseRate()); + String resultMsg = "["+afterRate.getRateType()+"] 루징:"+beforeRate.getMaxPointRate()+", "+beforeRate.getMinPointRate()+" 사이값을 입력하세요"; + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::resultMsg : " + resultMsg); + throw new ApiException("U032", resultMsg); + } + } + } + } + + userService.updateMultipleRate(param); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", param.getMemId()+"::회원 Multiple 요율 변경"); + logParam.put("logDesc", param.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/updateMemListIcon") + public ApiResponse updateMemListIcon(@RequestHeader String token, HttpServletRequest request, @RequestBody MemberUpdate memberVO) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + memberVO.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + memberVO); + userService.updateMemListIcon(memberVO); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", memberVO.getMemId()+"::회원 리스트 변경"); + logParam.put("logDesc", memberVO.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/deniedLoginIp") + public ApiResponse deniedLoginIp(@RequestHeader String token, HttpServletRequest request, @RequestBody MemberListSearch memberVO) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + memberVO.setSiteId(tokenInfo.getSid()); + + if(memberVO.getMemId() == null || memberVO.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + if(memberVO.getIp() == null || memberVO.getIp().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + memberVO); + Block block = new Block(); + block.setSiteId(tokenInfo.getSid()); + block.setBlockType("IP"); + block.setBlockTarget(memberVO.getIp()); + block.setBlockTerm(0); + block.setRegId(tokenInfo.getMid()); + commonService.blockSave(block); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", memberVO.getMemId()+"::"+memberVO.getIp()+"::회원 로그인IP 차단"); + logParam.put("logDesc", block.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/settingCashInOut"}) + public ApiResponse settingCashInOut(@RequestHeader String token, HttpServletRequest request, @RequestBody HashMap param) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + + if(param == null || param.get("memId") == null || param.get("memId").toString().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + if(param == null || param.get("setType") == null || param.get("setType").toString().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + if(param == null || param.get("setYn") == null || param.get("setYn").toString().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + param.put("siteId", tokenInfo.getSid()); + // param.get("setType") : SEND(지급설정), RECEIVE(회수설정) + // param.get("setYn") : Y(설정), N(해제) + log.info("[REQUEST: "+request.getRequestURI()+"] " + param.toString()); + + int result = userService.settingCashInOut(param); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/rollingList"}) + public ApiResponse rollingList(@RequestHeader String token, HttpServletRequest request, @RequestBody MemberListSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + search.setPartnerType(""); + search.setSiteId(tokenInfo.getSid()); + + int totalCount = userService.getMemRollingListCnt(search); + if(totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List memList = userService.getMemRollingList(search); + apiResponse.put("list", memList); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/statusList"}) + public ApiResponse statusList(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberListSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0) search.setPage(1); + search.setPartnerType(""); + search.setSiteId(tokenInfo.getSid()); + + int totalCount = userService.getMemStatusListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List memList = userService.getMemStatusList(search); + apiResponse.put("list", memList); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/logList"}) + public ApiResponse logList(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberListSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + search.setPartnerType(""); + search.setSiteId(tokenInfo.getSid()); + + int totalCount = userService.getMemLogListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List memList = userService.getMemLogList(search); + apiResponse.put("list", memList); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/memLogout") + public ApiResponse memLogout(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberListSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", search.getMemId()+"::회원 강제 로그아웃"); + logParam.put("logDesc", ""); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + try { + Map logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId",search.getMemId()); + logParam.put("logType", "FORCELOGOUT"); + logParam.put("logoutYn", "N"); + logParam.put("logName", "강제로그아웃"); + logParam.put("logDesc", ""); + logParam.put("regId", tokenInfo.getSid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertlog(logParam); + + logParam.put("actionType", 0); + commonService.updateAcctionLog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/loginList"}) + public ApiResponse loginList(@RequestHeader String token, HttpServletRequest request, @RequestBody MemberListSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + search.setPartnerType(""); + search.setSiteId(tokenInfo.getSid()); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + long nDate = System.currentTimeMillis(); + String nDateStr = sdf.format(nDate); + if(search.getStartDate() == null || search.getStartDate().equals("")) { + search.setStartDate(nDateStr); + } + if(search.getEndDate() == null || search.getEndDate().equals("")) { + search.setEndDate(nDateStr); + } + + /* + int totalCount = userService.getMemLoginListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + */ + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List memList = userService.getMemLoginList(search); + apiResponse.put("list", memList); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/ipList"}) + public ApiResponse ipList(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberListSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + if(search.getOrderStr() == null || search.getOrderStr().equals("")) { + search.setOrderStr("CNT_DESC"); + } + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + search.setPartnerType(""); + search.setSiteId(tokenInfo.getSid()); + + int totalCount = userService.getIpListCnt(search); + if(totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List memList = userService.getIpList(search); + apiResponse.put("list", memList); + + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/ipDetailList"}) + public ApiResponse ipDetailList(@RequestHeader String token, HttpServletRequest request, @RequestBody MemberListSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + if(search.getIp() == null || search.getIp().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List memList = userService.getIpDetailList(search); + apiResponse.put("list", memList); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/treeList"} ) + public ApiResponse treeList(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody TreeListSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + if("".equals(search.getTargetId()) || search.getTargetId() == null) { + search.setTargetId(tokenInfo.getSid()); + + } + search.setSearchType("member"); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List treeList = userService.getMemTreeList(search); + apiResponse.put("list", treeList); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/cashTransLog"}) + public ApiResponse cashTransLog(@RequestHeader String token, HttpServletRequest request, @RequestBody CashTranLogSrch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + String startDateStr = search.getStartDate(); + log.info("[REQUEST: "+request.getRequestURI()+"] BF::startDateStr:" + startDateStr); + if(startDateStr!=null && !"".equals(startDateStr)) { + startDateStr = startDateStr.substring(0, 10); + search.setStartDate(startDateStr); + log.info("[REQUEST: "+request.getRequestURI()+"] AF::startDateStr:" + startDateStr); + } + + String endDateStr = search.getEndDate(); + log.info("[REQUEST: "+request.getRequestURI()+"] BF::endDateStr:" + endDateStr); + if(endDateStr!=null && !"".equals(endDateStr)) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date endDate = sdf.parse(endDateStr); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(endDate); + calendar.add(Calendar.DAY_OF_MONTH, 1); + endDate = calendar.getTime(); + endDateStr = sdf.format(endDate); + log.info("[REQUEST: "+request.getRequestURI()+"] MF::endDateStr:" + endDateStr); + endDateStr = endDateStr.substring(0, 10); + search.setEndDate(endDateStr); + log.info("[REQUEST: "+request.getRequestURI()+"] AF::endDateStr:" + endDateStr); + } + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + int totalCount = cashService.cashTransLogCnt(search); + + if(totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(10); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(20); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List cashTransLogs = cashService.cashTransLogList(search); + apiResponse.put("cashTransLogs", cashTransLogs); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/cashSendlist") + public ApiResponse cashSendlist(@RequestHeader String token, HttpServletRequest request, @RequestBody CashSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + if("in".equals(search.getCashType()) || "-3".equals(search.getCashType())) { + search.setCashType("IN_CASH"); + } + + if("out".equals(search.getCashType()) || "3".equals(search.getCashType())) { + search.setCashType("OUT_CASH"); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + int totalCount = cashService.getCashSendListCnt(search); + + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + List> cashList = cashService.getCashSendList(search); + apiResponse.put("list", cashList); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/resetPassword") + public ApiResponse resetPassword(@RequestHeader String token, HttpServletRequest request, @RequestBody MemberUpdate memberVO) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + Member param = new Member(); + param.setSiteId(tokenInfo.getSid()); + param.setMemId(memberVO.getMemId()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + memberVO); + + int result = userService.resetPassword(param, passwordEncoder); + if(result > 0) { + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", memberVO.getMemId()+"::resetPassword"); + logParam.put("logDesc", ""); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + } else { + throw new ApiException("R999", "Reset password fail"); + } + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/recUpdate") + public ApiResponse recUpdate(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberListSearch signupMember) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + signupMember.setSiteId(tokenInfo.getSid()); + + Map param = new HashMap(); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + signupMember); + +// userService.recUpdate(signupMember); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/cashAmt") + public ApiResponse getUserCashAmt(HttpServletRequest request, @RequestHeader String token, @RequestBody MemberSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + MemberSearch param = new MemberSearch(); + param.setSiteId(tokenInfo.getSid()); + param.setMemId(search.getMemId()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + param); + + HashMap userCashAmt = userService.getUserCashAmt(param); + apiResponse.put("userCashAmt", userCashAmt); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + /** + * 회원 전체 패스워드 초기화(아이디로) + * @param request + * @param token + * @return + * @throws Exception + */ + @ResponseBody + @PostMapping(value="/passAllReset") + public ApiResponse passAllReset(HttpServletRequest request, @RequestHeader String token) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-admin::passAllReset::"+tokenInfo.getMid()+":::"; + List> userList = userService.getPassAllResetList(tokenInfo.getSid()); + log.info(LOG_PREFIX+ "userList size : " + userList.size()); + for(HashMap user : userList) { + String memId = user.get("memId").toString(); + String newPass = passwordEncoder.encode(memId); + Member memberVO = new Member(); + memberVO.setSiteId(user.get("siteId").toString()); + memberVO.setMemId(memId); + memberVO.setMemPass(newPass); + int updResult = userService.resetPassword2(memberVO); + log.info(LOG_PREFIX+ "ID:"+memId+" - updResult : " + updResult); + } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + private Site getSiteByCheck(HttpServletRequest request) { + Site site = userService.getSiteInfoByKey(request.getHeader("Authorization").toString()); + return site; + } +} diff --git a/src/main/java/com/bb/admin/controller/AdminApiMiniGameController.java b/src/main/java/com/bb/admin/controller/AdminApiMiniGameController.java new file mode 100644 index 0000000..b1805a3 --- /dev/null +++ b/src/main/java/com/bb/admin/controller/AdminApiMiniGameController.java @@ -0,0 +1,232 @@ +package com.bb.admin.controller; + +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.util.HashMap; +import java.util.List; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.ApiResponse; +import com.bb.model.BetSearch; +import com.bb.model.MiniGameSearch; +import com.bb.model.MinigameBetRate; +import com.bb.model.MinigameSet; +import com.bb.model.PageFormVO; +import com.bb.model.Site; +import com.bb.service.BetService; +import com.bb.service.MinigameService; +import com.bb.service.UserService; +import com.bb.util.PagingUtil; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + + +@RestController +@Slf4j +@RequestMapping("/api/admin/minigame") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class AdminApiMiniGameController { + + private final UserService userService; + + private final MinigameService minigameService; + + private final BetService betService; + + private final JwtManager jwtManager; + + private static final long serialVersionUID = 1L; + private static NumberFormat formatter = new DecimalFormat("#0.00"); + + + @ResponseBody + @PostMapping(value={"/setSave"}) + public ApiResponse setSave(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MinigameSet mgs) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + mgs.setSiteId(tokenInfo.getSid()); + minigameService.setSave(mgs); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value={"/betRateSave"}) + public ApiResponse betRateSave(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MinigameBetRate mbr) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + mbr.setSiteId(tokenInfo.getSid()); + mbr.setUpdId(tokenInfo.getMid()); + minigameService.betRateSave(mbr); + + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/setList") + public ApiResponse setList( @RequestHeader String token, HttpServletRequest request, @RequestBody MiniGameSearch search ) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + List setList = minigameService.getSetList(search); + + apiResponse.put("list", setList); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value="/betRateList") + public ApiResponse betRateList( @RequestHeader String token, HttpServletRequest request, @RequestBody MiniGameSearch search ) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + List betRateList = minigameService.getBetRateList(search); + apiResponse.put("list", betRateList); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/powerballResult"}) + public ApiResponse minigameResult(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody BetSearch search ) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + search.setSiteId(tokenInfo.getSid()); + int totalCount = betService.getPowerballResultListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + System.out.println(search.getLimit()); + System.out.println(search.getOffset()); + + List list = betService.getPowerballResultList(search); + apiResponse.put("list", list); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + private Site getSiteByCheck(HttpServletRequest request) { + Site site = userService.getSiteInfoByKey(request.getHeader("Authorization").toString()); + return site; + } +} diff --git a/src/main/java/com/bb/admin/controller/AdminApiPartnerController.java b/src/main/java/com/bb/admin/controller/AdminApiPartnerController.java new file mode 100644 index 0000000..9f11c31 --- /dev/null +++ b/src/main/java/com/bb/admin/controller/AdminApiPartnerController.java @@ -0,0 +1,855 @@ +package com.bb.admin.controller; + +import java.util.HashMap; +import java.util.List; + +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.ApiResponse; +import com.bb.model.CompDetail; +import com.bb.model.CompSearch; +import com.bb.model.Member; +import com.bb.model.MemberInsert; +import com.bb.model.MemberListSearch; +import com.bb.model.MemberRate; +import com.bb.model.MemberSearch; +import com.bb.model.MemberStatus; +import com.bb.model.PageFormVO; +import com.bb.model.PartnerCompInfo; +import com.bb.model.Site; +import com.bb.model.SiteSearch; +import com.bb.model.TreeListSearch; +import com.bb.service.CommonService; +import com.bb.service.CompService; +import com.bb.service.UserService; +import com.bb.util.IPKit; +import com.bb.util.PagingUtil; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@Slf4j +@RequestMapping("/api/admin/partner") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class AdminApiPartnerController { + + private final UserService userService; + + private final CompService compService; + + private final CommonService commonService; + + private final PasswordEncoder passwordEncoder; + + private final JwtManager jwtManager; + + @ResponseBody + @PostMapping(value="/signup") + public ApiResponse signup(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberInsert signupMember) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + String createSiteId = signupMember.getMemId().replaceAll(" ", "").replaceAll(" ", "").toLowerCase(); + final String LOG_PREFIX = "#-admin::addCompany::"+createSiteId+"::::"; + + if(createSiteId.equals("")) { + throw new ApiException("U005", "idCheckByAdmin"); + } + + String myType = tokenInfo.getType(); + String targetType = signupMember.getPartnerType(); + + if(myType.equals("agency")) { + throw new ApiException("1000", "accessDinied"); + } + + if(myType.equals(targetType)) { + throw new ApiException("1000", "accessDinied"); + } + + if(myType.equals("master") && targetType.equals("senior")) { + throw new ApiException("1000", "accessDinied"); + } + + signupMember.setMemId(createSiteId); + signupMember.setSiteId(createSiteId); + signupMember.setAdminId(createSiteId); + signupMember.setRegId(tokenInfo.getMid()); +// System.out.print(tokenInfo.getSid()); +// System.out.print(signupMember.getMemId()); + signupMember.setMemLevel("99"); + signupMember.setPartnerLevel("COMP"); + signupMember.setMemStatus("1"); + signupMember.setRecommenderId(tokenInfo.getSid()); + + Member checkMember = new Member(); + checkMember.setSiteId(createSiteId); + checkMember.setMemId(createSiteId); + checkMember.setRecommenderId(signupMember.getRecommenderId()); + /* + int idCheck =userService.idCheck(checkMember); + if(idCheck>0) { + throw new ApiException("U005", "idCheck"); + } + */ + int idCheckByAdmin =userService.idCheckByAdmin(checkMember); + if(idCheckByAdmin>0) { + throw new ApiException("U005", "idCheckByAdmin"); + } + + int nameCheck =userService.nameCheck(checkMember); + if(nameCheck>0) { + throw new ApiException("U006", "nameCheck"); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + signupMember); + + int result = userService.adminSignUp(LOG_PREFIX, signupMember, passwordEncoder); + if(result == 0) { + throw new ApiException("SP99", "site prefix check"); + } + + Member search = new Member(); + search.setMemId(signupMember.getMemId()); + search.setSiteId(tokenInfo.getSid()); + search.setPartnerLevel("COMP"); + + if(signupMember.getRateList() != null) { + MemberRate rateparam = new MemberRate(); + rateparam.setMemId(signupMember.getMemId()); + rateparam.setRateList(signupMember.getRateList()); + userService.getMemberRateUpdate(search, rateparam); + userService.getMemberbetYnUpdate(search, rateparam); + } + + apiResponse.success(); + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/modify/compInfo") + public ApiResponse modifyCompInfo(@RequestHeader String token, HttpServletRequest request, @RequestBody PartnerCompInfo compInfo) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(compInfo.getSiteDomain() == null) { + compInfo.setSiteDomain(""); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + + compInfo.setTopCompId(tokenInfo.getSid()); + int chkTopComp = compService.getCheckTopComp(compInfo); + if(chkTopComp == 1) { + if(compInfo.getUserCountLimit() == null || compInfo.getUserCountLimit().equals("")) { compInfo.setUserCountLimit("1000"); } + if(compInfo.getCompCountLimit() == null || compInfo.getCompCountLimit().equals("")) { compInfo.setCompCountLimit("10"); } + + if(compInfo.getPassword() != null && !compInfo.getPassword().equals("")) { + String password = passwordEncoder.encode(compInfo.getPassword()); + log.info("[ADMIN PWD:" + password + "]"); + compInfo.setPassword(password); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + compInfo); + + int result = compService.modifyCompInfo(compInfo); + try{ + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", compInfo.getSiteId()+"::업체 수정"); + logParam.put("logDesc", compInfo.toString()); + logParam.put("regId", tokenInfo.getSid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { System.out.print(e.toString()); } + + if(result > 0) { + apiResponse.success(); + } else { + throw new ApiException("COMP009", "회사정보 설정에 문제가 발생하였습니다. 관리자에게 문의하세요."); + } + } else { + throw new ApiException("COMP099", "권한이 없는 사용자 입니다."); + } + + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/modify/siteSettings") + public ApiResponse modifySiteSettings(@RequestHeader String token, HttpServletRequest request, @RequestBody PartnerCompInfo compInfo) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + compInfo.setTopCompId(tokenInfo.getSid()); + int chkTopComp = compService.getCheckTopComp(compInfo); + if(chkTopComp == 1) { + + log.info("[REQUEST: "+request.getRequestURI()+"] " + compInfo); + int result = compService.modifySiteSettings(compInfo); + + try{ + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", compInfo.getSiteId()+"::업체 세팅 수정"); + logParam.put("logDesc", compInfo.toString()); + + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { System.out.print(e.toString()); } + + if(result > 0) { + apiResponse.success(); + } else { + throw new ApiException("COMP009", "사이트 기능 설정에 문제가 발생하였습니다. 관리자에게 문의하세요."); + } + } else { + throw new ApiException("COMP099", "권한이 없는 사용자 입니다."); + } + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/modify/creditSettings") + public ApiResponse modifyCreditSettings(@RequestHeader String token, HttpServletRequest request, @RequestBody PartnerCompInfo compInfo) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + compInfo.setTopCompId(tokenInfo.getSid()); + int chkTopComp = compService.getCheckTopComp(compInfo); + if(chkTopComp == 1) { + + log.info("[REQUEST: "+request.getRequestURI()+"] " + compInfo); + + // TODO: 기본수수료율 변경 전 해당 사이트 크레딧(알) 잔액이 0인지 체크. 0이아니면 변경 불가능 + Site search = new Site(); + search.setSiteId(compInfo.getSiteId()); + CompDetail comp = compService.getPartnerComp(search); + int creditAmt = Integer.parseInt(comp.getCreditAmt()); + if(creditAmt > 0) { + throw new ApiException("COMP010", "보유알이 0일때만 기본수수료율 변경이 가능합니다."); + } + + int result = compService.modifyCreditSettings(compInfo); + try{ + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", compInfo.getSiteId()+"::업체 크레딧 세팅 수정"); + logParam.put("logDesc", compInfo.toString()); + + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { System.out.print(e.toString()); } + + if(result > 0) { + apiResponse.success(); + } else { + throw new ApiException("COMP009", "PT 설정에 문제가 발생하였습니다. 관리자에게 문의하세요."); + } + } else { + throw new ApiException("COMP099", "권한이 없는 사용자 입니다."); + } + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/modify/creditRates") + public ApiResponse modifyCreditRates(@RequestHeader String token, HttpServletRequest request, @RequestBody MemberRate memberRate) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + PartnerCompInfo compInfo = new PartnerCompInfo(); + compInfo.setSiteId(memberRate.getSiteId()); + compInfo.setTopCompId(tokenInfo.getSid()); + int chkTopComp = compService.getCheckTopComp(compInfo); + if(chkTopComp == 1) { + Member search = new Member(); + search.setSiteId(memberRate.getSiteId()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + memberRate); + int result = compService.modifyCreditRates(search, memberRate); + try{ + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", compInfo.getSiteId()+"::업체 크레딧 요율 수정"); + logParam.put("logDesc", compInfo.toString()); + + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { System.out.print(e.toString()); } + + if(result > 0) { + apiResponse.success(); + } else { + throw new ApiException("COMP009", "게임별 PT수수료율 설정에 문제가 발생하였습니다. 관리자에게 문의하세요."); + } + } else { + throw new ApiException("COMP099", "권한이 없는 사용자 입니다."); + } + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/modify/biSubPointRates") + public ApiResponse modifyBiSubPointRates(@RequestHeader String token, HttpServletRequest request, @RequestBody PartnerCompInfo compInfo) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + compInfo.setTopCompId(tokenInfo.getSid()); + int chkTopComp = compService.getCheckTopComp(compInfo); + if(chkTopComp == 1) { + + log.info("[REQUEST: "+request.getRequestURI()+"] " + compInfo); + int result = compService.modifySiteGameSetting(compInfo); + try{ + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", compInfo.getSiteId()+"::업체 보험포인트 요율 수정"); + logParam.put("logDesc", compInfo.toString()); + + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { System.out.print(e.toString()); } + + if(result > 0) { + apiResponse.success(); + } else { + throw new ApiException("COMP009", "서브포인트요율 설정에 문제가 발생하였습니다. 관리자에게 문의하세요."); + } + } else { + throw new ApiException("COMP099", "권한이 없는 사용자 입니다."); + } + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/modify/betSettings") + public ApiResponse modifyBetSettings(@RequestHeader String token, HttpServletRequest request, @RequestBody PartnerCompInfo compInfo) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + compInfo.setTopCompId(tokenInfo.getSid()); + int chkTopComp = compService.getCheckTopComp(compInfo); + if(chkTopComp == 1) { + + log.info("[REQUEST: "+request.getRequestURI()+"] " + compInfo); + int result = compService.modifySiteGameSetting(compInfo); + try{ + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", compInfo.getSiteId()+"::업체 게임세팅 수정"); + logParam.put("logDesc", compInfo.toString()); + + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { System.out.print(e.toString()); } + + if(result > 0) { + apiResponse.success(); + } else { + throw new ApiException("COMP009", "배팅 가능유/무 설정에 문제가 발생하였습니다. 관리자에게 문의하세요."); + } + } else { + throw new ApiException("COMP099", "권한이 없는 사용자 입니다."); + } + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/detail") + public ApiResponse detail(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberSearch memberSearch) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + Member search2 = new Member(); + search2.setMemId(memberSearch.getMemId()); + search2.setSiteId(memberSearch.getSiteId()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + memberSearch); + HashMap memberDetail = compService.getPartnerCompDetail(search2); + memberDetail.put("memPass", ""); + + memberDetail.put("memberCommissionRate", compService.getCompanyRate(search2)); + memberDetail.put("BI_SubPointRate", userService.getBISubPointRate(search2)); + + List memberFlow = userService.getMemberFlowList(memberDetail); + List partnerFlow = userService.getPartnerFlowList(memberDetail); + + apiResponse.put("memberDetail", memberDetail); + apiResponse.put("memberFlow", memberFlow); + apiResponse.put("partnerFlow", partnerFlow); + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value="/getTripleGameRate") + public ApiResponse getTripleGameRate(@RequestHeader String token, HttpServletRequest request, @RequestBody CompSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List> rateList = compService.getOmsRateListByTripleGame(search); + apiResponse.put("list", rateList); + + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/setTripleGameRate") + public ApiResponse setTripleGameRate(@RequestHeader String token, HttpServletRequest request, @RequestBody CompSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + HashMap tripleParam = compService.getTripleParam(search); + log.info("[REQUEST: "+request.getRequestURI()+"] " + tripleParam); + if(tokenInfo.getSid().equals(tripleParam.get("topCompId").toString()) || tokenInfo.getType().equals("super")) { + List> tripleRateList = compService.getTripleGameRate(tripleParam); + + compService.insertTripleRateList(search, tripleRateList); + + compService.updateOmsRateList(search); + + List> rateList = compService.getOmsRateListByTripleGame(search); + apiResponse.put("list", rateList); + } else { + throw new ApiException("COMP099", "권한이 없는 사용자 입니다."); + } + + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/passChg") + public ApiResponse passwsChg(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody Site site) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + log.info("[REQUEST: "+request.getRequestURI()+"] " + site); + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + site.setSiteId(tokenInfo.getSid()); + + if(site.getSitePass() == null || site.getSitePass().equals("")) { + throw new ApiException("S999", "현재 비밀번호를 입력하세요."); + } + + if(site.getNewSitePass() != null && !site.getNewSitePass().equals("")) { + String password = passwordEncoder.encode(site.getNewSitePass()); + log.info("[ADMIN NEW PWD:" + password + "]"); + site.setNewSitePass(password); + } + + SiteSearch search = new SiteSearch(); + search.setSiteId(site.getSiteId()); + HashMap siteinfo= userService.adminLogin(search); + + boolean chkPassword = passwordEncoder.matches(site.getSitePass(), siteinfo.get("sitePass").toString()); + log.info("[ADMIN chkPassword:" + chkPassword + "]"); + + if(!chkPassword) { + throw new ApiException("S999", "현재 비밀번호가 다릅니다."); + } + + if(!tokenInfo.getSid().equals(tokenInfo.getMid())) { + site.setAdminId(tokenInfo.getMid()); + userService.updateAdminPwd(site); + } + + userService.updatePwd(site); + + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/updateStatus") + public ApiResponse updateStatus(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberStatus status) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + status.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + status); + userService.updateStatus(status); + try{ + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", status.getMemId()+"::업체 세팅 수정"); + logParam.put("logDesc", status.toString()); + + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { System.out.print(e.toString()); } + + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/list"} ) + public ApiResponse list(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberListSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + PageFormVO pageVo= new PageFormVO(); + search.setSiteId(tokenInfo.getSid()); + + int totalCount = compService.getPartnerCompListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List compList = compService.getPartnerCompList(search); + apiResponse.put("list", compList); + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/treeList"} ) + public ApiResponse treeList(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody TreeListSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + if("".equals(search.getTargetId()) || search.getTargetId() == null) { + search.setTargetId(tokenInfo.getSid()); + } + search.setSearchType("partner"); // 여기서 "partner"는 컴퍼니를 지칭함. 파트너유저가 아님. + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List treeList = userService.getMemTreeList(search); + apiResponse.put("list", treeList); + + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + private Site getSiteByCheck(HttpServletRequest request) { + Site site = userService.getSiteInfoByKey(request.getHeader("Authorization").toString()); + return site; + + } +} diff --git a/src/main/java/com/bb/admin/controller/AdminApiPointController.java b/src/main/java/com/bb/admin/controller/AdminApiPointController.java new file mode 100644 index 0000000..21abe97 --- /dev/null +++ b/src/main/java/com/bb/admin/controller/AdminApiPointController.java @@ -0,0 +1,496 @@ +package com.bb.admin.controller; + +import java.net.SocketTimeoutException; +import java.util.HashMap; +import java.util.List; + +import org.apache.http.conn.ConnectTimeoutException; +import org.codehaus.jettison.json.JSONObject; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.ResourceAccessException; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.ApiResponse; +import com.bb.model.CashDetail; +import com.bb.model.Member; +import com.bb.model.MemberDetail; +import com.bb.model.PageFormVO; +import com.bb.model.Point; +import com.bb.model.PointInOut; +import com.bb.model.PointSearchAdm; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; +import com.bb.service.CashService; +import com.bb.service.CommonService; +import com.bb.service.PointService; +import com.bb.service.TripleService; +import com.bb.service.UserService; +import com.bb.util.IPKit; +import com.bb.util.PagingUtil; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@Slf4j +@RequestMapping("/api/admin/point") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class AdminApiPointController { + + private final UserService userService; + + private final PointService pointService; + + private final CashService cashService; + + private final CommonService commonService; + + private final TripleService tripleService; + + private final JwtManager jwtManager; + + + @ResponseBody + @PostMapping(value="/pointList") + public ApiResponse pointList(@RequestHeader String token, HttpServletRequest request, @RequestBody PointSearchAdm search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + search.setSiteId(tokenInfo.getSid()); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = pointService.getAdminPointListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List> cashList = pointService.getAdminPointList(search); + apiResponse.put("list", cashList); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/pointListNew") + public ApiResponse pointListNew(@RequestHeader String token, HttpServletRequest request, @RequestBody PointSearchAdm search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + final String LOG_PREFIX = "#-admin::pointListNew::"+tokenInfo.getSid()+":::"; + + ObjectMapper objectMapper = new ObjectMapper(); + String reqJsonStr = objectMapper.writeValueAsString(search); + JSONObject reqObj = new JSONObject(reqJsonStr); + log.info(LOG_PREFIX+ "Request {}", reqObj); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = pointService.getAdminPointListNewCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + List> cashList = pointService.getAdminPointListNew(search); + apiResponse.put("list", cashList); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/botRateList") + public ApiResponse botRateList(@RequestHeader String token, HttpServletRequest request, @RequestBody PointSearchAdm search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + if(search.getMemId() == null || search.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + if(search.getBetMemId() == null || search.getBetMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + if(search.getVendorCode() == null || search.getVendorCode().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List> botRateList = null; + if(search.getRateTypeCode() == null || search.getRateTypeCode().equals("")) { + botRateList = pointService.getPointBotRateList(search); + } else { + botRateList = pointService.getPointBotMultiRateList(search); + } + + + apiResponse.put("botRateList", botRateList); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/pointInOut") + public ApiResponse pointInOut(@RequestHeader String token, HttpServletRequest request, @RequestBody PointInOut pointInout) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + + Point point = new Point(); + + Member search = new Member(); + search.setMemId(pointInout.getMemId()); + search.setSiteId(tokenInfo.getSid()); + + MemberDetail loginMember= userService.getMember(search); + if(loginMember == null) { + throw new ApiException("U003", "unknown user"); + } + + long prePoint = loginMember.getPointAmt(); + if("-2".equals(pointInout.getPointType())){ + if(prePoint < pointInout.getPointAmt()) { + throw new ApiException("P003", "보유 포인트를 초과하여 회수 할 수 없습니다."); + } + } + + if(pointInout.getPointType().equals("2")) { + pointInout.setPointDesc("관리자 포인트 지급"); + } + + if(pointInout.getPointType().equals("-2")) { + pointInout.setPointDesc("관리자 포인트 회수"); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + pointInout); + + if(pointInout.getPointType().equals("2") && pointInout.getPointAmt() <= 0) { + throw new ApiException("P004", "포인트 금액을 입력하세요."); + } + + if(pointInout.getPointType().equals("-2") && pointInout.getPointAmt() >= 0) { + throw new ApiException("P004", "포인트 금액을 입력하세요."); + } + + double pointAmtD = pointInout.getPointAmt() * 1.0; + + point.setSiteId(tokenInfo.getSid()); + point.setMemId(pointInout.getMemId()); + point.setPointType(pointInout.getPointType()); + point.setPointDesc(pointInout.getPointDesc()); + point.setPointAmt(pointAmtD); + point.setBetIdx(null); + point.setPointStatus("1"); + point.setRegId(tokenInfo.getMid()); + point.setAdminId(tokenInfo.getMid()); + point.setMemo(pointInout.getMemo()); + point.setPrePointAmt(loginMember.getPointAmt()); +// cashService.pointInsert(point); + long pointIdx = pointService.pointInsert(point); + if(pointIdx == 0) { + throw new ApiException("P006", "포인트지급,회수 처리는 1분에 1건씩 처리됩니다. 잠시후 다시 시도해주세요"); + } else { + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "CREATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", pointInout.getMemId()+"::관리자 포인트 지급/회수"); + logParam.put("logDesc", pointInout.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { System.out.print(e.toString()); } + } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/pointChg") + public ApiResponse pointChg(@RequestHeader String token, HttpServletRequest request, @RequestBody Point point) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(point.getSiteId() == null || point.getSiteId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + if(point.getMemId() == null || point.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + final String LOG_PREFIX = "#-admin::pointChg::"+point.getSiteId()+"::"+point.getMemId()+"::::"; + + Member search = new Member(); + search.setSiteId(point.getSiteId()); + search.setMemId(point.getMemId()); + MemberDetail memDetail= userService.getMember(search); + if(memDetail == null) { + throw new ApiException("U003", "unknown user"); + } + + log.info(LOG_PREFIX+ "[REQUEST: "+request.getRequestURI()+"] " + point); + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(point.getSiteId()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + + if(point.getPointAmt() == null || point.getPointAmt() <= 0) { + throw new ApiException("P001", "전환할 포인트를 입력하세요."); + } + + int pointAmt = point.getPointAmt().intValue(); + int pointInMax = Integer.parseInt(siteOption.getPointChangeAmtLimit()); + int pointInUnit = Integer.parseInt(siteOption.getPointChangeAmtUnit()); + if((pointInMax != 0) && (pointAmt > pointInMax)) { + throw new ApiException("P101", "1회 포인트전환 최대한도는 " + pointInMax + "입니다."); + } + if((pointInUnit != 0) && (pointAmt % pointInUnit != 0)) { + throw new ApiException("P102", "포인트전환 금액 단위는 " + pointInUnit + "입니다."); + } + + int cashAmt = pointAmt; + double pointAmtD = pointAmt * -1.0; + + if(memDetail.getPointAmt() >= point.getPointAmt() ) { + point.setPointType("-44"); + point.setPointDesc("관리자 포인트전환"); + point.setPointAmt(pointAmtD); + point.setBetIdx(null); + point.setPointStatus("1"); + point.setRegId(tokenInfo.getSid()); + point.setAdminId(tokenInfo.getSid()); + point.setMemo(""); + point.setPrePointAmt(memDetail.getPointAmt()); + log.info(LOG_PREFIX+ point); + long pointIdx = pointService.pointInsert(point); + log.info(LOG_PREFIX+ "pointIdx: " + pointIdx); + if(pointIdx == 0) { + throw new ApiException("P005", "포인트전환은 1분에 1건씩 처리됩니다. 잠시후 다시 시도해주세요"); + } else { + CashDetail paramCash = new CashDetail(); + paramCash.setSiteId(point.getSiteId()); + paramCash.setMemId(point.getMemId()); + paramCash.setCashType("44"); + paramCash.setCashAmt(cashAmt); + paramCash.setCashDesc("관리자 포인트전환"); + paramCash.setDelYn("N"); + paramCash.setCashStatus("1"); + paramCash.setMemo(""); + paramCash.setRegId(tokenInfo.getSid()); + paramCash.setAdminId(tokenInfo.getSid()); + paramCash.setPreCashAmt(Integer.toString(memDetail.getCashAmt())); + paramCash.setWaitTime(-60); + log.info(LOG_PREFIX+ paramCash); + long cashIdx = cashService.insertCash(paramCash); + log.info(LOG_PREFIX+ "cashIdx: " + cashIdx); + if(cashIdx == 0) { + throw new ApiException("P005", "포인트전환은 1분에 1건씩 처리됩니다. 잠시후 다시 시도해주세요"); + } else { + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "CREATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", point.getMemId()+"::관리자 포인트 전환"); + logParam.put("logDesc", point.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { System.out.print(e.toString()); } + } + } + } else { + throw new ApiException("P002", "보유 포인트를 초과하여 전환신청을 할 수 없습니다."); + } + + apiResponse.success(); + + } catch (ResourceAccessException rae) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + String siteId = tokenInfo.getSid(); + String memId = tokenInfo.getMid(); + + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error("#-admin::pointChg::"+siteId+"::"+memId+"::::"+"[ConnectTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("ConnectTimeoutException"); + } + + if(rae.getCause() instanceof SocketTimeoutException) { + log.error("#-admin::pointChg::"+siteId+"::"+memId+"::::"+"[SocketTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("SocketTimeoutException"); + } + + if(rae.getCause() instanceof InterruptedException) { + log.error("#-admin::pointChg::"+siteId+"::"+memId+"::::"+"[InterruptedException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("InterruptedException"); + } + + apiResponse.success(); + } catch(ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + String siteId = tokenInfo.getSid(); + String memId = tokenInfo.getMid(); + log.error("#-admin::pointChg::"+siteId+"::"+memId+"::::"+"ApiException::"+e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + String siteId = tokenInfo.getSid(); + String memId = tokenInfo.getMid(); + log.error("#-admin::pointChg::"+siteId+"::"+memId+"::::"+"Exception::"+e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + +} diff --git a/src/main/java/com/bb/admin/controller/AdminApiReportController.java b/src/main/java/com/bb/admin/controller/AdminApiReportController.java new file mode 100644 index 0000000..ecf0a1b --- /dev/null +++ b/src/main/java/com/bb/admin/controller/AdminApiReportController.java @@ -0,0 +1,622 @@ +package com.bb.admin.controller; + +import java.util.HashMap; +import java.util.List; + +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.ApiResponse; +import com.bb.model.DailyReportSearch; +import com.bb.model.DayilPartnerReport; +import com.bb.model.DayilPeriodicReports; +import com.bb.model.PageFormVO; +import com.bb.model.ReportSearch; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; +import com.bb.service.CommonService; +import com.bb.service.ReportService; +import com.bb.util.PagingUtil; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@Slf4j +@RequestMapping("/api/admin/report") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class AdminApiReportController { + + private final ReportService reportService; + + private final CommonService commonService; + + private final JwtManager jwtManager; + + + @ResponseBody + @PostMapping(value={"/calculateSearch"}) + public ApiResponse dailyCalculateSearch(@RequestHeader String token, HttpServletRequest request, @RequestBody DailyReportSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + final String LOG_PREFIX = "#-admin::dailyCalculateSearch:::"; + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + PageFormVO pageVo = new PageFormVO(); + if(search.getPage() == 0) search.setPage(1); + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + search.setBlankSpinSetType(siteOption.getBlankSpinSetType()); + + log.info(LOG_PREFIX+ "[REQUEST: "+request.getRequestURI()+"] " + search); + + List> reportCateInfo = reportService.getReportCateInfo(search.getSiteId()); + apiResponse.put("reportCateInfo", reportCateInfo); + + int totalCount = reportService.getReportsListCntForAdmin(search); + + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + if(search.getCount_per_page() == 0) { + commonForm.setCount_per_page(10); + } else { + commonForm.setCount_per_page(search.getCount_per_page()); + } + if(search.getCount_per_list() == 0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); +// search.setOffset(pageVo.getOffset()); + search.setOffset(-1); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + if(search.getSearchType().equals("OUTER")) { + List list = reportService.getReportsListForAdmin(search); // Use blankSpinSetType + DayilPeriodicReports total = reportService.getReportsTotalForAdmin(search); // Use blankSpinSetType + apiResponse.put("search", search); + apiResponse.put("outSearchList", list); + apiResponse.put("outSearchTotal", total); + } else { + List list = reportService.getReportsListForAdmin(search); // Use blankSpinSetType + search.setSearchType("OUTER"); + List total = reportService.getReportsListForAdmin(search); // Use blankSpinSetType + DayilPeriodicReports inSearchTotal = total.get(0); + apiResponse.put("search", search); + apiResponse.put("inSearchList", list); + apiResponse.put("inSearchTotal", inSearchTotal); + } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(LOG_PREFIX+ "ApiException: "+e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(LOG_PREFIX+ "Exception: "+e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @PostMapping(value={"/reportByUser"}) + public ApiResponse reportByUser(@RequestHeader String token, HttpServletRequest request, @RequestBody DailyReportSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(search.getSearchMemId() == null) { + search.setSearchMemId(""); + } + search.setSiteId(tokenInfo.getSid()); + if(search.getSearchRecommandId() == null) { + search.setSearchRecommandId(""); + } + + if(search.getOrderStr() == null) { + search.setOrderStr(""); + } + + PageFormVO pageVo = new PageFormVO(); + if(search.getPage() == 0) search.setPage(1); + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + search.setBlankSpinSetType(siteOption.getBlankSpinSetType()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List> reportCateInfo = reportService.getReportCateInfo(search.getSiteId()); + apiResponse.put("reportCateInfo", reportCateInfo); + + int totalCount = reportService.getReportsByUserListCntForAdmin(search); + + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + if(search.getCount_per_page() == 0) { + commonForm.setCount_per_page(10); + } else { + commonForm.setCount_per_page(search.getCount_per_page()); + } + if(search.getCount_per_list() == 0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + DayilPeriodicReports total = reportService.getReportsByUserTotalForAdmin(search); // Use blankSpinSetType + apiResponse.put("searchTotal", total); + + List list = reportService.getReportsByUserListForAdmin(search); // Use blankSpinSetType + apiResponse.put("searchList", list); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value={"/dailyCalculate"}) + public ApiResponse dailyCalculate(@RequestHeader String token, HttpServletRequest request, @RequestBody DailyReportSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + search.setBlankSpinSetType(siteOption.getBlankSpinSetType()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List> reportCateInfo = reportService.getReportCateInfo(search.getSiteId()); + apiResponse.put("reportCateInfo", reportCateInfo); + + HashMap partnerInfo = reportService.getPartnerInfo(search); // Use blankSpinSetType + List dailyList = reportService.getDayilPartnerReport(search); // Use blankSpinSetType + + apiResponse.put("partnerInfo", partnerInfo); + apiResponse.put("dailyList", dailyList); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/memWL"}) + public ApiResponse logList(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody ReportSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + search.setSiteId(tokenInfo.getSid()); + + int totalCount = reportService.getReportMemwlListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List list = reportService.getReportMemwlList(search); + apiResponse.put("list", list); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/period"}) + public ApiResponse period(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody ReportSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + search.setSiteId(tokenInfo.getSid()); + log.info("AdminApiReportController /period ReportSearch : " + search); + + + HashMap cashInfo = reportService.getPeriodCash(search); + + apiResponse.put("total_cashInAmt", cashInfo.get("total_cashInAmt")); + apiResponse.put("total_cashOutAmt",cashInfo.get("total_cashOutAmt")); + + apiResponse.put("total_cashManualAmt", cashInfo.get("total_cashManualAmt")); + apiResponse.put("total_couponUseAmt", "0"); + apiResponse.put("total_couponAmt", "0"); + apiResponse.put("total_discrepancyAmt", "0"); + apiResponse.put("total_pointManualAmt", "0"); + + // total_bonusAmt_list + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List rollPoint = reportService.getPeriodRollPoint(search); + apiResponse.put("total_rollBonusAmt_list", rollPoint); + + List wlAmt = reportService.getPeriodWlAmt(search); + apiResponse.put("total_wlAmt_list", wlAmt); + + + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/gameType"}) + public ApiResponse gameType(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody ReportSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + search.setSiteId(tokenInfo.getSid()); + + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List gameTypeList = reportService.getGameTypeList(search); + apiResponse.put("list", gameTypeList); + + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/day"}) + public ApiResponse day(@RequestHeader String token, HttpServletRequest request, @RequestBody ReportSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + search.setBlankSpinSetType(siteOption.getBlankSpinSetType()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List> dayList = reportService.getDayList(search); // Use blankSpinSetType + HashMap dayTotal = reportService.getDayTotal(search); // Use blankSpinSetType + + apiResponse.put("list", dayList); + apiResponse.put("total", dayTotal); + + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/trade"}) + public ApiResponse trade(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody ReportSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + search.setSiteId(tokenInfo.getSid()); + log.info("AdminApiReportController /trade ReportSearch : " + search); + + int totalCount = reportService.getReportTradeListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List list = reportService.getReportTradeList(search); + apiResponse.put("list", list); + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/partner"}) + public ApiResponse partner(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody ReportSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + search.setSiteId(tokenInfo.getSid()); + log.info("AdminApiReportController /partner ReportSearch : " + search); + + int totalCount = reportService.getReportPartnerListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + }else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List list = reportService.getReportPartnerList(search); + apiResponse.put("list", list); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/pay"}) + public ApiResponse pay(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody ReportSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + search.setSiteId(tokenInfo.getSid()); + log.info("AdminApiReportController /pay ReportSearch : " + search); + + int totalCount = reportService.getReportPayListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(40); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + }else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List list = reportService.getReportPayList(search); + apiResponse.put("list", list); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + +} diff --git a/src/main/java/com/bb/admin/controller/AdminApiRetailController.java b/src/main/java/com/bb/admin/controller/AdminApiRetailController.java new file mode 100644 index 0000000..ce20aaf --- /dev/null +++ b/src/main/java/com/bb/admin/controller/AdminApiRetailController.java @@ -0,0 +1,1790 @@ +package com.bb.admin.controller; + +import java.util.HashMap; +import java.util.List; + +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.ApiResponse; +import com.bb.model.BlankSpinRate; +import com.bb.model.ChargingPointSettingVO; +import com.bb.model.Member; +import com.bb.model.MemberDetail; +import com.bb.model.MemberInsert; +import com.bb.model.MemberInsert2; +import com.bb.model.MemberRate; +import com.bb.model.MemberRateVo; +import com.bb.model.MemberSearch; +import com.bb.model.MemberUpdate; +import com.bb.model.MultipleRate; +import com.bb.model.MultipleRateInfo; +import com.bb.model.NewMemRateItem; +import com.bb.model.PageFormVO; +import com.bb.model.PartnerListVO; +import com.bb.model.RateInfo; +import com.bb.model.RateVO; +import com.bb.model.RetailLockVO; +import com.bb.model.RetailSearch; +import com.bb.model.RetailSet; +import com.bb.model.Site; +import com.bb.service.AsyncExcoinOtcService; +import com.bb.service.CommonService; +import com.bb.service.CompService; +import com.bb.service.RateService; +import com.bb.service.RetailService; +import com.bb.service.UserService; +import com.bb.util.IPKit; +import com.bb.util.PagingUtil; +import com.bb.util.StringUtils; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@Slf4j +@RequestMapping("/api/admin/retail") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class AdminApiRetailController { + + private final RetailService retailService; + + private final UserService userService; + + private final RateService rateService; + + private final CommonService commonService; + + private final CompService compService; + + private final AsyncExcoinOtcService asyncExcoinOtcService; + + private final PasswordEncoder passwordEncoder; + + private final JwtManager jwtManager; + + + @ResponseBody + @PostMapping(value="/partnerJoin") + public ApiResponse partnerJoin(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberInsert signupMember) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + String LOG_PREFIX = "#-admin::partnerJoin::"; + + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + Site site = userService.getSiteInfo(tokenInfo.getSid()); + + signupMember.setSiteIdx(tokenInfo.getSidx()); + signupMember.setSiteId(tokenInfo.getSid()); + signupMember.setMemId(signupMember.getMemId().replaceAll(" ", "").replaceAll(" ", "").toLowerCase()); + LOG_PREFIX = LOG_PREFIX + tokenInfo.getSid()+"::"+signupMember.getMemId()+"::::"; + + if(signupMember.getMemId().equals("")) { + throw new ApiException("U098", "아이디를 입력해주세요."); + } + + if(signupMember.getRecommenderId() == null || signupMember.getRecommenderId().equals("")) { + throw new ApiException("U097", "추천인 계정을 입력해주세요."); + } + + String refer = request.getHeader("Referer"); + String domain = "unknown"; + if(refer != null) { + String[] urls = StringUtils.extractUrlParts(refer); + domain = urls[2]; + log.info(LOG_PREFIX+"::domain::"+domain+"::recommandId::"+signupMember.getRecommenderId()); + } + signupMember.setJoinDomain(domain); + + signupMember.setRecommenderId(signupMember.getRecommenderId().replaceAll(" ", "").toLowerCase()); + signupMember.setRegId(tokenInfo.getMid()); + signupMember.setPartnerType(""); + signupMember.setMemStatus("1"); + + if(signupMember.getMemId() == null || signupMember.getMemId().equals("") || (signupMember.getMemId().length() < 3)) { + throw new ApiException("U101", "파트너 아이디는 영문+숫자 3자 이상입니다."); + } + + String password = passwordEncoder.encode(signupMember.getMemPass()); + log.info(LOG_PREFIX+ "[MEMBER PWD:" + password + "]"); + signupMember.setMemPass(password); + + log.info(LOG_PREFIX+ "[RECOMMEND USER ID:" + signupMember.getRecommenderId() + "]"); + String myPartnerLevel = userService.getPartnerLevelByRecId(signupMember); + if(myPartnerLevel.equals("COMP") || myPartnerLevel.equals("AUTO") || myPartnerLevel.equals("NORMAL")) { + throw new ApiException("U099", "추천인으로 사용할 수 없는 계정입니다."); + } + signupMember.setPartnerLevel(myPartnerLevel); + log.info(LOG_PREFIX+ "[PARTNER LEVEL:" + signupMember.getPartnerLevel() + "]"); + + // isOnlyFlex : 파트너 회원 베팅가능여부 플레그(Y:가능, N:불가능) + log.info(LOG_PREFIX+"::site.getIsOnlyFlex()::"+site.getIsOnlyFlex()); + if(site.getIsOnlyFlex().equals("Y")) { + signupMember.setBetYn("Y"); + } else { + signupMember.setBetYn("N"); + } + log.info(LOG_PREFIX+"::BetYn::"+signupMember.getBetYn()); + + signupMember.setPointExchangeYn("Y"); + signupMember.setRollingYn("Y"); + signupMember.setRecommendYn("Y"); + + signupMember.setMemLevel("1"); + signupMember.setCasinoLevel("1"); + signupMember.setSlotLevel("1"); + signupMember.setMgLevel("1"); + signupMember.setSportsLevel("1"); + signupMember.setNationCode(""); + signupMember.setPartSendYn("N"); + signupMember.setMaxCredit(""); + signupMember.setCreditRate(""); + signupMember.setCreditStatus(""); + signupMember.setMemBlackYn("N"); + + signupMember.setCashSendYn("Y"); + signupMember.setCashReceiveYn("Y"); + + Member recommendUser = new Member(); + recommendUser.setSiteId(tokenInfo.getSid()); + recommendUser.setMemId(signupMember.getRecommenderId()); + MemberDetail upPartner = userService.getMember(recommendUser); + + if(upPartner == null) { + throw new ApiException("U096", "존재하지 않는 추천인 계정입니다."); + } + + if(upPartner.getPartnerLevel().equals("COMP") || upPartner.getPartnerLevel().equals("NORMAL") || upPartner.getPartnerLevel().equals("PTN_7")) { + throw new ApiException("U099", "추천인으로 사용할 수 없는 계정입니다."); + } + + if(upPartner.getRecommendYn().equals("N")) { + throw new ApiException("U099", "추천인으로 사용할 수 없는 계정입니다."); + } + + if(!upPartner.getMemStatus().equals("1")) { + throw new ApiException("U099", "추천인으로 사용할 수 없는 계정입니다."); + } + + Member checkMember = new Member(); + checkMember.setSiteId(signupMember.getSiteId()); + checkMember.setMemId(signupMember.getMemId()); + checkMember.setRecommenderId(signupMember.getRecommenderId()); + checkMember.setMemName(signupMember.getMemName()); + checkMember.setMemNick(signupMember.getMemNick()); + + int idCheck =userService.idCheck(checkMember); + if(idCheck>0) { + throw new ApiException("U005", "idCheck"); + } + /* + int idCheckByAdmin =userService.idCheckByAdmin(checkMember); + if(idCheckByAdmin>0) { + throw new ApiException("U005", "idCheckByAdmin"); + } + */ + int nameCheck =userService.nameCheck(checkMember); + if(nameCheck>0) { + throw new ApiException("U006", "nameCheck"); + } + + if(signupMember.getSiteId().equals(signupMember.getRecommenderId())) { + throw new ApiException("U099", "recommenderIdCheck"); + } + + ObjectMapper objectMapper = new ObjectMapper(); + String signupMemberJson = objectMapper.writeValueAsString(signupMember); + log.info(LOG_PREFIX+ "signupMemberJson::" + signupMember); + + RateInfo rateInfo = signupMember.getRateInfo(); + if(rateInfo != null) { + rateInfo.setSiteId(signupMember.getSiteId()); + rateInfo.setMemId(signupMember.getMemId()); + + Member top = new Member(); + top.setSiteId(tokenInfo.getSid()); + top.setMemId(signupMember.getRecommenderId()); + List> topRateInfoList = rateService.getMemRollingInfo(top); + + for(RateVO mvo : rateInfo.getRateList()) { + mvo.setSiteId(rateInfo.getSiteId()); + mvo.setMemId(rateInfo.getMemId()); + String category = mvo.getCategory(); + String cateCode = mvo.getCateCode(); + Double pointRate = Double.valueOf(mvo.getPointRate()); + Double loseRate = Double.valueOf(mvo.getLoseRate()); + + for(HashMap topRateInfo : topRateInfoList) { + String topCategory = topRateInfo.get("category").toString(); + String topCateCode = topRateInfo.get("cateCode").toString(); + Double maxPointRate = Double.valueOf(topRateInfo.get("pointRate").toString()); + Double maxLoseRate = Double.valueOf(topRateInfo.get("loseRate").toString()); + if(upPartner.getPartnerLevel().equals("AUTO")) { + maxPointRate = 50.0; + maxLoseRate = 50.0; + } + if(cateCode.equals(topCateCode)) { + if(maxPointRate < pointRate) { + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::pointRate::"+pointRate); + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::MaxPointRate::"+maxPointRate); + String resultMsg = "롤링:"+"cateCode::"+cateCode+ "::"+maxPointRate+" 보다 작은값을 입력하세요"; + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + + if(maxLoseRate < loseRate) { + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::loseRate::"+loseRate); + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::MaxLoseRate::"+maxLoseRate); + String resultMsg = "루징:"+"cateCode::"+cateCode+ "::"+maxLoseRate+" 보다 작은값을 입력하세요"; + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + } + } + } + } + + userService.adminJoin(signupMember); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "CREATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", signupMember.getMemId()+"::파트너 계정 생성"); + logParam.put("logDesc", signupMember.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error(LOG_PREFIX+ "insertAdminlog::Exception::"+e.toString()); } + + try { + if(rateInfo != null) { + rateService.rateInfoUpdate(rateInfo); + } + } catch(Exception eee) { + log.error(LOG_PREFIX+ "Partner_Rate_Setting::Exception::"+eee.toString()); + } + + apiResponse.success(); + } catch(ApiException e) { + log.error(LOG_PREFIX+ "ApiException::"+e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(LOG_PREFIX+ "Exception::"+e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/create") + public ApiResponse create(@RequestHeader String token, HttpServletRequest request, @RequestBody MemberInsert2 signupMember) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + String LOG_PREFIX = "#-admin::retail::create::"; + + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + Site site = userService.getSiteInfo(tokenInfo.getSid()); + + signupMember.setSiteIdx(tokenInfo.getSidx()); + signupMember.setSiteId(tokenInfo.getSid()); + + String refer = request.getHeader("Referer"); + String domain = "unknown"; + if(refer != null) { + String[] urls = StringUtils.extractUrlParts(refer); + domain = urls[2]; + log.info(LOG_PREFIX+"::domain::"+domain+"::recommandId::"+signupMember.getRecommenderId()); + } + signupMember.setJoinDomain(domain); + + if(signupMember.getMemIdList() == null || signupMember.getMemIdList().size() == 0) { + throw new ApiException("UC01", "아이디를 입력해주세요."); + } else { + for(String memId : signupMember.getMemIdList()) { + if(memId.equals("")) { + throw new ApiException("UC01", "아이디를 입력해주세요."); + } else { + Member checkMember = new Member(); + checkMember.setSiteId(signupMember.getSiteId()); + memId = memId.replaceAll(" ", "").toLowerCase(); + checkMember.setMemId(memId); + int idCheck = userService.idCheck(checkMember); + if(idCheck > 0) { + throw new ApiException("UC02", "중복 아이디: "+memId); + } + } + } + } + + if(signupMember.getMemNickList() == null || signupMember.getMemNickList().size() == 0) { + throw new ApiException("UC03", "닉네임을 입력해주세요."); + } else { + for(String memNick : signupMember.getMemNickList()) { + if(memNick.equals("")) { + throw new ApiException("UC03", "닉네임을 입력해주세요."); + } else { + Member checkMember = new Member(); + checkMember.setSiteId(signupMember.getSiteId()); + checkMember.setMemNick(memNick); + int nickCheck = userService.nameCheck(checkMember); + if(nickCheck > 0) { + throw new ApiException("UC04", "중복 닉네임: "+memNick); + } + } + } + } + + if(signupMember.getMemNameList() == null || signupMember.getMemNameList().size() == 0) { + throw new ApiException("UC05", "이름을 입력해주세요."); + } else { + for(String memName : signupMember.getMemNameList()) { + if(memName.equals("")) { + throw new ApiException("UC05", "이름을 입력해주세요."); + } + } + } + + if(signupMember.getMemIdList().size() != signupMember.getMemNickList().size() + || signupMember.getMemIdList().size() != signupMember.getMemNameList().size()) { + throw new ApiException("UC06", "아이디, 닉네임, 이름 갯수가 일치하지 않습니다."); + } + + if(signupMember.getMemIdList().size() > 30) { + throw new ApiException("UC07", "최대 30명까지 생성할 수 있습니다."); + } + + signupMember.setRecommenderId(signupMember.getRecommenderId().replaceAll(" ", "").toLowerCase()); + log.info(LOG_PREFIX+ "[RECOMMEND USER ID:" + signupMember.getRecommenderId() + "]"); + MemberInsert param = new MemberInsert(); + param.setSiteId(tokenInfo.getSid()); + param.setRecommenderId(signupMember.getRecommenderId()); + String myPartnerLevel = userService.getPartnerLevelByRecId(param); + if(myPartnerLevel.equals("COMP") || myPartnerLevel.equals("AUTO") || myPartnerLevel.equals("NORMAL")) { + throw new ApiException("UC08", "추천인으로 사용할 수 없는 계정입니다."); + } + signupMember.setPartnerLevel(myPartnerLevel); + log.info(LOG_PREFIX+ "[PARTNER LEVEL:" + signupMember.getPartnerLevel() + "]"); + + signupMember.setRecommendYn("Y"); + + // isOnlyFlex : 파트너 회원 베팅가능여부 플레그(Y:가능, N:불가능) + log.info(LOG_PREFIX+"::site.getIsOnlyFlex()::"+site.getIsOnlyFlex()); + if(site.getIsOnlyFlex().equals("Y")) { + signupMember.setBetYn("Y"); + } else { + signupMember.setBetYn("N"); + } + log.info(LOG_PREFIX+"::BetYn::"+signupMember.getBetYn()); + + signupMember.setRegId(tokenInfo.getMid()); + signupMember.setMemStatus("1"); + + String password = passwordEncoder.encode(signupMember.getMemPass()); + log.info(LOG_PREFIX+ "[MEMBER PWD:" + password + "]"); + signupMember.setMemPass(password); + signupMember.setMemLevel("1"); + signupMember.setCasinoLevel("1"); + signupMember.setSlotLevel("1"); + signupMember.setCashSendYn("Y"); + signupMember.setCashReceiveYn("Y"); + + if(signupMember.getCashOutPass()==null || signupMember.getCashOutPass().equals("")) { + signupMember.setCashOutPass("0000"); + } + + ObjectMapper objectMapper = new ObjectMapper(); + String signupMemberJson = objectMapper.writeValueAsString(signupMember); + log.info(LOG_PREFIX+ "signupMemberJson::" + signupMemberJson); + + if(signupMember.getRateList() != null) { + MemberSearch topUser = new MemberSearch(); + topUser.setSiteId(signupMember.getSiteId()); + topUser.setMemId(signupMember.getRecommenderId()); + List topRateList = rateService.getTopRate(topUser); + + for(RateVO topRate : topRateList) { + String topCtgr = topRate.getCategory(); + double topPR = Double.parseDouble(topRate.getPointRate()); + double topLR = Double.parseDouble(topRate.getLoseRate()); + for(RateVO botRate : signupMember.getRateList()) { + String botCtgr = botRate.getCategory(); + double botPR = Double.parseDouble(botRate.getPointRate()); + double botLR = Double.parseDouble(botRate.getLoseRate()); + + if(topCtgr.equals(botCtgr)) { + if(topPR < botPR) { + log.error(LOG_PREFIX+ "topCtgr::"+topCtgr+ "::topPR::"+topPR); + log.error(LOG_PREFIX+ "botCtgr::"+botCtgr+ "::botPR::"+botPR); + String resultMsg = "롤링:"+topCtgr+ "::"+topPR+" 보다 작은값을 입력하세요"; + log.error(LOG_PREFIX+ "resultMsg : " + resultMsg); + throw new ApiException("UC09", resultMsg); + } + if(topLR < botLR) { + log.error(LOG_PREFIX+ "topCtgr::"+topCtgr+ "::topLR::"+topLR); + log.error(LOG_PREFIX+ "botCtgr::"+botCtgr+ "::botLR::"+botLR); + String resultMsg = "루징:"+topCtgr+ "::"+topLR+" 보다 작은값을 입력하세요"; + log.error(LOG_PREFIX+ "resultMsg : " + resultMsg); + throw new ApiException("UC09", resultMsg); + } + } + } + } + } + + for(int i=0; i logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "CREATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", signupMember.getMemId()+"::파트너 계정 생성"); + logParam.put("logDesc", signupMember.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error(LOG_PREFIX2+ "insertAdminlog::Exception::"+e.toString()); } + + // TODO : List rateList 등록 처리 + if(signupMember.getRateList() != null) { + for(RateVO botRate : signupMember.getRateList()) { + botRate.setSiteId(siteId); + botRate.setMemId(memId); + int myUpdateResult = rateService.myRateInfoUpdate(botRate); + log.info(LOG_PREFIX2+ "::myUpdateResult::"+myUpdateResult); + int topMinUpdateResult = rateService.topMinRateInfoUpdate(botRate); + log.info(LOG_PREFIX2+ "::topMinUpdateResult::"+topMinUpdateResult); + } + } + } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(LOG_PREFIX+ "ApiException::"+e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(LOG_PREFIX+ "Exception::"+e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /** + * 메뉴: [파트너 관리] > [파트너 리스트] + * @param token + * @param request + * @param search + * @return + * @throws Exception + */ + @ResponseBody + @PostMapping(value={"/partnerList"}) + public ApiResponse partnerList(@RequestHeader String token, HttpServletRequest request, @RequestBody RetailSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + search.setSiteId(tokenInfo.getSid()); + + int totalCount = retailService.getRetailListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List list = retailService.getRetailList(search); + apiResponse.put("list", list); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /** + * 메뉴: [파트너 관리] > [파트너 리스트] + * @param token + * @param request + * @param search + * @return + * @throws Exception + */ + @ResponseBody + @PostMapping(value={"/partnerList2"}) + public ApiResponse partnerList2(@RequestHeader String token, HttpServletRequest request, @RequestBody RetailSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + /* + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = retailService.getRetailListCnt2(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + */ + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List list = retailService.getRetailList2(search); + apiResponse.put("list", list); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/rateInfoList"}) + public ApiResponse rateInfoList(@RequestHeader String token, HttpServletRequest request, @RequestBody RetailSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List rateInfoList = retailService.getListRateInfo(search); + apiResponse.put("rateInfoList", rateInfoList); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/rateInfoUpdate") + public ApiResponse rateInfoUpdate(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody NewMemRateItem rateItem) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + rateItem.setSiteId(tokenInfo.getSid()); + + NewMemRateItem checkParam = new NewMemRateItem(); + checkParam.setSiteId(rateItem.getSiteId()); + checkParam.setMemId(rateItem.getMemId()); + checkParam.setGameCategory(rateItem.getGameCategory()); + checkParam.setGameCategoryEn(rateItem.getGameCategoryEn()); + checkParam.setGameCategoryName(rateItem.getGameCategoryName()); + checkParam.setVendorCode(rateItem.getVendorCode()); + checkParam.setRateTypeCode(rateItem.getRateTypeCode()); + checkParam.setPointRate(rateItem.getPointRate()); + checkParam.setLoseRate(rateItem.getLoseRate()); + if(checkParam.getGameCategory().equals("minigame")) { + // 폭탄게임, 홀덤, 니우니우, 스피드게임 + checkParam.setVendorCode(checkParam.getGameCategoryEn()); + rateItem.setVendorCode(rateItem.getGameCategoryEn()); + rateItem.setGameCategoryEn(""); + } else if(checkParam.getGameCategory().equals("slot")) { + // 슬롯 + checkParam.setVendorCode("200"); + rateItem.setGameCategoryEn(""); + } else if(checkParam.getGameCategory().equals("sport")) { + // 스포츠 + checkParam.setVendorCode("splus"); + rateItem.setGameCategoryEn(""); + } else if(checkParam.getGameCategory().equals("casino")) { + if(checkParam.getGameCategoryEn().equals("CASINO")) { + // 카지노 + checkParam.setVendorCode("1"); + } else { + // HC-카지노 + checkParam.setVendorCode("13"); + } + } else { + + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + checkParam); + NewMemRateItem myRateInfo = userService.getMemRateItem(checkParam); + if(myRateInfo.getMaxPointRate() < rateItem.getPointRate() || myRateInfo.getMinPointRate() > rateItem.getPointRate()) { + log.info("#-newListUpdateRate::"+rateItem.getSiteId()+"::"+rateItem.getMemId()+"::vendorcode::"+rateItem.getVendorCode()+"::rateType::"+rateItem.getRateTypeCode()+ "::pointRate::"+rateItem.getPointRate()); + log.info("#-newListUpdateRate::"+rateItem.getSiteId()+"::"+rateItem.getMemId()+"::vendorcode::"+rateItem.getVendorCode()+"::rateType::"+rateItem.getRateTypeCode()+ "::MaxPointRate::"+myRateInfo.getMaxPointRate()+"::MinPointRate::"+myRateInfo.getMinPointRate()); + String resultMsg = "롤링: "+myRateInfo.getMaxPointRate()+", "+myRateInfo.getMinPointRate()+" 사이값을 입력하세요"; + log.info("#-newListUpdateRate::"+rateItem.getSiteId()+"::"+rateItem.getMemId()+"::vendorcode::"+rateItem.getVendorCode()+"::rateType::"+rateItem.getRateTypeCode()+ "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + + if(myRateInfo.getMaxLoseRate() < rateItem.getLoseRate() || myRateInfo.getMinLoseRate() > rateItem.getLoseRate()) { + log.info("#-newListUpdateRate::"+rateItem.getSiteId()+"::"+rateItem.getMemId()+"::vendorcode::"+rateItem.getVendorCode()+"::rateType::"+rateItem.getRateTypeCode()+ "::loseRate::"+rateItem.getLoseRate()); + log.info("#-newListUpdateRate::"+rateItem.getSiteId()+"::"+rateItem.getMemId()+"::vendorcode::"+rateItem.getVendorCode()+"::rateType::"+rateItem.getRateTypeCode()+ "::MaxLoseRate::"+myRateInfo.getMaxLoseRate()+"::MinLoseRate::"+myRateInfo.getMinLoseRate()); + String resultMsg = "루징: "+myRateInfo.getMaxLoseRate()+", "+myRateInfo.getMinLoseRate()+" 사이값을 입력하세요"; + log.info("#-newListUpdateRate::"+rateItem.getSiteId()+"::"+rateItem.getMemId()+"::vendorcode::"+rateItem.getVendorCode()+"::rateType::"+rateItem.getRateTypeCode()+ "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + rateItem); + userService.updateMemRateItem(rateItem); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", rateItem.getMemId()+"::파트너 리스트 요율 변경"); + logParam.put("logDesc", rateItem.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/partnerDetail") + public ApiResponse partnerDetail(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberSearch memberSearch) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + Member search = new Member(); + search.setMemId(memberSearch.getMemId()); + search.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + memberSearch); + HashMap memberDetail = userService.getPartnerMemberDetail(search); + + memberDetail.put("memberCommissionRate", userService.getMemberRate(search)); + List memberFlow = userService.getMemberFlowList(memberDetail); + List partnerFlow = userService.getPartnerFlowList(memberDetail); + List userList = userService.getPartnerBotUserList(search); + List> memRollingInfo = rateService.getMemRollingInfo(search); + + HashMap param = new HashMap<>(); + long siteIdx = Long.parseLong(memberDetail.get("siteIdx").toString()); + long memIdx = Long.parseLong(memberDetail.get("memIdx").toString()); + param.put("siteIdx", siteIdx); + param.put("memIdx", memIdx); + HashMap bonusSettingInfo = userService.getBonusSettingInfo(param); + + apiResponse.put("member", memberDetail); + apiResponse.put("memberFlow", memberFlow); + apiResponse.put("partnerFlow", partnerFlow); + apiResponse.put("memRollingInfo", memRollingInfo); + apiResponse.put("userList", userList); + apiResponse.put("bonusSettingInfo", bonusSettingInfo); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/partnerModify") + public ApiResponse partnerModify(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberUpdate signupMember) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-admin::retail:modify::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::"; + + signupMember.setSiteId(tokenInfo.getSid()); + signupMember.setUpdId(tokenInfo.getMid()); + + if(signupMember.getMemPass() != null && !signupMember.getMemPass().equals("")) { + String password = passwordEncoder.encode(signupMember.getMemPass()); + log.info("[MEMBER PWD:" + password + "]"); + signupMember.setMemPass(password); + } + + + log.info("[REQUEST: "+request.getRequestURI()+"] " + signupMember); + userService.updateMember(signupMember); + + // TODO: Excoin API 호출 + Member search = new Member(); + search.setSiteId(signupMember.getSiteId()); + search.setMemId(signupMember.getMemId()); + MemberDetail memDetail = userService.getMember(search); + HashMap exCoinInfo = commonService.getVassApiInfo(search); + if(exCoinInfo.get("vaccCode") != null) { + log.info(LOG_PREFIX+ "API_INFO::" + exCoinInfo.toString()); + String vaccCode = exCoinInfo.get("vaccCode").toString(); + if(vaccCode.equals("excoin")) { + exCoinInfo.put("userEmail", memDetail.getMemId()); + exCoinInfo.put("userMobile", memDetail.getMemPhone().replaceAll("-", "").trim()); + exCoinInfo.put("userNm", memDetail.getMemName()); + // 회원수정 + int resultCode = asyncExcoinOtcService.updateUser(LOG_PREFIX, exCoinInfo); + log.info(LOG_PREFIX+ "OTC API resultCode::" + resultCode); + } + } + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", signupMember.getMemId()+"::파트너 회원 수정"); + logParam.put("logDesc", signupMember.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/userLockWithBottom") + public ApiResponse userLockWithBottom(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody RetailLockVO search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + + HashMap param = new HashMap(); + param.put("siteId", tokenInfo.getSid()); + param.put("memId", search.getMemId()); + param.put("memLockYn", search.getMemLockYn()); + param.put("updId", tokenInfo.getMid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + param.toString()); + int updResult = retailService.userLockWithBottom(param); + log.info("[REQUEST: "+request.getRequestURI()+"] updResult: " + updResult); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + if("Y".equals(search.getMemLockYn())) { + logParam.put("logName", search.getMemId()+"::파트너 회원 계정 잠금"); + } else { + logParam.put("logName", search.getMemId()+"::파트너 회원 계정 잠금해제"); + } + logParam.put("logDesc", search.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [파트너목록 하이라키] API 기능 + */ + @ResponseBody + @PostMapping(value={"/hierarchy"}) + public ApiResponse partnerHierarchy(@RequestHeader String token, HttpServletRequest request, @RequestBody RetailSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + if(search.getTreeOption() == null || search.getTreeOption().equals("")) { + search.setTreeOption("N"); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List hierarchy = retailService.getPartnerHierarchy(search); + apiResponse.put("hierarchy", hierarchy); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/bonusSetting") + public ApiResponse bonusSetting(HttpServletRequest request, @RequestHeader String token, @RequestBody ChargingPointSettingVO settingVO) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + settingVO.setSiteIdx(tokenInfo.getSidx()); + settingVO.setSiteId(tokenInfo.getSid()); + + if(settingVO.getMemId() == null || settingVO.getMemId().equals("")) { + throw new ApiException("F999", "Not found memId"); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + settingVO); + int result = retailService.partnerBonusSettingSave(settingVO); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", settingVO.getMemId()+"::파트너 보너스 세팅"); + logParam.put("logDesc", settingVO.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/updateRate") + public ApiResponse updateRate(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberRate memberRate) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + Member search = new Member(); + search.setMemId(memberRate.getMemId()); + + if("super".equals(tokenInfo.getType())) { + search.setSiteId(memberRate.getSiteId()); + } else { + search.setSiteId(tokenInfo.getSid()); + } + search.setPartnerLevel("PTN"); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + memberRate); + + NewMemRateItem rateItem = new NewMemRateItem(); + rateItem.setSiteId(tokenInfo.getSid()); + rateItem.setMemId(memberRate.getMemId()); + List myRateList = userService.getMemRateItemList(rateItem); + for(MemberRateVo mvo:memberRate.getRateList()) { + String vendorCode = mvo.getGameType(); + Double pointRate = Double.valueOf(mvo.getPointRate()); + Double loseRate = Double.valueOf(mvo.getLoseRate()); + + for(NewMemRateItem myRateInfo : myRateList) { + String myCode = myRateInfo.getVendorCode(); + Double maxPointRate = myRateInfo.getMaxPointRate(); + Double minPointRate = myRateInfo.getMinPointRate(); + Double maxLoseRate = myRateInfo.getMaxLoseRate(); + Double minLoseRate = myRateInfo.getMinLoseRate(); + if(vendorCode.equals(myCode)) { + if(maxPointRate < pointRate || minPointRate > pointRate) { + log.info("#-updateRate::"+myRateInfo.getSiteId()+"::"+myRateInfo.getMemId()+"::vendorcode::"+myCode+ "::pointRate::"+pointRate); + log.info("#-updateRate::"+myRateInfo.getSiteId()+"::"+myRateInfo.getMemId()+"::vendorcode::"+myCode+ "::MaxPointRate::"+maxPointRate+"::MinPointRate::"+minPointRate); + String resultMsg = "롤링:"+"::vendorcode::"+myCode+ "::"+maxPointRate+", "+minPointRate+" 사이값을 입력하세요"; + log.info("#-updateRate::"+myRateInfo.getSiteId()+"::"+myRateInfo.getMemId()+"::vendorcode::"+myCode+ "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + + if(maxLoseRate < loseRate || minLoseRate > loseRate) { + log.info("#-updateRate::"+myRateInfo.getSiteId()+"::"+myRateInfo.getMemId()+"::vendorcode::"+myCode+ "::loseRate::"+loseRate); + log.info("#-updateRate::"+myRateInfo.getSiteId()+"::"+myRateInfo.getMemId()+"::vendorcode::"+myCode+ "::MaxLoseRate::"+maxLoseRate+"::MinLoseRate::"+minLoseRate); + String resultMsg = "루징:"+"::vendorcode::"+myCode+ "::"+maxLoseRate+", "+minLoseRate+" 사이값을 입력하세요"; + log.info("#-updateRate::"+myRateInfo.getSiteId()+"::"+myRateInfo.getMemId()+"::vendorcode::"+myCode+ "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + } + } + } + + userService.getMemberRateUpdate(search, memberRate); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", memberRate.getMemId()+"::상세페이지 요율 변경"); + logParam.put("logDesc", memberRate.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + //사용 안함 추후 삭제 + @ResponseBody + @PostMapping(value="/updateAllBottomRate") + public ApiResponse updateAllBottomRate(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberRate bottomRate) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + Member search = new Member(); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(bottomRate.getMemId()); + search.setPartnerLevel("PTN"); + + List myRateList = userService.getMemberRate(search); + +// log.info("[REQUEST: "+request.getRequestURI()+"] ## updateAllBottomRate ## myRateList : " + myRateList); +// log.info("[REQUEST: "+request.getRequestURI()+"] ## updateAllBottomRate ## bottomRate : " + bottomRate); + HashMap result = userService.updateAllBottomRate(search, myRateList, bottomRate); + apiResponse.put("updResult", result); + + if("SUCC".equals(result.get("status".toString()))) { + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", bottomRate.getMemId()+"::하부전체 요율 변경"); + logParam.put("logDesc", bottomRate.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + //사용 안함 추후 삭제 + @ResponseBody + @PostMapping(value="/multipleRateInfo") + public ApiResponse multipleRateInfo(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MultipleRateInfo param) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + param.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + param); + + List multipleRateList = userService.getMultipleRateList(param); + param.setRateList(multipleRateList); + + apiResponse.put("multipleRateInfo", param); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + //사용 안함 추후 삭제 + @ResponseBody + @PostMapping(value="/updateMultipleRate") + public ApiResponse updateMultipleRate(@RequestHeader String token, HttpServletRequest request, @RequestBody MultipleRateInfo param) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + param.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + param); + + List afterRateList = param.getRateList(); + List beforeRateList = userService.getMultipleRateList(param); + + for(MultipleRate afterRate : afterRateList) { + for(MultipleRate beforeRate : beforeRateList) { + if(afterRate.getRateType().equals(beforeRate.getRateType())) { + if(beforeRate.getMaxPointRate() < afterRate.getPointRate() || beforeRate.getMinPointRate() > afterRate.getPointRate()) { + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::rateType::"+afterRate.getRateType()+"::pointRate::"+afterRate.getPointRate()); + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::rateType::"+afterRate.getRateType()+"::MaxPointRate::"+beforeRate.getMaxPointRate()+"::MinPointRate::"+beforeRate.getMinPointRate()); + String resultMsg = "["+afterRate.getRateType()+"] 롤링:"+beforeRate.getMaxPointRate()+", "+beforeRate.getMinPointRate()+" 사이값을 입력하세요"; + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::resultMsg : " + resultMsg); + throw new ApiException("U032", resultMsg); + } + + if(beforeRate.getMaxLoseRate() < afterRate.getLoseRate() || beforeRate.getMinLoseRate() > afterRate.getLoseRate()) { + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::rateType::"+afterRate.getRateType()+"::loseRate::"+afterRate.getLoseRate()); + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::rateType::"+afterRate.getRateType()+"::MaxLoseRate::"+beforeRate.getMaxLoseRate()+"::MinLoseRate::"+beforeRate.getMinLoseRate()); + String resultMsg = "["+afterRate.getRateType()+"] 루징:"+beforeRate.getMaxPointRate()+", "+beforeRate.getMinPointRate()+" 사이값을 입력하세요"; + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::resultMsg : " + resultMsg); + throw new ApiException("U032", resultMsg); + } + } + } + } + + userService.updateMultipleRate(param); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", param.getMemId()+"::파트너 Multiple 요율 변경"); + logParam.put("logDesc", param.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/updateBlankSpinRate") + public ApiResponse updateBlankSpinRate(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody BlankSpinRate rate) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + rate.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + rate); + if(rate.getBlankSpinCasinoRate() == null) { + rate.setBlankSpinCasinoRate(0); + } + + if(rate.getBlankSpinSlotRate() == null) { + rate.setBlankSpinSlotRate(0); + } + + userService.updateBlankSpinRate(rate); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", rate.getMemId()+"::파트너 직하부 공회전율 변경"); + logParam.put("logDesc", rate.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/updateAllBlankSpinRate") + public ApiResponse updateAllBlankSpinRate(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody BlankSpinRate rate) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + rate.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + rate); + if(rate.getBlankSpinCasinoRate() == null) { + rate.setBlankSpinCasinoRate(0); + } + + if(rate.getBlankSpinSlotRate() == null) { + rate.setBlankSpinSlotRate(0); + } + + userService.updateAllBlankSpinRate(rate); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", rate.getMemId()+"::파트너 하부전체 공회전율 변경"); + logParam.put("logDesc", rate.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/settingSave"}) + public ApiResponse settingSave(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody RetailSet retailSet) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + + retailSet.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + retailSet); + retailService.settingSave(retailSet); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/settingList"}) + public ApiResponse settingList(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody RetailSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + search.setSiteId(tokenInfo.getSid()); + + int totalCount = retailService.getRetailSettingListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + }else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List list = retailService.getRetailSettingList(search); + apiResponse.put("list", list); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/balanceList"}) + public ApiResponse balanceList(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody RetailSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + search.setSiteId(tokenInfo.getSid()); + + int totalCount = retailService.getRetailBalanceListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + }else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List list = retailService.getRetailBalanceList(search); + apiResponse.put("list", list); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/balanceDetail"}) + public ApiResponse balanceDetail(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody RetailSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + search.setSiteId(tokenInfo.getSid()); + + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List list = retailService.retailBalanceDetail(search); + apiResponse.put("list", list); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/detailList"}) + public ApiResponse detailList(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody RetailSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + search.setSiteId(tokenInfo.getSid()); + + int totalCount = retailService.retailDetailListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + }else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List list = retailService.retailDetailList(search); + apiResponse.put("list", list); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/summryList"}) + public ApiResponse summryList(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody RetailSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + search.setSiteId(tokenInfo.getSid()); + + int totalCount = retailService.retailSummryListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + }else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List list = retailService.retailSummryList(search); + apiResponse.put("list", list); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/setPoint"}) + public ApiResponse setPoint(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody RetailSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + + + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + + search.setSiteId(tokenInfo.getSid()); + search.setMemId(search.getMemId()); + + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + if("W".equals(search.getRetailPeriod()) || "M".equals(search.getRetailPeriod() )){ + retailService.setPoint(search); + }else { + + apiResponse.fail(); + } + + + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + private Site getSiteByCheck(HttpServletRequest request) { + Site site = userService.getSiteInfoByKey(request.getHeader("Authorization").toString()); + return site; + } + +} diff --git a/src/main/java/com/bb/admin/controller/AdminApiSettingController.java b/src/main/java/com/bb/admin/controller/AdminApiSettingController.java new file mode 100644 index 0000000..18f926a --- /dev/null +++ b/src/main/java/com/bb/admin/controller/AdminApiSettingController.java @@ -0,0 +1,1848 @@ +package com.bb.admin.controller; + +import java.nio.charset.Charset; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.codehaus.jettison.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.reactive.function.client.WebClient; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.Admin; +import com.bb.model.AdminIp; +import com.bb.model.AdminLogSearch; +import com.bb.model.AdminSearch; +import com.bb.model.ApiResponse; +import com.bb.model.ApiVendorCompInfo; +import com.bb.model.Bank; +import com.bb.model.Banner; +import com.bb.model.Block; +import com.bb.model.BlockSearch; +import com.bb.model.ChargingPointSettingVO; +import com.bb.model.CompDetail; +import com.bb.model.DomainPartnerVO; +import com.bb.model.GameSetting; +import com.bb.model.GameSettingItem; +import com.bb.model.LevelBank; +import com.bb.model.LevelBetLimit; +import com.bb.model.LevelDomain; +import com.bb.model.LevelFailPoint; +import com.bb.model.LevelOutPwd; +import com.bb.model.Member; +import com.bb.model.MemberDetail; +import com.bb.model.NotiBgmVo; +import com.bb.model.PageFormVO; +import com.bb.model.Site; +import com.bb.model.SiteCashBonusSettingVO; +import com.bb.model.SiteCheckReq; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; +import com.bb.service.CommonService; +import com.bb.service.CompService; +import com.bb.service.UserService; +import com.bb.util.IPKit; +import com.bb.util.PagingUtil; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import reactor.core.publisher.Mono; + +@RestController +@Slf4j +@RequestMapping("/api/admin/setting") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class AdminApiSettingController { + + private final UserService userService; + + private final JwtManager jwtManager; + + private final CommonService commonService; + + private final CompService compService; + + private final PasswordEncoder passwordEncoder; + + //@Autowired + //RestTemplate restTemplate; + + @Autowired + WebClient webClient; + + @ResponseBody + @PostMapping(value="/account") + public ApiResponse account(@RequestHeader String token, HttpServletRequest request, @RequestBody SiteSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + HashMap account = commonService.getSiteAccoucnt(search) ; + apiResponse.put("account", account); + apiResponse.success(); + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + apiResponse.success(); + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/bank") + public ApiResponse bank(@RequestHeader String token, HttpServletRequest request, @RequestBody SiteSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + List bankList = commonService.getAdminBankList(search) ; + apiResponse.put("list", bankList); + apiResponse.success(); + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/bankSave") + public ApiResponse bankSave(@RequestHeader String token, HttpServletRequest request, @RequestBody Bank bank) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + bank.setSiteId(tokenInfo.getSid()); + + if("Y".equals(bank.getDelYn())) { + // 삭제 + if(bank.getBankCode() == null || bank.getBankCode().equals("")) { + throw new ApiException("BK99", "bankcode is not null"); + } + commonService.bankDelete(bank); + } else { + // 수정 + commonService.bankSave(bank); + } + + apiResponse.success(); + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/option") + public ApiResponse option(@RequestHeader String token, HttpServletRequest request, @RequestBody SiteSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + if(search.getSiteId()==null || search.getSiteId().equals("")) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + } + + SiteOption option = commonService.getSiteSetting(search); + apiResponse.put("option", option); + apiResponse.success(); + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/optionSave") + public ApiResponse optionSave(@RequestHeader String token, HttpServletRequest request, @RequestBody SiteOption option) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + if(!"super".equals(tokenInfo.getType())) { + option.setSiteId(tokenInfo.getSid()); + } + log.info("#-admin::optionSave:::"+ "[REQUEST: "+request.getRequestURI()+"] " + option); + + if(option.getMaxWinAmt() != null && !option.getMaxWinAmt().equals("")) { + boolean isNumeric = StringUtils.isNumeric(option.getMaxWinAmt()); + if(!isNumeric) { + log.error("#-admin::optionSave:::"+ "maxWinAmt is not numeric::"+option.getMaxWinAmt()); + throw new ApiException("OP001", "maxWinAmt is not numeric"); + } + } + + int result = commonService.optionSave(option); + log.info("#-admin::optionSave:::"+ "optionSave result" + result); + + if(option.getVictoryPassYn() != null && !option.getVictoryPassYn().equals("")) { + result = compService.updateCompVictoryPassYn(option); + log.info("#-admin::optionSave:::"+ "updateCompVictoryPassYn result" + result); + } + + apiResponse.success(); + } catch(ApiException e) { + log.error("#-admin::optionSave:::"+ "ApiException::"+e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error("#-admin::optionSave:::"+ "Exception::"+e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/parseUseUpdate") + public ApiResponse parseUseUpdate(@RequestHeader String token, HttpServletRequest request, @RequestBody net.sf.json.JSONObject usdtObj) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-parseUseUpdate::"+tokenInfo.getSid()+":::"; + + HashMap param = new HashMap(); + param.put("siteId", tokenInfo.getSid()); + param.put("apiVendorCode", "triple"); + ApiVendorCompInfo vendorCompInfo = userService.getApiVendorCompInfo(param); + + // 헤더에 토큰 세팅 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + headers.set("User-Agent", "PostmanRuntime/7.28.4"); + headers.set("Authorization", vendorCompInfo.getClientSecretKey()); + headers.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8"))); + + JSONObject params = new JSONObject(); + params.put("parseUseYn", usdtObj.getString("parseUseYn")); + + String apiUrl = vendorCompInfo.getApiUrl() + "/parseUseUpdate"; + log.info(LOG_PREFIX+ "Url: " + apiUrl); + log.info(LOG_PREFIX+ "Params: " + params.toString()); + + Mono responseMono = webClient.post() + .uri(apiUrl) + .headers(httpHeaders -> httpHeaders.addAll(headers)) + .bodyValue(params.toString()) + .retrieve() + .bodyToMono(String.class); + + String responseBody = responseMono.block(); // Blocking to get the response synchronously + + log.info(LOG_PREFIX+ "response : " + responseBody); + JSONObject jsonObj = new JSONObject(responseBody); + if("0".equals(jsonObj.getString("resultCode"))) { + JSONObject dataObj = jsonObj.getJSONObject("data"); + + apiResponse.put("currentUseYn", dataObj.getString("currentUseYn")); + apiResponse.success(); + } else { + throw new ApiException("1000", "accessDinied"); + } + + } catch(ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-parseUseUpdate::"+tokenInfo.getSid()+":::"; + apiResponse = e.getApiResponse(); + + log.error(LOG_PREFIX+ "ApiException: " + e.toString()); + log.error(LOG_PREFIX+ "ApiException: " + apiResponse.toString()); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-parseUseUpdate::"+tokenInfo.getSid()+":::"; + e.printStackTrace(); + apiResponse.fail(); + + log.error(LOG_PREFIX+ "Exception: " + e.toString()); + log.error(LOG_PREFIX+ "Exception: " + apiResponse.toString()); + } + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/level/chargingPointSettingInfo") + public ApiResponse chargingPointSettingInfo(HttpServletRequest request, @RequestHeader String token) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + log.info("[REQUEST: "+request.getRequestURI()+"] siteIdx: " + tokenInfo.getSidx()); + List List = commonService.getChargingPointSettingList(tokenInfo.getSidx()); + apiResponse.put("list", List); + + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/level/chargingPointSettingSave") + public ApiResponse chargingPointSettingSave(HttpServletRequest request, @RequestHeader String token, @RequestBody ChargingPointSettingVO settingVO) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + final String LOG_PREFIX = "#-admin::setting::chargingPointSettingSave::"+tokenInfo.getSid()+":::"; + ObjectMapper objectMapper = new ObjectMapper(); + String reqJsonStr = objectMapper.writeValueAsString(settingVO); + JSONObject reqObj = new JSONObject(reqJsonStr); + log.info(LOG_PREFIX+ "Request {}", reqObj); + + settingVO.setSiteIdx(tokenInfo.getSidx()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + settingVO); + int result = commonService.setChargingPointSettingSave(settingVO); + + try{ + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", tokenInfo.getSid()+"::업체 이벤트 보너스 포인트 기본세팅 수정"); + logParam.put("logDesc", settingVO.toString()); + + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { System.out.print(e.toString()); } + + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/level/betLimit") + public ApiResponse lBetlimit(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + SiteSearch search = new SiteSearch(); + search.setSiteId(tokenInfo.getSid()); + + List lblList = commonService.getLbetLimitList(search); + apiResponse.put("list", lblList); + + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/level/betLimitSave") + public ApiResponse lBetlimitSave(@RequestHeader String token, HttpServletRequest request, @RequestBody LevelBetLimit betLimit) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + final String LOG_PREFIX = "#-admin::setting::lBetlimitSave::"+tokenInfo.getSid()+":::"; + ObjectMapper objectMapper = new ObjectMapper(); + String reqJsonStr = objectMapper.writeValueAsString(betLimit); + JSONObject reqObj = new JSONObject(reqJsonStr); + log.info(LOG_PREFIX+ "Request {}", reqObj); + + betLimit.setSiteId(tokenInfo.getSid()); + commonService.setLbetLimitList(betLimit); + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/level/siteCashBonusSettingInfo") + public ApiResponse siteCashBonusSettingInfo(HttpServletRequest request, @RequestHeader String token) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + log.info("[REQUEST: "+request.getRequestURI()+"] siteIdx: " + tokenInfo.getSidx()); + List List = commonService.getSiteCashBonusSettingList(tokenInfo.getSidx()); + apiResponse.put("list", List); + + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/level/siteCashBonusSettingSave") + public ApiResponse siteCashBonusSettingSave(HttpServletRequest request, @RequestHeader String token, @RequestBody SiteCashBonusSettingVO settingVO) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + final String LOG_PREFIX = "#-admin::setting::chargingPointSettingSave::"+tokenInfo.getSid()+":::"; + ObjectMapper objectMapper = new ObjectMapper(); + String reqJsonStr = objectMapper.writeValueAsString(settingVO); + JSONObject reqObj = new JSONObject(reqJsonStr); + log.info(LOG_PREFIX+ "Request {}", reqObj); + + settingVO.setSiteIdx(tokenInfo.getSidx()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + settingVO); + int result = commonService.setSiteCashBonusSettingSave(settingVO); + + try{ + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", tokenInfo.getSid()+"::업체 입금 보너스 포인트 기본세팅 수정"); + logParam.put("logDesc", settingVO.toString()); + + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { System.out.print(e.toString()); } + + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/level/account") + public ApiResponse laccount(@RequestHeader String token, HttpServletRequest request, @RequestBody SiteSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + List lbList = commonService.getLbList(search); + + apiResponse.put("list", lbList); + + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/level/accountSave") + public ApiResponse accountSave(@RequestHeader String token, HttpServletRequest request, @RequestBody LevelBank levelBank ) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + final String LOG_PREFIX = "#-admin::setting::accountSave::"+tokenInfo.getSid()+":::"; + ObjectMapper objectMapper = new ObjectMapper(); + String reqJsonStr = objectMapper.writeValueAsString(levelBank); + JSONObject reqObj = new JSONObject(reqJsonStr); + log.info(LOG_PREFIX+ "Request {}", reqObj); + + levelBank.setSiteId(tokenInfo.getSid()); + + commonService.accountSave(levelBank); + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/level/failPoint") + public ApiResponse failPoint(@RequestHeader String token, HttpServletRequest request, @RequestBody SiteSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + search.setSiteId(tokenInfo.getSid()); + List failPointList = commonService.getFailPointList(search); + + apiResponse.put("list", failPointList); + + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/level/failPointSave") + public ApiResponse failPointSave(@RequestHeader String token, HttpServletRequest request, @RequestBody LevelFailPoint failPoint) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + failPoint.setSiteId(tokenInfo.getSid()); + commonService.failPointSave(failPoint); + + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/level/domain") + public ApiResponse lDomain(@RequestHeader String token, HttpServletRequest request, @RequestBody SiteSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + List domainList = commonService.getDomainList(search); + apiResponse.put("list", domainList); + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/level/domainSave") + public ApiResponse domainSave(@RequestHeader String token, HttpServletRequest request, @RequestBody LevelDomain domain) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + domain.setSiteId(tokenInfo.getSid()); + commonService.domainSave(domain); + + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/level/outPwd") + public ApiResponse outPwd(@RequestHeader String token, HttpServletRequest request, @RequestBody SiteSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + List outPwdList = commonService.getOutPwdList(search); + apiResponse.put("list", outPwdList); + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/level/outPwdSave") + public ApiResponse outPwdSave(@RequestHeader String token, HttpServletRequest request, @RequestBody LevelOutPwd outPwd) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + outPwd.setSiteId(tokenInfo.getSid()); + commonService.outPwdSave(outPwd); + + + + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/banner") + public ApiResponse banner(@RequestHeader String token, HttpServletRequest request, @RequestBody SiteSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + List bannerList = commonService.getBannerInfoList(search); + apiResponse.put("list", bannerList); + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/bannerSave") + public ApiResponse bannerSave(@RequestHeader String token, HttpServletRequest request, @RequestBody Banner banner) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + +// log.info("### KHO ### - Banner: " + banner); + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + banner.setSiteId(tokenInfo.getSid()); + + if(banner.getBannerType().equals("B")) { + banner.setLoginYn("N"); + } + + if(banner.getLoginYn() == null || "".equals(banner.getLoginYn())) { + banner.setLoginYn("N"); + } + + if(banner.getBannerContent() == null) { + banner.setBannerContent(""); + } + + if(banner.getDomain() == null) { + banner.setDomain(""); + } + + if(banner.getBannerPosition() == null) { + banner.setBannerPosition(""); + } + + if(banner.getBannerTitle() == null) { + banner.setBannerTitle(""); + } + + commonService.bannerSave(banner); + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/notiBgmList") + public ApiResponse notiBgmList(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + SiteSearch search = new SiteSearch(); + search.setSiteId(tokenInfo.getSid()); + + List list = commonService.getNotiBgmList(search); + apiResponse.put("list", list); + + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/notiBgmSave") + public ApiResponse notiBgmSave(@RequestHeader String token, HttpServletRequest request, @RequestBody NotiBgmVo notiBgmVo) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + notiBgmVo.setSiteId(tokenInfo.getSid()); + int result = commonService.setNotiBgmSave(notiBgmVo); + + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/logList"}) + public ApiResponse logList(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody AdminLogSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + search.setSiteId(tokenInfo.getSid()); + + int totalCount = commonService.getAdminLogListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + }else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + + } + System.out.println(search.getLimit()); + System.out.println(search.getOffset()); + List adminLogLis = commonService.getAdminLogList(search); + apiResponse.put("list", adminLogLis); + + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/block"}) + public ApiResponse block(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody BlockSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + search.setSiteId(tokenInfo.getSid()); + + int totalCount = commonService.getSiteBlockListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + System.out.println(search.getLimit()); + System.out.println(search.getOffset()); + + List adminLogLis = commonService.getSiteBlockList(search); + + apiResponse.put("list", adminLogLis); + apiResponse.success(); + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/blockSave"}) + public ApiResponse blockSave(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody Block block) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + block.setSiteId(tokenInfo.getSid()); + block.setRegId(tokenInfo.getSid()); + + + commonService.blockSave(block); + + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/admin"}) + public ApiResponse adminList(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody AdminSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + search.setSiteId(tokenInfo.getSid()); + + int totalCount = commonService.getSiteAdminListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + }else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + + } + + log.info("#-adminSetting::adminList::" + search); + List adminList = commonService.getSiteAdminList(search); + apiResponse.put("list", adminList); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch(Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/adminSave") + public ApiResponse adminSave(@RequestHeader String token, HttpServletRequest request, @RequestBody Admin admin) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + admin.setSiteIdx(tokenInfo.getSidx()); + admin.setSiteId(tokenInfo.getSid()); + admin.setRegId(tokenInfo.getMid()); + + log.info("#-adminSetting::adminSave::" + admin); + if(admin.getDelYn() == null || admin.getDelYn().equals("")) { + admin.setDelYn("N"); + } + + if(admin.getDelYn().equals("Y")) { + log.info("#-adminSetting::adminSave::DELETE_START"); + commonService.adminDelete(admin); + try { + Map logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "DELETE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", admin.getAdminId()+" 계정 삭제"); + logParam.put("logDesc", admin.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e){log.error("#-adminSetting::adminSave::" + e.toString());} + } else { + log.info("#-adminSetting::adminSave::" + "[ADMIN PWD:" + admin.getAdminPass() + "]"); + String password = passwordEncoder.encode(admin.getAdminPass()); + admin.setAdminPass(password); + log.info("#-adminSetting::adminSave::" + "[ADMIN PWD:" + admin.getAdminPass() + "]"); + + if(admin.getLoginYn() == null || admin.getLoginYn().equals("")) { + admin.setLoginYn("Y"); + } + if(admin.getSiteId().equals(admin.getAdminId())) { + log.error("#-adminSetting::adminSave::" + "siteId는 adminId와 같을 수 없습니다."); + throw new ApiException("1000", "accessDinied"); + } + log.info("#-adminSetting::adminSave::SAVE_START"); + commonService.adminSave(admin); + try { + Map logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "CREATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", admin.getAdminId()+" 계정 생성,변경"); + logParam.put("logDesc", admin.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e){log.error("#-adminSetting::adminSave::" + e.toString());} + } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch(Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/adminLogout"}) + public ApiResponse adminLogout(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody AdminSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!tokenInfo.getSid().equals(tokenInfo.getMid())) { + throw new ApiException("1001", "accessDinied11"); + } + + final String LOG_PREFIX = "#-admin::adminLogout::"+tokenInfo.getMid()+":::"; + log.info(LOG_PREFIX+ "AdminSearch : " + search); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", search.getAdminId()); + logParam.put("logType", "FORCELOGOUT"); + logParam.put("logoutYn", "N"); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", search.getAdminId()+"::관리자 강제 로그아웃"); + logParam.put("logDesc", ""); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch(Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/adminIp"}) + public ApiResponse adminIpList(@RequestHeader String token, HttpServletRequest request, @RequestBody AdminSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + search.setSiteId(tokenInfo.getSid()); + + int totalCount = commonService.getSiteAdminIpListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + log.info("#-adminSetting::adminIpList::" + search); + List adminLogLis = commonService.getSiteAdminIpList(search); + apiResponse.put("list", adminLogLis); + + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch(Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/adminIpSave") + public ApiResponse adminIpSave(@RequestHeader String token, HttpServletRequest request, @RequestBody AdminIp adminIp) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + adminIp.setSiteId(tokenInfo.getSid()); + adminIp.setRegId(tokenInfo.getMid()); + + if(adminIp.getAdminId() == null || adminIp.getAdminId().equals("")) { + throw new ApiException("IP01", "허용할 관리자 아이디를 입력하세요."); + } + + if(adminIp.getIp() == null || adminIp.getIp().equals("")) { + throw new ApiException("IP02", "허용할 아이피를 입력하세요."); + } + + log.info("#-adminSetting::adminIpSave::" + adminIp); + if(adminIp.getDelYn() == null || adminIp.getDelYn().equals("")) { + adminIp.setDelYn("N"); + } + + if(adminIp.getDelYn().equals("Y")) { + log.info("#-adminSetting::adminIpSave::DELETE_START"); + commonService.adminIpDelete(adminIp); + } else { + log.info("#-adminSetting::adminIpSave::SAVE_START"); + commonService.adminIpSave(adminIp); + } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/game/settingList") + public ApiResponse gameSettingList(@RequestHeader String token, HttpServletRequest request, @RequestBody GameSetting searchSetting) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + Site search = new Site(); + search.setSiteId(tokenInfo.getSid()); + CompDetail comp = compService.getPartnerComp(search); + searchSetting.setSiteId(tokenInfo.getSid()); + searchSetting.setPartnerType(comp.getPartnerType()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + searchSetting); + List settingList = commonService.gameSettingList(searchSetting); + apiResponse.put("list", settingList); + + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/game/settingSave") + public ApiResponse gameSettingSave(@RequestHeader String token, HttpServletRequest request, @RequestBody GameSetting gameSetting) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + Site search = new Site(); + search.setSiteId(tokenInfo.getSid()); + CompDetail comp = compService.getPartnerComp(search); + + List settingList = gameSetting.getSettingItems(); + for(GameSettingItem item : settingList) { + item.setSiteId(tokenInfo.getSid()); + if("senior".equals(comp.getPartnerType())) { + item.setTopCompId(""); + } else { + item.setTopCompId(comp.getRecommenderId()); + } + } + + int result = commonService.gameSettingSave(settingList); + log.info("Insert game setting item result: " + result); + + if(result > 0) { + apiResponse.success(); + } else { + apiResponse.fail(); + } + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value="/siteCheckSave") + public ApiResponse siteCheckSave(@RequestHeader String token, HttpServletRequest request, @RequestBody SiteCheckReq siteCheckReq) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + siteCheckReq.setSiteId(tokenInfo.getSid()); + siteCheckReq.setRegId(tokenInfo.getMid()); + + int result = 0; + + if(siteCheckReq.getIsEmergency() != null && siteCheckReq.getIsEmergency().equals("Y")) { + + SiteCheckReq param = new SiteCheckReq(); + param.setSiteId(tokenInfo.getSid()); + param.setSiteCheckYn("Y"); + commonService.changeSiteSettingCheckYn(param); + + log.info("#-siteCheckSave::"+tokenInfo.getSid()+"::SiteCheckReq: " + siteCheckReq); + result = 1; + } else { + if(siteCheckReq.getStartDate() == null || siteCheckReq.getStartDate().equals("")) { + throw new ApiException("SC29", "긴급점검이 아닐 경우 점검시간을 입력하세요."); + } + + if(siteCheckReq.getEndDate() == null || siteCheckReq.getEndDate().equals("")) { + throw new ApiException("SC29", "긴급점검이 아닐 경우 점검시간을 입력하세요."); + } + + DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date stDate = format.parse(siteCheckReq.getStartDate()); + Date edDate = format.parse(siteCheckReq.getEndDate()); + long sec = (edDate.getTime() - stDate.getTime()) / 1000; // 초 + log.info("#-siteCheckSave::"+tokenInfo.getSid() + "::sec : " + sec); + if(sec <= 0) { + throw new ApiException("SC39", "점검종료시간 확인"); + } + + int checkCnt = commonService.getSiteCheckCount(siteCheckReq); + if(checkCnt > 0) { + throw new ApiException("SC19", "점검시간 중복입니다. 확인 후 다시 요청하세요."); + } + + if(siteCheckReq.getContents() == null || siteCheckReq.getContents().equals("")) { + siteCheckReq.setContents(""); + } + + log.info("#-siteCheckSave::"+tokenInfo.getSid()+"::SiteCheckReq: " + siteCheckReq); + result = commonService.siteCheckSave(siteCheckReq); + } + + if(result > 0) { + apiResponse.success(); + } else { + throw new ApiException("SC99", "Site check save error"); + } + + } catch(ApiException e) { + apiResponse = e.getApiResponse(); + log.error("#-siteCheckSave::"+siteCheckReq.getSiteId()+"::apiResponse: " + apiResponse); + } catch (Exception e) { + log.error("#-siteCheckSave::"+siteCheckReq.getSiteId()+"::Exception::"+e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/siteCheckList") + public ApiResponse siteCheckList(@RequestHeader String token, HttpServletRequest request, @RequestBody SiteCheckReq siteCheckReq) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + siteCheckReq.setSiteId(tokenInfo.getSid()); + log.info("#-siteCheckList::"+tokenInfo.getSid()+"::SiteCheckReq: " + siteCheckReq); + List list = commonService.siteCheckList(siteCheckReq); + apiResponse.put("list", list); + + SiteSearch search = new SiteSearch(); + search.setSiteId(tokenInfo.getSid()); + SiteOption option = commonService.getSiteSetting(search); + apiResponse.put("siteCheckYn", option.getSiteCheckYn()); + + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/siteCheckDetail") + public ApiResponse siteCheckDetail(@RequestHeader String token, HttpServletRequest request, @RequestBody SiteCheckReq siteCheckReq) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + siteCheckReq.setSiteId(tokenInfo.getSid()); + log.info("#-siteCheckDetail::"+tokenInfo.getSid()+"::SiteCheckReq: " + siteCheckReq); + HashMap detail = commonService.siteCheckDetail(siteCheckReq); + apiResponse.put("detail", detail); + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/siteCheckOff") + public ApiResponse siteCheckOff(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + SiteCheckReq siteCheckReq = new SiteCheckReq(); + siteCheckReq.setSiteId(tokenInfo.getSid()); + HashMap detail = commonService.siteCheckInfo(siteCheckReq); + if(detail == null || detail.get("siteCheckIdx") == null) { + siteCheckReq.setSiteCheckYn("N"); + log.info("#-siteCheckOff::"+tokenInfo.getSid()+"::SiteCheckReq: " + siteCheckReq); + commonService.changeSiteSettingCheckYn(siteCheckReq); + } else { + int siteCheckIdx = (int) detail.get("siteCheckIdx"); + siteCheckReq.setSiteCheckIdx(siteCheckIdx); + siteCheckReq.setRegId(tokenInfo.getMid()); + siteCheckReq.setIsCheckOff("Y"); + siteCheckReq.setSiteCheckYn("N"); + log.info("#-siteCheckOff::"+tokenInfo.getSid()+"::SiteCheckReq: " + siteCheckReq); + commonService.changeSiteCheckOff(siteCheckReq); + commonService.changeSiteSettingCheckYn(siteCheckReq); + } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/siteCheckOffByIdx") + public ApiResponse siteCheckOffByIdx(@RequestHeader String token, HttpServletRequest request, @RequestBody SiteCheckReq siteCheckReq) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + if(siteCheckReq.getSiteCheckIdx() == null) { + throw new ApiException("SC99", "site check idx is not null"); + } + siteCheckReq.setSiteId(tokenInfo.getSid()); + siteCheckReq.setRegId(tokenInfo.getMid()); + siteCheckReq.setIsCheckOff("Y"); + siteCheckReq.setSiteCheckYn("N"); + log.info("#-siteCheckOff::"+tokenInfo.getSid()+"::SiteCheckReq: " + siteCheckReq); + commonService.changeSiteCheckOff(siteCheckReq); + commonService.changeSiteSettingCheckYn(siteCheckReq); + + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/domainPartnerList") + public ApiResponse domainPartnerList(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + DomainPartnerVO domainPartnerVO = new DomainPartnerVO(); + domainPartnerVO.setSiteIdx(tokenInfo.getSidx()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + domainPartnerVO); + + List> domainList = commonService.getDomainPartnerList(domainPartnerVO); + apiResponse.put("domainList", domainList); + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/domainPartnerSave") + public ApiResponse domainPartnerSave(@RequestHeader String token, HttpServletRequest request, @RequestBody DomainPartnerVO domainPartnerVO) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + domainPartnerVO.setSiteIdx(tokenInfo.getSidx()); + domainPartnerVO.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + domainPartnerVO); + Member member = new Member(); + member.setSiteId(tokenInfo.getSid()); + member.setMemId(domainPartnerVO.getMemId()); + MemberDetail partner = userService.getMember(member); + if(partner == null) { + throw new ApiException("S1000", "파트너 아이디가 존재하지 않습니다."); + } + + if(partner.getIsPartnerMember().equals("N")) { + throw new ApiException("S1001", "파트너 아이디만 등록 가능합니다."); + } + + if(partner.getRecommendYn().equals("N")) { + throw new ApiException("S1002", "추천 가능 상태가 아닙니다."); + } + + if(partner.getMemLockYn().equals("Y") || partner.getMemBlackYn().equals("Y") || partner.getMemDelYn().equals("Y")) { + throw new ApiException("S1003", "[정지][블랙][삭제] 상태의 파트너는 등록할 수 없습니다."); + } + + commonService.domainPartnerSave(domainPartnerVO); + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/domainPartnerDelete") + public ApiResponse domainPartnerDelete(@RequestHeader String token, HttpServletRequest request, @RequestBody DomainPartnerVO domainPartnerVO) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + domainPartnerVO.setSiteIdx(tokenInfo.getSidx()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + domainPartnerVO); + if(domainPartnerVO.getDomain() == null || domainPartnerVO.getDomain().equals("")) { + throw new ApiException("S1004", "domain is not null"); + } + + commonService.domainPartnerDelete(domainPartnerVO); + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + private Site getSiteByCheck(HttpServletRequest request) { + Site site = userService.getSiteInfoByKey(request.getHeader("Authorization").toString()); + return site; + } +} diff --git a/src/main/java/com/bb/admin/controller/AdminSuperController.java b/src/main/java/com/bb/admin/controller/AdminSuperController.java new file mode 100644 index 0000000..414824b --- /dev/null +++ b/src/main/java/com/bb/admin/controller/AdminSuperController.java @@ -0,0 +1,527 @@ +package com.bb.admin.controller; + +import java.util.HashMap; +import java.util.List; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.ApiResponse; +import com.bb.model.Member; +import com.bb.model.MemberDetail; +import com.bb.model.MemberInsert; +import com.bb.model.MemberListSearch; +import com.bb.model.MemberRate; +import com.bb.model.PageFormVO; +import com.bb.model.PartnerListVO; +import com.bb.model.RetailSearch; +import com.bb.service.CommonService; +import com.bb.service.CompService; +import com.bb.service.RetailService; +import com.bb.service.SuperService; +import com.bb.service.UserService; +import com.bb.util.IPKit; +import com.bb.util.PagingUtil; +import com.bb.util.StringUtils; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@Slf4j +@RequestMapping("/api/super") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class AdminSuperController { + + private final SuperService superService; + + private final JwtManager jwtManager; + + private final CommonService commonService; + + private final UserService userService; + + private final CompService compService; + + private final RetailService retailService; + + private final PasswordEncoder passwordEncoder; + + private final String ISSUER = "super.oms-admin.com"; + + @ResponseBody + @PostMapping(value = "/addCompany") + public ApiResponse addCompany(@RequestHeader String token, HttpServletRequest request, + @Valid @RequestBody MemberInsert signupMember) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (tokenInfo.getType() == null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + String createSiteId = signupMember.getMemId().replaceAll(" ", "").replaceAll(" ", "").toLowerCase(); + final String LOG_PREFIX = "#-admin::addCompany::" + createSiteId + "::::"; + + signupMember.setSiteId(createSiteId); + signupMember.setMemId(createSiteId); + signupMember.setAdminId(createSiteId); + System.out.print(tokenInfo.getMid()); + System.out.print(signupMember.getMemId()); + signupMember.setMemLevel("99"); + signupMember.setPartnerLevel("COMP"); + signupMember.setMemStatus("1"); + signupMember.setRecommenderId(""); + signupMember.setPartnerType("senior"); + + String password = passwordEncoder.encode(signupMember.getMemPass()); + log.info("[MEMBER PWD:" + password + "]"); + signupMember.setMemPass(password); + + Member checkMember = new Member(); + checkMember.setSiteId(signupMember.getMemId()); + checkMember.setMemId(signupMember.getMemId()); + checkMember.setRecommenderId(signupMember.getRecommenderId()); + /* + * int idCheck = userService.idCheck(checkMember); if(idCheck>0) { throw new + * ApiException("SC005", "idCheck"); } + */ + + int idCheckByAdmin = userService.idCheckByAdmin(checkMember); + if (idCheckByAdmin > 0) { + throw new ApiException("U005", "idCheckByAdmin"); + } + + int nameCheck = userService.nameCheck(checkMember); + if (nameCheck > 0) { + throw new ApiException("SC006", "nameCheck"); + } + + int adminCheck = userService.adminCheck(signupMember.getSiteId()); + if (nameCheck > 0) { + throw new ApiException("SC007", "Super admin account duplication"); + } + + log.info("##-SUPER addCompany() -## [REQUEST: " + request.getRequestURI() + "] " + signupMember); + int result = userService.adminSignUp(LOG_PREFIX, signupMember, passwordEncoder); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "CREATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", signupMember.getSiteId() + "::슈퍼관리자 업체 생성"); + logParam.put("logDesc", signupMember.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + Member search = new Member(); + search.setMemId(signupMember.getMemId()); + search.setSiteId(signupMember.getMemId()); + search.setPartnerLevel("COMP"); + + if (signupMember.getRateList() != null) { + MemberRate rateparam = new MemberRate(); + rateparam.setMemId(signupMember.getMemId()); + rateparam.setRateList(signupMember.getRateList()); + + userService.getMemberRateUpdate(search, rateparam); + userService.getMemberbetYnUpdate(search, rateparam); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", signupMember.getSiteId() + "::슈퍼관리자 업체 생성 요율 세팅"); + logParam.put("logDesc", rateparam.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + } + + apiResponse.success(); + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/updateRate") + public ApiResponse updateRate(@RequestHeader String token, HttpServletRequest request, + @Valid @RequestBody MemberRate memberRate) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // System.out.println("ddd" + request.getAttribute("Authorization").toString()); + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (tokenInfo.getType() == null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + Member search = new Member(); + search.setMemId(memberRate.getMemId()); + search.setSiteId(memberRate.getSiteId()); + + MemberDetail member = userService.getMember(search); + if (member == null) { + throw new ApiException("U003", "unknown user"); + } + + search.setPartnerLevel(member.getPartnerLevel()); + + userService.getMemberRateUpdate(search, memberRate); + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", memberRate.getMemId() + "::슈퍼관리자 요율 변경"); + logParam.put("logDesc", memberRate.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + apiResponse.success(); + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/addUser") + public ApiResponse addUser(@RequestHeader String token, HttpServletRequest request, + @Valid @RequestBody MemberInsert signupMember) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + String LOG_PREFIX = "#-super::join::"; + + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (tokenInfo.getType() == null || tokenInfo.getType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + LOG_PREFIX = LOG_PREFIX + signupMember.getSiteId() + "::" + signupMember.getMemId() + "::::"; + + signupMember.setPartnerType(""); + signupMember.setMemStatus("1"); + + String password = passwordEncoder.encode(signupMember.getMemPass()); + log.info("[MEMBER PWD:" + password + "]"); + signupMember.setMemPass(password); + + signupMember.setPartnerLevel("NORMAL"); + + signupMember.setRecommendYn("N"); + signupMember.setPointExchangeYn("Y"); + signupMember.setRollingYn("Y"); + signupMember.setCashSendYn("N"); + signupMember.setCashReceiveYn("N"); + + signupMember.setNationCode(""); + signupMember.setPartSendYn("N"); + signupMember.setMaxCredit(""); + signupMember.setCreditRate(""); + signupMember.setCreditStatus(""); + + if (signupMember.getRecommenderId() == null || signupMember.getRecommenderId().equals("")) { + throw new ApiException("U097", "추천인 계정을 입력해주세요."); + } + + String refer = request.getHeader("Referer"); + String domain = "unknown"; + if (refer != null) { + String[] urls = StringUtils.extractUrlParts(refer); + domain = urls[2]; + log.info(LOG_PREFIX + "::domain::" + domain + "::recommandId::" + signupMember.getRecommenderId()); + } + signupMember.setJoinDomain(domain); + + Member recommendUser = new Member(); + recommendUser.setSiteId(signupMember.getSiteId()); + recommendUser.setMemId(signupMember.getRecommenderId()); + MemberDetail partner = userService.getMember(recommendUser); + + if (partner == null) { + throw new ApiException("U096", "존재하지 않는 추천인 계정입니다."); + } + + if (partner.getPartnerLevel().equals("COMP") || partner.getPartnerLevel().equals("AUTO") + || partner.getPartnerLevel().equals("NORMAL")) { + throw new ApiException("U099", "추천인으로 사용할 수 없는 계정입니다."); + } + + if (partner.getRecommendYn().equals("N")) { + throw new ApiException("U099", "추천인으로 사용할 수 없는 계정입니다."); + } + + if (!partner.getMemStatus().equals("1")) { + throw new ApiException("U114", "추천인으로 사용할 수 없는 계정입니다."); + } + + Member checkMember = new Member(); + checkMember.setSiteId(signupMember.getSiteId()); + checkMember.setMemId(signupMember.getMemId()); + checkMember.setRecommenderId(signupMember.getRecommenderId()); + checkMember.setMemName(signupMember.getMemName()); + checkMember.setMemNick(signupMember.getMemNick()); + + int idCheck = userService.idCheck(checkMember); + if (idCheck > 0) { + throw new ApiException("U005", "idCheck"); + } + /* + * int idCheckByAdmin =userService.idCheckByAdmin(checkMember); + * if(idCheckByAdmin>0) { throw new ApiException("U005", "idCheckByAdmin"); } + */ + int nameCheck = userService.nameCheck(checkMember); + if (nameCheck > 0) { + throw new ApiException("U006", "nameCheck"); + } + + if (signupMember.getSiteId().equals(signupMember.getRecommenderId())) { + throw new ApiException("U099", "recommenderIdCheck"); + } + + log.info("Insert Member:" + signupMember); + userService.adminJoin(signupMember); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "CREATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", signupMember.getMemId() + "::슈퍼관리자 회원 생성"); + logParam.put("logDesc", signupMember.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + Member search = new Member(); + search.setSiteId(signupMember.getSiteId()); + search.setMemId(signupMember.getMemId()); + search.setPartnerLevel("NORMAL"); + + try { + if (signupMember.getRateList() != null) { + MemberRate rateparam = new MemberRate(); + rateparam.setMemId(signupMember.getMemId()); + rateparam.setRateList(signupMember.getRateList()); + + userService.getMemberRateUpdate(search, rateparam); + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", signupMember.getMemId() + "::슈퍼관리자 회원 생성 요율 세팅"); + logParam.put("logDesc", rateparam.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + } + + } catch (Exception eee) { + } + + apiResponse.success(); + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = { "/memberList" }) + public ApiResponse memberList(@RequestHeader String token, HttpServletRequest request, + @Valid @RequestBody MemberListSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + PageFormVO pageVo = new PageFormVO(); + if (search.getPage() == 0) + search.setPage(1); + search.setPartnerType(""); + search.setSiteId(search.getSiteId()); + HashMap totalInfo = userService.getMemberListCnt(search); + + int totalCount = Integer.parseInt(totalInfo.get("totalCnt").toString()); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if (search.getCount_per_list() == 0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + + } + System.out.println(search.getLimit()); + System.out.println(search.getOffset()); + List memList = userService.getMemberList(search); + apiResponse.put("list", memList); + apiResponse.put("totalInfo", totalInfo); + apiResponse.success(); + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = { "/retailList" }) + public ApiResponse retailList(@RequestHeader String token, HttpServletRequest request, + @Valid @RequestBody RetailSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + PageFormVO pageVo = new PageFormVO(); + if (search.getPage() == 0) + search.setPage(1); + + search.setSiteId(search.getSiteId()); + + int totalCount = retailService.getRetailListCnt2(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if (search.getCount_per_list() == 0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + List list = retailService.getRetailList2(search); + apiResponse.put("list", list); + apiResponse.success(); + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + +} diff --git a/src/main/java/com/bb/admintop/controller/SuperApiCompController.java b/src/main/java/com/bb/admintop/controller/SuperApiCompController.java new file mode 100644 index 0000000..b098f3c --- /dev/null +++ b/src/main/java/com/bb/admintop/controller/SuperApiCompController.java @@ -0,0 +1,996 @@ +package com.bb.admintop.controller; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.ApiResponse; +import com.bb.model.CodeSearch; +import com.bb.model.CompResetInfo; +import com.bb.model.Member; +import com.bb.model.MemberInsert; +import com.bb.model.MemberListSearch; +import com.bb.model.MemberRate; +import com.bb.model.MenuVO; +import com.bb.model.PageFormVO; +import com.bb.model.PartnerCompInfo; +import com.bb.model.SiteSearch; +import com.bb.service.CommonService; +import com.bb.service.CompService; +import com.bb.service.SuperService; +import com.bb.service.UserService; +import com.bb.util.IPKit; +import com.bb.util.PagingUtil; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@Slf4j +@RequestMapping("/api/super/company") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class SuperApiCompController { + + private final SuperService superService; + + private final JwtManager jwtManager; + + private final CommonService commonService; + + private final UserService userService; + + private final CompService compService; + + private final PasswordEncoder passwordEncoder; + + @ResponseBody + @PostMapping(value = "/addCompany") + public ApiResponse addCompany(@RequestHeader String token, HttpServletRequest request, + @Valid @RequestBody MemberInsert signupMember) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (tokenInfo.getType() == null || !tokenInfo.getType().equals("super")) { + throw new ApiException("1000", "accessDinied"); + } + String createSiteId = signupMember.getMemId().replaceAll(" ", "").replaceAll(" ", "").toLowerCase(); + final String LOG_PREFIX = "#-super::addCompany::" + createSiteId + "::::"; + + signupMember.setMemId(createSiteId); + signupMember.setSiteId(createSiteId); + signupMember.setAdminId(createSiteId); + signupMember.setMemLevel("99"); + signupMember.setPartnerLevel("COMP"); + signupMember.setMemStatus("1"); + signupMember.setRecommenderId(""); + signupMember.setPartnerType("senior"); + + String password = passwordEncoder.encode(signupMember.getMemPass()); + log.info(LOG_PREFIX + "[MEMBER PWD:" + password + "]"); + signupMember.setMemPass(password); + + Member checkMember = new Member(); + checkMember.setSiteId(signupMember.getMemId()); + checkMember.setMemId(signupMember.getMemId()); + checkMember.setRecommenderId(signupMember.getRecommenderId()); + + /* + * int idCheck = userService.idCheck(checkMember); if(idCheck>0) { throw new + * ApiException("SC005", "idCheck"); } + */ + + int idCheckByAdmin = userService.idCheckByAdmin(checkMember); + if (idCheckByAdmin > 0) { + log.error(LOG_PREFIX + "idCheckByAdmin"); + throw new ApiException("U005", "idCheckByAdmin"); + } + + int nameCheck = userService.nameCheck(checkMember); + if (nameCheck > 0) { + log.error(LOG_PREFIX + "nameCheck"); + throw new ApiException("SC006", "nameCheck"); + } + + int adminCheck = userService.adminCheck(signupMember.getSiteId()); + if (nameCheck > 0) { + log.error(LOG_PREFIX + "Super admin account duplication"); + throw new ApiException("SC007", "Super admin account duplication"); + } + + log.info(LOG_PREFIX + "Company::" + signupMember); + int result = userService.adminSignUp(LOG_PREFIX, signupMember, passwordEncoder); + log.info(LOG_PREFIX + "adminSignUp result::" + result); + if (result == 0) { + log.error(LOG_PREFIX + "site prefix check"); + throw new ApiException("SP99", "site prefix check"); + } + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "save"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "SuperApiCompController.addCompany() => UserService.adminSignUp()"); + logParam.put("logDesc", signupMember.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + log.error(LOG_PREFIX + "insertAdminlog Exception::" + e.toString()); + } + + Member search = new Member(); + search.setMemId(signupMember.getMemId()); + search.setSiteId(signupMember.getMemId()); + search.setPartnerLevel("COMP"); + + if (signupMember.getRateList() != null) { + log.info(LOG_PREFIX + "RateList::" + signupMember.getRateList()); + MemberRate rateparam = new MemberRate(); + rateparam.setMemId(signupMember.getMemId()); + rateparam.setRateList(signupMember.getRateList()); + + userService.getMemberRateUpdate(search, rateparam); + log.info(LOG_PREFIX + "getMemberRateUpdate::End"); + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "save"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "SuperApiCompController.addCompany() => UserService.getMemberRateUpdate()"); + logParam.put("logDesc", rateparam.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + log.error(LOG_PREFIX + "insertAdminlog Exception::" + e.toString()); + } + + userService.getMemberbetYnUpdate(search, rateparam); + log.info(LOG_PREFIX + "getMemberbetYnUpdate::End"); + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "save"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", + "SuperApiCompController.addCompany() => UserService.getMemberbetYnUpdate()"); + logParam.put("logDesc", rateparam.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + log.error(LOG_PREFIX + "insertAdminlog Exception::" + e.toString()); + } + } + + apiResponse.success(); + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/detail") + public ApiResponse detail(@RequestHeader String token, HttpServletRequest request, @RequestBody SiteSearch search) + throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + log.info("[REQUEST: " + request.getRequestURI() + "] " + search); + + HashMap compInfo = compService.getCompInfoForDetail(search); + HashMap settingInfo = compService.getSettingInfoForDetail(search); + HashMap compStats = compService.getCompStatsForDetail(search); + List topCompList = compService.getTopCompListForDetail(search); + List botCompList = compService.getBotCompListForDetail(search); + CodeSearch codesSearch = new CodeSearch(); + codesSearch.setSiteId(search.getSiteId()); + List gameList = commonService.getGameCodesForSuper(codesSearch); + HashMap param = new HashMap<>(); + param.put("siteId", search.getSiteId()); + param.put("isSuper", "N"); + List menuList = commonService.getMenuList(param); + + codesSearch.setMasterCode("vendorComp"); + List vendorCompList = commonService.getCodeList(codesSearch); + + apiResponse.put("topCompId", compInfo.get("topCompId")); + apiResponse.put("compInfo", compInfo); + apiResponse.put("settingInfo", settingInfo); + apiResponse.put("compStats", compStats); + apiResponse.put("topCompList", topCompList); + apiResponse.put("botCompList", botCompList); + apiResponse.put("gameList", gameList); + apiResponse.put("menuList", menuList); + apiResponse.put("vendorCompList", vendorCompList); + apiResponse.success(); + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/modify/compInfo") + public ApiResponse modifyCompInfo(@RequestHeader String token, HttpServletRequest request, + @RequestBody PartnerCompInfo compInfo) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (tokenInfo.getType() == null || !tokenInfo.getType().equals("super")) { + throw new ApiException("1000", "accessDinied"); + } + + if (compInfo.getTopCompId() == null) { + throw new ApiException("SC999", "상위 컴퍼니 아이디 누락"); + } + + if (compInfo.getPassword() != null && !compInfo.getPassword().equals("")) { + String password = passwordEncoder.encode(compInfo.getPassword()); + log.info("[ADMIN PWD:" + password + "]"); + compInfo.setPassword(password); + } + + if (compInfo.getSiteDomain() == null) { + compInfo.setSiteDomain(""); + } + + log.info("[REQUEST: " + request.getRequestURI() + "] " + compInfo); + int result = compService.modifyCompInfo(compInfo); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("logType", "modify"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "SuperApiCompController.modifyCompInfo() => CompService.modifyCompInfo()"); + logParam.put("logDesc", compInfo.toString()); + + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + if (result > 0) { + apiResponse.success(); + } else { + throw new ApiException("COMP009", "회사정보 설정에 문제가 발생하였습니다. 관리자에게 문의하세요."); + } + + apiResponse.success(); + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/modify/apiSetting") + public ApiResponse updateApiSetting(@RequestHeader String token, HttpServletRequest request, + @RequestBody PartnerCompInfo compInfo) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (tokenInfo.getType() == null || !tokenInfo.getType().equals("super")) { + throw new ApiException("1000", "accessDinied"); + } + + if (compInfo.getSiteId() == null || compInfo.getSiteId().equals("")) { + throw new ApiException("SS99", "Not Found siteId"); + } + + log.info("[REQUEST: " + request.getRequestURI() + "] " + compInfo); + int result = compService.updateApiSetting(compInfo); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("logType", "modify"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "SuperApiCompController.updateApiSetting() => CompService.updateApiSetting()"); + logParam.put("logDesc", compInfo.toString()); + + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + if (result > 0) { + apiResponse.success(); + } else { + throw new ApiException("COMP009", "회사정보 설정에 문제가 발생하였습니다. 관리자에게 문의하세요."); + } + + apiResponse.success(); + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/modify/siteSettings") + public ApiResponse modifySiteSettings(@RequestHeader String token, HttpServletRequest request, + @RequestBody PartnerCompInfo compInfo) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (tokenInfo.getType() == null || !tokenInfo.getType().equals("super")) { + throw new ApiException("1000", "accessDinied"); + } + + if (compInfo.getTopCompId() == null) { + throw new ApiException("SC999", "상위 컴퍼니 아이디 누락"); + } + + log.info("[REQUEST: " + request.getRequestURI() + "] " + compInfo); + int result = compService.modifySiteSettings(compInfo); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("logType", "modify"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", + "SuperApiCompController.modifySiteSettings() => CompService.modifySiteSettings()"); + logParam.put("logDesc", compInfo.toString()); + + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + if (result > 0) { + apiResponse.success(); + } else { + throw new ApiException("COMP009", "사이트 기능 설정에 문제가 발생하였습니다. 관리자에게 문의하세요."); + } + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/modify/creditSettings") + public ApiResponse modifyCreditSettings(@RequestHeader String token, HttpServletRequest request, + @RequestBody PartnerCompInfo compInfo) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (tokenInfo.getType() == null || !tokenInfo.getType().equals("super")) { + throw new ApiException("1000", "accessDinied"); + } + + if (compInfo.getTopCompId() == null) { + throw new ApiException("SC999", "상위 컴퍼니 아이디 누락"); + } + + log.info("[REQUEST: " + request.getRequestURI() + "] " + compInfo); + int result = compService.modifyCreditSettings(compInfo); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("logType", "modify"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", + "SuperApiCompController.modifyCreditSettings() => CompService.modifyCreditSettings()"); + logParam.put("logDesc", compInfo.toString()); + + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + if (result > 0) { + apiResponse.success(); + } else { + throw new ApiException("COMP009", "PT 설정에 문제가 발생하였습니다. 관리자에게 문의하세요."); + } + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/modify/creditRates") + public ApiResponse modifyCompCreditRates(@RequestHeader String token, HttpServletRequest request, + @RequestBody PartnerCompInfo compInfo) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (tokenInfo.getType() == null || !tokenInfo.getType().equals("super")) { + throw new ApiException("1000", "accessDinied"); + } + + if (compInfo.getTopCompId() == null) { + throw new ApiException("SC999", "상위 컴퍼니 아이디 누락"); + } + + log.info("[REQUEST: " + request.getRequestURI() + "] " + compInfo); + int result = compService.modifyCompCreditRates(compInfo); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("logType", "modify"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", + "SuperApiCompController.modifyCompCreditRates() => CompService.modifyCompCreditRates()"); + logParam.put("logDesc", compInfo.toString()); + + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + if (result > 0) { + apiResponse.success(); + } else { + throw new ApiException("COMP009", "게임별 PT수수료율 설정에 문제가 발생하였습니다. 관리자에게 문의하세요."); + } + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/modify/gameSettings") + public ApiResponse modifyGameSettings(@RequestHeader String token, HttpServletRequest request, + @RequestBody PartnerCompInfo compInfo) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (tokenInfo.getType() == null || !tokenInfo.getType().equals("super")) { + throw new ApiException("1000", "accessDinied"); + } + + if (compInfo.getTopCompId() == null) { + throw new ApiException("SC999", "상위 컴퍼니 아이디 누락"); + } + + log.info("[REQUEST: " + request.getRequestURI() + "] " + compInfo); + int result = compService.modifySiteGameSettingForSuper(compInfo); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("logType", "modify"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", + "SuperApiCompController.modifyGameSettings() => CompService.modifySiteGameSettingForSuper()"); + logParam.put("logDesc", compInfo.toString()); + + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + if (result > 0) { + apiResponse.success(); + } else { + throw new ApiException("COMP009", "배팅 가능유/무 설정에 문제가 발생하였습니다. 관리자에게 문의하세요."); + } + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/modify/menuSettings") + public ApiResponse modifyMenuSettings(@RequestHeader String token, HttpServletRequest request, + @RequestBody PartnerCompInfo compInfo) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (tokenInfo.getType() == null || !tokenInfo.getType().equals("super")) { + throw new ApiException("1000", "accessDinied"); + } + + if (compInfo.getTopCompId() == null) { + throw new ApiException("SC999", "상위 컴퍼니 아이디 누락"); + } + + log.info("[REQUEST: " + request.getRequestURI() + "] " + compInfo); + int result = compService.modifyMenuSettings(compInfo); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("logType", "modify"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", + "SuperApiCompController.modifyMenuSettings() => CompService.modifyMenuSettings()"); + logParam.put("logDesc", compInfo.toString()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + if (result > 0) { + apiResponse.success(); + } else { + throw new ApiException("COMP009", "배팅 가능유/무 설정에 문제가 발생하였습니다. 관리자에게 문의하세요."); + } + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/detail/siteIds") + public ApiResponse getSiteIds(@RequestHeader String token, HttpServletRequest request, + @RequestBody SiteSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + log.info("[REQUEST: " + request.getRequestURI() + "] " + search); + List> compIdList = compService.getCompIdList(search); + apiResponse.put("siteIds", compIdList); + apiResponse.success(); + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/detail/siteGameInfo") + public ApiResponse getSiteGameInfo(@RequestHeader String token, HttpServletRequest request, + @RequestBody SiteSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + log.info("[REQUEST: " + request.getRequestURI() + "] " + search); + List gameList = compService.getSiteGameInfo(search); + + apiResponse.put("gameList", gameList); + apiResponse.success(); + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/detail/siteMenuInfo") + public ApiResponse getSiteMenuInfo(@RequestHeader String token, HttpServletRequest request, + @RequestBody SiteSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + log.info("[REQUEST: " + request.getRequestURI() + "] " + search); + HashMap param = new HashMap<>(); + List menuList = compService.getSiteMenuInfo(search); + + apiResponse.put("menuList", menuList); + apiResponse.success(); + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/detail/otpInfo") + public ApiResponse getSiteAdminOTPInfo(@RequestHeader String token, HttpServletRequest request, + @RequestBody SiteSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + if (search.getSiteId() == null || search.getSiteId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + log.info("[REQUEST: " + request.getRequestURI() + "] " + search); + List> adminOtpList = compService.getAdminOtpInfoList(search.getSiteId()); + apiResponse.put("adminOtpList", adminOtpList); + + apiResponse.success(); + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/reset") + public ApiResponse reset(@RequestHeader String token, HttpServletRequest request, + @RequestBody CompResetInfo compResetInfo) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (tokenInfo.getType() == null || !tokenInfo.getType().equals("super")) { + throw new ApiException("1000", "accessDinied"); + } + + if (compResetInfo.getSiteId() == null || compResetInfo.getSiteId().equals("")) { + throw new ApiException("SS99", "Not Found siteId"); + } + + log.info("[REQUEST: " + request.getRequestURI() + "] [SUPER_ADMIN reset("+compResetInfo.getSiteId()+")] " + compResetInfo); + int result = compService.resetComp(compResetInfo); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("logType", "modify"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "SuperApiCompController.reset() => CompService.resetComp()"); + logParam.put("logDesc", compResetInfo.toString()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + if (result == 0) { + apiResponse.success(); + } else { + throw new ApiException("COMP010", "사이트 초기화에 문제가 발생하였습니다. 관리자에게 문의하세요."); + } + + log.info("[REQUEST: " + request.getRequestURI() + "] [SUPER_ADMIN reset("+compResetInfo.getSiteId()+")] END..."); + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/deleteUsers") + public ApiResponse deleteUsers(@RequestHeader String token, HttpServletRequest request, + @RequestBody CompResetInfo compResetInfo) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (tokenInfo.getType() == null || !tokenInfo.getType().equals("super")) { + throw new ApiException("1000", "accessDinied"); + } + + if (compResetInfo.getSiteId() == null || compResetInfo.getSiteId().equals("")) { + throw new ApiException("SS99", "Not Found siteId"); + } + + final String LOG_PREFIX = "#super::deleteUsers::" + compResetInfo.getSiteId() + "::::"; + compResetInfo.setMemIds(compResetInfo.getMemIds().trim()); + + log.info(LOG_PREFIX + "[REQUEST: " + request.getRequestURI() + "] delete()::" + compResetInfo); + // User check + List memIdList = Arrays.asList(compResetInfo.getMemIds().split(",")); + if (memIdList.size() > 10) { + throw new ApiException("DU03", "User list size over"); + } + compResetInfo.setMemIdList(memIdList); + + List> memList = userService.delCheckMemList(compResetInfo); + for (HashMap mem : memList) { + String memId = mem.get("memId").toString(); + // String partnerLevel = mem.get("partnerLevel").toString(); + int botCnt = Integer.parseInt(mem.get("botCnt").toString()); + /* + * if(!"NORMAL".equals(partnerLevel)) { throw new ApiException("DU01", + * "["+memId+"] is not normal user"); } + */ + if (botCnt != 0) { + throw new ApiException("DU02", "[" + memId + "] has a bottom user(" + botCnt + ")"); + } + } + + // Delete user + int result = userService.deleteUsers(LOG_PREFIX, compResetInfo); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("logType", "modify"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "SuperApiUserController.delete() => UserService.deleteUsers()"); + logParam.put("logDesc", compResetInfo.toString()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + log.error(LOG_PREFIX + "insertAdminlog Exception::" + e.toString()); + } + + if (result >= 0) { + apiResponse.success(); + } else { + throw new ApiException("DU91", "유저 영구삭제 중 문제가 발생하였습니다. 관리자에게 문의하세요."); + } + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#super:memberDelete::" + compResetInfo.getSiteId() + "::::"; + log.error(LOG_PREFIX + "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#super:memberDelete::" + compResetInfo.getSiteId() + "::::"; + log.error(LOG_PREFIX + "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + @ResponseBody + @PostMapping(value = { "/statistics" }) + public ApiResponse statistics(@RequestHeader String token, HttpServletRequest request, + @Valid @RequestBody MemberListSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + PageFormVO pageVo = new PageFormVO(); + int totalCount = superService.getCompanyListCnt(search); + + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if (search.getCount_per_list() == 0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + List cashList = superService.getCompanyList(search); + apiResponse.put("list", cashList); + + apiResponse.success(); + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + +} diff --git a/src/main/java/com/bb/admintop/controller/SuperApiController.java b/src/main/java/com/bb/admintop/controller/SuperApiController.java new file mode 100644 index 0000000..670a333 --- /dev/null +++ b/src/main/java/com/bb/admintop/controller/SuperApiController.java @@ -0,0 +1,583 @@ +package com.bb.admintop.controller; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtClame; +import com.bb.jwt.JwtManager; +import com.bb.model.ApiResponse; +import com.bb.model.CodeSearch; +import com.bb.model.OTPInfo; +import com.bb.model.Site; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; +import com.bb.model.TOtpVO; +import com.bb.service.CommonService; +import com.bb.service.CompService; +import com.bb.service.SuperService; +import com.bb.service.UserService; +import com.bb.util.IPKit; +import com.bb.util.TOTPTokenGenerator; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@Slf4j +@RequestMapping("/api/super") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class SuperApiController { + + private final SuperService superService; + + private final JwtManager jwtManager; + + private final CommonService commonService; + + private final UserService userService; + + private final CompService compService; + + private final PasswordEncoder passwordEncoder; + + private final String ISSUER = "super.oms-admin.com"; + + @ResponseBody + @PostMapping(value = "/login") + public ApiResponse admonLogin(HttpServletRequest request, @RequestBody SiteSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + String loginAdminId = search.getSiteId(); + final String LOG_PREFIX = "#-super::login::" + loginAdminId + "::::"; + String logDesc = ""; + + try { + String adminOtpYN = compService.getAdminOtpUseYN(search.getSiteId()); + + if (adminOtpYN.equals("Y")) { + // OTP Login = Y + apiResponse.put("useOtp", adminOtpYN); + if (search.getOtp() == null || "".equals(search.getOtp())) { + log.error(LOG_PREFIX + "ApiException::5000::OTP 번호를 입력하세요."); + throw new ApiException("5000", "OTP 번호를 입력하세요."); + } + + // Check OTP + String account = search.getSiteId(); + int otpNum = 0; + try { + otpNum = Integer.parseInt(search.getOtp()); + } catch (NumberFormatException ne) { + log.error(LOG_PREFIX + "ApiException::4000::OTP 번호는 숫자 형식입니다."); + throw new ApiException("4000", "OTP 번호는 숫자 형식입니다."); + } + + OTPInfo otpInfo = compService.getOtpInfo(account); + if (otpInfo == null || otpInfo.getAccount().equals("")) { + log.error(LOG_PREFIX + "ApiException::6000::OTP 정보를 찾을 수 없습니다."); + throw new ApiException("6000", "OTP 정보를 찾을 수 없습니다."); + } + log.info(LOG_PREFIX + "OTP Info : " + otpInfo); + String secret = otpInfo.getSecretKey(); + + // long l = new Date().getTime(); + // long ll = l / 30000; + // boolean chkOtp = TOTPTokenGenerator.check_code(secret, otpNum, ll); + boolean chkOtp = TOTPTokenGenerator.otpVerify(secret, otpNum); + if (chkOtp) { + apiResponse.put("useOtp", "Y"); + + String password = passwordEncoder.encode(search.getSitePass()); + log.info(LOG_PREFIX + "[ADMIN PWD:" + password + "]"); + HashMap admininfo = userService.adminSuperLogin(search); + + boolean chkPassword = passwordEncoder.matches(search.getSitePass(), + admininfo.get("adminPass").toString()); + log.info(LOG_PREFIX + "[ADMIN chkPassword:" + chkPassword + "]"); + + if (!chkPassword) { + log.error(LOG_PREFIX + "ApiException::2000::no site"); + throw new ApiException("2000", "no site"); + } + + // ipchck + Map ipParam = new HashMap(); + ipParam.put("adminId", admininfo.get("adminId").toString()); + ipParam.put("ip", IPKit.getIpAddressByRequest(request)); + apiResponse.put("site", admininfo); + + JwtClame jwtinfo = new JwtClame(); + jwtinfo.setSiteIdx(0); + jwtinfo.setMemIdx(0); + jwtinfo.setSiteId(admininfo.get("adminId").toString()); + jwtinfo.setMemId(admininfo.get("adminId").toString()); + jwtinfo.setType("super"); + String tok = jwtManager.generateToken(jwtinfo); + apiResponse.put("token", tok); + + try { + Map logParam = new HashMap(); + logParam.put("siteId", admininfo.get("adminId").toString()); + logParam.put("memId", admininfo.get("adminId").toString()); + logParam.put("logType", "SUPERLOGIN"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "로그인"); + logParam.put("logDesc", logParam.toString()); + logParam.put("regId", admininfo.get("adminId").toString()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", tok); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + apiResponse.success(); + } else { + // TODO: 잘못된 OTP번호 + log.error(LOG_PREFIX + "ApiException::3000::OTP 번호가 일치하지 않습니다."); + throw new ApiException("3000", "OTP 번호가 일치하지 않습니다."); + } + } else { + // OTP Login = N + apiResponse.put("useOtp", adminOtpYN); + + String password = passwordEncoder.encode(search.getSitePass()); + log.info(LOG_PREFIX + "[ADMIN PWD:" + password + "]"); + HashMap admininfo = userService.adminSuperLogin(search); + + boolean chkPassword = passwordEncoder.matches(search.getSitePass(), + admininfo.get("adminPass").toString()); + log.info(LOG_PREFIX + "[ADMIN chkPassword:" + chkPassword + "]"); + + if (!chkPassword) { + log.error(LOG_PREFIX + "ApiException::2000::no site"); + throw new ApiException("2000", "no site"); + } + + // ipchck + Map ipParam = new HashMap(); + ipParam.put("adminId", admininfo.get("adminId").toString()); + ipParam.put("ip", IPKit.getIpAddressByRequest(request)); + apiResponse.put("site", admininfo); + + JwtClame jwtinfo = new JwtClame(); + jwtinfo.setSiteIdx(0); + jwtinfo.setMemIdx(0); + jwtinfo.setSiteId(admininfo.get("adminId").toString()); + jwtinfo.setMemId(admininfo.get("adminId").toString()); + jwtinfo.setType("super"); + String tok = jwtManager.generateToken(jwtinfo); + apiResponse.put("token", tok); + + try { + Map logParam = new HashMap(); + logParam.put("siteId", admininfo.get("adminId").toString()); + logParam.put("memId", admininfo.get("adminId").toString()); + logParam.put("logType", "SUPERLOGIN"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "로그인"); + logParam.put("logDesc", logParam.toString()); + logParam.put("regId", admininfo.get("adminId").toString()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", tok); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + } + + apiResponse.success(); + } catch (ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/makeOtp") + public ApiResponse makeOtp(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (tokenInfo.getType() == null || !tokenInfo.getType().equals("super")) { + throw new ApiException("1000", "accessDinied"); + } + + OTPInfo param = new OTPInfo(); + param.setAccount(tokenInfo.getMid()); + param.setIssuer(ISSUER); + param.setUseYn("Y"); + param.setType("S"); + param = TOTPTokenGenerator.getGoogleAuthQRUrl(param); + + log.info("#-super::makeOtp:: SUPER ADMIN secret : " + param.getSecretKey()); + log.info("#-super::makeOtp:: SUPER ADMIN account : " + param.getAccount()); + log.info("#-super::makeOtp:: SUPER ADMIN issuer : " + ISSUER); + log.info("#-super::makeOtp:: SUPER ADMIN URL : " + param.getUrl()); + + int result = compService.registSuperOtp(param); + if (result > 0) { + String adminOtpYN = compService.getAdminOtpUseYN(tokenInfo.getMid()); + apiResponse.put("useOtp", adminOtpYN); + apiResponse.put("otpUrl", param.getUrl()); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("logType", "modify"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "SuperApiController.makeOtp() => userService.registAdminOtp()"); + logParam.put("logDesc", param.toString()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + apiResponse.success(); + } else { + throw new ApiException("9999", "FAIL"); + } + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/getOtpUrl") + public ApiResponse getOtpUrl(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (tokenInfo.getType() == null || !tokenInfo.getType().equals("super")) { + throw new ApiException("1000", "accessDinied"); + } + + String account = tokenInfo.getMid(); + OTPInfo otpInfo = compService.getOtpInfo(account); + log.info("#-super::getOtpUrl::OTP info: " + otpInfo); + apiResponse.put("otpUrl", otpInfo.getUrl()); + + String adminOtpYN = compService.getAdminOtpUseYN(tokenInfo.getMid()); + apiResponse.put("useOtp", adminOtpYN); + + apiResponse.success(); + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/updateOtpUseYN") + public ApiResponse updateOtpUseYN(@RequestHeader String token, HttpServletRequest request, + @RequestBody OTPInfo info) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + if (info.getUseYn() == null || info.getUseYn().equals("")) { + throw new ApiException("1009", "The value 'useYN' does not exist."); + } + + int result = 0; + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (tokenInfo.getType() == null || !tokenInfo.getType().equals("super")) { + throw new ApiException("1000", "accessDinied"); + } + + if (info.getAccount() != null && !info.getAccount().equals("")) { + String adminId = info.getAccount(); + String adminType = compService.getAdminType(adminId); + info.setType(adminType); + result = compService.updateAdminOtpUseYN(info); + } else { + info.setAccount(tokenInfo.getMid()); + result = compService.updateSuperOtpUseYN(info); + } + + if (result > 0) { + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("logType", "modify"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "SuperApiController.updateOtpUseYN() => userService.updateOtpUseYN()"); + logParam.put("logDesc", info.toString()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + apiResponse.success(); + } else { + throw new ApiException("9999", "FAIL"); + } + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + + } + + @ResponseBody + @PostMapping(value = "/makeSiteOtp") + public ApiResponse makeSiteOtp(@RequestHeader String token, HttpServletRequest request, + @Valid @RequestBody TOtpVO otpVO) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (tokenInfo.getType() == null || !tokenInfo.getType().equals("super")) { + throw new ApiException("1000", "accessDinied"); + } + + String siteId = otpVO.getSiteId(); + String account = otpVO.getAdminId(); + Site site = userService.getSiteInfo(siteId); + String issuer = site.getSiteDomain(); + String adminType = compService.getAdminType(account); + + OTPInfo param = new OTPInfo(); + param.setAccount(account); + param.setIssuer(issuer); + param.setUseYn("N"); + param.setType(adminType); + param = TOTPTokenGenerator.getGoogleAuthQRUrl(param); + + log.info("#-admin::makeOtp:: secret : " + param.getSecretKey()); + log.info("#-admin::makeOtp:: account : " + param.getAccount()); + log.info("#-admin::makeOtp:: issuer : " + issuer); + log.info("#-admin::makeOtp:: URL : " + param.getUrl()); + + int result = compService.registAdminOtp(param); + if (result > 0) { + String siteOtpYN = compService.getAdminOtpUseYN(account); + apiResponse.put("useOtp", siteOtpYN); + apiResponse.put("otpUrl", param.getUrl()); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("logType", "modify"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "SuperApiController.makeSiteOtp() => userService.registAdminOtp()"); + logParam.put("logDesc", param.toString()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + apiResponse.success(); + } else { + throw new ApiException("9999", "FAIL"); + } + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/getSiteOtpUrl") + public ApiResponse getSiteOtpUrl(@RequestHeader String token, HttpServletRequest request, + @Valid @RequestBody TOtpVO otpVO) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + OTPInfo otpInfo = compService.getOtpInfo(otpVO.getAdminId()); + log.info("#-super::getSiteOtpUrl::OTP info: " + otpInfo); + apiResponse.put("otpUrl", otpInfo.getUrl()); + apiResponse.success(); + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/optionSave") + public ApiResponse optionSave(@RequestHeader String token, HttpServletRequest request, + @RequestBody SiteOption option) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (tokenInfo.getType() == null || !tokenInfo.getType().equals("super")) { + throw new ApiException("1000", "accessDinied"); + } + + option.setSiteId(option.getSiteId()); + commonService.optionSave(option); + + try { + Map logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "insert or update"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "AdminSuperController.optionSave() => CommonService.optionSave()"); + logParam.put("logDesc", option.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + apiResponse.success(); + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/gameCodes") + public ApiResponse gameCodes(@RequestHeader String token, HttpServletRequest request, + @RequestBody CodeSearch codesSearch) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + if (codesSearch == null || codesSearch.getSiteId().equals("")) { + codesSearch.setSiteId(""); + } else { + codesSearch.setSiteId(codesSearch.getSiteId()); + } + + List codeList = commonService.getGameCodesForSuper(codesSearch); + apiResponse.put("codes", codeList); + apiResponse.put("codesSearch", codesSearch); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/gameGroupCodes") + public ApiResponse gameGroupCodes(@RequestHeader String token, HttpServletRequest request, + @RequestBody CodeSearch codesSearch) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + if (codesSearch == null || codesSearch.getSiteId().equals("")) { + codesSearch.setSiteId(""); + } else { + codesSearch.setSiteId(codesSearch.getSiteId()); + } + + String siteId = codesSearch.getSiteId(); + List codeList = commonService.getGameGroupCodesForSuper(siteId); + apiResponse.put("groupCodes", codeList); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } +} diff --git a/src/main/java/com/bb/admintop/controller/SuperApiSettingController.java b/src/main/java/com/bb/admintop/controller/SuperApiSettingController.java new file mode 100644 index 0000000..f6ddd24 --- /dev/null +++ b/src/main/java/com/bb/admintop/controller/SuperApiSettingController.java @@ -0,0 +1,178 @@ +package com.bb.admintop.controller; + +import java.util.HashMap; +import java.util.List; + +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.ApiResponse; +import com.bb.model.GameCodeSearchVO; +import com.bb.model.GameCodeVO; +import com.bb.service.CommonService; +import com.bb.util.IPKit; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@Slf4j +@RequestMapping("/api/super/setting") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class SuperApiSettingController { + + private final JwtManager jwtManager; + + private final CommonService commonService; + + + @ResponseBody + @PostMapping(value="/gameCodeList") + public ApiResponse gameCodeList(@RequestHeader String token, HttpServletRequest request, @RequestBody GameCodeSearchVO searchVO) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + List> tabList = commonService.getGameCodeTabList(searchVO); + List> colList = commonService.getGameCodeColList(searchVO); + List> gameCodelist = commonService.getGameCodeList(searchVO); + apiResponse.put("selectTab", searchVO.getGroupCode()); + apiResponse.put("selectOrderName", searchVO.getOrderName()); + apiResponse.put("selectOrderType", searchVO.getOrderType()); + apiResponse.put("tabList", tabList); + apiResponse.put("colList", colList); + apiResponse.put("gameCodelist", gameCodelist); + apiResponse.success(); + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + + } + + + @ResponseBody + @PostMapping(value="/gameCodeRegist") + public ApiResponse gameCodeRegist(@RequestHeader String token, HttpServletRequest request, @RequestBody GameCodeVO gameCodeVO) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || !tokenInfo.getType().equals("super")) { + throw new ApiException("1000", "accessDinied"); + } + + log.info("#-gameCodeRegist::"+ gameCodeVO.toString()); + + if(gameCodeVO.getGroupCode() == null || gameCodeVO.getGroupCode().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + if(gameCodeVO.getGroupCodeNameEN() == null || gameCodeVO.getGroupCodeNameEN().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + if(gameCodeVO.getCode() == null || gameCodeVO.getCode().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + int result = commonService.gameCodeRegist(gameCodeVO); + if(result> 0) { + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "save"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "SuperApiSettingController.gameCodeRegist() => commonService.gameCodeRegist()"); + logParam.put("logDesc", gameCodeVO.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { System.out.print(e.toString()); } + + apiResponse.success(); + } else { + apiResponse.fail(); + } + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/gameCodeUpdate") + public ApiResponse gameCodeUpdate(@RequestHeader String token, HttpServletRequest request, @RequestBody GameCodeVO gameCodeVO) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(tokenInfo.getType()==null || !tokenInfo.getType().equals("super")) { + throw new ApiException("1000", "accessDinied"); + } + + log.info(gameCodeVO.toString()); + + int result = commonService.gameCodeUpdate(gameCodeVO); + if(result> 0) { + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "save"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "SuperApiSettingController.gameCodeUpdate() => commonService.gameCodeUpdate()"); + logParam.put("logDesc", gameCodeVO.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { System.out.print(e.toString()); } + apiResponse.success(); + } else { + apiResponse.fail(); + } + + } catch(ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } +} diff --git a/src/main/java/com/bb/admintop/controller/SuperApiUserController.java b/src/main/java/com/bb/admintop/controller/SuperApiUserController.java new file mode 100644 index 0000000..b740291 --- /dev/null +++ b/src/main/java/com/bb/admintop/controller/SuperApiUserController.java @@ -0,0 +1,603 @@ +package com.bb.admintop.controller; + +import java.net.SocketTimeoutException; +import java.util.HashMap; +import java.util.List; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; + +import org.apache.http.conn.ConnectTimeoutException; +import org.codehaus.jettison.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.ResourceAccessException; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.ApiResponse; +import com.bb.model.ApiVendorCompInfo; +import com.bb.model.Member; +import com.bb.model.MemberDetail; +import com.bb.model.MemberInsert; +import com.bb.model.MemberListSearch; +import com.bb.model.MemberRate; +import com.bb.model.MemberRateVo; +import com.bb.model.MemberSearch; +import com.bb.model.MemberUpdate; +import com.bb.model.NewMemRateItem; +import com.bb.model.PageFormVO; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; +import com.bb.model.TripleAuthInfo; +import com.bb.service.CommonService; +import com.bb.service.TripleService; +import com.bb.service.UserService; +import com.bb.util.IPKit; +import com.bb.util.PagingUtil; +import com.bb.util.StringUtils; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@Slf4j +@RequestMapping("/api/super/member") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class SuperApiUserController { + + private final JwtManager jwtManager; + + private final CommonService commonService; + + private final UserService userService; + + private final TripleService tripleService; + + private final PasswordEncoder passwordEncoder; + + private final String ISSUER = "super.oms-admin.com"; + + @ResponseBody + @PostMapping(value = "/addUser") + public ApiResponse addUser(@RequestHeader String token, HttpServletRequest request, + @Valid @RequestBody MemberInsert signupMember) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + String LOG_PREFIX = "#-super::join::"; + + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + if (signupMember.getSiteId() == null || signupMember.getSiteId().equals("")) { + throw new ApiException("SS99", "Not Found siteId"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (tokenInfo.getType() == null || !tokenInfo.getType().equals("super")) { + throw new ApiException("1000", "accessDinied"); + } + LOG_PREFIX = LOG_PREFIX + signupMember.getSiteId() + "::" + signupMember.getMemId() + "::::"; + + signupMember.setMemId(signupMember.getMemId().replaceAll(" ", "").replaceAll(" ", "").toLowerCase()); + if (signupMember.getRecommenderId() == null || signupMember.getRecommenderId().equals("")) { + throw new ApiException("U097", "추천인 계정을 입력해주세요."); + } + + String refer = request.getHeader("Referer"); + String domain = "unknown"; + if (refer != null) { + String[] urls = StringUtils.extractUrlParts(refer); + domain = urls[2]; + log.info(LOG_PREFIX + "::domain::" + domain + "::recommandId::" + signupMember.getRecommenderId()); + } + signupMember.setJoinDomain(domain); + + signupMember.setRecommenderId(signupMember.getRecommenderId().replaceAll(" ", "").toLowerCase()); + + signupMember.setPartnerType(""); + signupMember.setMemStatus("1"); + + String password = passwordEncoder.encode(signupMember.getMemPass()); + log.info("[MEMBER PWD:" + password + "]"); + signupMember.setMemPass(password); + + signupMember.setPartnerLevel("NORMAL"); + + signupMember.setRecommendYn("N"); + signupMember.setPointExchangeYn("Y"); + signupMember.setRollingYn("Y"); + signupMember.setCashSendYn("N"); + signupMember.setCashReceiveYn("N"); + + signupMember.setNationCode(""); + signupMember.setPartSendYn("N"); + signupMember.setMaxCredit(""); + signupMember.setCreditRate(""); + signupMember.setCreditStatus(""); + + Member recommendUser = new Member(); + recommendUser.setSiteId(signupMember.getSiteId()); + recommendUser.setMemId(signupMember.getRecommenderId()); + MemberDetail partner = userService.getMember(recommendUser); + + if (partner == null) { + throw new ApiException("U096", "존재하지 않는 추천인 계정입니다."); + } + + if (partner.getPartnerLevel().equals("COMP") || partner.getPartnerLevel().equals("AUTO")) { + throw new ApiException("U099", "추천인으로 사용할 수 없는 계정입니다."); + } + + if (partner.getRecommendYn().equals("N")) { + throw new ApiException("U099", "추천인으로 사용할 수 없는 계정입니다."); + } + + if (!partner.getMemStatus().equals("1")) { + throw new ApiException("U114", "추천인으로 사용할 수 없는 계정입니다."); + } + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(signupMember.getSiteId()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + if (partner.getPartnerLevel().equals("NORMAL") && siteOption.getUserRecommenderChgYn().equals("N")) { + throw new ApiException("U099", "추천인으로 사용할 수 없는 계정입니다."); + } + + if (partner.getPartnerLevel().equals("NORMAL") && siteOption.getUserRecommenderChgYn().equals("Y")) { + int cnt = userService.getNormalRetailCnt(recommendUser); + if (cnt == 10) { + // 일반회원 최대 추천인 가능 단계(10) 초과 + throw new ApiException("U099", "추천인으로 사용할 수 없는 계정입니다."); + } + } + + Member checkMember = new Member(); + checkMember.setSiteId(signupMember.getSiteId()); + checkMember.setMemId(signupMember.getMemId()); + checkMember.setRecommenderId(signupMember.getRecommenderId()); + checkMember.setMemName(signupMember.getMemName()); + checkMember.setMemNick(signupMember.getMemNick()); + + int idCheck = userService.idCheck(checkMember); + if (idCheck > 0) { + throw new ApiException("U005", "idCheck"); + } + + /* + * int idCheckByAdmin =userService.idCheckByAdmin(checkMember); + * if(idCheckByAdmin>0) { throw new ApiException("U005", "idCheckByAdmin"); } + */ + + int nameCheck = userService.nameCheck(checkMember); + if (nameCheck > 0) { + throw new ApiException("U006", "nameCheck"); + } + + if (signupMember.getSiteId().equals(signupMember.getRecommenderId())) { + throw new ApiException("U099", "recommenderIdCheck"); + } + + log.info("Insert Member:" + signupMember); + userService.adminJoin(signupMember); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "save"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "SuperApiUserController.addUser() => UserService.adminJoin()"); + logParam.put("logDesc", signupMember.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + Member search = new Member(); + search.setSiteId(signupMember.getSiteId()); + search.setMemId(signupMember.getMemId()); + search.setPartnerLevel("NORMAL"); + + try { + if (signupMember.getRateList() != null) { + MemberRate rateparam = new MemberRate(); + rateparam.setMemId(signupMember.getMemId()); + rateparam.setRateList(signupMember.getRateList()); + + userService.getMemberRateUpdate(search, rateparam); + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "save"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", + "SuperApiUserController.addUser() => UserService.getMemberRateUpdate()"); + logParam.put("logDesc", rateparam.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + /* + * userService.getMemberbetYnUpdate(search, rateparam); try{ HashMap logParam = new HashMap(); logParam.put("siteId", + * tokenInfo.getMid()); logParam.put("memId", tokenInfo.getMid()); + * logParam.put("logType", "save"); logParam.put("logoutYn", ""); + * logParam.put("logEndPoint", request.getRequestURI()); logParam.put("logName", + * "AdminSuperController.addUser() => UserService.getMemberbetYnUpdate()"); + * logParam.put("logDesc", rateparam.toString()); logParam.put("regId", + * tokenInfo.getMid()); logParam.put("regIp", + * IPKit.getIpAddressByRequest(request)); logParam.put("token", ""); + * commonService.insertAdminlog(logParam); } catch(Exception e) { + * System.out.print(e.toString()); } + */ + } + + } catch (Exception eee) { + } + + apiResponse.success(); + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = { "/memberList" }) + public ApiResponse memberList(@RequestHeader String token, HttpServletRequest request, + @Valid @RequestBody MemberListSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + if (search.getSiteId() == null || search.getSiteId().equals("")) { + throw new ApiException("SS99", "Not Found siteId"); + } + + PageFormVO pageVo = new PageFormVO(); + if (search.getPage() == 0) + search.setPage(1); + search.setPartnerType(""); + search.setSiteId(search.getSiteId()); + + if (search.getUserType() == null) { + search.setUserType(""); // 전체 검색 + } + + HashMap totalInfo = userService.getMemberListCnt(search); + + int totalCount = Integer.parseInt(totalInfo.get("totalCnt").toString()); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if (search.getCount_per_list() == 0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + + } + + log.info("[REQUEST: " + request.getRequestURI() + "] " + search); + + List memList = userService.getMemberList(search); + apiResponse.put("list", memList); + apiResponse.put("totalInfo", totalInfo); + + apiResponse.success(); + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/detail") + public ApiResponse memberDetail(@RequestHeader String token, HttpServletRequest request, + @Valid @RequestBody MemberSearch memberSearch) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + if (memberSearch.getSiteId() == null || memberSearch.getSiteId().equals("")) { + throw new ApiException("SS99", "Not Found siteId"); + } + + Member search = new Member(); + search.setMemId(memberSearch.getMemId()); + search.setSiteId(memberSearch.getSiteId()); + + log.info("[REQUEST: " + request.getRequestURI() + "] " + search); + + HashMap memberDetail = userService.getMemberDetail_1(search); + int totalChangePointAmt = userService.getTotalChangePointAmt(search); + memberDetail.put("totalChangePointAmt", totalChangePointAmt); + memberDetail.put("memPass", ""); + memberDetail.put("memberCommissionRate", userService.getMemberRate(search)); + + List memberFlow = userService.getMemberFlowList(memberDetail); + List partnerFlow = userService.getPartnerFlowList(memberDetail); + + apiResponse.put("member", memberDetail); + apiResponse.put("memberFlow", memberFlow); + apiResponse.put("partnerFlow", partnerFlow); + apiResponse.success(); + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/modify") + public ApiResponse modify(@RequestHeader String token, HttpServletRequest request, + @Valid @RequestBody MemberUpdate signupMember) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (tokenInfo.getType() == null || !tokenInfo.getType().equals("super")) { + throw new ApiException("1000", "accessDinied"); + } + + if (signupMember.getSiteId() == null || signupMember.getSiteId().equals("")) { + throw new ApiException("SS99", "Not Found siteId"); + } + + signupMember.setUpdId(tokenInfo.getMid()); + + if (signupMember.getMemPass() != null && !signupMember.getMemPass().equals("")) { + String password = passwordEncoder.encode(signupMember.getMemPass()); + log.info("[MEMBER PWD:" + password + "]"); + signupMember.setMemPass(password); + } + + log.info("[REQUEST: " + request.getRequestURI() + "] " + signupMember); + userService.updateMember(signupMember); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "save"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "SuperApiUserController.modify() => UserService.updateMember()"); + logParam.put("logDesc", signupMember.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + apiResponse.success(); + + } catch (ResourceAccessException rae) { + if (rae.getCause() instanceof ConnectTimeoutException) { + log.error("[ConnectTimeoutException]" + rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("ConnectTimeoutException"); + } + + if (rae.getCause() instanceof SocketTimeoutException) { + log.error("[SocketTimeoutException]" + rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("SocketTimeoutException"); + } + + if (rae.getCause() instanceof InterruptedException) { + log.error("[InterruptedException]" + rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("InterruptedException"); + } + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/updateRate") + public ApiResponse updateRate(@RequestHeader String token, HttpServletRequest request, + @Valid @RequestBody MemberRate memberRate) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // System.out.println("ddd" + request.getAttribute("Authorization").toString()); + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if (tokenInfo.getType() == null || !tokenInfo.getType().equals("super")) { + throw new ApiException("1000", "accessDinied"); + } + + Member search = new Member(); + search.setSiteId(memberRate.getSiteId()); + search.setMemId(memberRate.getMemId()); + search.setPartnerLevel("NORMAL"); + + MemberDetail member = userService.getMember(search); + if (member == null) { + throw new ApiException("U003", "unknown user"); + } + search.setPartnerLevel(member.getPartnerLevel()); + + log.info("[REQUEST: " + request.getRequestURI() + "] " + memberRate); + + /* + * MemberDetail myInfo = userService.getMember(search); Member topSearch = new + * Member(); topSearch.setSiteId(search.getSiteId()); + * topSearch.setMemId(myInfo.getRecommenderId()); List topRateList = + * userService.getMemberRateByNormal(topSearch); for(MemberRateVo + * mvo:memberRate.getRateList()) { String botCode = mvo.getGameType(); Double + * botPR = Double.valueOf(mvo.getPointRate()); Double botLR = + * Double.valueOf(mvo.getLoseRate()); + * + * for(HashMap topRate : topRateList) { String topCode = + * topRate.get("gameType").toString(); Double topPR = + * Double.valueOf(topRate.get("pointRate").toString()); Double topLR = + * Double.valueOf(topRate.get("loseRate").toString()); + * if(botCode.equals(topCode)) { if(botPR > topPR || botLR > topLR) { + * log.info("## updateRate ## botCode : " + botCode + ", topCode : " + topCode); + * log.info("## updateRate ## botPR : " + botPR + ", topPR : " + topPR); + * log.info("## updateRate ## botLR : " + botLR + ", topLR : " + topLR); String + * resultMsg = "["+topRate.get("codeName").toString()+"] 롤링:"+topPR+", 루징:" + * +topLR+" 보다 작은값을 입력하세요"; log.info("## updateRate ## resultMsg : " + + * resultMsg); + * + * throw new ApiException("U031", resultMsg); } } } } + */ + + NewMemRateItem rateItem = new NewMemRateItem(); + rateItem.setSiteId(memberRate.getSiteId()); + rateItem.setMemId(memberRate.getMemId()); + List myRateList = userService.getMemRateItemList(rateItem); + for (MemberRateVo mvo : memberRate.getRateList()) { + String vendorCode = mvo.getGameType(); + Double pointRate = Double.valueOf(mvo.getPointRate()); + Double loseRate = Double.valueOf(mvo.getLoseRate()); + + for (NewMemRateItem myRateInfo : myRateList) { + String myCode = myRateInfo.getVendorCode(); + Double maxPointRate = myRateInfo.getMaxPointRate(); + Double minPointRate = myRateInfo.getMinPointRate(); + Double maxLoseRate = myRateInfo.getMaxLoseRate(); + Double minLoseRate = myRateInfo.getMinLoseRate(); + if (vendorCode.equals(myCode)) { + if (maxPointRate < pointRate || minPointRate > pointRate) { + log.info("#-updateRate::" + myRateInfo.getSiteId() + "::" + myRateInfo.getMemId() + + "::vendorcode::" + myCode + "::pointRate::" + pointRate); + log.info("#-updateRate::" + myRateInfo.getSiteId() + "::" + myRateInfo.getMemId() + + "::vendorcode::" + myCode + "::MaxPointRate::" + maxPointRate + "::MinPointRate::" + + minPointRate); + String resultMsg = "롤링:" + "::vendorcode::" + myCode + "::" + maxPointRate + ", " + + minPointRate + " 사이값을 입력하세요"; + log.info("#-updateRate::" + myRateInfo.getSiteId() + "::" + myRateInfo.getMemId() + + "::vendorcode::" + myCode + "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + + if (maxLoseRate < loseRate || minLoseRate > loseRate) { + log.info("#-updateRate::" + myRateInfo.getSiteId() + "::" + myRateInfo.getMemId() + + "::vendorcode::" + myCode + "::loseRate::" + loseRate); + log.info("#-updateRate::" + myRateInfo.getSiteId() + "::" + myRateInfo.getMemId() + + "::vendorcode::" + myCode + "::MaxLoseRate::" + maxLoseRate + "::MinLoseRate::" + + minLoseRate); + String resultMsg = "루징:" + "::vendorcode::" + myCode + "::" + maxLoseRate + ", " + + minLoseRate + " 사이값을 입력하세요"; + log.info("#-updateRate::" + myRateInfo.getSiteId() + "::" + myRateInfo.getMemId() + + "::vendorcode::" + myCode + "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + } + } + } + + userService.getMemberRateUpdate(search, memberRate); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getMid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "save"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", "SuperApiUserController.updateRate() => UserService.getMemberRateUpdate()"); + logParam.put("logDesc", memberRate.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch (Exception e) { + System.out.print(e.toString()); + } + + apiResponse.success(); + + } catch (ApiException e) { + log.debug(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + +} diff --git a/src/main/java/com/bb/admintop/controller/SuperApiVendorController.java b/src/main/java/com/bb/admintop/controller/SuperApiVendorController.java new file mode 100644 index 0000000..c3dd2f1 --- /dev/null +++ b/src/main/java/com/bb/admintop/controller/SuperApiVendorController.java @@ -0,0 +1,208 @@ +package com.bb.admintop.controller; + +import java.util.HashMap; +import java.util.List; + +import jakarta.servlet.http.HttpServletRequest; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.ApiResponse; +import com.bb.model.SiteSearch; +import com.bb.service.CompService; +import com.bb.service.VendorService; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.sf.json.JSONObject; + +@RestController +@Slf4j +@RequestMapping("/api/super/vendor") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class SuperApiVendorController { + + private final JwtManager jwtManager; + + private final CompService compService; + + private final VendorService vendorService; + + @ResponseBody + @PostMapping(value = "/nexusSkinInfo") + public ApiResponse nexusSkinInfo(@RequestHeader String token, HttpServletRequest request, + @RequestBody SiteSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + final String LOG_PREFIX = "#-super::nexusSkinInfo::" + search.getSiteId() + "::::"; + + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + log.info(LOG_PREFIX + "Request::" + search.toString()); + if (search.getSiteId() == null || search.getSiteId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + HashMap tripleSiteInfo = compService.getTripleCreditInfo(search.getSiteId()); + + List> skinInfo = vendorService.getNexusSkinInfo(tripleSiteInfo); + for (HashMap item : skinInfo) { + long vendorIdx = (long) item.get("vendorIdx"); + HashMap vendorInfo = new HashMap<>(); + vendorInfo.put("vendorIdx", vendorIdx); + + List> skinList = vendorService.getNexusSkinList(vendorInfo); + item.put("skinList", skinList); + } + + apiResponse.put("skinInfo", skinInfo); + apiResponse.success(); + + } catch (ApiException e) { + apiResponse = e.getApiResponse(); + log.error(LOG_PREFIX + "ApiException::" + e.getApiResponse()); + } catch (Exception e) { + log.error(LOG_PREFIX + "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + log.error(LOG_PREFIX + "Response::" + apiResponse.toString()); + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/nexusSkinList") + public ApiResponse nexusSkinList(@RequestHeader String token, HttpServletRequest request, + @RequestBody JSONObject requestObj) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + final String LOG_PREFIX = "#-super::nexusSkinList::" + requestObj.getString("siteId") + "::::"; + log.info(LOG_PREFIX + "Request::" + requestObj.toString()); + + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + if (requestObj.getString("siteId") == null || requestObj.getString("siteId").equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + HashMap vendorInfo = new HashMap<>(); + vendorInfo.put("vendorIdx", requestObj.getInt("vendorIdx")); + + List> skinList = vendorService.getNexusSkinList(vendorInfo); + + apiResponse.put("skinList", skinList); + apiResponse.success(); + + } catch (ApiException e) { + apiResponse = e.getApiResponse(); + log.error(LOG_PREFIX + "ApiException::" + e.getApiResponse()); + } catch (Exception e) { + log.error(LOG_PREFIX + "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + log.error(LOG_PREFIX + "Response::" + apiResponse.toString()); + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/nexusSkinUpdate") + public ApiResponse nexusSkinUpdate(@RequestHeader String token, HttpServletRequest request, + @RequestBody JSONObject requestObj) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + final String LOG_PREFIX = "#-super::nexusSkinUpdate::" + requestObj.getString("siteId") + "::::"; + log.info(LOG_PREFIX + "Request::" + requestObj.toString()); + + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + + if (requestObj.getString("siteId") == null || requestObj.getString("siteId").equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + HashMap skinInfo = new HashMap<>(); + skinInfo.put("siteIdx", requestObj.getInt("siteIdx")); + skinInfo.put("vendorIdx", requestObj.getInt("vendorIdx")); + skinInfo.put("nexusSkinType", requestObj.getString("nexusSkinType")); + + int updResult = vendorService.nexusSkinUpdate(skinInfo); + log.info(LOG_PREFIX + "nexusSkinUpdate Result::" + updResult); + + HashMap skin = vendorService.getNexusSkin(skinInfo); + skin.put("siteId", requestObj.getString("siteId")); + updResult = compService.updateVendoMinMax(skin); + log.info(LOG_PREFIX + "updateVendoMinMax Result::" + updResult); + + apiResponse.success(); + + } catch (ApiException e) { + apiResponse = e.getApiResponse(); + log.error(LOG_PREFIX + "ApiException::" + e.getApiResponse()); + } catch (Exception e) { + log.error(LOG_PREFIX + "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + log.error(LOG_PREFIX + "Response::" + apiResponse.toString()); + return apiResponse; + } + + @ResponseBody + @PostMapping(value = "/list") + public ApiResponse vendorList(@RequestHeader String token, HttpServletRequest request, + @RequestBody SiteSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + final String LOG_PREFIX = "#-super::vendorList::" + search.getSiteId() + "::::"; + + try { + // Site site = getSiteByCheck(request); + if (token == null) { + throw new ApiException("1000", "accessDinied"); + } + log.info(LOG_PREFIX + "Request::" + search.toString()); + if (search.getSiteId() == null || search.getSiteId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + HashMap tripleSiteInfo = compService.getTripleCreditInfo(search.getSiteId()); + + List> vendorList = vendorService.getTripleVendorList(tripleSiteInfo); + + apiResponse.put("vendorList", vendorList); + apiResponse.success(); + + } catch (ApiException e) { + apiResponse = e.getApiResponse(); + log.error(LOG_PREFIX + "ApiException::" + e.getApiResponse()); + } catch (Exception e) { + log.error(LOG_PREFIX + "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + log.error(LOG_PREFIX + "Response::" + apiResponse.toString()); + return apiResponse; + } + +} diff --git a/src/main/java/com/bb/common/controller/CommonApiController.java b/src/main/java/com/bb/common/controller/CommonApiController.java new file mode 100644 index 0000000..71e5cc5 --- /dev/null +++ b/src/main/java/com/bb/common/controller/CommonApiController.java @@ -0,0 +1,348 @@ +package com.bb.common.controller; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.List; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; + +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.ApiResponse; +import com.bb.model.CodeSearch; +import com.bb.model.Member; +import com.bb.model.MemberCheckVo; +import com.bb.model.Site; +import com.bb.model.SiteCheckReq; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; +import com.bb.service.CommonService; +import com.bb.service.CompService; +import com.bb.service.UserService; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + + + +@RestController +@Slf4j +@RequestMapping("/api/common") +@RequiredArgsConstructor +public class CommonApiController { + + private final CommonService commonService; + + private final UserService userService; + + private final CompService compService; + + private final JwtManager jwtManager; + + public static String securityKey = "20cb7d92d7ac36900840a5fda92286ff"; + + @ResponseBody + @PostMapping(value="/code") + public ApiResponse codes(HttpServletRequest request, @RequestBody CodeSearch codesSearch) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + List codeList = commonService.getCodeList(codesSearch); + apiResponse.put("codes", codeList); + apiResponse.put("codesSearch",codesSearch); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value="/gameCodes") + public ApiResponse gameCodes(HttpServletRequest request, @RequestBody CodeSearch codesSearch) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + codesSearch.setSiteId(site.getSiteId()); + + List codeList = commonService.getGameCodes(codesSearch); + apiResponse.put("codes", codeList); + apiResponse.put("codesSearch",codesSearch); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value="/gameGroupCodes") + public ApiResponse gameGroupCodes(HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + String siteId = site.getSiteId(); + List codeList = commonService.getGameGroupCodes(siteId); + apiResponse.put("groupCodes", codeList); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value="/rateCategory") + public ApiResponse rateCategory(HttpServletRequest request, @RequestHeader String token) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + String siteId = tokenInfo.getSid(); + List codeList = commonService.getRateCategory(siteId); + apiResponse.put("category", codeList); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value="/siteCheckInfo") + public ApiResponse siteCheckInfo(HttpServletRequest request, @RequestBody SiteCheckReq siteCheckReq) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + HashMap detail = commonService.siteCheckInfo(siteCheckReq); + if(detail == null) { + SiteSearch search = new SiteSearch(); + search.setSiteId(siteCheckReq.getSiteId()); + SiteOption option = commonService.getSiteSetting(search); + if(option.getSiteCheckYn().equals("Y")) { + detail = new HashMap<>(); + detail.put("siteCheckIdx", 0); + detail.put("siteId", siteCheckReq.getSiteId()); + detail.put("checkType", "site"); + detail.put("checkTypeName", "사이트점검"); + detail.put("checkCode", "site"); + detail.put("checkCodeName", "사이트점검"); + DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long sDateL = System.currentTimeMillis(); + long eDateL = sDateL + (1000 * 60 * 60 * 24); + String sDateStr = sdf.format(sDateL); + String eDateStr = sdf.format(eDateL); + detail.put("startDate", sDateStr); + detail.put("endDate", eDateStr); + detail.put("isEmergency", "Y"); + detail.put("isCheckOff", "N"); + detail.put("siteCheckStatus", "open"); + detail.put("contents", "사이트 점검입니다. 조속히 마무리 하겠습니다. 감사합니다."); + } + } + apiResponse.put("siteCheckInfo", detail); + apiResponse.success(); + + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + @ResponseBody + @PostMapping(value="/isOtpLogin") + public ApiResponse isOtpLogin(HttpServletRequest request, @RequestBody SiteSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + String adminOtpYN = compService.getAdminOtpUseYN(search.getSiteId()); + apiResponse.put("useOtp", adminOtpYN); + apiResponse.success(); + + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } // Duplicate check + + + @ResponseBody + @PostMapping(value="/duplicateCheck") + public ApiResponse duplicateCheck(HttpServletRequest request, @RequestBody MemberCheckVo search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + Member checkMember = new Member(); + checkMember.setSiteId(search.getSiteId()); + checkMember.setMemId(search.getMemId()); + checkMember.setMemNick(search.getMemNick()); + + if(search.getCheckType().equals("memId")) { + // ID Check + int idCheck = userService.idCheck(checkMember); + int result = idCheck; + //int idCheckByAdmin = userService.idCheckByAdmin(checkMember); + //int result = idCheck + idCheckByAdmin; + + if(result == 0) { + apiResponse.put("checkType", "memId"); + apiResponse.put("checkResult", "succ"); + } else { + apiResponse.put("checkType", "memId"); + apiResponse.put("checkResult", "duplicate"); + } + + } else if(search.getCheckType().equals("memNick")) { + // NickName Check + int nickNameCheck = userService.nameCheck(checkMember); + if(nickNameCheck == 0) { + apiResponse.put("checkType", "memNick"); + apiResponse.put("checkResult", "succ"); + } else { + apiResponse.put("checkType", "memNick"); + apiResponse.put("checkResult", "duplicate"); + } + } else { + apiResponse.fail(); + } + + apiResponse.success(); + + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + + @PostMapping(value="/test") + public ApiResponse test(HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + String message = "박도울"; + SecretKeySpec skeySpec = new SecretKeySpec(hexStringToByteArray(securityKey), "AES"); + + // Instantiate the cipher + Cipher cipher = Cipher.getInstance("AES"); + cipher.init(Cipher.ENCRYPT_MODE, skeySpec); + byte[] encrypted = cipher.doFinal(message.getBytes("EUC-KR")); + System.out.println(byteArrayToHex(encrypted)); + + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @PostMapping(value="/test2") + public ApiResponse test2(HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + HashMap data = commonService.getSessionTransactionIsolation(); + apiResponse.put("data", data); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @PostMapping(value="/test3") + public ApiResponse test3(HttpServletRequest request, @RequestBody String param) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + log.info("###-test3::::param::"+param); + String[] gameNameArr = param.split("\\|\\|"); + String gameName = "Golden Wealth Baccarat"; + boolean isMatchKeyword = false; + + for(int i=0; ibyte 변환 + public static byte[] hexStringToByteArray(String s) { + int len = s.length(); + byte[] data = new byte[len / 2]; + for (int i = 0; i < len; i += 2) { + data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i+1), 16)); + } + return data; + } + + private Site getSiteByCheck(HttpServletRequest request) { + Site site = userService.getSiteInfoByKey(request.getHeader("Authorization").toString()); + return site; + } +} diff --git a/src/main/java/com/bb/config/ApiKeyFilter.java b/src/main/java/com/bb/config/ApiKeyFilter.java new file mode 100644 index 0000000..39c18d0 --- /dev/null +++ b/src/main/java/com/bb/config/ApiKeyFilter.java @@ -0,0 +1,38 @@ +package com.bb.config; + +import java.io.IOException; + +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + + +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; + + +import com.bb.util.StringUtils; + +@Component +public class ApiKeyFilter implements Filter { + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + HttpServletRequest req = (HttpServletRequest) request; + HttpServletResponse res = (HttpServletResponse) response; + + + String reqKey = req.getHeader("Authorization"); + + if (StringUtils.isEmpty(reqKey)) { + res.setStatus(HttpStatus.UNAUTHORIZED.value()); + } else { + request.setAttribute("Authorization", reqKey); + chain.doFilter(request, response); + } + } +} diff --git a/src/main/java/com/bb/config/AsyncConfig.java b/src/main/java/com/bb/config/AsyncConfig.java new file mode 100644 index 0000000..cf59476 --- /dev/null +++ b/src/main/java/com/bb/config/AsyncConfig.java @@ -0,0 +1,44 @@ +package com.bb.config; + +import java.util.concurrent.Executor; + +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.AsyncConfigurerSupport; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +@Configuration +@EnableAsync +public class AsyncConfig extends AsyncConfigurerSupport { + + // 기본 실행 대기하는 Thread의 수 + private final int CORE_POOL_SIZE = 20; + + // 동시 동작하는 최대 Thread의 수 + private final int MAX_POOL_SIZE = 100; + + // MaxPoolSize 초과 요청에서 Thread 생성 요청 시, 해당 요청을 Queue에 저장하는데 이때 최대 수용 가능한 Queue의 수 + private final int QUEUE_CAPACITY = 1000; + + // maxPoolSize가 모두 사용되다가 idle(쓰레드 휴식상태)로 돌아갔을 때 종료하기까지 대기하는 걸리는 시간 + private final int KEEP_ALIVE_SECONDS = 60; + + // 생성되는 Thread 접두사 지정 + private final String CUSTOM_THREAD_NAME_PREFIX = "BET-ASYNC-"; + + // 시스템을 종료(shutdown)할 때 queue에 남아있는 작업을 모두 완료한 후 종료 하도록 처리 + private final boolean WAIT_FOR_TASKS_TO_COMPLETE_ON_SHOUTDOWN = true; + + @Override + public Executor getAsyncExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(CORE_POOL_SIZE); + executor.setMaxPoolSize(MAX_POOL_SIZE); + executor.setQueueCapacity(QUEUE_CAPACITY); + executor.setKeepAliveSeconds(KEEP_ALIVE_SECONDS); + executor.setThreadNamePrefix(CUSTOM_THREAD_NAME_PREFIX); + executor.setWaitForTasksToCompleteOnShutdown(WAIT_FOR_TASKS_TO_COMPLETE_ON_SHOUTDOWN); + executor.initialize(); + return executor; + } +} diff --git a/src/main/java/com/bb/config/AuthFailureHandler.java b/src/main/java/com/bb/config/AuthFailureHandler.java new file mode 100644 index 0000000..614e9bb --- /dev/null +++ b/src/main/java/com/bb/config/AuthFailureHandler.java @@ -0,0 +1,35 @@ +package com.bb.config; + +import java.io.IOException; + +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import javax.xml.transform.Result; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; +import org.springframework.stereotype.Component; + +/** + * 로그인 실패 핸들러 + * + * @author wedul + * + */ +@Component +public class AuthFailureHandler extends SimpleUrlAuthenticationFailureHandler { + + @Override + public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, + AuthenticationException exception) throws IOException, ServletException { + + ObjectMapper om = new ObjectMapper(); + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + //response.getWriter().print(om.writeValueAsString("FAIL")); + //response.getWriter().flush(); + response.sendRedirect(request.getContextPath() + "/login"); + } +} diff --git a/src/main/java/com/bb/config/AuthProvider.java b/src/main/java/com/bb/config/AuthProvider.java new file mode 100644 index 0000000..ccf57d1 --- /dev/null +++ b/src/main/java/com/bb/config/AuthProvider.java @@ -0,0 +1,81 @@ +package com.bb.config; + +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.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Repository; + +import com.bb.front.ApiMemberController; +import com.bb.model.Site; +import com.bb.service.UserService; + +import lombok.extern.slf4j.Slf4j; + + + + +/** + * Description: 스프링시큐리티 로그인 인증 + * Path : 스프링시큐리티 + * @FileName : AsRepairController.java + * @Version : 2019. 8. 27. + * @Author : LeeChunghan + * @Comment : + */ +@Slf4j +@Component("authProvider") +public class AuthProvider implements AuthenticationProvider { + + @Autowired + private UserService userService; + + @Autowired + private PasswordEncoder passwordEncoder; + + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + String id = authentication.getName(); + String password = authentication.getCredentials().toString(); + String encodePassword = passwordEncoder.encode(password); + log.info("[PWD:" + encodePassword + "]"); + + HashMap param = new HashMap(); + param.put("siteId", id); + param.put("sitePass", password); + + Site loginMember = userService.swaggerlogin(param); + boolean chkPassword = passwordEncoder.matches(password, loginMember.getSitePass()); + log.info("[ADMIN chkPassword:" + chkPassword + "]"); + + if(!chkPassword) { + return null; + } else { + Site loginVO = new Site(); + loginVO = loginMember; + + List roles = new ArrayList(); + roles.add(new SimpleGrantedAuthority("SITE")); + + UsernamePasswordAuthenticationToken result = new UsernamePasswordAuthenticationToken(id, password, roles); + result.setDetails(loginVO); + return result; + } + } + + @Override + public boolean supports(Class authentication) { + return authentication.equals(UsernamePasswordAuthenticationToken.class); + } + +} diff --git a/src/main/java/com/bb/config/AuthSuccessHandler.java b/src/main/java/com/bb/config/AuthSuccessHandler.java new file mode 100644 index 0000000..52f37a1 --- /dev/null +++ b/src/main/java/com/bb/config/AuthSuccessHandler.java @@ -0,0 +1,106 @@ +package com.bb.config; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; + +import com.bb.dao.UserDao; +import com.bb.model.Site; +import com.bb.util.IPKit; +import com.fasterxml.jackson.databind.ObjectMapper; + + + + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler; +import org.springframework.stereotype.Component; + +/** + * Description: 스프링시큐리티 인증 + * Path : 스프링시큐리티 + * @FileName : AsRepairController.java + * @Version : 2019. 8. 27. + * @Author : LeeChunghan + * @Comment : + */ +@Component +public class AuthSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { + + //@Autowired + //private RedisSession redisSession; + // + @Autowired + private UserDao userDao; + + + @Override + public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, + Authentication authentication) throws ServletException, IOException { + + ObjectMapper om = new ObjectMapper(); + response.setStatus(HttpServletResponse.SC_OK); + response.getWriter().print(om.writeValueAsString("SUCCESS")); + HttpSession session = request.getSession(true); + + Site login = (Site)authentication.getDetails(); + + + + // 채팅서버와 공유할 세션 정보 + /* + OutLoginVO outLoginVO = new OutLoginVO(); + outLoginVO.setDomain(login.getDomain()); + outLoginVO.setName(login.getName()); + outLoginVO.setId(login.getId()); + + + login.setToken(redisSession.getToken(outLoginVO)); + */ + + // front 세션 저장 + //session.setAttribute("user", login); + + + + System.out.println(login.getSiteName()); + + if(login.getIp().equals(IPKit.getIpAddressByRequest(request)) || "0.0.0.0".equals(login.getIp()) || "".equals(login.getIp())) { + /* + HashMap logParam = new HashMap(); + logParam.put("memId",login.getId()); + logParam.put("logType", "LOGIN"); + logParam.put("logName", "로그인"); + logParam.put("logDesc", login.getId() +" "+ IPKit.getIpAddressByRequest(request) + " 로그인"); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("regId", login.getId()); + logDao.insertLog(logParam); + */ + response.sendRedirect(request.getContextPath() + "/swagger-ui.html"); + }else { + /* + HashMap logParam = new HashMap(); + logParam.put("memId",login.getId()); + logParam.put("logType", "LOGINFAIL"); + logParam.put("logName", "IP제한 - "); + logParam.put("logDesc", login.getId() +" "+ IPKit.getIpAddressByRequest(request) + " 로그인 IP제한"); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("regId", login.getId()); + logDao.insertLog(logParam); + + response.sendRedirect(request.getContextPath() + "/Admin/logout"); + */ + response.sendRedirect(request.getContextPath() + "/logout"); + } + + + + +}} diff --git a/src/main/java/com/bb/config/CorsConfig.java b/src/main/java/com/bb/config/CorsConfig.java new file mode 100644 index 0000000..17685d3 --- /dev/null +++ b/src/main/java/com/bb/config/CorsConfig.java @@ -0,0 +1,23 @@ +package com.bb.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class CorsConfig implements WebMvcConfigurer{ + + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/api/**") + .allowedOriginPatterns("*") + .allowedHeaders("*") // 어떤 헤더들을 허용할 것인지 + .allowedMethods("*") // 어떤 메서드를 허용할 것인지 (GET, POST...) + .allowCredentials(true) // 쿠키 요청을 허용한다(다른 도메인 서버 + .maxAge(86400); + + WebMvcConfigurer.super.addCorsMappings(registry); + + } +} diff --git a/src/main/java/com/bb/config/DbConfig.java b/src/main/java/com/bb/config/DbConfig.java new file mode 100644 index 0000000..1df8a5d --- /dev/null +++ b/src/main/java/com/bb/config/DbConfig.java @@ -0,0 +1,166 @@ +package com.bb.config; + +import java.util.Arrays; +import java.util.HashSet; + +import javax.sql.DataSource; + +import org.apache.ibatis.session.AutoMappingBehavior; +import org.apache.ibatis.session.ExecutorType; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.type.JdbcType; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.boot.autoconfigure.SpringBootVFS; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; + +import com.zaxxer.hikari.HikariDataSource; + +@Configuration +public class DbConfig { + + + + /** DataSource OMS Master 생성 */ + @Bean + @Primary + @ConfigurationProperties(prefix = "spring.datasource1") + public DataSource masterDataSource() { + return DataSourceBuilder.create() + .type(HikariDataSource.class) + .build(); + } + + /** DataSource OMS Slave 생성 */ + @Bean + @Primary + @ConfigurationProperties(prefix = "spring.datasource2") + public DataSource slaveDataSource() { + return DataSourceBuilder.create() + .type(HikariDataSource.class) + .build(); + } + + /** DataSource Triple 생성 */ + @Bean + @ConfigurationProperties(prefix = "spring.datasource3") + public DataSource tripleDataSource() { + return DataSourceBuilder.create() + .type(HikariDataSource.class) + .build(); + } + + /** sqlSessionFactory OMS Master 생성 */ + @Bean + @Primary + public SqlSessionFactory sqlSessionFactoryMain(@Autowired @Qualifier("masterDataSource") DataSource dataSource) throws Exception { + // logger.info("SqlSessionFactory Main Start"); + org.apache.ibatis.session.Configuration configuration = this.getMybatisConfig(); + + SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); + factoryBean.setDataSource(dataSource); + factoryBean.setVfs(SpringBootVFS.class); + factoryBean.setConfiguration(configuration); + factoryBean.setTypeHandlersPackage("com.commax.tool.framework.mybatis.typehandler"); + + ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); + Resource[] resource = resolver.getResources("db1/**/*.xml"); + factoryBean.setMapperLocations(resource); + + return factoryBean.getObject(); + } + + /** sqlSessionFactory OMS Slave 생성 */ + @Bean + @Primary + public SqlSessionFactory sqlSessionFactorySub(@Autowired @Qualifier("slaveDataSource") DataSource dataSource) throws Exception { + // logger.info("SqlSessionFactory Main Start"); + org.apache.ibatis.session.Configuration configuration = this.getMybatisConfig(); + + SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); + factoryBean.setDataSource(dataSource); + factoryBean.setVfs(SpringBootVFS.class); + factoryBean.setConfiguration(configuration); + factoryBean.setTypeHandlersPackage("com.commax.tool.framework.mybatis.typehandler"); + + ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); + Resource[] resource = resolver.getResources("db1/**/*.xml"); + factoryBean.setMapperLocations(resource); + + return factoryBean.getObject(); + } + + /** sqlSessionFactory Triple 생성 */ + @Bean + public SqlSessionFactory sqlSessionFactoryTriple(@Autowired @Qualifier("tripleDataSource") DataSource dataSource) throws Exception { + // logger.info("SqlSessionFactory SUB Start"); + org.apache.ibatis.session.Configuration configuration = this.getMybatisConfig(); + + SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); + factoryBean.setDataSource(dataSource); + factoryBean.setVfs(SpringBootVFS.class); + factoryBean.setConfiguration(configuration); + factoryBean.setTypeHandlersPackage("com.commax.tool.framework.mybatis.typehandler"); + + ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); + Resource[] resource = resolver.getResources("db2/**/*.xml"); + factoryBean.setMapperLocations(resource); + + return factoryBean.getObject(); + } + + /** sqlSession OMS Master 생성 */ + @Bean + @Primary + public SqlSession sqlSessionMain(@Autowired @Qualifier("sqlSessionFactoryMain") SqlSessionFactory factory) { + return new SqlSessionTemplate(factory); + } + + /** sqlSession OMS Slave 생성 */ + @Bean + public SqlSession sqlSessionSub(@Autowired @Qualifier("sqlSessionFactorySub") SqlSessionFactory factory) { + return new SqlSessionTemplate(factory); + } + + /** sqlSession Triple 생성 */ + @Bean + public SqlSession sqlSessionTriple(@Autowired @Qualifier("sqlSessionFactoryTriple") SqlSessionFactory factory) { + return new SqlSessionTemplate(factory); + } + + /** MybatisConfig 설정정보 */ + private org.apache.ibatis.session.Configuration getMybatisConfig() { + org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration(); + configuration.setCacheEnabled(true); + configuration.setLazyLoadingEnabled(false); + configuration.setAggressiveLazyLoading(false); + configuration.setMultipleResultSetsEnabled(true); + configuration.setUseColumnLabel(true); + configuration.setAutoMappingBehavior(AutoMappingBehavior.PARTIAL); + configuration.setDefaultExecutorType(ExecutorType.SIMPLE); + configuration.setDefaultStatementTimeout(25000); + configuration.setMapUnderscoreToCamelCase(true); + configuration.setJdbcTypeForNull(JdbcType.NVARCHAR); + configuration.setLazyLoadTriggerMethods(new HashSet<>(Arrays.asList("equals", "clone", "hashCode", "toString"))); + configuration.setLogPrefix("[SQL]"); + + return configuration; + } + + + + + + + +} diff --git a/src/main/java/com/bb/config/HttpEncryptionFilter.java b/src/main/java/com/bb/config/HttpEncryptionFilter.java new file mode 100644 index 0000000..3ec33b6 --- /dev/null +++ b/src/main/java/com/bb/config/HttpEncryptionFilter.java @@ -0,0 +1,35 @@ +package com.bb.config; + +import java.io.IOException; + +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.annotation.WebFilter; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@WebFilter("/api/*") +public class HttpEncryptionFilter implements Filter { + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { +// log.info("HttpEncryptionFilter.doFilter() call..."); + // TODO Auto-generated method stub + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + HttpServletResponse httpServletResponse = (HttpServletResponse) response; + + RequestDecryptWrapper requestDecryptWrapper = new RequestDecryptWrapper(httpServletRequest); + ResponseEncryptWrapper responseEncryptWrapper = new ResponseEncryptWrapper(httpServletResponse); + + chain.doFilter(requestDecryptWrapper, responseEncryptWrapper); + + httpServletResponse.getOutputStream().write(responseEncryptWrapper.encryptResponse()); + } + +} diff --git a/src/main/java/com/bb/config/HttpInterceptor.java b/src/main/java/com/bb/config/HttpInterceptor.java new file mode 100644 index 0000000..3775911 --- /dev/null +++ b/src/main/java/com/bb/config/HttpInterceptor.java @@ -0,0 +1,35 @@ +package com.bb.config; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Component +public class HttpInterceptor implements HandlerInterceptor { + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { +// log.info("[preHandle] " + request.getRequestURI()); +// log.info("[preHandle] " + request.toString()); + return true; + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { +// log.info("[postHandle] " + request.getRequestURI()); +// log.info("[postHandle] " + request.toString()); + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception ex) throws Exception { +// log.info("[afterCompletion] " + request.getRequestURI()); +// log.info("[afterCompletion] " + request.toString()); + } +} + diff --git a/src/main/java/com/bb/config/InterceptorConfig.java b/src/main/java/com/bb/config/InterceptorConfig.java new file mode 100644 index 0000000..5f920b9 --- /dev/null +++ b/src/main/java/com/bb/config/InterceptorConfig.java @@ -0,0 +1,17 @@ +package com.bb.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class InterceptorConfig implements WebMvcConfigurer { + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new HttpInterceptor()) + .addPathPatterns("/api/**/**/**/**") + .excludePathPatterns("/api/login", "/api/signUp"); // 해당 경로는 인터셉터가 가로채지 않는다. + } +} + + diff --git a/src/main/java/com/bb/config/OpenapiConfig.java b/src/main/java/com/bb/config/OpenapiConfig.java new file mode 100644 index 0000000..99e8037 --- /dev/null +++ b/src/main/java/com/bb/config/OpenapiConfig.java @@ -0,0 +1,55 @@ +package com.bb.config; + +import org.springdoc.core.GroupedOpenApi; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import io.swagger.v3.oas.annotations.OpenAPIDefinition; +import io.swagger.v3.oas.annotations.enums.SecuritySchemeIn; +import io.swagger.v3.oas.annotations.enums.SecuritySchemeType; +import io.swagger.v3.oas.annotations.info.Info; +import io.swagger.v3.oas.annotations.security.SecurityScheme; +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.security.SecurityRequirement; + +@Configuration +@OpenAPIDefinition(info = @Info(title = "My API", version = "v1")) +@SecurityScheme( + name = "Authorization", + // type = SecuritySchemeType.HTTP, + scheme = "basic", type = SecuritySchemeType.APIKEY , in=SecuritySchemeIn.HEADER +) + + + +public class OpenapiConfig { + @Bean + public GroupedOpenApi publicOpenAPI( ) { + return GroupedOpenApi + .builder() + .group("front") + .packagesToScan("com.bb.front") + .build(); + } + + @Bean + public GroupedOpenApi adminAPI( ) { + return GroupedOpenApi + .builder() + .group("admin") + .packagesToScan("com.bb.admin") + .build(); + } + + @Bean + public GroupedOpenApi commonAPI( ) { + return GroupedOpenApi + .builder() + .group("common") + .packagesToScan("com.bb.common") + .build(); + } + + +} diff --git a/src/main/java/com/bb/config/RequestDecryptWrapper.java b/src/main/java/com/bb/config/RequestDecryptWrapper.java new file mode 100644 index 0000000..f9df127 --- /dev/null +++ b/src/main/java/com/bb/config/RequestDecryptWrapper.java @@ -0,0 +1,86 @@ +package com.bb.config; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +import jakarta.servlet.ReadListener; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; + +import org.apache.commons.io.IOUtils; +import org.springframework.util.ObjectUtils; + +import com.bb.util.AESUtil; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class RequestDecryptWrapper extends HttpServletRequestWrapper { + + private final Charset encoding; + private String decodingBody; + private byte[] rawData; + + public RequestDecryptWrapper(HttpServletRequest request) { + super(request); + String charEncoding = request.getCharacterEncoding(); + this.encoding = ObjectUtils.isEmpty(charEncoding) ? StandardCharsets.UTF_8 : Charset.forName(charEncoding); + + try { + InputStream inputStream = request.getInputStream(); + rawData = IOUtils.toByteArray(inputStream); + + if (ObjectUtils.isEmpty(rawData)) { + return; + } + + AESUtil aesUtil = new AESUtil(); + this.decodingBody = aesUtil.decrypt(new String(rawData, StandardCharsets.UTF_8)); + } catch (IOException e) { + log.error(e.getMessage()); + } + } + + @Override + public ServletInputStream getInputStream() { + final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(decodingBody == null ? "".getBytes(encoding) : decodingBody.getBytes(encoding)); + return new ServletInputStream() { + + @Override + public boolean isFinished() { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean isReady() { + // TODO Auto-generated method stub + return false; + } + + @Override + public void setReadListener(ReadListener listener) { + // TODO Auto-generated method stub + + } + + @Override + public int read() throws IOException { + // TODO Auto-generated method stub + return byteArrayInputStream.read(); + } + + }; + } + + @Override + public BufferedReader getReader() { + return new BufferedReader(new InputStreamReader(this.getInputStream())); + } +} diff --git a/src/main/java/com/bb/config/ResponseEncryptWrapper.java b/src/main/java/com/bb/config/ResponseEncryptWrapper.java new file mode 100644 index 0000000..764011d --- /dev/null +++ b/src/main/java/com/bb/config/ResponseEncryptWrapper.java @@ -0,0 +1,54 @@ +package com.bb.config; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.WriteListener; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponseWrapper; + +import com.bb.util.AESUtil; + +public class ResponseEncryptWrapper extends HttpServletResponseWrapper { + + private final ByteArrayOutputStream output; + + public ResponseEncryptWrapper(HttpServletResponse response) { + super(response); + // TODO Auto-generated constructor stub + output = new ByteArrayOutputStream(); + } + + @Override + public ServletOutputStream getOutputStream() throws IOException { + return new ServletOutputStream() { + + @Override + public boolean isReady() { + // TODO Auto-generated method stub + return false; + } + + @Override + public void setWriteListener(WriteListener listener) { + // TODO Auto-generated method stub + + } + + @Override + public void write(int b) throws IOException { + // TODO Auto-generated method stub + output.write(b); + } + + }; + } + + public byte[] encryptResponse() { + String responseMessage = new String(output.toByteArray(), StandardCharsets.UTF_8); + AESUtil aesUtil = new AESUtil(); + return aesUtil.encrypt(responseMessage).getBytes(StandardCharsets.UTF_8); + } +} diff --git a/src/main/java/com/bb/config/RestTemplateConfig.java b/src/main/java/com/bb/config/RestTemplateConfig.java new file mode 100644 index 0000000..5a7f8ff --- /dev/null +++ b/src/main/java/com/bb/config/RestTemplateConfig.java @@ -0,0 +1,46 @@ +package com.bb.config; + +import java.util.concurrent.TimeUnit; + +import org.apache.hc.client5.http.classic.HttpClient; +import org.apache.hc.client5.http.config.ConnectionConfig; +import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder; +import org.apache.hc.client5.http.io.HttpClientConnectionManager; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class RestTemplateConfig { + static final int READ_TIMEOUT = 1500; + static final int CONN_TIMEOUT = 3000; + + @Bean + public RestTemplate restTemplate() { + var factory = new HttpComponentsClientHttpRequestFactory(); + factory.setHttpClient(createHttpClient()); + return new RestTemplate(factory); + } + + private HttpClient createHttpClient() { + return org.apache.hc.client5.http.impl.classic + .HttpClientBuilder.create() + .setConnectionManager(createHttpClientConnectionManager()) + + .build(); + + } + + private HttpClientConnectionManager createHttpClientConnectionManager() { + return PoolingHttpClientConnectionManagerBuilder.create() + .setMaxConnTotal(4096) //최대 오픈되는 커넥션 수 + .setMaxConnPerRoute(200) //IP, 포트 1쌍에 대해 수행할 커넥션 수 + .setDefaultConnectionConfig(ConnectionConfig.custom() + .setSocketTimeout(READ_TIMEOUT, TimeUnit.MILLISECONDS) + .setConnectTimeout(CONN_TIMEOUT, TimeUnit.MILLISECONDS) + .build()) + .build(); + } +} diff --git a/src/main/java/com/bb/config/SecurityConfig.java b/src/main/java/com/bb/config/SecurityConfig.java new file mode 100644 index 0000000..4ac1664 --- /dev/null +++ b/src/main/java/com/bb/config/SecurityConfig.java @@ -0,0 +1,116 @@ +package com.bb.config; + +import java.util.Arrays; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.CorsConfigurationSource; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; + +@Configuration +@EnableMethodSecurity(securedEnabled = true) +@ComponentScan(basePackages = {"com.bb.*"}) +public class SecurityConfig { + + @Autowired + @Lazy + AuthProvider authProvider; + + @Autowired + AuthFailureHandler authFailureHandler; + + @Autowired + AuthSuccessHandler authSuccessHandler; + + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http.cors().configurationSource(corsConfigurationSource()) + .and().csrf().disable() + .authorizeHttpRequests(auth -> auth + .requestMatchers( + "/v3/api-docs", + "/swagger-resources/**", + "/webjars/**", + "/swagger/**", + "/favicon.ico", + "/html/**", + "/resources/**", + "/triple/**", + "/triple", + "/excb/**", + "/excb", + "/passim/**", + "/passim", + "/websocket", + "/websocket/**", + "/test", + "/test/**" + ).permitAll() + .requestMatchers("/api/**", "/actuator/**", "/triple/**", "/websocket", "/websocket/**", "/test/**", "/excb/**", "/passim/**").permitAll() + .anyRequest().authenticated() + ) + .formLogin(form -> form + .loginProcessingUrl("/authenticate") + .defaultSuccessUrl("/swagger-ui.html") + .failureHandler(authFailureHandler) + .successHandler(authSuccessHandler) + .usernameParameter("id") + .passwordParameter("pw") + ) + .logout(logout -> logout + .logoutRequestMatcher(new AntPathRequestMatcher("/logoutProc")) + .invalidateHttpSession(true) + ) + .authenticationProvider(authProvider) + .headers(headers -> headers.frameOptions().disable()); + + return http.build(); + } + + @Bean + public BCryptPasswordEncoder bCryptPasswordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Bean + public FilterRegistrationBean filterRegistrationBean() { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + ApiKeyFilter customURLFilter = new ApiKeyFilter(); + + registrationBean.setFilter(customURLFilter); + registrationBean.addUrlPatterns("/api/login"); + registrationBean.setOrder(1); + + return registrationBean; + } + + @Bean + public CorsConfigurationSource corsConfigurationSource() { + final CorsConfiguration configuration = new CorsConfiguration(); + configuration.setAllowedOriginPatterns(Arrays.asList("*")); + configuration.addAllowedHeader("*"); + configuration.addAllowedMethod("*"); + configuration.setAllowCredentials(true); + + final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", configuration); + return source; + } + + @Bean + public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception { + return authenticationConfiguration.getAuthenticationManager(); + } +} \ No newline at end of file diff --git a/src/main/java/com/bb/config/WebClientConfig.java b/src/main/java/com/bb/config/WebClientConfig.java new file mode 100644 index 0000000..04c68df --- /dev/null +++ b/src/main/java/com/bb/config/WebClientConfig.java @@ -0,0 +1,189 @@ +package com.bb.config; + +import java.time.Duration; + +import javax.net.ssl.SSLException; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.reactive.ReactorClientHttpConnector; +import org.springframework.web.reactive.function.client.ExchangeFilterFunction; +import org.springframework.web.reactive.function.client.WebClient; + +import io.netty.channel.ChannelOption; +import io.netty.handler.ssl.SslContext; +import io.netty.handler.ssl.SslContextBuilder; +import io.netty.handler.ssl.SslProvider; +import io.netty.handler.ssl.util.InsecureTrustManagerFactory; +import io.netty.handler.timeout.ReadTimeoutHandler; +import io.netty.handler.timeout.WriteTimeoutHandler; +import lombok.extern.slf4j.Slf4j; +import reactor.core.publisher.Mono; +import reactor.netty.http.client.HttpClient; +import reactor.netty.tcp.TcpClient; + +@Slf4j +@Configuration +public class WebClientConfig { + + @Bean + public WebClient webClient() { + return WebClient.builder() + .filter(logRequest()) + .filter(logResponse()) + .build(); + } + + + @Bean + public WebClient webClientTimeout_1500() { + + HttpClient httpClient = HttpClient.create() + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1500); + + return WebClient.builder() + .clientConnector(new ReactorClientHttpConnector(httpClient)) + .filter(logRequest()) + .filter(logResponse()) + + .build(); + } + + @Bean + public WebClient webClientTimeout_3000() { + + HttpClient httpClient = HttpClient.create() + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000); + + return WebClient.builder() + .clientConnector(new ReactorClientHttpConnector(httpClient)) + .filter(logRequest()) + .filter(logResponse()) + + .build(); + } + + @Bean + public WebClient secureTls12WebClient() throws SSLException { + + // TLS 1.2 강제 + SslContext sslContext = SslContextBuilder.forClient() + .protocols("TLSv1.2") + .build(); + + // Timeout 적용 (Spring Boot 3.0.0 호환 방식) + TcpClient tcpClient = TcpClient.create() + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000) // 연결 timeout (5초) + .doOnConnected(conn -> conn + .addHandlerLast(new ReadTimeoutHandler(10)) // 읽기 timeout 10초 + .addHandlerLast(new WriteTimeoutHandler(10)) // 쓰기 timeout 10초 + ) + .secure(ssl -> ssl.sslContext(sslContext)); + + HttpClient httpClient = HttpClient.from(tcpClient); + + return WebClient.builder() + .clientConnector(new ReactorClientHttpConnector(httpClient)) + .defaultHeader("Content-Type", "application/json") + .defaultHeader("Accept", "application/json") + .defaultHeader("Accept-Charset", "utf-8") + .defaultHeader("User-Agent", "PostmanRuntime/7.28.4") + .filter(logRequest2()) + .filter(logResponse2()) + .build(); + } + + @Bean + public WebClient webClientOpenSslFull() throws SSLException { + SslContext sslContext = SslContextBuilder.forClient() + .sslProvider(SslProvider.OPENSSL) + .protocols("TLSv1.3", "TLSv1.2") + .build(); + + TcpClient tcpClient = TcpClient.create() + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000) + .doOnConnected(conn -> conn.addHandlerLast(new ReadTimeoutHandler(10))) + .secure(spec -> spec.sslContext(sslContext)); + + HttpClient httpClient = HttpClient.from(tcpClient); + + return WebClient.builder() + .clientConnector(new ReactorClientHttpConnector(httpClient)) + .defaultHeader("User-Agent", "PostmanRuntime/7.28.4") + .defaultHeader("Content-Type", "application/json") + .filter(logRequest2()) + .filter(logResponse2()) + .build(); + } + + @Bean + public WebClient insecureTrustAllWebClient() throws SSLException { + + // Netty용 SSLContext 생성 (Trust 모든 인증서) + SslContext sslContext = SslContextBuilder.forClient() + .trustManager(InsecureTrustManagerFactory.INSTANCE) + .protocols("TLSv1.2") + .build(); + + HttpClient httpClient = HttpClient.create() + .secure(spec -> spec.sslContext(sslContext)) + .responseTimeout(Duration.ofSeconds(10)) + .option(io.netty.channel.ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000); + + return WebClient.builder() + .clientConnector(new ReactorClientHttpConnector(httpClient)) + .build(); + } + + @Bean + public WebClient insecureJdkTlsWebClient() throws SSLException { + + // JDK SSLContext 사용, 인증서 검증 무시 + SslContext sslContext = SslContextBuilder.forClient() + .sslProvider(SslProvider.JDK) // JDK SSLContext 사용 강제 + .trustManager(InsecureTrustManagerFactory.INSTANCE) // 인증서 무시 + .protocols("TLSv1.2") // TLS 1.2 강제 + .build(); + + HttpClient httpClient = HttpClient.create() + .secure(spec -> spec.sslContext(sslContext)) + .responseTimeout(Duration.ofSeconds(10)) + .option(io.netty.channel.ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000); + + return WebClient.builder() + .clientConnector(new ReactorClientHttpConnector(httpClient)) + .build(); + } + + /** Request 로깅 **/ + private ExchangeFilterFunction logRequest2() { + return ExchangeFilterFunction.ofRequestProcessor(request -> { + System.out.println("### WebClient Request: " + request.method() + " " + request.url()); + return reactor.core.publisher.Mono.just(request); + }); + } + + /** Response 로깅 **/ + private ExchangeFilterFunction logResponse2() { + return ExchangeFilterFunction.ofResponseProcessor(response -> { + System.out.println("### WebClient Response Status: " + response.statusCode()); + return reactor.core.publisher.Mono.just(response); + }); + } + + private ExchangeFilterFunction logRequest() { + return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> { + // log.info("Request: {} {}", clientRequest.method(), clientRequest.url()); + // clientRequest.headers().forEach((name, values) -> values.forEach(value -> log.info("{}={}", name, value))); + return Mono.just(clientRequest); + }); + } + + private ExchangeFilterFunction logResponse() { + return ExchangeFilterFunction.ofResponseProcessor(clientResponse -> { + // log.info("Response Status: {}", clientResponse.statusCode()); + // clientResponse.headers().asHttpHeaders().forEach((name, values) -> values.forEach(value -> log.info("{}={}", name, value))); + return Mono.just(clientResponse); + }); + } +} \ No newline at end of file diff --git a/src/main/java/com/bb/config/WebSocketConfig.java b/src/main/java/com/bb/config/WebSocketConfig.java new file mode 100644 index 0000000..fbe8885 --- /dev/null +++ b/src/main/java/com/bb/config/WebSocketConfig.java @@ -0,0 +1,29 @@ +package com.bb.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.simp.config.ChannelRegistration; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; + +@Configuration +@EnableWebSocketMessageBroker +public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { + + @Override + public void configureMessageBroker(MessageBrokerRegistry config) { + config.enableSimpleBroker("/topic"); + config.setApplicationDestinationPrefixes("/app"); + } + + @Override + public void registerStompEndpoints(StompEndpointRegistry registry) { + registry.addEndpoint("/websocket").setAllowedOriginPatterns("*").withSockJS(); + } + + @Override + public void configureClientInboundChannel(ChannelRegistration registration) { + registration.interceptors(new WebSocketInterceptor()); + } +} \ No newline at end of file diff --git a/src/main/java/com/bb/config/WebSocketInterceptor.java b/src/main/java/com/bb/config/WebSocketInterceptor.java new file mode 100644 index 0000000..23e6160 --- /dev/null +++ b/src/main/java/com/bb/config/WebSocketInterceptor.java @@ -0,0 +1,32 @@ +package com.bb.config; + +import java.util.HashSet; +import java.util.Set; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.messaging.Message; +import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.support.ChannelInterceptor; +import org.springframework.stereotype.Component; + +@Component +public class WebSocketInterceptor implements ChannelInterceptor { + + private final Set sessionSet = new HashSet<>(); + + @Override + public Message preSend(Message message, MessageChannel channel) { + String simpMessageType = String.valueOf(message.getHeaders().get("simpMessageType")); + if (StringUtils.equals(simpMessageType, "CONNECT")) { + String simpSessionId = String.valueOf(message.getHeaders().get("simpSessionId")); + sessionSet.add(simpSessionId); + } else if (StringUtils.equals(simpMessageType, "DISCONNECT")) { + String simpSessionId = String.valueOf(message.getHeaders().get("simpSessionId")); + sessionSet.remove(simpSessionId); + } + + int uniqueJoinSessionCount = sessionSet.size(); + // System.out.println("connectCnt: " + uniqueJoinSessionCount); + return message; + } +} \ No newline at end of file diff --git a/src/main/java/com/bb/controller/CallbackPassimController.java b/src/main/java/com/bb/controller/CallbackPassimController.java new file mode 100644 index 0000000..82378d6 --- /dev/null +++ b/src/main/java/com/bb/controller/CallbackPassimController.java @@ -0,0 +1,35 @@ +package com.bb.controller; + +import org.springframework.http.ResponseEntity; +import org.springframework.scheduling.annotation.EnableScheduling; +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.RestController; + +import com.bb.model.PassimVo; +import com.bb.service.PassimService; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@EnableScheduling +@RequiredArgsConstructor +@RestController +@RequestMapping(value = "/passim") +public class CallbackPassimController { + + private final PassimService passimService; + + @PostMapping(value="/notification") + public ResponseEntity notificationWebHook(HttpServletRequest request, @RequestBody PassimVo webhook) { + + // 멱등 처리: txHash 기준 + + // TODO: 비즈니스 처리 (포인트 충전 등) + + return ResponseEntity.ok("OK"); + } +} diff --git a/src/main/java/com/bb/controller/CallbackRvHoldemController.java b/src/main/java/com/bb/controller/CallbackRvHoldemController.java new file mode 100644 index 0000000..21de356 --- /dev/null +++ b/src/main/java/com/bb/controller/CallbackRvHoldemController.java @@ -0,0 +1,443 @@ +package com.bb.controller; + +import java.util.HashMap; + +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.scheduling.annotation.EnableScheduling; +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.RestController; + +import com.bb.model.Member; +import com.bb.model.RvHoldemResponse; +import com.bb.model.RvHoldemVO; +import com.bb.service.AsyncBetService; +import com.bb.service.BetService; +import com.bb.service.UserService; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.sf.json.JSONObject; + +@Slf4j +@EnableScheduling +@RequiredArgsConstructor +@RestController +@RequestMapping(value = "/excb/rvholdem") +public class CallbackRvHoldemController { + + private final UserService userService; + + private final BetService betService; + + private final AsyncBetService asyncService; + + /** + * APICode + * FAILED = 0, + * INVALID_ARGUMENT = -4, + * UNKNOWN_ERROR = -3, + * INVALID_PK = -2, + * UNAUTH = -1, + * SUCCESS = 1 + */ + + @PostMapping(value="/ping") + public ResponseEntity ping(HttpServletRequest request) throws Exception { + RvHoldemResponse response = new RvHoldemResponse(); + response.setCode(1); + HttpStatus httpStatus = HttpStatus.OK; + + return new ResponseEntity(response, httpStatus); + } + + @PostMapping(value="/user/balance") + public ResponseEntity userBalance(HttpServletRequest request, @RequestBody JSONObject requestBody) { + RvHoldemResponse response = new RvHoldemResponse(); + HttpStatus httpStatus = HttpStatus.OK; + + String apiKey = request.getHeader("apikey").toString(); + String uid = requestBody.getString("uid"); + String cbUid = requestBody.getString("cb_uid"); + + int siteIdx = Integer.parseInt(uid.substring(0, 3), 16); + String memberId = uid.substring(3, uid.length()); + final String LOG_PREFIX = "#-CB::RV_HOLDEM::"+uid+"::"+cbUid+"::userBalance:::"; + log.info(LOG_PREFIX+ "Request Body : " + requestBody.toString()); + + HashMap checkInfo = userService.getRvHoldemCheckInfo(uid); + if(checkInfo == null) { + log.error(LOG_PREFIX + "UNAUTH::NOT_FOUND_USER"); + response.setCode(-1); + return new ResponseEntity(response, httpStatus); + } + + if(!checkInfo.get("apiKey").toString().equals(apiKey)) { + log.error(LOG_PREFIX + "UNAUTH::INVALID_APIKEY"); + response.setCode(-1); + return new ResponseEntity(response, httpStatus); + } + + Member memInfo = new Member(); + memInfo.setSiteIdx(siteIdx); + memInfo.setMemId(memberId); + int balance = betService.getCurBalance(memInfo); + + response.setCode(1); + response.setPayload(balance); + + return new ResponseEntity(response, httpStatus); + } + + @PostMapping(value="/game/buyin") + public ResponseEntity gameBuyIn(HttpServletRequest request, @RequestBody JSONObject requestBody) { + RvHoldemResponse response = new RvHoldemResponse(); + HttpStatus httpStatus = HttpStatus.OK; + + String apiKey = request.getHeader("apikey").toString(); + String uid = requestBody.getString("uid"); + String cbUid = requestBody.getString("cb_uid"); + + int siteIdx = Integer.parseInt(uid.substring(0, 3), 16); + String memberId = uid.substring(3, uid.length()); + final String LOG_PREFIX = "#-CB::RV_HOLDEM::"+uid+"::"+cbUid+"::gameBuyIn:::"; + log.info(LOG_PREFIX+ "Request Body : " + requestBody.toString()); + + HashMap checkInfo = userService.getRvHoldemCheckInfo(uid); + if(checkInfo == null) { + log.error(LOG_PREFIX + "UNAUTH::NOT_FOUND_USER"); + response.setCode(-1); + return new ResponseEntity(response, httpStatus); + } + + if(!checkInfo.get("apiKey").toString().equals(apiKey)) { + log.error(LOG_PREFIX + "UNAUTH::INVALID_APIKEY"); + response.setCode(-1); + return new ResponseEntity(response, httpStatus); + } + + Member memInfo = new Member(); + memInfo.setSiteIdx(siteIdx); + memInfo.setMemId(memberId); + HashMap memberVo = userService.getMemberMap(memInfo); + + // Insert rvholdem_callback_log + RvHoldemVO rvParam = RvHoldemVO.fromJSONObject(LOG_PREFIX, requestBody); + rvParam.setSiteId(memberVo.get("siteId").toString()); + rvParam.setMemId(memberId); + rvParam.setCallbackType("buyin"); + log.info(LOG_PREFIX+ "rvParam : " + rvParam.toString()); + + int balance = Integer.parseInt(memberVo.get("cashAmt").toString()); + int amount = rvParam.getAmount(); + rvParam.setBfBalance(balance); + rvParam.setAfBalance(balance+amount); + + int cbIdx = 0; + try { + cbIdx = betService.insertRvhCallbackLog(rvParam); + } catch(DataIntegrityViolationException de) { + log.error(LOG_PREFIX + "Duplicate cb_uid!!! " + de.getMessage(), de); + response.setCode(-2); + return new ResponseEntity(response, httpStatus); + } + + if(cbIdx > 0) { + HashMap balanceParam = new HashMap(); + balanceParam.put("siteIdx", memInfo.getSiteIdx()); + balanceParam.put("memId", memInfo.getMemId()); + balanceParam.put("cashAmt", Integer.toString(amount)); + balanceParam.put("changeFlag", "N"); + long chs4 = System.currentTimeMillis(); + int memCashResult = betService.updateUserCashByAmountNew(balanceParam); + long che4 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff4 = (chs4 - che4)/1000.0; //두 시간에 차 계산 + log.info(LOG_PREFIX+ "updateUserCashByAmountNew() : " + String.format("%.3f", diff4)); + if(diff4 < -1.0) log.error(LOG_PREFIX+ "updateUserCashByAmountNew() : " + String.format("%.3f", diff4)); + + asyncService.cashProc(LOG_PREFIX, rvParam); + } else { + log.error(LOG_PREFIX + "INSERT_CALLBACK_LOG_FAIL"); + response.setCode(-3); + return new ResponseEntity(response, httpStatus); + } + + response.setCode(1); + response.setPayload(balance+amount); + + return new ResponseEntity(response, httpStatus); + } + + @PostMapping(value="/game/rebuyin") + public ResponseEntity gameReBuyIn(HttpServletRequest request, @RequestBody JSONObject requestBody) { + RvHoldemResponse response = new RvHoldemResponse(); + HttpStatus httpStatus = HttpStatus.OK; + + String apiKey = request.getHeader("apikey").toString(); + String uid = requestBody.getString("uid"); + String cbUid = requestBody.getString("cb_uid"); + + int siteIdx = Integer.parseInt(uid.substring(0, 3), 16); + String memberId = uid.substring(3, uid.length()); + final String LOG_PREFIX = "#-CB::RV_HOLDEM::"+uid+"::"+cbUid+"::gameReBuyIn:::"; + log.info(LOG_PREFIX+ "Request Body : " + requestBody.toString()); + + HashMap checkInfo = userService.getRvHoldemCheckInfo(uid); + if(checkInfo == null) { + log.error(LOG_PREFIX + "UNAUTH::NOT_FOUND_USER"); + response.setCode(-1); + return new ResponseEntity(response, httpStatus); + } + + if(!checkInfo.get("apiKey").toString().equals(apiKey)) { + log.error(LOG_PREFIX + "UNAUTH::INVALID_APIKEY"); + response.setCode(-1); + return new ResponseEntity(response, httpStatus); + } + + Member memInfo = new Member(); + memInfo.setSiteIdx(siteIdx); + memInfo.setMemId(memberId); + HashMap memberVo = userService.getMemberMap(memInfo); + + // Insert rvholdem_callback_log + RvHoldemVO rvParam = RvHoldemVO.fromJSONObject(LOG_PREFIX, requestBody); + rvParam.setSiteId(memberVo.get("siteId").toString()); + rvParam.setMemId(memberId); + rvParam.setCallbackType("rebuyin"); + log.info(LOG_PREFIX+ "rvParam : " + rvParam.toString()); + + int balance = Integer.parseInt(memberVo.get("cashAmt").toString()); + int amount = rvParam.getAmount(); + rvParam.setBfBalance(balance); + rvParam.setAfBalance(balance+amount); + + int cbIdx = 0; + try { + cbIdx = betService.insertRvhCallbackLog(rvParam); + } catch(DataIntegrityViolationException de) { + log.error(LOG_PREFIX + "Duplicate cb_uid!!! " + de.getMessage(), de); + response.setCode(-2); + return new ResponseEntity(response, httpStatus); + } + + if(cbIdx > 0) { + HashMap balanceParam = new HashMap(); + balanceParam.put("siteIdx", memInfo.getSiteIdx()); + balanceParam.put("memId", memInfo.getMemId()); + balanceParam.put("cashAmt", Integer.toString(amount)); + balanceParam.put("changeFlag", "N"); + long chs4 = System.currentTimeMillis(); + int memCashResult = betService.updateUserCashByAmountNew(balanceParam); + long che4 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff4 = (chs4 - che4)/1000.0; //두 시간에 차 계산 + log.info(LOG_PREFIX+ "updateUserCashByAmountNew() : " + String.format("%.3f", diff4)); + if(diff4 < -1.0) log.error(LOG_PREFIX+ "updateUserCashByAmountNew() : " + String.format("%.3f", diff4)); + + asyncService.cashProc(LOG_PREFIX, rvParam); + } else { + log.error(LOG_PREFIX + "INSERT_CALLBACK_LOG_FAIL"); + response.setCode(-3); + return new ResponseEntity(response, httpStatus); + } + + response.setCode(1); + response.setPayload(balance+amount); + + return new ResponseEntity(response, httpStatus); + } + + @PostMapping(value="/game/win") + public ResponseEntity gameWin(HttpServletRequest request, @RequestBody JSONObject requestBody) { + RvHoldemResponse response = new RvHoldemResponse(); + HttpStatus httpStatus = HttpStatus.OK; + + String apiKey = request.getHeader("apikey").toString(); + String uid = requestBody.getString("uid"); + String cbUid = requestBody.getString("cb_uid"); + + int siteIdx = Integer.parseInt(uid.substring(0, 3), 16); + String memberId = uid.substring(3, uid.length()); + final String LOG_PREFIX = "#-CB::RV_HOLDEM::"+uid+"::"+cbUid+"::gameWin:::"; + log.info(LOG_PREFIX+ "Request Body : " + requestBody.toString()); + + HashMap checkInfo = userService.getRvHoldemCheckInfo(uid); + if(checkInfo == null) { + log.error(LOG_PREFIX + "UNAUTH::NOT_FOUND_USER"); + response.setCode(-1); + return new ResponseEntity(response, httpStatus); + } + + if(!checkInfo.get("apiKey").toString().equals(apiKey)) { + log.error(LOG_PREFIX + "UNAUTH::INVALID_APIKEY"); + response.setCode(-1); + return new ResponseEntity(response, httpStatus); + } + + Member memInfo = new Member(); + memInfo.setSiteIdx(siteIdx); + memInfo.setMemId(memberId); + HashMap memberVo = userService.getMemberMap(memInfo); + + // Insert rvholdem_callback_log + RvHoldemVO rvParam = RvHoldemVO.fromJSONObject(LOG_PREFIX, requestBody); + rvParam.setSiteId(memberVo.get("siteId").toString()); + rvParam.setMemId(memberId); + rvParam.setCallbackType("win"); + log.info(LOG_PREFIX+ "rvParam : " + rvParam.toString()); + + int balance = Integer.parseInt(memberVo.get("cashAmt").toString()); + int amount = rvParam.getAmount(); + rvParam.setBfBalance(balance); + rvParam.setAfBalance(balance+amount); + + int cbIdx = 0; + try { + cbIdx = betService.insertRvhCallbackLog(rvParam); + } catch(DataIntegrityViolationException de) { + log.error(LOG_PREFIX + "Duplicate cb_uid!!! " + de.getMessage(), de); + response.setCode(-2); + return new ResponseEntity(response, httpStatus); + } + + if(cbIdx > 0) { + HashMap balanceParam = new HashMap(); + balanceParam.put("siteIdx", memInfo.getSiteIdx()); + balanceParam.put("memId", memInfo.getMemId()); + balanceParam.put("cashAmt", Integer.toString(amount)); + balanceParam.put("changeFlag", "N"); + long chs4 = System.currentTimeMillis(); + int memCashResult = betService.updateUserCashByAmountNew(balanceParam); + long che4 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff4 = (chs4 - che4)/1000.0; //두 시간에 차 계산 + log.info(LOG_PREFIX+ "updateUserCashByAmountNew() : " + String.format("%.3f", diff4)); + if(diff4 < -1.0) log.error(LOG_PREFIX+ "updateUserCashByAmountNew() : " + String.format("%.3f", diff4)); + + asyncService.cashProc(LOG_PREFIX, rvParam); + } else { + log.error(LOG_PREFIX + "INSERT_CALLBACK_LOG_FAIL"); + response.setCode(-3); + return new ResponseEntity(response, httpStatus); + } + + response.setCode(1); + response.setPayload(balance+amount); + + return new ResponseEntity(response, httpStatus); + } + + @PostMapping(value="/game/leave") + public ResponseEntity gameLeave(HttpServletRequest request, @RequestBody JSONObject requestBody) throws Exception { + RvHoldemResponse response = new RvHoldemResponse(); + HttpStatus httpStatus = HttpStatus.OK; + + String apiKey = request.getHeader("apikey").toString(); + String uid = requestBody.getString("uid"); + String cbUid = requestBody.getString("cb_uid"); + + int siteIdx = Integer.parseInt(uid.substring(0, 3), 16); + String memberId = uid.substring(3, uid.length()); + final String LOG_PREFIX = "#-CB::RV_HOLDEM::"+uid+"::"+cbUid+"::gameLeave:::"; + log.info(LOG_PREFIX+ "Request Body : " + requestBody.toString()); + + HashMap checkInfo = userService.getRvHoldemCheckInfo(uid); + if(checkInfo == null) { + log.error(LOG_PREFIX + "UNAUTH::NOT_FOUND_USER"); + response.setCode(-1); + return new ResponseEntity(response, httpStatus); + } + + if(!checkInfo.get("apiKey").toString().equals(apiKey)) { + log.error(LOG_PREFIX + "UNAUTH::INVALID_APIKEY"); + response.setCode(-1); + return new ResponseEntity(response, httpStatus); + } + + Member memInfo = new Member(); + memInfo.setSiteIdx(siteIdx); + memInfo.setMemId(memberId); + HashMap memberVo = userService.getMemberMap(memInfo); + + // Insert rvholdem_callback_log + RvHoldemVO rvParam = RvHoldemVO.fromJSONObject(LOG_PREFIX, requestBody); + rvParam.setSiteId(memberVo.get("siteId").toString()); + rvParam.setMemId(memberId); + rvParam.setCallbackType("leave"); + log.info(LOG_PREFIX+ "rvParam : " + rvParam.toString()); + + int balance = Integer.parseInt(memberVo.get("cashAmt").toString()); + int amount = rvParam.getAmount(); + rvParam.setBfBalance(balance); + rvParam.setAfBalance(balance+amount); + + int cbIdx = 0; + try { + cbIdx = betService.insertRvhCallbackLog(rvParam); + } catch(DataIntegrityViolationException de) { + log.error(LOG_PREFIX + "Duplicate cb_uid!!! " + de.getMessage(), de); + response.setCode(-2); + return new ResponseEntity(response, httpStatus); + } + + if(cbIdx > 0) { + HashMap balanceParam = new HashMap(); + balanceParam.put("siteIdx", memInfo.getSiteIdx()); + balanceParam.put("memId", memInfo.getMemId()); + balanceParam.put("cashAmt", Integer.toString(amount)); + balanceParam.put("changeFlag", "N"); + long chs4 = System.currentTimeMillis(); + int memCashResult = betService.updateUserCashByAmountNew(balanceParam); + long che4 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff4 = (chs4 - che4)/1000.0; //두 시간에 차 계산 + log.info(LOG_PREFIX+ "updateUserCashByAmountNew() : " + String.format("%.3f", diff4)); + if(diff4 < -1.0) log.error(LOG_PREFIX+ "updateUserCashByAmountNew() : " + String.format("%.3f", diff4)); + + asyncService.cashProc(LOG_PREFIX, rvParam); + } else { + log.error(LOG_PREFIX + "INSERT_CALLBACK_LOG_FAIL"); + response.setCode(-3); + return new ResponseEntity(response, httpStatus); + } + + response.setCode(1); + response.setPayload(balance+amount); + + return new ResponseEntity(response, httpStatus); + } + + @PostMapping(value="/game/result") + public ResponseEntity gameResult(HttpServletRequest request, @RequestBody JSONObject requestBody) throws Exception { + RvHoldemResponse response = new RvHoldemResponse(); + HttpStatus httpStatus = HttpStatus.OK; + + String apiKey = request.getHeader("apikey").toString(); + String uid = requestBody.getString("uid"); + String cbUid = requestBody.getString("cb_uid"); + + int siteIdx = Integer.parseInt(uid.substring(0, 3), 16); + String memberId = uid.substring(3, uid.length()); + final String LOG_PREFIX = "#-CB::RV_HOLDEM::"+uid+"::"+cbUid+"::gameResult:::"; + log.info(LOG_PREFIX+ "Request Body : " + requestBody.toString()); + + HashMap checkInfo = userService.getRvHoldemCheckInfo(uid); + if(checkInfo == null) { + log.error(LOG_PREFIX + "UNAUTH::NOT_FOUND_USER"); + response.setCode(-1); + return new ResponseEntity(response, httpStatus); + } + + if(!checkInfo.get("apiKey").toString().equals(apiKey)) { + log.error(LOG_PREFIX + "UNAUTH::INVALID_APIKEY"); + response.setCode(-1); + return new ResponseEntity(response, httpStatus); + } + + response.setCode(1); + + return new ResponseEntity(response, httpStatus); + } +} diff --git a/src/main/java/com/bb/controller/CallbackTripleController.java b/src/main/java/com/bb/controller/CallbackTripleController.java new file mode 100644 index 0000000..4d9d1b9 --- /dev/null +++ b/src/main/java/com/bb/controller/CallbackTripleController.java @@ -0,0 +1,997 @@ +package com.bb.controller; + +import java.text.SimpleDateFormat; +import java.util.HashMap; + +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.scheduling.annotation.EnableScheduling; +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.RestController; + +import com.bb.model.Member; +import com.bb.model.TripleResponse; +import com.bb.model.TripleVO; +import com.bb.service.AsyncBetService; +import com.bb.service.BetService; +import com.bb.service.SportService; +import com.bb.service.UserService; +import com.google.gson.Gson; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.sf.json.JSONObject; + +@Slf4j +@EnableScheduling +@RequiredArgsConstructor +@RestController +@RequestMapping(value = "/triple") +public class CallbackTripleController { + + private final UserService userService; + + private final BetService betService; + + private final SportService sportService; + + private final AsyncBetService asyncService; + + + @PostMapping(value="/balance") + public ResponseEntity balance(HttpServletRequest request, @RequestBody JSONObject requestBody) throws Exception { + long startTime = System.currentTimeMillis(); + TripleResponse response = new TripleResponse(); + HttpStatus httpStatus = null; + String tripleUserId = requestBody.getString("userId"); + int siteIdx = Integer.parseInt(tripleUserId.substring(0, 3), 16); + String memberId = tripleUserId.substring(3, tripleUserId.length()); + final String LOG_PREFIX = "#-CB::TRIPLE::balance::"+requestBody.getString("userId")+"::"+requestBody.getString("requestAt")+":::"; + log.info(LOG_PREFIX+ "Request Body : " + requestBody.toString()); + + try { + Member memInfo = new Member(); + memInfo.setSiteIdx(siteIdx); + memInfo.setMemId(memberId); + int balance = betService.getCurBalance(memInfo); + response.setResult_code(0); + response.setBalance(balance); + httpStatus = HttpStatus.OK; + + } catch(Exception e) { + response.setResult_code(9999); + response.setError_msg("UNKNOWN_ERROR"); + httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; + log.error(LOG_PREFIX+ "Exception : "+e.getMessage()); + } + + log.info(LOG_PREFIX+ "Response Data : " + response.toString()); + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -2.0) { + log.error(LOG_PREFIX+ "[### balance diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + + return new ResponseEntity(response, httpStatus); + } + + + @PostMapping(value="/changebalance") + public ResponseEntity changeBalance(HttpServletRequest request, @RequestBody JSONObject transaction) throws Exception { + long startTime = System.currentTimeMillis(); + ResponseEntity resEntity = null; + HttpStatus httpStatus = null; + String tripleUserId = transaction.getString("userId"); + int siteIdx = Integer.parseInt(tripleUserId.substring(0, 3), 16); + String memberId = tripleUserId.substring(3, tripleUserId.length()); + final String LOG_PREFIX = "#-CB::TRIPLE::changeBalance::"+transaction.getString("userId")+"::"+transaction.getString("tranId")+":::"; + log.info(LOG_PREFIX+ "Request Body : " + transaction.toString()); + + try { + String transactionType = transaction.getString("tranType"); + int isCancel = transaction.getInt("isCancel"); + int isBonus = transaction.getInt("isBonus"); + + Member memInfo = new Member(); + memInfo.setSiteIdx(siteIdx); + memInfo.setMemId(memberId); + + if(!transaction.has("requestAt") || transaction.getString("requestAt").equals("")) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + long nDate = System.currentTimeMillis(); + String nDateStr = sdf.format(nDate); + transaction.put("requestAt", nDateStr); + } + + int vendorIdx = transaction.getInt("vendorIdx"); + if(vendorIdx == 83 || vendorIdx == 84) { + // 스포츠 배팅 + TripleVO tripleVO = new Gson().fromJson(transaction.toString(), TripleVO.class); + net.sf.json.JSONObject responseObj = sportService.betProc(memInfo, tripleVO); + TripleResponse response = new Gson().fromJson(responseObj.toString(), TripleResponse.class); + if(responseObj.getString("result_code").equals("0") || + responseObj.getString("result_code").equals("70") || + responseObj.getString("result_code").equals("80") || + responseObj.getString("result_code").equals("98") || + responseObj.getString("result_code").equals("99") || + responseObj.getString("result_code").equals("44") || + responseObj.getString("result_code").equals("1005") || + responseObj.getString("result_code").equals("3333") ) { + + // 0 70 80 98 99 + httpStatus = HttpStatus.OK; + } else { + httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; + } + resEntity = new ResponseEntity(response, httpStatus); + } else { + if(transactionType.equals("debit") && isCancel == 0) { + log.info(LOG_PREFIX+ "callBet() ================="); + resEntity = callBet(LOG_PREFIX, memInfo, transaction); + + } else if(transactionType.equals("credit") && isCancel == 0 && isBonus == 0) { + log.info(LOG_PREFIX+ "callWin() ================="); + resEntity = callWin(LOG_PREFIX, memInfo, transaction); + + } else if(transactionType.equals("credit") && isCancel == 1) { + log.info(LOG_PREFIX+ "callCancel() ================="); + resEntity = callCancel(LOG_PREFIX, memInfo, transaction); + + } else if(transactionType.equals("credit") && isBonus == 1) { + log.info(LOG_PREFIX+ "callBonus() ================="); + resEntity = callBonus(LOG_PREFIX, memInfo, transaction); + + } else if(transactionType.equals("adjust")) { + // 해당 타입은 "조정" 이라는 의미로, 해당 내역은 이미 처리된 내역에 대한 조정을 의미합니다. + // amount 값은 + (재지급), - (오지급 회수)가 될 수 있습니다. + log.info(LOG_PREFIX+ "callAdjust() ================="); + resEntity = callAdjust(LOG_PREFIX, memInfo, transaction); + + } else if(transactionType.equals("tip")) { + log.info(LOG_PREFIX+ "callTip() ================="); + resEntity = callTip(LOG_PREFIX, memInfo, transaction); + + } else if(transactionType.equals("credit_wait")) { + log.info(LOG_PREFIX+ "callCreditWait() ================="); + int balance = betService.getCurBalance(memInfo); + TripleResponse response = new TripleResponse(); + response.setResult_code(0); + response.setBalance(balance); + httpStatus = HttpStatus.OK; + resEntity = new ResponseEntity(response, httpStatus); + + } else { + log.error(LOG_PREFIX+ "unknown_transaction_type"); + TripleResponse response = new TripleResponse(); + response.setResult_code(8888); + response.setError_msg("UNKNOWN_TRAN_TYPE"); + httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; + resEntity = new ResponseEntity(response, httpStatus); + + } + } + + } catch(Exception e) { + log.error(LOG_PREFIX+ "Exception : "+e.getMessage()); + TripleResponse response = new TripleResponse(); + response.setResult_code(9999); + response.setError_msg("UNKNOWN_ERROR"); + httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; + resEntity = new ResponseEntity(response, httpStatus); + } + + log.info(LOG_PREFIX+ "Response Data : " + resEntity.toString()); + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -2.0) { + log.error(LOG_PREFIX+ "[### balance diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + + return resEntity; + } + + + @PostMapping(value="/changebalance/slot") + public ResponseEntity changeBalanceSlot(HttpServletRequest request, @RequestBody JSONObject transaction) throws Exception { + long startTime = System.currentTimeMillis(); + ResponseEntity resEntity = null; + HttpStatus httpStatus = null; + String tripleUserId = transaction.getString("userId"); + int siteIdx = Integer.parseInt(tripleUserId.substring(0, 3), 16); + String memberId = tripleUserId.substring(3, tripleUserId.length()); + final String LOG_PREFIX = "#-CB::TRIPLE::changeBalanceSlot::"+transaction.getString("userId")+"::"+transaction.getString("tranId")+":::"; + log.info(LOG_PREFIX+ "Request Body : " + transaction.toString()); + + try { + String transactionType = transaction.getString("tranType"); + int isCancel = transaction.getInt("isCancel"); + int isBonus = transaction.getInt("isBonus"); + + Member memInfo = new Member(); + memInfo.setSiteIdx(siteIdx); + memInfo.setMemId(memberId); + + if(!transaction.has("requestAt") || transaction.getString("requestAt").equals("")) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + long nDate = System.currentTimeMillis(); + String nDateStr = sdf.format(nDate); + transaction.put("requestAt", nDateStr); + } + + if(transactionType.equals("debit") && isCancel == 0) { + log.info(LOG_PREFIX+ "callBet() ================="); + resEntity = callBetSlot(LOG_PREFIX, memInfo, transaction); + + } else if(transactionType.equals("credit") && isCancel == 0 && isBonus == 0) { + log.info(LOG_PREFIX+ "callWin() ================="); + resEntity = callWinSlot(LOG_PREFIX, memInfo, transaction); + + } else if(transactionType.equals("credit") && isCancel == 1) { + log.info(LOG_PREFIX+ "callCancel() ================="); + resEntity = callCancel(LOG_PREFIX, memInfo, transaction); + + } else if(transactionType.equals("credit") && isBonus == 1) { + log.info(LOG_PREFIX+ "callBonus() ================="); + resEntity = callBonus(LOG_PREFIX, memInfo, transaction); + + } else if(transactionType.equals("adjust")) { + // 해당 타입은 "조정" 이라는 의미로, 해당 내역은 이미 처리된 내역에 대한 조정을 의미합니다. + // amount 값은 + (재지급), - (오지급 회수)가 될 수 있습니다. + log.info(LOG_PREFIX+ "callAdjust() ================="); + resEntity = callAdjust(LOG_PREFIX, memInfo, transaction); + + } else if(transactionType.equals("tip")) { + log.info(LOG_PREFIX+ "callTip() ================="); + resEntity = callTip(LOG_PREFIX, memInfo, transaction); + + } else if(transactionType.equals("credit_wait")) { + log.info(LOG_PREFIX+ "callCreditWait() ================="); + int balance = betService.getCurBalance(memInfo); + TripleResponse response = new TripleResponse(); + response.setResult_code(0); + response.setBalance(balance); + httpStatus = HttpStatus.OK; + resEntity = new ResponseEntity(response, httpStatus); + + } else { + log.error(LOG_PREFIX+ "unknown_transaction_type"); + TripleResponse response = new TripleResponse(); + response.setResult_code(8888); + response.setError_msg("UNKNOWN_TRAN_TYPE"); + httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; + resEntity = new ResponseEntity(response, httpStatus); + + } + + } catch(Exception e) { + log.error(LOG_PREFIX+ "Exception : "+e.getMessage()); + TripleResponse response = new TripleResponse(); + response.setResult_code(9999); + response.setError_msg("UNKNOWN_ERROR"); + httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; + resEntity = new ResponseEntity(response, httpStatus); + } + + log.info(LOG_PREFIX+ "Response Data : " + resEntity.toString()); + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -2.0) { + log.error(LOG_PREFIX+ "[### balance diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + + return resEntity; + } + + + private ResponseEntity callBet(String LOG_PREFIX, Member memInfo, JSONObject transaction) { + LOG_PREFIX = LOG_PREFIX + "BET:::"; + ResponseEntity resEntity = null; + TripleResponse response = new TripleResponse(); + + HashMap memberVo = userService.getMemberMap(memInfo); + if(memberVo == null) { + log.error(LOG_PREFIX+ "NOT_FOUND_USER"); + response.setResult_code(1111); + response.setError_msg("NOT_FOUND_USER"); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + if(memberVo.get("betYn").toString().equals("N") || memberVo.get("memLockYn").toString().equals("Y")) { + log.error(LOG_PREFIX+ "betYn : "+memberVo.get("betYn").toString()); + log.error(LOG_PREFIX+ "memLockYn : "+memberVo.get("memLockYn").toString()); + response.setResult_code(1005); + response.setError_msg("THIS_USER_BETTING_LOCK"); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + int balance = Integer.parseInt(memberVo.get("cashAmt").toString()); + int amount = transaction.getInt("debit"); + amount = Math.abs(amount) * -1; + if(balance < Math.abs(amount)) { + log.error(LOG_PREFIX+ "유저 잔액부족::balance::"+balance+"::amount::"+amount); + response.setResult_code(80); + response.setBalance(balance); + response.setError_msg("INSUFFICIENT_FUNDS"); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + String tranId = transaction.getString("tranId"); + String betId = transaction.getString("betId"); + String apiVendorCode = transaction.getString("vendorKey"); + String gameName = transaction.getString("gameKey"); + + HashMap vParam = new HashMap<>(); + vParam.put("siteId", memberVo.get("siteId").toString()); + vParam.put("apiCompCode", "triple"); + vParam.put("apiVendorCode", apiVendorCode); + vParam.put("memLevel", memberVo.get("memLevel").toString()); + HashMap siteVendorInfo = betService.getSiteVendorInfo(vParam); + if(siteVendorInfo == null) { + log.error(LOG_PREFIX+ "NOT_FOUND_VENDOR"); + response.setResult_code(70); + response.setError_msg("NOT_FOUND_VENDOR"); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + int maxBetAmt = Integer.parseInt(siteVendorInfo.get("betAmtMax").toString()); + if(maxBetAmt < Math.abs(amount)) { + log.error(LOG_PREFIX+ "MAX_BET_OVER"); + log.error(LOG_PREFIX+ "siteMaxBet : " + maxBetAmt +", amount : " + amount); + response.setResult_code(81); + response.setBalance(balance); + response.setError_msg("MAX_BET_OVER"); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + HashMap betData = new HashMap(); + betData.put("tranId", tranId); + betData.put("betId", betId); + betData.put("siteId", memberVo.get("siteId").toString()); + betData.put("memId", memberVo.get("memId").toString()); + betData.put("apiCompCode", "triple"); + betData.put("apiVendor", transaction.getString("vendor")); + betData.put("gameCategory", siteVendorInfo.get("gameCategory").toString()); + betData.put("vendorCode", siteVendorInfo.get("vendorCode").toString()); + betData.put("gameName", gameName); + betData.put("tranType", "DEBIT"); + betData.put("betAmt", Math.abs(amount)); + betData.put("betWinAmt", 0); + betData.put("balance", (balance+amount)); + betData.put("isBlankSpinYn", "N"); + betData.put("pointRegYn", "N"); + betData.put("regDate", transaction.getString("requestAt")); + betData.put("updDate", transaction.getString("requestAt")); + int betResult = 0; + try { + log.info(LOG_PREFIX+ "betData : "+betData.toString()); + betResult = betService.insertBetNew(betData); + log.info(LOG_PREFIX+ "insertBet result : "+betResult); + } catch(DataIntegrityViolationException de) { + log.error(LOG_PREFIX+ "Duplicate tranId!!!"); + response.setResult_code(98); + response.setBalance(balance); + response.setError_msg("BET_ALREADY_SETTLED"); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + if(betResult > 0) { + HashMap balanceParam = new HashMap(); + balanceParam.put("siteIdx", memInfo.getSiteIdx()); + balanceParam.put("memId", memInfo.getMemId()); + balanceParam.put("cashAmt", Integer.toString(amount)); + balanceParam.put("changeFlag", "N"); + long chs4 = System.currentTimeMillis(); + int memCashResult = betService.updateUserCashByAmountNew(balanceParam); + long che4 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff4 = (chs4 - che4)/1000.0; //두 시간에 차 계산 + log.info(LOG_PREFIX+ "updateUserCashByAmountNew() : " + String.format("%.3f", diff4)); + if(diff4 < -1.0) log.error(LOG_PREFIX+ "updateUserCashByAmountNew() : " + String.format("%.3f", diff4)); + + asyncService.rollingProc(LOG_PREFIX, betData); + + } else { + log.error(LOG_PREFIX+ "BET_FAIL"); + response.setResult_code(9999); + response.setError_msg("BET_FAIL"); + resEntity = new ResponseEntity(response, HttpStatus.INTERNAL_SERVER_ERROR); + return resEntity; + } + + log.info(LOG_PREFIX+ "beforeBalance : "+balance); + log.info(LOG_PREFIX+ "amount : "+amount); + log.info(LOG_PREFIX+ "responseBalance : "+(balance+amount)); + + response.setResult_code(0); + response.setBalance(balance+amount); + response.setError_msg(""); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + + private ResponseEntity callWin(String LOG_PREFIX, Member memInfo, JSONObject transaction) { + LOG_PREFIX = LOG_PREFIX + "WIN:::"; + ResponseEntity resEntity = null; + TripleResponse response = new TripleResponse(); + + String tranId = transaction.getString("tranId"); + String betId = transaction.getString("betId"); + + HashMap betData = betService.getReferenceData2(betId); + if(betData == null) { + log.error(LOG_PREFIX+ "NOT_FOUND_REF_DATA"); + response.setResult_code(99); + response.setError_msg("NOT_FOUND_REF_DATA"); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + int balance = betService.getCurBalance(memInfo); + int amount = transaction.getInt("credit"); + betData.put("tranId", tranId); + betData.put("betId", betId); + betData.put("tranType", "CREDIT"); + betData.put("betAmt", 0); + betData.put("betWinAmt", Math.abs(amount)); + betData.put("balance", (balance+amount)); + betData.put("updDate", transaction.getString("requestAt")); + int betResult = 0; + try { + log.info(LOG_PREFIX+ "betData : "+betData.toString()); + betResult = betService.insertBetNew(betData); + log.info(LOG_PREFIX+ "insertBet result : "+betResult); + } catch(DataIntegrityViolationException de) { + log.error(LOG_PREFIX+ "Duplicate tranId!!!"); + response.setResult_code(98); + response.setBalance(balance); + response.setError_msg("WIN_ALREADY_SETTLED"); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + if(betResult > 0) { + HashMap balanceParam = new HashMap(); + balanceParam.put("siteIdx", memInfo.getSiteIdx()); + balanceParam.put("memId", memInfo.getMemId()); + balanceParam.put("cashAmt", Integer.toString(amount)); + balanceParam.put("changeFlag", "N"); + long chs4 = System.currentTimeMillis(); + int memCashResult = betService.updateUserCashByAmountNew(balanceParam); + long che4 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff4 = (chs4 - che4)/1000.0; //두 시간에 차 계산 + log.info(LOG_PREFIX+ "updateUserCashByAmountNew() : " + String.format("%.3f", diff4)); + if(diff4 < -1.0) log.error(LOG_PREFIX+ "updateUserCashByAmountNew() : " + String.format("%.3f", diff4)); + + if(betData.get("gameCategory").toString().equals("casino")) { + // #-Rolling Tie Proc call + asyncService.rollingTieProc(LOG_PREFIX, betId); + } + else { + asyncService.losingResultProc(LOG_PREFIX, betData); + } + + //asyncService.losingResultProc(LOG_PREFIX, betData); + } else { + log.error(LOG_PREFIX+ "WIN_FAIL"); + response.setResult_code(9999); + response.setError_msg("WIN_FAIL"); + resEntity = new ResponseEntity(response, HttpStatus.INTERNAL_SERVER_ERROR); + return resEntity; + } + + log.info(LOG_PREFIX+ "beforeBalance : "+balance); + log.info(LOG_PREFIX+ "amount : "+amount); + log.info(LOG_PREFIX+ "responseBalance : "+(balance+amount)); + + response.setResult_code(0); + response.setBalance(balance+amount); + response.setError_msg(""); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + + private ResponseEntity callCancel(String LOG_PREFIX, Member memInfo, JSONObject transaction) { + LOG_PREFIX = LOG_PREFIX + "CANCEL:::"; + ResponseEntity resEntity = null; + TripleResponse response = new TripleResponse(); + + String tranId = transaction.getString("tranId"); + String betId = transaction.getString("betId"); + + HashMap betData = betService.getReferenceData1(betId); + if(betData == null) { + log.error(LOG_PREFIX+ "NOT_FOUND_REF_DATA"); + response.setResult_code(99); + response.setError_msg("NOT_FOUND_REF_DATA"); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + int betAmt = Integer.parseInt(betData.get("betAmt").toString()); + int balance = betService.getCurBalance(memInfo); + int amount = transaction.getInt("credit"); + + betData.put("tranId", tranId); + betData.put("betId", betId); + betData.put("tranType", "CANCEL"); + betData.put("betAmt", 0); + betData.put("betWinAmt", Math.abs(amount)); + betData.put("balance", (balance+amount)); + betData.put("isCancel", "Y"); + betData.put("updDate", transaction.getString("requestAt")); + int betResult = 0; + try { + log.info(LOG_PREFIX+ "betData : "+betData.toString()); + betResult = betService.insertBetNew(betData); + log.info(LOG_PREFIX+ "insertBet result : "+betResult); + } catch(DataIntegrityViolationException de) { + log.error(LOG_PREFIX+ "Duplicate tranId!!!"); + response.setResult_code(98); + response.setBalance(balance); + response.setError_msg("CANCEL_ALREADY_SETTLED"); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + if(betResult > 0) { + HashMap balanceParam = new HashMap(); + balanceParam.put("siteIdx", memInfo.getSiteIdx()); + balanceParam.put("memId", memInfo.getMemId()); + balanceParam.put("cashAmt", Integer.toString(amount)); + balanceParam.put("changeFlag", "N"); + long chs4 = System.currentTimeMillis(); + int memCashResult = betService.updateUserCashByAmountNew(balanceParam); + long che4 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff4 = (chs4 - che4)/1000.0; //두 시간에 차 계산 + log.info(LOG_PREFIX+ "updateUserCashByAmountNew() : " + String.format("%.3f", diff4)); + if(diff4 < -1.0) log.error(LOG_PREFIX+ "updateUserCashByAmountNew() : " + String.format("%.3f", diff4)); + + asyncService.rollingCancelProc(LOG_PREFIX, betAmt, betData); + + //asyncService.losingResultProc(LOG_PREFIX, betData); + + } else { + log.error(LOG_PREFIX+ "CANCEL_FAIL"); + response.setResult_code(9999); + response.setError_msg("CANCEL_FAIL"); + resEntity = new ResponseEntity(response, HttpStatus.INTERNAL_SERVER_ERROR); + return resEntity; + } + + log.info(LOG_PREFIX+ "beforeBalance : "+balance); + log.info(LOG_PREFIX+ "amount : "+amount); + log.info(LOG_PREFIX+ "responseBalance : "+(balance+amount)); + + response.setResult_code(0); + response.setBalance(balance+amount); + response.setError_msg(""); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + + private ResponseEntity callBetSlot(String LOG_PREFIX, Member memInfo, JSONObject transaction) { + LOG_PREFIX = LOG_PREFIX + "BET:::"; + ResponseEntity resEntity = null; + TripleResponse response = new TripleResponse(); + + HashMap memberVo = userService.getMemberMap(memInfo); + if(memberVo == null) { + log.error(LOG_PREFIX+ "NOT_FOUND_USER"); + response.setResult_code(1111); + response.setError_msg("NOT_FOUND_USER"); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + if(memberVo.get("betYn").toString().equals("N") || memberVo.get("memLockYn").toString().equals("Y")) { + log.error(LOG_PREFIX+ "betYn : "+memberVo.get("betYn").toString()); + log.error(LOG_PREFIX+ "memLockYn : "+memberVo.get("memLockYn").toString()); + response.setResult_code(1005); + response.setError_msg("THIS_USER_BETTING_LOCK"); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + int balance = Integer.parseInt(memberVo.get("cashAmt").toString()); + int amount = transaction.getInt("debit"); + amount = Math.abs(amount) * -1; + if(balance < Math.abs(amount)) { + log.error(LOG_PREFIX+ "유저 잔액부족::balance::"+balance+"::amount::"+amount); + response.setResult_code(80); + response.setBalance(balance); + response.setError_msg("INSUFFICIENT_FUNDS"); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + String tranId = transaction.getString("tranId"); + String betId = transaction.getString("betId"); + String apiVendorCode = transaction.getString("vendorKey"); + String gameName = transaction.getString("gameKey"); + + HashMap vParam = new HashMap<>(); + vParam.put("siteId", memberVo.get("siteId").toString()); + vParam.put("apiCompCode", "triple"); + vParam.put("apiVendorCode", apiVendorCode); + vParam.put("memLevel", memberVo.get("memLevel").toString()); + HashMap siteVendorInfo = betService.getSiteVendorInfo(vParam); + if(siteVendorInfo == null) { + log.error(LOG_PREFIX+ "NOT_FOUND_VENDOR"); + response.setResult_code(70); + response.setError_msg("NOT_FOUND_VENDOR"); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + int maxBetAmt = Integer.parseInt(siteVendorInfo.get("betAmtMaxSlot").toString()); + if(maxBetAmt < Math.abs(amount)) { + log.error(LOG_PREFIX+ "MAX_BET_OVER"); + log.error(LOG_PREFIX+ "siteMaxBet : " + maxBetAmt +", amount : " + amount); + response.setResult_code(81); + response.setBalance(balance); + response.setError_msg("MAX_BET_OVER"); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + HashMap betData = new HashMap(); + betData.put("tranId", tranId); + betData.put("betId", betId); + betData.put("siteId", memberVo.get("siteId").toString()); + betData.put("memId", memberVo.get("memId").toString()); + betData.put("apiCompCode", "triple"); + betData.put("apiVendor", transaction.getString("vendor")); + betData.put("gameCategory", siteVendorInfo.get("gameCategory").toString()); + betData.put("vendorCode", siteVendorInfo.get("vendorCode").toString()); + betData.put("gameName", gameName); + betData.put("tranType", "DEBIT"); + betData.put("betAmt", Math.abs(amount)); + betData.put("betWinAmt", 0); + betData.put("balance", (balance+amount)); + betData.put("isBlankSpinYn", "N"); + betData.put("pointRegYn", "N"); + betData.put("regDate", transaction.getString("requestAt")); + betData.put("updDate", transaction.getString("requestAt")); + int betResult = 0; + try { + log.info(LOG_PREFIX+ "betData : "+betData.toString()); + betResult = betService.insertBetNew(betData); + log.info(LOG_PREFIX+ "insertBet result : "+betResult); + } catch(DataIntegrityViolationException de) { + log.error(LOG_PREFIX+ "Duplicate tranId!!!"); + response.setResult_code(98); + response.setBalance(balance); + response.setError_msg("BET_ALREADY_SETTLED"); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + if(betResult > 0) { + HashMap balanceParam = new HashMap(); + balanceParam.put("siteIdx", memInfo.getSiteIdx()); + balanceParam.put("memId", memInfo.getMemId()); + balanceParam.put("cashAmt", Integer.toString(amount)); + balanceParam.put("changeFlag", "N"); + long chs4 = System.currentTimeMillis(); + int memCashResult = betService.updateUserCashByAmountNew(balanceParam); + long che4 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff4 = (chs4 - che4)/1000.0; //두 시간에 차 계산 + log.info(LOG_PREFIX+ "updateUserCashByAmountNew() : " + String.format("%.3f", diff4)); + if(diff4 < -1.0) log.error(LOG_PREFIX+ "updateUserCashByAmountNew() : " + String.format("%.3f", diff4)); + + asyncService.rollingProc(LOG_PREFIX, betData); + } else { + log.error(LOG_PREFIX+ "BET_FAIL"); + response.setResult_code(9999); + response.setError_msg("BET_FAIL"); + resEntity = new ResponseEntity(response, HttpStatus.INTERNAL_SERVER_ERROR); + return resEntity; + } + + log.info(LOG_PREFIX+ "beforeBalance : "+balance); + log.info(LOG_PREFIX+ "amount : "+amount); + log.info(LOG_PREFIX+ "responseBalance : "+(balance+amount)); + + response.setResult_code(0); + response.setBalance(balance+amount); + response.setError_msg(""); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + + private ResponseEntity callWinSlot(String LOG_PREFIX, Member memInfo, JSONObject transaction) { + LOG_PREFIX = LOG_PREFIX + "WIN:::"; + ResponseEntity resEntity = null; + TripleResponse response = new TripleResponse(); + + String tranId = transaction.getString("tranId"); + String betId = transaction.getString("betId"); + + HashMap betData = betService.getReferenceData2(betId); + if(betData == null) { + log.error(LOG_PREFIX+ "NOT_FOUND_REF_DATA"); + response.setResult_code(99); + response.setError_msg("NOT_FOUND_REF_DATA"); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + int balance = betService.getCurBalance(memInfo); + int amount = transaction.getInt("credit"); + betData.put("tranId", tranId); + betData.put("betId", betId); + betData.put("tranType", "CREDIT"); + betData.put("betAmt", 0); + betData.put("betWinAmt", Math.abs(amount)); + betData.put("balance", (balance+amount)); + betData.put("updDate", transaction.getString("requestAt")); + int betResult = 0; + try { + log.info(LOG_PREFIX+ "betData : "+betData.toString()); + betResult = betService.insertBetNew(betData); + log.info(LOG_PREFIX+ "insertBet result : "+betResult); + } catch(DataIntegrityViolationException de) { + log.error(LOG_PREFIX+ "Duplicate tranId!!!"); + response.setResult_code(98); + response.setBalance(balance); + response.setError_msg("WIN_ALREADY_SETTLED"); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + if(betResult > 0) { + HashMap balanceParam = new HashMap(); + balanceParam.put("siteIdx", memInfo.getSiteIdx()); + balanceParam.put("memId", memInfo.getMemId()); + balanceParam.put("cashAmt", Integer.toString(amount)); + balanceParam.put("changeFlag", "N"); + long chs4 = System.currentTimeMillis(); + int memCashResult = betService.updateUserCashByAmountNew(balanceParam); + long che4 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff4 = (chs4 - che4)/1000.0; //두 시간에 차 계산 + log.info(LOG_PREFIX+ "updateUserCashByAmountNew() : " + String.format("%.3f", diff4)); + if(diff4 < -1.0) log.error(LOG_PREFIX+ "updateUserCashByAmountNew() : " + String.format("%.3f", diff4)); + + asyncService.losingResultProc(LOG_PREFIX, betData); + + } else { + log.error(LOG_PREFIX+ "WIN_FAIL"); + response.setResult_code(9999); + response.setError_msg("WIN_FAIL"); + resEntity = new ResponseEntity(response, HttpStatus.INTERNAL_SERVER_ERROR); + return resEntity; + } + + log.info(LOG_PREFIX+ "beforeBalance : "+balance); + log.info(LOG_PREFIX+ "amount : "+amount); + log.info(LOG_PREFIX+ "responseBalance : "+(balance+amount)); + + response.setResult_code(0); + response.setBalance(balance+amount); + response.setError_msg(""); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + + private ResponseEntity callBonus(String LOG_PREFIX, Member memInfo, JSONObject transaction) { + LOG_PREFIX = LOG_PREFIX + "BONUS:::"; + ResponseEntity resEntity = null; + TripleResponse response = new TripleResponse(); + + String tranId = transaction.getString("tranId"); + String betId = transaction.getString("betId"); + + int betResult = 0; + int balance = 0; + int amount = Math.abs(transaction.getInt("credit")); + + HashMap betData = betService.getReferenceData2(betId); + if(betData != null) { + balance = betService.getCurBalance(memInfo); + betData.put("tranId", tranId); + betData.put("betId", betId); + betData.put("tranType", "BONUS"); + betData.put("betAmt", 0); + betData.put("betWinAmt", amount); + betData.put("balance", (balance+amount)); + betData.put("updDate", transaction.getString("requestAt")); + } else { + log.error(LOG_PREFIX+ "NOT_FOUND_REF_DATA"); + String apiVendorCode = transaction.getString("vendorKey"); + String gameName = transaction.getString("gameKey"); + + HashMap memberVo = userService.getMemberMap(memInfo); + if(memberVo == null) { + log.error(LOG_PREFIX+ "NOT_FOUND_USER"); + response.setResult_code(1111); + response.setError_msg("NOT_FOUND_USER"); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + HashMap vParam = new HashMap<>(); + vParam.put("siteId", memberVo.get("siteId").toString()); + vParam.put("apiCompCode", "triple"); + vParam.put("apiVendorCode", apiVendorCode); + vParam.put("memLevel", memberVo.get("memLevel").toString()); + HashMap siteVendorInfo = betService.getSiteVendorInfo(vParam); + if(siteVendorInfo == null) { + log.error(LOG_PREFIX+ "NOT_FOUND_VENDOR"); + response.setResult_code(70); + response.setError_msg("NOT_FOUND_VENDOR"); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + balance = Integer.parseInt(memberVo.get("cashAmt").toString()); + + betData = new HashMap<>(); + betData.put("tranId", tranId+"#"+transaction.getString("type")); + betData.put("betId", tranId+"#"+transaction.getString("type")); + betData.put("siteId", memberVo.get("siteId").toString()); + betData.put("memId", memberVo.get("memId").toString()); + betData.put("apiCompCode", "triple"); + betData.put("apiVendor", transaction.getString("vendor")); + betData.put("gameCategory", siteVendorInfo.get("gameCategory").toString()); + betData.put("vendorCode", siteVendorInfo.get("vendorCode").toString()); + betData.put("gameName", gameName); + betData.put("tranType", "BONUS"); + betData.put("betAmt", 0); + betData.put("betWinAmt", amount); + betData.put("balance", (balance+amount)); + betData.put("isBlankSpinYn", "N"); + betData.put("pointRegYn", "N"); + betData.put("regDate", transaction.getString("requestAt")); + betData.put("updDate", transaction.getString("requestAt")); + } + + try { + log.info(LOG_PREFIX+ "betData : "+betData.toString()); + betResult = betService.insertBetNew(betData); + log.info(LOG_PREFIX+ "insertBet result : "+betResult); + } catch(DataIntegrityViolationException de) { + log.error(LOG_PREFIX+ "Duplicate tranId!!!"); + response.setResult_code(98); + response.setBalance(balance); + response.setError_msg("BONUS_ALREADY_SETTLED"); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + if(betResult > 0) { + int bonusResult = betService.bonusBetNew(betData); + log.info(LOG_PREFIX+ "bonusBet result : "+bonusResult); + + HashMap balanceParam = new HashMap(); + balanceParam.put("siteIdx", memInfo.getSiteIdx()); + balanceParam.put("memId", memInfo.getMemId()); + balanceParam.put("cashAmt", Integer.toString(amount)); + balanceParam.put("changeFlag", "N"); + long chs4 = System.currentTimeMillis(); + int memCashResult = betService.updateUserCashByAmountNew(balanceParam); + long che4 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff4 = (chs4 - che4)/1000.0; //두 시간에 차 계산 + log.info(LOG_PREFIX+ "updateUserCashByAmountNew() : " + String.format("%.3f", diff4)); + if(diff4 < -1.0) log.error(LOG_PREFIX+ "updateUserCashByAmountNew() : " + String.format("%.3f", diff4)); + } else { + log.error(LOG_PREFIX+ "BONUST_FAIL"); + response.setResult_code(9999); + response.setError_msg("BONUST_FAIL"); + resEntity = new ResponseEntity(response, HttpStatus.INTERNAL_SERVER_ERROR); + return resEntity; + } + + log.info(LOG_PREFIX+ "beforeBalance : "+balance); + log.info(LOG_PREFIX+ "amount : "+amount); + log.info(LOG_PREFIX+ "responseBalance : "+(balance+amount)); + + response.setResult_code(0); + response.setBalance(balance+amount); + response.setError_msg(""); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + + private ResponseEntity callAdjust(String LOG_PREFIX, Member memInfo, JSONObject transaction) { + LOG_PREFIX = LOG_PREFIX + "ADJUST:::"; + ResponseEntity resEntity = null; + TripleResponse response = new TripleResponse(); + + String tranId = transaction.getString("tranId"); + String betId = transaction.getString("betId"); + + HashMap betData = betService.getReferenceData2(betId); + if(betData == null) { + log.error(LOG_PREFIX+ "NOT_FOUND_REF_DATA"); + response.setResult_code(99); + response.setError_msg("NOT_FOUND_REF_DATA"); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + int balance = betService.getCurBalance(memInfo); + int debit = transaction.getInt("debit"); + debit = Math.abs(debit) * -1; + int credit = transaction.getInt("credit"); + int amount = debit + credit; + betData.put("tranId", tranId); + betData.put("betId", betId); + betData.put("tranType", "ADJUST"); + if(amount > 0) { + betData.put("betAmt", 0); + betData.put("betWinAmt", Math.abs(amount)); + } else { + betData.put("betAmt", Math.abs(amount)); + betData.put("betWinAmt", 0); + } + betData.put("balance", (balance+amount)); + betData.put("updDate", transaction.getString("requestAt")); + int betResult = 0; + try { + log.info(LOG_PREFIX+ "betData : "+betData.toString()); + betResult = betService.insertBetNew(betData); + log.info(LOG_PREFIX+ "insertBet result : "+betResult); + } catch(DataIntegrityViolationException de) { + log.error(LOG_PREFIX+ "Duplicate tranId!!!"); + response.setResult_code(98); + response.setBalance(balance); + response.setError_msg("ADJUST_ALREADY_SETTLED"); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + if(betResult > 0) { + HashMap balanceParam = new HashMap(); + balanceParam.put("siteIdx", memInfo.getSiteIdx()); + balanceParam.put("memId", memInfo.getMemId()); + balanceParam.put("cashAmt", Integer.toString(amount)); + balanceParam.put("changeFlag", "N"); + long chs4 = System.currentTimeMillis(); + int memCashResult = betService.updateUserCashByAmountNew(balanceParam); + long che4 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff4 = (chs4 - che4)/1000.0; //두 시간에 차 계산 + log.info(LOG_PREFIX+ "updateUserCashByAmountNew() : " + String.format("%.3f", diff4)); + if(diff4 < -1.0) log.error(LOG_PREFIX+ "updateUserCashByAmountNew() : " + String.format("%.3f", diff4)); + } else { + log.error(LOG_PREFIX+ "ADJUST_FAIL"); + response.setResult_code(9999); + response.setError_msg("ADJUST_FAIL"); + resEntity = new ResponseEntity(response, HttpStatus.INTERNAL_SERVER_ERROR); + return resEntity; + } + + log.info(LOG_PREFIX+ "beforeBalance : "+balance); + log.info(LOG_PREFIX+ "amount : "+amount); + log.info(LOG_PREFIX+ "responseBalance : "+(balance+amount)); + + response.setResult_code(0); + response.setBalance(balance+amount); + response.setError_msg(""); + resEntity = new ResponseEntity(response, HttpStatus.OK); + return resEntity; + } + + + private ResponseEntity callTip(String LOG_PREFIX, Member memInfo, JSONObject transaction) { + LOG_PREFIX = LOG_PREFIX + "TIP:::"; + ResponseEntity resEntity = null; + TripleResponse response = new TripleResponse(); + + return resEntity; + } +} diff --git a/src/main/java/com/bb/controller/CashCronController.java b/src/main/java/com/bb/controller/CashCronController.java new file mode 100644 index 0000000..0ddea63 --- /dev/null +++ b/src/main/java/com/bb/controller/CashCronController.java @@ -0,0 +1,127 @@ +package com.bb.controller; + +import java.net.InetAddress; +import java.util.HashMap; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Controller; + +import com.bb.model.CashQueVO; +import com.bb.model.CronServerInfo; +import com.bb.model.Member; +import com.bb.model.TripleAuthInfo; +import com.bb.service.CashService; +import com.bb.service.CommonService; +import com.bb.service.UserService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@EnableScheduling +@RequiredArgsConstructor +@Controller +public class CashCronController { + + private final CashService cashService; + + private final UserService userService; + + private final CommonService commonService; + + @Scheduled(fixedDelay = 2000) // 작업 종류 후 1초 마다 + public void cashProc() throws Exception { + long startTime = System.currentTimeMillis(); + int queSize = 0; + + try { + CronServerInfo cronStatus = new CronServerInfo(); + cronStatus.setHostName(InetAddress.getLocalHost().getHostName()); + cronStatus.setIpAddress(InetAddress.getLocalHost().getHostAddress()); + cronStatus.setCronType("CASH"); + cronStatus = commonService.getServerCronStatus(cronStatus); + log.debug("#-cashProc::" + "#[CRON STATUS] cronStatus: " + cronStatus); + + if (cronStatus != null && cronStatus.getRunYn().equals("Y")) { + List cashQueList = cashService.getCashQueList(); + queSize = cashQueList.size(); + if (queSize > 0) { + log.info("#-cashProc::" + "cashQueList size: " + cashQueList.size()); + + for (CashQueVO item : cashQueList) { + String LOG_PREFIX = "#-cashProc::" + item.getSiteId() + "::" + item.getCashIdx() + "::"; + + if (item.getRefCnt() == 0) { + // log.info(LOG_PREFIX+ "not ready... RefCnt: " + item.getRefCnt()); + continue; + } + + long cashAmt = Long.parseLong(item.getCashAmt()); + long balance = cashService.getBalance(item); + if ((balance + cashAmt) < 0) { + // 보유금 마이너스 오류. 거래 실패처리 + HashMap wdParam = new HashMap<>(); + wdParam.put("cashIdx", item.getCashIdx()); + wdParam.put("refIdx", null); + wdParam.put("cashStatus", "-1"); + wdParam.put("memo", "계정(" + item.getMemId() + ") 보유금(" + balance + ") 부족 처리실패"); + int wdResult = cashService.updateQueStatus(wdParam); + log.info(LOG_PREFIX + item.getMemId() + " withdraw queue fail process result: " + wdResult); + if (wdResult > 0) { + HashMap dpParam = new HashMap<>(); + dpParam.put("cashIdx", null); + dpParam.put("refIdx", item.getCashIdx()); + dpParam.put("cashStatus", "-1"); + dpParam.put("memo", "계정(" + item.getMemId() + ") 보유금(" + balance + ") 부족 처리실패"); + int dpResult = cashService.updateQueStatus(dpParam); + log.info(LOG_PREFIX + item.getTargetId() + " deposit queue fail process result: " + + dpResult); + } + } else { + // Triple API + Member botUser = new Member(); + botUser.setSiteId(item.getSiteId()); + botUser.setMemId(item.getMemId()); + TripleAuthInfo tripleMember = userService.getTripleAuthInfo2(botUser); + if (tripleMember != null && tripleMember.getPartnerLevel().equals("NORMAL")) { + // asyncService.withdrawBalanceAsync2(LOG_PREFIX, tripleMember); + } + + // 거래 성공 처리 + HashMap wdParam = new HashMap<>(); + wdParam.put("cashIdx", item.getCashIdx()); + wdParam.put("refIdx", null); + wdParam.put("cashStatus", "1"); + wdParam.put("memo", ""); + int wdResult = cashService.updateQueStatus(wdParam); + log.info(LOG_PREFIX + item.getMemId() + " withdraw queue success process result: " + + wdResult); + if (wdResult > 0) { + HashMap dpParam = new HashMap<>(); + dpParam.put("cashIdx", null); + dpParam.put("refIdx", item.getCashIdx()); + dpParam.put("cashStatus", "1"); + dpParam.put("memo", ""); + int dpResult = cashService.updateQueStatus(dpParam); + log.info(LOG_PREFIX + item.getTargetId() + " deposit queue success process result: " + + dpResult); + } + } + } + } + } + + } catch (Exception e) { + log.error("#-cashProc::" + "Exception::" + e.toString()); + e.printStackTrace(); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double secDiffTime = (startTime - endTime) / 1000.0; // 두 시간에 차 계산 + if (queSize > 0) + log.error("#-cashProc::" + "Proc Time(s) > 1s : " + String.format("%.3f", secDiffTime)); + } +} diff --git a/src/main/java/com/bb/controller/PointCronController.java b/src/main/java/com/bb/controller/PointCronController.java new file mode 100644 index 0000000..2ed63bc --- /dev/null +++ b/src/main/java/com/bb/controller/PointCronController.java @@ -0,0 +1,331 @@ +package com.bb.controller; + +import java.net.InetAddress; +import java.util.HashMap; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Controller; + +import com.bb.model.CronServerInfo; +import com.bb.service.BetService; +import com.bb.service.CashService; +import com.bb.service.CommonService; +import com.bb.service.UserService; +import com.bb.util.RandomRolling; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RequiredArgsConstructor +@EnableScheduling +@Controller +public class PointCronController { + + private final BetService betService; + + private final CashService cashService; + + private final CommonService commonService; + + + // 'jjanggu01', 'ichiban01', 'viva01', 'mvp001', 'black01' 제외 사이트 + //@Scheduled(fixedDelay = 10000) // 작업 종류 후 10초 마다 + public void pointProc() throws Exception { + long startTime = System.currentTimeMillis(); + try { + CronServerInfo cronStatus = new CronServerInfo(); + cronStatus.setHostName(InetAddress.getLocalHost().getHostName()); + cronStatus.setIpAddress(InetAddress.getLocalHost().getHostAddress()); + cronStatus.setCronType("POINT"); + log.debug("##- [OMS CRON STATUS] HostName: " + cronStatus.getHostName() + ", HostAddress: " + cronStatus.getIpAddress()); + cronStatus = commonService.getServerCronStatus(cronStatus); + log.debug("##- [OMS CRON STATUS] cronStatus: " + cronStatus); + + if(cronStatus != null && cronStatus.getRunYn().equals("Y")) { + log.debug("### Triple API pointProc() Start -###"); + List biBetList = betService.getBetPointList(); + log.debug("### Triple API pointProc() biBetList.size() : " + biBetList.size()); + for(HashMap betItem : biBetList) { + + log.debug("### Triple API betItem : " + betItem.toString()); + long betIdx = (long) betItem.get("betIdx"); + String betId = betItem.get("betId").toString(); + int betRate = Integer.parseInt(betItem.get("betRate").toString()); + String gameCategory = betItem.get("gameCategory").toString(); + String vendorCode = betItem.get("vendorCode").toString(); + + long betAmt = Long.parseLong(betItem.get("betAmt").toString()); + long betWinAmt = Long.parseLong(betItem.get("betWinAmt").toString()); + int bsCasinoRate = Integer.parseInt(betItem.get("blankSpinCasinoRate").toString()); + int bsSlotRate = Integer.parseInt(betItem.get("blankSpinSlotRate").toString()); + + String siteId = betItem.get("siteId").toString(); + String memId = betItem.get("memId").toString(); + String blankSpinSetType = betItem.get("blankSpinSetType").toString(); + int betCnt = 0; + long sumWinAmt = 0; + HashMap totalInfo = betService.getBetTodayTotalInfo(betItem); + if(totalInfo != null) { + betCnt = Integer.parseInt(totalInfo.get("betCnt").toString()); + sumWinAmt = Long.parseLong(totalInfo.get("sumWinAmt").toString()); + } + + int rate = 0; + if( blankSpinSetType.equals("B") && ( betCnt < 20 || betAmt >= sumWinAmt ) ) { + rate = 0; + } else { + if(gameCategory.equals("casino")) { + //if(gameCategory.equals("casino") && (betAmt > betWinAmt)) { // 24.07.12 jinu 요청 수정 + rate = bsCasinoRate; + //} else if(gameCategory.equals("slot") && (betAmt >= betWinAmt)) { // 24.08.27 CS팀 요청(Green) + } else if(gameCategory.equals("slot")) { // 24.10.16 jinu 요청 수정 + rate = bsSlotRate; + } else if(gameCategory.equals("undefind")) { + rate = 100; + } else { + rate = 0; + } + } + + // isBlankSpin = true (롤링공회전), isBlankSpin = false (롤링진행) + boolean isBlankSpin = RandomRolling.isBlankSpin(rate); + + HashMap mapParam = new HashMap(); + mapParam.put("betIdx", betIdx); + mapParam.put("betRate", betRate); + mapParam.put("gameCategory", gameCategory); + mapParam.put("vendorCode", vendorCode); + if(isBlankSpin) { + mapParam.put("isBlankSpinYn", "Y"); + } else { + mapParam.put("isBlankSpinYn", "N"); + } + + String LOG_PREFIX = "#-pointProc::"+siteId+"::"+memId+"::betIdx::"+betIdx+"::::"; + try { + log.debug(LOG_PREFIX+ "cashService.insertBetPoint(mapParam) start"); + int pointResult = cashService.insertBetPoint(LOG_PREFIX, mapParam); + log.debug(LOG_PREFIX+ "cashService.insertBetPoint(mapParam) end: " + pointResult); + } catch(Exception e) { + log.error(LOG_PREFIX+ "POINT_ERROR::"+e.toString()); + } + } + } + } catch(Exception e) { + log.error(e.toString()); + e.printStackTrace(); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double secDiffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + log.error("pointProc() Proc Time(s) > 1s : " + String.format("%.3f", secDiffTime)); + } + + private void pointProcSite(final String SITE_ID) throws Exception { + log.debug("### Triple API pointProc("+SITE_ID+") Start -###"); + List biBetList = betService.getBetPointListBySite(SITE_ID); + log.debug("### Triple API pointProc("+SITE_ID+") biBetList.size() : " + biBetList.size()); + for(HashMap betItem : biBetList) { + + log.debug("### Triple API pointProc("+SITE_ID+") betItem : " + betItem.toString()); + long betIdx = (long) betItem.get("betIdx"); + String betId = betItem.get("betId").toString(); + int betRate = Integer.parseInt(betItem.get("betRate").toString()); + String gameCategory = betItem.get("gameCategory").toString(); + String vendorCode = betItem.get("vendorCode").toString(); + + long betAmt = Long.parseLong(betItem.get("betAmt").toString()); + long betWinAmt = Long.parseLong(betItem.get("betWinAmt").toString()); + int bsCasinoRate = Integer.parseInt(betItem.get("blankSpinCasinoRate").toString()); + int bsSlotRate = Integer.parseInt(betItem.get("blankSpinSlotRate").toString()); + + String siteId = betItem.get("siteId").toString(); + String memId = betItem.get("memId").toString(); + String blankSpinSetType = betItem.get("blankSpinSetType").toString(); + int betCnt = 0; + long sumWinAmt = 0; + HashMap totalInfo = betService.getBetTodayTotalInfo(betItem); + if(totalInfo != null) { + betCnt = Integer.parseInt(totalInfo.get("betCnt").toString()); + sumWinAmt = Long.parseLong(totalInfo.get("sumWinAmt").toString()); + } + + int rate = 0; + if( blankSpinSetType.equals("B") && ( betCnt < 20 || betAmt >= sumWinAmt ) ) { + rate = 0; + } else { + if(gameCategory.equals("casino")) { + //if(gameCategory.equals("casino") && (betAmt > betWinAmt)) { // 24.07.12 jinu 요청 수정 + rate = bsCasinoRate; + //} else if(gameCategory.equals("slot") && (betAmt >= betWinAmt)) { // 24.08.27 CS팀 요청(Green) + } else if(gameCategory.equals("slot")) { // 24.10.16 jinu 요청 수정 + rate = bsSlotRate; + } else if(gameCategory.equals("undefind")) { + rate = 100; + } else { + rate = 0; + } + } + + // isBlankSpin = true (롤링공회전), isBlankSpin = false (롤링진행) + boolean isBlankSpin = RandomRolling.isBlankSpin(rate); + + HashMap mapParam = new HashMap(); + mapParam.put("betIdx", betIdx); + mapParam.put("betRate", betRate); + mapParam.put("gameCategory", gameCategory); + mapParam.put("vendorCode", vendorCode); + if(isBlankSpin) { + mapParam.put("isBlankSpinYn", "Y"); + } else { + mapParam.put("isBlankSpinYn", "N"); + } + + String LOG_PREFIX = "#-pointProc::"+siteId+"::"+memId+"::betIdx::"+betIdx+"::::"; + try { + log.debug(LOG_PREFIX+ "cashService.insertBetPoint(mapParam) start"); + int pointResult = cashService.insertBetPoint(LOG_PREFIX, mapParam); + log.debug(LOG_PREFIX+ "cashService.insertBetPoint(mapParam) end: " + pointResult); + } catch(Exception e) { + log.error(LOG_PREFIX+ "POINT_ERROR::"+e.toString()); + } + } + } + + + // 'jjanggu01', 'ichiban01', 'viva01', 'mvp001', 'black01' + //@Scheduled(fixedDelay = 10000) // 작업 종류 후 10초 마다 + public void pointProc_jjanggu01() throws Exception { + long startTime = System.currentTimeMillis(); + final String SITE_ID = "jjanggu01"; + try { + CronServerInfo cronStatus = new CronServerInfo(); + cronStatus.setHostName(InetAddress.getLocalHost().getHostName()); + cronStatus.setIpAddress(InetAddress.getLocalHost().getHostAddress()); + cronStatus.setCronType("POINT"); + log.debug("##- [OMS CRON STATUS] HostName: " + cronStatus.getHostName() + ", HostAddress: " + cronStatus.getIpAddress()); + cronStatus = commonService.getServerCronStatus(cronStatus); + log.debug("##- [OMS CRON STATUS] cronStatus: " + cronStatus); + + if(cronStatus != null && cronStatus.getRunYn().equals("Y")) { + pointProcSite(SITE_ID); + } + } catch(Exception e) { + log.error(e.toString()); + e.printStackTrace(); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double secDiffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + log.error("pointProc("+SITE_ID+") Proc Time(s) > 1s : " + String.format("%.3f", secDiffTime)); + } + + //@Scheduled(fixedDelay = 10000) // 작업 종류 후 10초 마다 + public void pointProc_ichiban01() throws Exception { + long startTime = System.currentTimeMillis(); + final String SITE_ID = "ichiban01"; + try { + CronServerInfo cronStatus = new CronServerInfo(); + cronStatus.setHostName(InetAddress.getLocalHost().getHostName()); + cronStatus.setIpAddress(InetAddress.getLocalHost().getHostAddress()); + cronStatus.setCronType("POINT"); + log.debug("##- [OMS CRON STATUS] HostName: " + cronStatus.getHostName() + ", HostAddress: " + cronStatus.getIpAddress()); + cronStatus = commonService.getServerCronStatus(cronStatus); + log.debug("##- [OMS CRON STATUS] cronStatus: " + cronStatus); + + if(cronStatus != null && cronStatus.getRunYn().equals("Y")) { + pointProcSite(SITE_ID); + } + } catch(Exception e) { + log.error(e.toString()); + e.printStackTrace(); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double secDiffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + log.error("pointProc("+SITE_ID+") Proc Time(s) > 1s : " + String.format("%.3f", secDiffTime)); + } + + //@Scheduled(fixedDelay = 10000) // 작업 종류 후 10초 마다 + public void pointProc_viva01() throws Exception { + long startTime = System.currentTimeMillis(); + final String SITE_ID = "viva01"; + try { + CronServerInfo cronStatus = new CronServerInfo(); + cronStatus.setHostName(InetAddress.getLocalHost().getHostName()); + cronStatus.setIpAddress(InetAddress.getLocalHost().getHostAddress()); + cronStatus.setCronType("POINT"); + log.debug("##- [OMS CRON STATUS] HostName: " + cronStatus.getHostName() + ", HostAddress: " + cronStatus.getIpAddress()); + cronStatus = commonService.getServerCronStatus(cronStatus); + log.debug("##- [OMS CRON STATUS] cronStatus: " + cronStatus); + + if(cronStatus != null && cronStatus.getRunYn().equals("Y")) { + pointProcSite(SITE_ID); + } + } catch(Exception e) { + log.error(e.toString()); + e.printStackTrace(); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double secDiffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + log.error("pointProc("+SITE_ID+") Proc Time(s) > 1s : " + String.format("%.3f", secDiffTime)); + } + + //@Scheduled(fixedDelay = 10000) // 작업 종류 후 10초 마다 + public void pointProc_black01() throws Exception { + long startTime = System.currentTimeMillis(); + final String SITE_ID = "black01"; + try { + CronServerInfo cronStatus = new CronServerInfo(); + cronStatus.setHostName(InetAddress.getLocalHost().getHostName()); + cronStatus.setIpAddress(InetAddress.getLocalHost().getHostAddress()); + cronStatus.setCronType("POINT"); + log.debug("##- [OMS CRON STATUS] HostName: " + cronStatus.getHostName() + ", HostAddress: " + cronStatus.getIpAddress()); + cronStatus = commonService.getServerCronStatus(cronStatus); + log.debug("##- [OMS CRON STATUS] cronStatus: " + cronStatus); + + if(cronStatus != null && cronStatus.getRunYn().equals("Y")) { + pointProcSite(SITE_ID); + } + } catch(Exception e) { + log.error(e.toString()); + e.printStackTrace(); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double secDiffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + log.error("pointProc("+SITE_ID+") Proc Time(s) > 1s : " + String.format("%.3f", secDiffTime)); + } + + //@Scheduled(fixedDelay = 10000) // 작업 종류 후 10초 마다 + public void pointProc_mvp001() throws Exception { + long startTime = System.currentTimeMillis(); + final String SITE_ID = "mvp001"; + try { + CronServerInfo cronStatus = new CronServerInfo(); + cronStatus.setHostName(InetAddress.getLocalHost().getHostName()); + cronStatus.setIpAddress(InetAddress.getLocalHost().getHostAddress()); + cronStatus.setCronType("POINT"); + log.debug("##- [OMS CRON STATUS] HostName: " + cronStatus.getHostName() + ", HostAddress: " + cronStatus.getIpAddress()); + cronStatus = commonService.getServerCronStatus(cronStatus); + log.debug("##- [OMS CRON STATUS] cronStatus: " + cronStatus); + + if(cronStatus != null && cronStatus.getRunYn().equals("Y")) { + pointProcSite(SITE_ID); + } + } catch(Exception e) { + log.error(e.toString()); + e.printStackTrace(); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double secDiffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + log.error("pointProc("+SITE_ID+") Proc Time(s) > 1s : " + String.format("%.3f", secDiffTime)); + } + +} diff --git a/src/main/java/com/bb/controller/SocketController.java b/src/main/java/com/bb/controller/SocketController.java new file mode 100644 index 0000000..8e81ffd --- /dev/null +++ b/src/main/java/com/bb/controller/SocketController.java @@ -0,0 +1,176 @@ +package com.bb.controller; + +import java.net.InetAddress; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; + +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Controller; + +import com.bb.model.CronServerInfo; +import com.bb.model.OutChatMessageVO; +import com.bb.model.SiteCheckReq; +import com.bb.service.CommonService; +import com.bb.service.UserService; +import com.bb.util.AESUtil; +import com.fasterxml.jackson.databind.ObjectMapper; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + + +@Slf4j +@EnableScheduling +@RequiredArgsConstructor +@Controller +public class SocketController { + + private final SimpMessagingTemplate simpMessagingTemplate; + + private final CommonService commonService; + + private final UserService userService; + + @Scheduled(fixedDelay = 8000L) + public void sendPong() throws Exception { + String nowtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(System.currentTimeMillis())); + + OutChatMessageVO outMs = new OutChatMessageVO(); + AESUtil aesUtil = new AESUtil(); + String json = ""; + String encryptMsg = ""; + + try { + CronServerInfo cronStatus = new CronServerInfo(); + cronStatus.setHostName(InetAddress.getLocalHost().getHostName()); + cronStatus.setIpAddress(InetAddress.getLocalHost().getHostAddress()); + cronStatus.setCronType("SOCKET"); + log.debug("##- [OMS CRON STATUS] HostName: " + cronStatus.getHostName() + ", HostAddress: " + cronStatus.getIpAddress()); + cronStatus = commonService.getServerCronStatus(cronStatus); + log.debug("##- [OMS CRON STATUS] cronStatus: " + cronStatus); + + if(cronStatus != null && cronStatus.getRunYn().equals("Y")) { + HashMap superHeadCashInfo = userService.getSuperHeadCashInfo(); + + ObjectMapper oms = new ObjectMapper(); + // Map or List Object 를 JSON 문자열로 변환 + String superHeadCashInfoStr = oms.writeValueAsString(superHeadCashInfo); + outMs.setContent(superHeadCashInfoStr); + json = oms.writeValueAsString(outMs); + encryptMsg = aesUtil.encrypt(json); + + // this.simpMessagingTemplate.convertAndSend("/topic/super", outMs); + this.simpMessagingTemplate.convertAndSend("/topic/super", encryptMsg); + + List tokenList = commonService.getlastLoginToken(); + if(tokenList != null) { + for(HashMap ti:tokenList) { + if("admin".equals(ti.get("mt"))) { + HashMap param = new HashMap(); + param.put("siteId", ti.get("siteId")); + HashMap headCashInfo = userService.getHeadCashInfo(param); + //log.info("###- SocketController.sendPong() headCashInfo: " + headCashInfo); + + ObjectMapper om2 = new ObjectMapper(); + // Map or List Object 를 JSON 문자열로 변환 + String headCashInfoStr = om2.writeValueAsString(headCashInfo); + + outMs.setContent(headCashInfoStr); + json = om2.writeValueAsString(outMs); + encryptMsg = aesUtil.encrypt(json); + // this.simpMessagingTemplate.convertAndSend("/topic/adminfo/"+ti.get("lastToken").toString(), outMs); + this.simpMessagingTemplate.convertAndSend("/topic/adminfo/"+ti.get("lastToken").toString(), encryptMsg); + } + + if("mem".equals(ti.get("mt"))) { + List memInfo = userService.getMemInfo(ti); + //log.info("###- SocketController.sendPong() memInfo: " + memInfo); + + ObjectMapper om2 = new ObjectMapper(); + // Map or List Object 를 JSON 문자열로 변환 + String memInfoStr = om2.writeValueAsString(memInfo); + + outMs.setContent(memInfoStr); + json = om2.writeValueAsString(outMs); + encryptMsg = aesUtil.encrypt(json); + // this.simpMessagingTemplate.convertAndSend("/topic/"+ti.get("lastToken").toString(), outMs); + this.simpMessagingTemplate.convertAndSend("/topic/"+ti.get("lastToken").toString(), encryptMsg); + } + } + } + } + } catch(Exception e) { + e.printStackTrace(); + } + } + + +// @Scheduled(fixedDelay = 2000L) + public void sendMiniGame() throws Exception { + String nowtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(System.currentTimeMillis())); + + OutChatMessageVO outMs = new OutChatMessageVO(); + + List siteList = commonService.getLoginSite(); + + if(siteList != null) { + for(HashMap ti:siteList) { + // Map or List Object 를 JSON 문자열로 변환 + List miniGameInfo = userService.miniGameInfo(ti); + + ObjectMapper om2 = new ObjectMapper(); + // Map or List Object 를 JSON 문자열로 변환 + String miniGameInfoStr = om2.writeValueAsString(miniGameInfo); + //System.out.println("miniGameInfoStr" + miniGameInfoStr); + outMs.setContent(miniGameInfoStr); + + this.simpMessagingTemplate.convertAndSend("/topic/powerball/"+ti.get("siteId").toString(), outMs); + } + } + } + + @Scheduled(fixedDelay = 10000L) + public void isSiteCheck() throws Exception { + try { + CronServerInfo cronStatus = new CronServerInfo(); + cronStatus.setHostName(InetAddress.getLocalHost().getHostName()); + cronStatus.setIpAddress(InetAddress.getLocalHost().getHostAddress()); + cronStatus.setCronType("CHECK"); + log.debug("##- [OMS CRON STATUS] HostName: " + cronStatus.getHostName() + ", HostAddress: " + cronStatus.getIpAddress()); + cronStatus = commonService.getServerCronStatus(cronStatus); + log.debug("##- [OMS CRON STATUS] cronStatus: " + cronStatus); + + if(cronStatus != null && cronStatus.getRunYn().equals("Y")) { + List siteCheckList = commonService.isSiteCheck(); + + for(HashMap item : siteCheckList) { + int siteCheckIdx = (int) item.get("siteCheckIdx"); + SiteCheckReq param = new SiteCheckReq(); + param.setSiteCheckIdx(siteCheckIdx); + param.setSiteId((String) item.get("siteId")); + if(item.get("checkStatus").equals("ON")) { + // site_setting 테이블 siteCheckYn => 'Y' + param.setSiteCheckYn("Y"); + log.info("#-isSiteCheck::ON::" + param.getSiteId()+"::"+param.getSiteCheckIdx()+"::"+param.getStartDate()+"-"+param.getEndDate()); + commonService.changeSiteSettingCheckYn(param); + } else { + // site_check_info 테이블 isCheckOff => 'Y' + // site_setting 테이블 siteCheckYn => 'N' + param.setIsCheckOff("Y"); + param.setSiteCheckYn("N"); + log.info("#-isSiteCheck::OFF::" + param.getSiteId()+"::"+param.getSiteCheckIdx()+"::"+param.getStartDate()+"-"+param.getEndDate()); + commonService.changeSiteCheckOff(param); + commonService.changeSiteSettingCheckYn(param); + } + } + } + } catch(Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/com/bb/controller/TripleController.java b/src/main/java/com/bb/controller/TripleController.java new file mode 100644 index 0000000..0a5f60e --- /dev/null +++ b/src/main/java/com/bb/controller/TripleController.java @@ -0,0 +1,686 @@ +package com.bb.controller; + +import java.net.InetAddress; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.scheduling.annotation.EnableScheduling; +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.RestController; + +import com.bb.model.CronServerInfo; +import com.bb.model.Member; +import com.bb.model.MemberDetail; +import com.bb.model.TripleAuthInfo; +import com.bb.model.TripleDVO; +import com.bb.model.TripleGameRate; +import com.bb.model.TriplePurchaseId; +import com.bb.model.TripleVO; +import com.bb.service.BetService; +import com.bb.service.CommonService; +import com.bb.service.CompService; +import com.bb.service.SportDService; +import com.bb.service.SportService; +import com.bb.service.TripleService; +import com.bb.service.UserService; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.sf.json.JSONObject; + +@Slf4j +@EnableScheduling +@RequiredArgsConstructor +@RestController +@RequestMapping(value = "/triple") +public class TripleController { + + private static final long serialVersionUID = 1L; + private static NumberFormat formatter = new DecimalFormat("#0.00"); + + private final UserService userService; + + private final BetService betService; + + private final TripleService tripleService; + + private final SportService sportService; + + private final SportDService sportDService; + + private final CommonService commonService; + + private final CompService compService; + + + @PostMapping("/balance/sports") + public ResponseEntity balance(@RequestBody TripleVO tripleVO, HttpServletRequest request) throws Exception { + long startTime = System.currentTimeMillis(); + + net.sf.json.JSONObject responseObj = new net.sf.json.JSONObject(); + HttpStatus httpStatus = null; + final String LOG_PREFIX = "#-CB::balance::"+tripleVO.getUserId()+"::"+tripleVO.getRequestAt()+":::"; + + log.info(LOG_PREFIX+ "TripleVO : " + tripleVO); + + try { + long balance = 0; + Member search = new Member(); + search.setSiteIdx(Integer.parseInt(tripleVO.getUserId().substring(0, 3), 16)); + search.setMemId(tripleVO.getUserId().substring(3, tripleVO.getUserId().length())); + + // synchronized method getMemByTriple() + MemberDetail memberVo = userService.getMemByTriple(search); + long endTime1 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime1 = (startTime - endTime1)/1000.0; //두 시간에 차 계산 + log.error(LOG_PREFIX+ "[### userService.getMemByTriple() : " + String.format("%.3f", diffTime1) + " ###]"); + + if(memberVo != null && !"".equals(memberVo.getUsername())) { + balance = memberVo.getCashAmt(); + responseObj.put("result_code", 0); + responseObj.put("balance", balance); + httpStatus = HttpStatus.OK; + } else { + if(memberVo != null && "".equals(memberVo.getUsername())) { + TripleAuthInfo user = new TripleAuthInfo(); + user.setSiteId(search.getSiteId()); + user.setMemId(search.getMemId()); + user.setId(0); + user.setUsername(tripleVO.getUserId()); + user.setNickname(tripleVO.getUserId()); + log.info(LOG_PREFIX+ "### Triple API ### - call \"/balance\" TripleAuthInfo: " + user); + int result = userService.insertTripleAuthInfo(user); + + if(result > 0) { + balance = memberVo.getCashAmt(); + responseObj.put("result_code", 0); + responseObj.put("balance", balance); + httpStatus = HttpStatus.OK; + } else { + responseObj.put("result_code", 1999); + responseObj.put("errors","INSERT_USER_ERROR"); + httpStatus = HttpStatus.OK; + } + } else { + responseObj.put("result_code", 9999); + responseObj.put("errors","INVALID_USER"); + httpStatus = HttpStatus.OK; + } + } + + } catch(Exception e) { + responseObj.put("result_code", 1111); + responseObj.put("errors","UNKNOWN_ERROR"); + httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; + log.error(LOG_PREFIX+ e.getMessage()); + } + log.info(LOG_PREFIX+ "### Triple API Controller ### - call \"/balance\" response : " + responseObj); + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -2.0) { + log.error(LOG_PREFIX+ "[### balance diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + + return new ResponseEntity(responseObj, httpStatus); + } + + + @PostMapping("/changebalance/sports") + public ResponseEntity changeBalance(HttpServletRequest request, @RequestBody TripleVO tripleVO) { + long startTime = System.currentTimeMillis(); + + net.sf.json.JSONObject responseObj = new net.sf.json.JSONObject(); + HttpStatus httpStatus = null; + + final String LOG_PREFIX = "#-callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::"+tripleVO.getTranType()+"::::"; + + try { + + + if(tripleVO.getTranType().equals("debit") && tripleVO.getIsCancel() == 0) { + if(tripleVO.getRequestAt() != null && !tripleVO.getRequestAt().equals("")) { + + SimpleDateFormat sdf = null; + if(tripleVO.getRequestAt().length() >= 20) { + // 2025-02-20 18:37:21.000 + sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + } else { + // 2025-02-20 18:37:21 + sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + } + + String requestAtStr = tripleVO.getRequestAt(); + //long nDate = System.currentTimeMillis() - 32400000; + long nDate = System.currentTimeMillis(); + String nDateStr = sdf.format(nDate); + // Date타입으로 변경 + Date requestAt = sdf.parse(requestAtStr); + double diff = (nDate - requestAt.getTime()) / 1000.0; // 초 + if(diff > 2.5) { + log.error(LOG_PREFIX +"changebalance::debit::"+diff+"초 통신 지연발생[requestAt:"+requestAtStr+"][nDate:"+nDateStr+"]"); + responseObj.put("result_code", 44); + responseObj.put("error_msg","TIMEOUT_ERROR"); + log.error(LOG_PREFIX+ "[### changeBalance() TIMEOUT_ERROR]"); + httpStatus = HttpStatus.OK; + return new ResponseEntity(responseObj, httpStatus); + } + } + } + + + log.info(LOG_PREFIX+ "TripleVO : " + tripleVO); + + Member search = new Member(); + search.setSiteIdx(Integer.parseInt(tripleVO.getUserId().substring(0, 3), 16)); + search.setMemId(tripleVO.getUserId().substring(3, tripleVO.getUserId().length())); + + if(tripleVO.getDetailStr() == null) { + tripleVO.setDetailStr("{}"); + } + + if(tripleVO.getMinusBalanceYn() == null) { + tripleVO.setMinusBalanceYn("N"); + } + + if(tripleVO.getVendorIdx() == 83) { + // 스포츠 배팅 + responseObj = sportService.betProc(search, tripleVO); + } else { + responseObj = tripleService.betProc(search, tripleVO); + } + + if(responseObj.getString("result_code").equals("0") || + responseObj.getString("result_code").equals("70") || + responseObj.getString("result_code").equals("80") || + responseObj.getString("result_code").equals("98") || + responseObj.getString("result_code").equals("99") || + responseObj.getString("result_code").equals("44") || + responseObj.getString("result_code").equals("1005") || + responseObj.getString("result_code").equals("3333") ) { + + // 0 70 80 98 99 + httpStatus = HttpStatus.OK; + } else { + httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; + } + } catch(Exception e) { + responseObj.put("result_code", 1111); + responseObj.put("error_msg","UNKNOWN_ERROR"); + httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; + log.error(LOG_PREFIX+ "Exception::"+e.getMessage()); + } + + log.info(LOG_PREFIX+ "Response::" + responseObj.toString()); + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -1.5) { + log.error(LOG_PREFIX+ "[callback::diffTime : " + String.format("%.3f", diffTime) + "]"); + } + return new ResponseEntity(responseObj, httpStatus); + } + + + @PostMapping("/balance/sportsD") + public ResponseEntity balanceD(@RequestBody TripleDVO tripleVO, HttpServletRequest request) throws Exception { + long startTime = System.currentTimeMillis(); + + net.sf.json.JSONObject responseObj = new net.sf.json.JSONObject(); + HttpStatus httpStatus = null; + final String LOG_PREFIX = "#-CB::balance::"+tripleVO.getUserId()+"::"+tripleVO.getRequestAt()+":::"; + + log.info(LOG_PREFIX+ "TripleVO : " + tripleVO); + + try { + Member search = new Member(); + search.setSiteIdx(Integer.parseInt(tripleVO.getUserId().substring(0, 3), 16)); + search.setMemId(tripleVO.getUserId().substring(3, tripleVO.getUserId().length())); + + // synchronized method getMemByTriple() + MemberDetail memberVo = userService.getMemByTriple(search); + + long endTime1 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime1 = (startTime - endTime1)/1000.0; //두 시간에 차 계산 + log.error(LOG_PREFIX+ "[### userService.getMemByTriple() : " + String.format("%.3f", diffTime1) + " ###]"); + + if(memberVo != null && !"".equals(memberVo.getUsername())) { + responseObj.put("result_code", 0); + responseObj.put("balance", memberVo.getCashAmtD()); + httpStatus = HttpStatus.OK; + } else { + if(memberVo != null && "".equals(memberVo.getUsername())) { + TripleAuthInfo user = new TripleAuthInfo(); + user.setSiteId(search.getSiteId()); + user.setMemId(search.getMemId()); + user.setId(0); + user.setUsername(tripleVO.getUserId()); + user.setNickname(tripleVO.getUserId()); + log.info(LOG_PREFIX+ "### Triple API ### - call \"/balance\" TripleAuthInfo: " + user); + int result = userService.insertTripleAuthInfo(user); + + if(result > 0) { + responseObj.put("result_code", 0); + responseObj.put("balance", memberVo.getCashAmtD()); + // FOR-BTI + responseObj.put("balanceD", memberVo.getCashAmtD()); + httpStatus = HttpStatus.OK; + } else { + responseObj.put("result_code", 1999); + responseObj.put("errors","INSERT_USER_ERROR"); + httpStatus = HttpStatus.OK; + } + } else { + responseObj.put("result_code", 9999); + responseObj.put("errors","INVALID_USER"); + httpStatus = HttpStatus.OK; + } + } + + } catch(Exception e) { + responseObj.put("result_code", 1111); + responseObj.put("errors","UNKNOWN_ERROR"); + httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; + log.error(LOG_PREFIX+ e.getMessage()); + } + log.info(LOG_PREFIX+ "### Triple API Controller ### - call \"/balance\" response : " + responseObj); + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -2.0) { + log.error(LOG_PREFIX+ "[### balance diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + + return new ResponseEntity(responseObj, httpStatus); + } + + + @PostMapping("/changebalance/sportsD") + public ResponseEntity changeBalanceD(HttpServletRequest request, @RequestBody TripleDVO tripleVO) { + long startTime = System.currentTimeMillis(); + + net.sf.json.JSONObject responseObj = new net.sf.json.JSONObject(); + HttpStatus httpStatus = null; + + final String LOG_PREFIX = "#-callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::"+tripleVO.getTranType()+"::::"; + + try { + + + if(tripleVO.getTranType().equals("debit") && tripleVO.getIsCancel() == 0) { + if(tripleVO.getRequestAt() != null && !tripleVO.getRequestAt().equals("")) { + + SimpleDateFormat sdf = null; + if(tripleVO.getRequestAt().length() >= 20) { + // 2025-02-20 18:37:21.000 + sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + } else { + // 2025-02-20 18:37:21 + sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + } + + String requestAtStr = tripleVO.getRequestAt(); + //long nDate = System.currentTimeMillis() - 32400000; + long nDate = System.currentTimeMillis(); + String nDateStr = sdf.format(nDate); + // Date타입으로 변경 + Date requestAt = sdf.parse(requestAtStr); + double diff = (nDate - requestAt.getTime()) / 1000.0; // 초 + if(diff > 2.5) { + log.error(LOG_PREFIX +"changebalance::debit::"+diff+"초 통신 지연발생[requestAt:"+requestAtStr+"][nDate:"+nDateStr+"]"); + responseObj.put("result_code", 44); + responseObj.put("error_msg","TIMEOUT_ERROR"); + log.error(LOG_PREFIX+ "[### changeBalance() TIMEOUT_ERROR]"); + httpStatus = HttpStatus.OK; + return new ResponseEntity(responseObj, httpStatus); + } + } + } + + + log.info(LOG_PREFIX+ "TripleVO : " + tripleVO); + + Member search = new Member(); + search.setSiteIdx(Integer.parseInt(tripleVO.getUserId().substring(0, 3), 16)); + search.setMemId(tripleVO.getUserId().substring(3, tripleVO.getUserId().length())); + + if(tripleVO.getDetailStr() == null) { + tripleVO.setDetailStr("{}"); + } + + if(tripleVO.getMinusBalanceYn() == null) { + tripleVO.setMinusBalanceYn("N"); + } + + // 스포츠 배팅 + responseObj = sportDService.betProc(search, tripleVO); + + if(responseObj.getString("result_code").equals("0") || + responseObj.getString("result_code").equals("70") || + responseObj.getString("result_code").equals("80") || + responseObj.getString("result_code").equals("98") || + responseObj.getString("result_code").equals("99") || + responseObj.getString("result_code").equals("44") || + responseObj.getString("result_code").equals("1005") || + responseObj.getString("result_code").equals("3333") ) { + + // 0 70 80 98 99 + httpStatus = HttpStatus.OK; + } else { + httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; + } + } catch(Exception e) { + responseObj.put("result_code", 1111); + responseObj.put("error_msg","UNKNOWN_ERROR"); + httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; + log.error(LOG_PREFIX+ "Exception::"+e.getMessage()); + } + + log.info(LOG_PREFIX+ "Response::" + responseObj.toString()); + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -1.5) { + log.error(LOG_PREFIX+ "[callback::diffTime : " + String.format("%.3f", diffTime) + "]"); + } + return new ResponseEntity(responseObj, httpStatus); + } + + + @PostMapping("/purchaseId") + public ResponseEntity callPurchaseId(HttpServletRequest request, @RequestBody TriplePurchaseId tripleVO) { + + JSONObject responseObj = new JSONObject(); + HttpStatus httpStatus = HttpStatus.OK; + final String LOG_PREFIX = "#-SPORT::callPurchaseId::"+tripleVO.getBetId()+"::"+tripleVO.getPurchaseId()+"::"; + + + log.info(LOG_PREFIX + "request::"+tripleVO); + + try { + int result = sportService.updatePurchaseId(tripleVO); + + if(result >= 0) { + responseObj.put("result_code", 0); + } else { + responseObj.put("result_code", -99); + responseObj.put("error_msg","UPDATE_ERROR"); + } + } catch(Exception e) { + responseObj.put("result_code", -11); + responseObj.put("error_msg","UNKNOWN_ERROR"); + log.error(LOG_PREFIX + "Exception::"+e.getMessage()); + } + + log.info(LOG_PREFIX + responseObj.toString()); + + return new ResponseEntity(responseObj, httpStatus); + } + + + @PostMapping("/changebalance/slot2") + public ResponseEntity changeBalanceSlot(HttpServletRequest request, @RequestBody TripleVO tripleVO) { + long startTime = System.currentTimeMillis(); + + net.sf.json.JSONObject responseObj = new net.sf.json.JSONObject(); + HttpStatus httpStatus = null; + + final String LOG_PREFIX = "#-callbackSlot::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::"+tripleVO.getTranType()+"::::"; + + if(tripleVO.getRequestAt() == null || tripleVO.getRequestAt().equals("")) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + long nDate = System.currentTimeMillis(); + String requestAtStr = sdf.format(nDate); + tripleVO.setRequestAt(requestAtStr); + } + + log.info(LOG_PREFIX+ "changeBalanceSlot::TripleVO : " + tripleVO); + + try { + Member search = new Member(); + search.setSiteIdx(Integer.parseInt(tripleVO.getUserId().substring(0, 3), 16)); + search.setMemId(tripleVO.getUserId().substring(3, tripleVO.getUserId().length())); + + responseObj = tripleService.betProcSlot(LOG_PREFIX, search, tripleVO); + + if(responseObj.getString("result_code").equals("0") || + responseObj.getString("result_code").equals("70") || + responseObj.getString("result_code").equals("80") || + responseObj.getString("result_code").equals("98") || + responseObj.getString("result_code").equals("99") || + responseObj.getString("result_code").equals("44") || + responseObj.getString("result_code").equals("1005") || + responseObj.getString("result_code").equals("3333") ) { + + // 0 70 80 98 99 + httpStatus = HttpStatus.OK; + } else { + httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; + } + } catch(Exception e) { + responseObj.put("result_code", 1111); + responseObj.put("error_msg","UNKNOWN_ERROR"); + httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; + log.error(LOG_PREFIX+ "Exception::"+e.getMessage()); + } + + log.info(LOG_PREFIX+ "changeBalanceSlot::Response::" + responseObj.toString()); + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + log.info(LOG_PREFIX+ "changeBalanceSlot::[diffTime : " + String.format("%.3f", diffTime) + "]"); + + return new ResponseEntity(responseObj, httpStatus); + } + + + //@Scheduled(fixedDelay = 30000) // 작업 종류 후 120초 마다 + public void betWaitAutoProcByCasino() throws Exception { + + final String LOG_PREFIX = "#-WaitAutoProc::CASINO:::"; + + try { + CronServerInfo cronStatus = new CronServerInfo(); + cronStatus.setHostName(InetAddress.getLocalHost().getHostName()); + cronStatus.setIpAddress(InetAddress.getLocalHost().getHostAddress()); + cronStatus.setCronType("WAIT"); + log.info(LOG_PREFIX+ "HostName: " + cronStatus.getHostName() + ", HostAddress: " + cronStatus.getIpAddress()); + cronStatus = commonService.getServerCronStatus(cronStatus); + log.info(LOG_PREFIX+ "cronStatus: " + cronStatus); + + if(cronStatus != null && cronStatus.getRunYn().equals("Y")) { + List betWaitList = betService.getTripleBetWaitListByCasino(); + log.info(LOG_PREFIX+ "betWaitList.size() : " + betWaitList.size()); + for(HashMap betItem : betWaitList) { + String siteId = betItem.get("siteId").toString(); + long betIdx = (long) betItem.get("betIdx"); + + try { + // 배팅 패배 처리 + HashMap mapParam = new HashMap(); + mapParam.put("betIdx", betIdx); + mapParam.put("betWinAmt", "0"); + + int afMoney = Integer.parseInt(betItem.get("afMoney").toString()); + int winAmt = 0; + afMoney = afMoney + winAmt; + mapParam.put("afMoney", Integer.toString(afMoney)); + + log.debug(LOG_PREFIX+ "배팅 자동 패배 처리중 ["+betIdx+"] - start: " + mapParam); + betService.updateEndAutoLose(mapParam); + log.debug(LOG_PREFIX+ "배팅 자동 패배 처리중 ["+betIdx+"] - end: " + mapParam); + } catch(Exception e) { + log.error(LOG_PREFIX+ "[Exception1]::"+e.toString()); + e.printStackTrace(); + } + } + } + + } catch(Exception e) { + log.error(LOG_PREFIX+ "[Exception2]::"+e.toString()); + e.printStackTrace(); + } + } + + + //@Scheduled(fixedDelay = 30000) // 작업 종류 후 120초 마다 + public void betWaitAutoProcBySlot() throws Exception { + + final String LOG_PREFIX = "#-WaitAutoProc::SLOT:::"; + + try { + CronServerInfo cronStatus = new CronServerInfo(); + cronStatus.setHostName(InetAddress.getLocalHost().getHostName()); + cronStatus.setIpAddress(InetAddress.getLocalHost().getHostAddress()); + cronStatus.setCronType("WAIT"); + log.info(LOG_PREFIX+ "HostName: " + cronStatus.getHostName() + ", HostAddress: " + cronStatus.getIpAddress()); + cronStatus = commonService.getServerCronStatus(cronStatus); + log.info(LOG_PREFIX+ "cronStatus: " + cronStatus); + + if(cronStatus != null && cronStatus.getRunYn().equals("Y")) { + List betWaitList = betService.getTripleBetWaitListBySlot(); + log.info(LOG_PREFIX+ "betWaitList.size() : " + betWaitList.size()); + for(HashMap betItem : betWaitList) { + String siteId = betItem.get("siteId").toString(); + long betIdx = (long) betItem.get("betIdx"); + + try { + // 배팅 패배 처리 + HashMap mapParam = new HashMap(); + mapParam.put("betIdx", betIdx); + mapParam.put("betWinAmt", "0"); + + int afMoney = Integer.parseInt(betItem.get("afMoney").toString()); + int winAmt = 0; + afMoney = afMoney + winAmt; + mapParam.put("afMoney", Integer.toString(afMoney)); + + log.debug(LOG_PREFIX+ "배팅 자동 패배 처리중 ["+betIdx+"] - start: " + mapParam); + betService.updateEndAutoLose(mapParam); + log.debug(LOG_PREFIX+ "배팅 자동 패배 처리중 ["+betIdx+"] - end: " + mapParam); + } catch(Exception e) { + log.error(LOG_PREFIX+ "[Exception1]::"+e.toString()); + e.printStackTrace(); + } + } + } + + } catch(Exception e) { + log.error(LOG_PREFIX+ "[Exception2]::"+e.toString()); + e.printStackTrace(); + } + } + + + //@Scheduled(fixedDelay = 60000) // 작업 종류 후 1분 마다 + public void betWaitAutoProc2() throws Exception { + try { + CronServerInfo cronStatus = new CronServerInfo(); + cronStatus.setHostName(InetAddress.getLocalHost().getHostName()); + cronStatus.setIpAddress(InetAddress.getLocalHost().getHostAddress()); + cronStatus.setCronType("WAIT2"); + log.debug("##- [WaitAutoProc2][OMS CRON STATUS] HostName: " + cronStatus.getHostName() + ", HostAddress: " + cronStatus.getIpAddress()); + cronStatus = commonService.getServerCronStatus(cronStatus); + log.debug("##- [WaitAutoProc2][OMS CRON STATUS] cronStatus: " + cronStatus); + + if(cronStatus != null && cronStatus.getRunYn().equals("Y")) { + log.info("##- [WaitAutoProc2] Triple API getTripleBetWaitList2() Start -###"); + List betWaitList = betService.getTripleBetWaitList2(); + log.info("##- [WaitAutoProc2] Triple API getTripleBetWaitList2.size() : " + betWaitList.size()); + for(HashMap betItem : betWaitList) { + log.debug("##- [WaitAutoProc2] Triple API betItem : " + betItem.toString()); + + String siteId = betItem.get("siteId").toString(); + String memId = betItem.get("memId").toString(); + long betIdx = (long) betItem.get("betIdx"); + String betId = betItem.get("betId").toString(); + String updDate = betItem.get("updDate").toString(); + + int isCancel = (int) betItem.get("isCancel"); + + if(isCancel == 0) { + // 배팅 정상 처리 + log.debug("##- [WaitAutoProc2] 배팅 대기상태 정상 처리 -시작-"); + + int creditAmt = (int) betItem.get("credit"); + + HashMap mapParam = new HashMap(); + mapParam.put("betIdx", betIdx); + mapParam.put("betWinAmt", Integer.toString(creditAmt)); + + int afMoney = Integer.parseInt(betItem.get("afMoney").toString()); + afMoney = afMoney + creditAmt; + mapParam.put("afMoney", Integer.toString(afMoney)); + mapParam.put("siteId", siteId); + mapParam.put("data", "{}"); + + log.debug("##- [WaitAutoProc2] 배팅 결과 처리중 ["+betId+"]["+betIdx+"] - start: " + mapParam); + betService.updateEnd(mapParam); + log.debug("##- [WaitAutoProc2] 배팅 결과 처리중 ["+betId+"]["+betIdx+"] - end: " + mapParam); + + log.debug("##- [WaitAutoProc2] 배팅 대기상태 정상 처리 -끝-"); + } else { + // 배팅 취소 처리 + log.info("##- [WaitAutoProc2] 배팅 대기상태 취소 처리 -시작-"); + int creditAmt = (int) betItem.get("credit"); + HashMap param = new HashMap(); + param.put("betIdx", betIdx); + param.put("betStatus", "CANCEL"); + param.put("betWinAmt", Integer.toString(creditAmt)); + param.put("data", "{}"); + + int betCancelAmt = Integer.parseInt(betItem.get("betAmt").toString()); + + log.debug("##- [WaitAutoProc2] 배팅 취소 처리중 ["+betId+"]["+betIdx+"] - start: " + param); + int resultBet = betService.betCancelTriple(param); + log.debug("##- [WaitAutoProc2] 배팅 취소 처리중 ["+betId+"]["+betIdx+"] - end: " + param); + + log.debug("##- [WaitAutoProc2] 배팅 대기상태 취소 처리 -끝-"); + } + } + } + + } catch(Exception e) { + log.error(e.toString()); + e.printStackTrace(); + } + } + + + @PostMapping("/gameRateChange") + public ResponseEntity gameRateChange(HttpServletRequest request, @RequestBody TripleGameRate gameRateVO) throws Exception { + net.sf.json.JSONObject responseObj = new net.sf.json.JSONObject(); + HttpStatus httpStatus = null; + log.info("### Triple API ### - call \"/gameRateChange\" gameRateVO: " + gameRateVO); + + try { + List> compList = compService.getGameRateCompList(gameRateVO); + for(HashMap compGameRateInfo : compList) { + compGameRateInfo.put("vendor", gameRateVO.getVendor()); + compGameRateInfo.put("gameRate", gameRateVO.getGameRate()); + log.info("### Triple API ### gameRateChange() update start compGameRateInfo : " + compGameRateInfo); + int updResult = compService.updateCompGameRate(compGameRateInfo); + log.info("### Triple API ### gameRateChange() update result: " + updResult); + } + + responseObj.put("result_code", 0); + httpStatus = HttpStatus.OK; + } catch(Exception e) { + responseObj.put("result_code", 1111); + responseObj.put("errors","UNKNOWN_ERROR"); + httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; + log.error(e.getMessage()); + } + log.info("### Triple API Controller ### - call \"/gameRateChange\" response : " + responseObj); + return new ResponseEntity(responseObj, httpStatus); + } +} diff --git a/src/main/java/com/bb/dao/BetDao.java b/src/main/java/com/bb/dao/BetDao.java new file mode 100644 index 0000000..72af88f --- /dev/null +++ b/src/main/java/com/bb/dao/BetDao.java @@ -0,0 +1,260 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import jakarta.validation.Valid; + +import com.bb.model.AdminBetSearch; +import com.bb.model.BetAutoLoseVO; +import com.bb.model.BetData; +import com.bb.model.BetDetail; +import com.bb.model.BetSearch; +import com.bb.model.BetSplusSearch; +import com.bb.model.Member; +import com.bb.model.RetailBetSearch; +import com.bb.model.RvHoldemVO; +import com.bb.model.TriplePurchaseId; +import com.bb.model.TripleVO; +import com.bb.model.TrxSearchVO; + +public interface BetDao { + + int insertBet(HashMap param); + + int insertBetMap(HashMap param); + + int updateEnd(HashMap mapParam); + + int updateEndOld(HashMap mapParam); + + int updateMapEnd(HashMap mapParam); + + int updateMapEndOld(HashMap mapParam); + + void updateEndAutoLose(HashMap mapParam); + + Long getBetIdxByGameIdx(String betId); + + Long getBetIdxByBetId(String betId); + + int getBetListCnt(BetSearch search); + + List getBetList(BetSearch search); + + int getFastBetIdListCnt(AdminBetSearch search); + + List> getFastBetIdList(AdminBetSearch search); + + HashMap getFastBetItem(HashMap item); + + int getBetListNewCnt(AdminBetSearch search); + + List getBetListNew(AdminBetSearch search); + + int getPowerballResultListCnt(BetSearch search); + + List getPowerballResultList(BetSearch search); + + HashMap getGameRataMiniGame(@Valid BetData betData); + + List getWaitBetlist(Map pParam); + + void updateBetInfoMapByPowerball(HashMap betInfo); + + void updateBetInfoMapResultByPowerball(HashMap betInfo); + + void insertCashByPowerball(HashMap betInfo); + + void updateBetInfoByPowerball(HashMap betInfo); + + void insertPointByPowerball(HashMap betInfo); + + void updatePointRegYnByPowerball(HashMap betInfo); + + int getTripleTxnCheck(String tranId); + + int getTripleDebitCheckByBetId(String betId); + + int getBetinfoCheckByBetId(String betId); + + int getTripleDebitCheckByTranId(String tranid); + + int getTripleCreditCheckByBetId(String betId); + + int getTripleCreditCheckByTranId(String tranid); + + int getTripleIsCancelCheck(String betId); + + int insertTripleTxnData(TripleVO tripleVO); + + BetDetail getBetDetail(long betIdx); + + int betCancelTriple(HashMap param); + + int betCancelOldTriple(HashMap param); + + int betCancelMega(HashMap param); + + int getTripleIsBonusCheck(String betid); + + int getUserBetListCnt(BetSearch search); + + List getUserBetList(BetSearch search); + + int getUserBetListNewCnt(BetSearch search); + + List getUserBetListNew(BetSearch search); + + int insertBetBonus(HashMap param); + + int updateBetInfo(HashMap param); + + int updateBetInfoOld(HashMap param); + + int updateBetInfoMap(HashMap param); + + int updateBetInfoMapOld(HashMap param); + + Long getCashIdx(HashMap param); + + int updateCashInfo(HashMap param); + + int updateUserCashByAmount(HashMap param); + + int updateUserCashByBalance(HashMap param); + + int getBottomBetListCnt(RetailBetSearch search); + + List getBottomBetList(RetailBetSearch search); + + int getTripleAutoCancelCheck(String tranId); + + int updateTripleTxnData(TripleVO tripleVO); + + int betAutoCancelTriple(HashMap param); + + List getTripleBetWaitListByCasino(); + + List getTripleBetWaitListBySlot(); + + HashMap getSiteBetLimitInfo(TripleVO tripleVO); + + List getTripleBetWaitList2(); + + List getBetPointList(); + + List getBetPointListBySite(String siteId); + + int getTrxListCnt(TrxSearchVO searchVO); + + List> getTrxList(TrxSearchVO searchVO); + + BetAutoLoseVO getBetInfoByBetId(String betId); + + int insertCashInfoByReserve(HashMap cashInsertParam); + + int insertBetSplusInfo(HashMap param); + + int updateSplusStatus(HashMap param); + + int getSportBetListCnt(BetSplusSearch search); + + List getSportBetList(BetSplusSearch search); + + int getSportEventListCnt(BetSplusSearch search); + + List getSportEventList(BetSplusSearch search); + + int getSportEventDetailListCnt(BetSplusSearch search); + + List getSportEventDetailList(BetSplusSearch search); + + int getSportBottomBetListCnt(BetSplusSearch search); + + List getSportBottomBetList(BetSplusSearch search); + + int updateSplusBetCancel(HashMap param); + + int updatePurchaseId(TriplePurchaseId tripleVO); + + int insertSlotTranInfo(HashMap param); + + int updateSportReport(HashMap repParam); + + int updateSportReportDebit(HashMap repParam); + + int updateSportReportCredit(HashMap repParam); + + int updateSportReportCancel(HashMap repParam); + + int updateSportReportRolling(long betIdx); + + int updateSportReportRollingCancel(long betIdx); + + String getBetType(String betId); + + HashMap getBetTodayTotalInfo(HashMap betItem); + + int getCurBalance(Member memInfo); + + HashMap getSiteVendorInfo(HashMap vParam); + + int insertBetNew(HashMap betData); + + HashMap getReferenceData1(String betId); + + HashMap getReferenceData2(String betId); + + int cancelBetNew(HashMap betData); + + int cancelBetNew2(long betIdx); + + int bonusBetNew(HashMap betData); + + HashMap getRollingInfo(HashMap betData); + + HashMap getBetTodayTotalInfoNew(HashMap betData); + + int insertBetRolling(HashMap betData); + + int updateRollingYn(HashMap betData); + + List getCancelPointAmtList(String betId); + + List getCancelPointAmtList2(long betIdx); + + int deleteRollingCancel(String betId); + + int deleteRollingCancel2(long betIdx); + + int deleteLosingCancel(String betId); + + int deleteLosingCancel2(long betIdx); + + int updateUserCashByAmountNew(HashMap balanceParam); + + HashMap getPreBetData(HashMap betData); + + int insertSportBetRolling(long betIdx); + + int deleteSportRollingCancel(long betIdx); + + int updateSportRollingYn(long betIdx); + + int updateCancelPoint(HashMap betData); + + Long getCancelTargetIdx(HashMap betData); + + int updateUserCashByAmountD(HashMap param); + + int insertRvhCallbackLog(RvHoldemVO rvParam); + + int insertBetLosing(HashMap betData); + + int insertBetLosingNew(HashMap betData); + + int insertWinLosing(HashMap betData); + +} diff --git a/src/main/java/com/bb/dao/BetDaoImpl.java b/src/main/java/com/bb/dao/BetDaoImpl.java new file mode 100644 index 0000000..7386a68 --- /dev/null +++ b/src/main/java/com/bb/dao/BetDaoImpl.java @@ -0,0 +1,747 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import jakarta.validation.Valid; + +import org.apache.ibatis.session.SqlSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Repository; + +import com.bb.model.AdminBetSearch; +import com.bb.model.BetAutoLoseVO; +import com.bb.model.BetData; +import com.bb.model.BetDetail; +import com.bb.model.BetSearch; +import com.bb.model.BetSplusSearch; +import com.bb.model.Member; +import com.bb.model.RetailBetSearch; +import com.bb.model.RvHoldemVO; +import com.bb.model.TriplePurchaseId; +import com.bb.model.TripleVO; +import com.bb.model.TrxSearchVO; + +@Repository("betDao") +public class BetDaoImpl implements BetDao { + + /** 메인DB 연결 */ + @Autowired @Qualifier("sqlSessionMain") + protected SqlSession sqlSession; + + /** 서브DB 연결 */ + @Autowired @Qualifier("sqlSessionSub") + protected SqlSession sqlSessionSub; + + + @Override + public int insertBet(HashMap param) { + return sqlSession.insert("insertBet", param); + } + + @Override + public int insertBetMap(HashMap param) { + return sqlSession.insert("insertBetMap", param); + } + + @Override + public int updateEnd(HashMap mapParam) { + // TODO Auto-generated method stub + return sqlSession.update("updateEnd", mapParam); + } + + @Override + public int updateEndOld(HashMap mapParam) { + // TODO Auto-generated method stub + return sqlSession.update("updateEndOld", mapParam); + } + + @Override + public int updateMapEnd(HashMap mapParam) { + // TODO Auto-generated method stub + return sqlSession.update("updateMapEnd", mapParam); + } + + @Override + public int updateMapEndOld(HashMap mapParam) { + // TODO Auto-generated method stub + return sqlSession.update("updateMapEndOld", mapParam); + } + + @Override + public void updateEndAutoLose(HashMap mapParam) { + // TODO Auto-generated method stub + sqlSession.update("updateEndAutoLose", mapParam); + } + + @Override + public Long getBetIdxByGameIdx(String betId) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getBetIdxByGameIdx", betId); + } + + @Override + public Long getBetIdxByBetId(String betId) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getBetIdxByBetId", betId); + } + + @Override + public int getBetListCnt(BetSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getBetListCnt", search); + } + + @Override + public List getBetList(BetSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getBetList", search); + } + + @Override + public int getFastBetIdListCnt(AdminBetSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getFastBetIdListCnt", search); + } + + @Override + public List> getFastBetIdList(AdminBetSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getFastBetIdList", search); + } + + @Override + public HashMap getFastBetItem(HashMap item) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getFastBetItem", item); + } + + @Override + public int getBetListNewCnt(AdminBetSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getBetListNewCnt", search); + } + + @Override + public List getBetListNew(AdminBetSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getBetListNew", search); + } + + @Override + public int getPowerballResultListCnt(BetSearch search) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getPowerballResultListCnt", search); + } + + @Override + public List getPowerballResultList(BetSearch search) { + // TODO Auto-generated method stub + return sqlSession.selectList("getPowerballResultList", search); + } + + @Override + public HashMap getGameRataMiniGame(@Valid BetData betData) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getGameRataMiniGame", betData); + } + + @Override + public List getWaitBetlist(Map pParam) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getWaitBetlist", pParam); + } + + @Override + public void updateBetInfoMapByPowerball(HashMap betInfo) { + // TODO Auto-generated method stub + sqlSession.update("updateBetInfoMapByPowerball", betInfo); + } + + @Override + public void updateBetInfoMapResultByPowerball(HashMap betInfo) { + // TODO Auto-generated method stub + sqlSession.update("updateBetInfoMapResultByPowerball", betInfo); + } + + @Override + public void insertCashByPowerball(HashMap betInfo) { + // TODO Auto-generated method stub + sqlSession.insert("insertCashByPowerball", betInfo); + } + + @Override + public void updateBetInfoByPowerball(HashMap betInfo) { + // TODO Auto-generated method stub + sqlSession.update("updateBetInfoByPowerball", betInfo); + } + + @Override + public void insertPointByPowerball(HashMap betInfo) { + // TODO Auto-generated method stub + sqlSession.insert("insertPointByPowerball", betInfo); + } + + @Override + public void updatePointRegYnByPowerball(HashMap betInfo) { + // TODO Auto-generated method stub + sqlSession.update("updatePointRegYnByPowerball", betInfo); + } + + @Override + public int getTripleTxnCheck(String tranId) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getTripleTxnCheck", tranId); + } + + @Override + public int getTripleDebitCheckByBetId(String betId) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getTripleDebitCheckByBetId", betId); + } + + @Override + public int getBetinfoCheckByBetId(String betId) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getBetinfoCheckByBetId", betId); + } + + @Override + public int getTripleDebitCheckByTranId(String tranid) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getTripleDebitCheckByTranId", tranid); + } + + @Override + public int getTripleCreditCheckByBetId(String betId) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getTripleCreditCheckByBetId", betId); + } + + @Override + public int getTripleCreditCheckByTranId(String tranid) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getTripleCreditCheckByTranId", tranid); + } + + @Override + public int getTripleIsCancelCheck(String betId) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getTripleIsCancelCheck", betId); + } + + @Override + public int getTripleIsBonusCheck(String betId) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getTripleIsBonusCheck", betId); + } + + @Override + public int insertTripleTxnData(TripleVO tripleVO) { + // TODO Auto-generated method stub + return sqlSession.insert("insertTripleTxnData", tripleVO); + } + + @Override + public BetDetail getBetDetail(long betIdx) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getBetDetail", betIdx); + } + + @Override + public int betCancelTriple(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.update("betCancelTriple", param); + } + + @Override + public int betCancelOldTriple(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.update("betCancelOldTriple", param); + } + + @Override + public int betCancelMega(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.update("betCancelMega", param); + } + + @Override + public int getUserBetListCnt(BetSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getUserBetListCnt", search); + } + + @Override + public List getUserBetList(BetSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getUserBetList", search); + } + + @Override + public int getUserBetListNewCnt(BetSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getUserBetListNewCnt", search); + } + + @Override + public List getUserBetListNew(BetSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getUserBetListNew", search); + } + + @Override + public int insertBetBonus(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.insert("insertBetBonus", param); + } + + @Override + public int updateBetInfo(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.update("updateBetInfo", param); + } + + @Override + public int updateBetInfoOld(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.update("updateBetInfoOld", param); + } + + @Override + public int updateBetInfoMap(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.update("updateBetInfoMap", param); + } + + @Override + public int updateBetInfoMapOld(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.update("updateBetInfoMapOld", param); + } + + @Override + public Long getCashIdx(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getCashIdx", param); + } + + @Override + public int updateCashInfo(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.update("updateCashInfo", param); + } + + @Override + public int updateUserCashByAmount(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.update("updateUserCashByAmount", param); + } + + @Override + public int updateUserCashByBalance(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.update("updateUserCashByBalance", param); + } + + @Override + public int getBottomBetListCnt(RetailBetSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getBottomBetListCnt", search); + } + + @Override + public List getBottomBetList(RetailBetSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getBottomBetList", search); + } + + @Override + public int getTripleAutoCancelCheck(String tranId) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getTripleAutoCancelCheck", tranId); + } + + @Override + public int updateTripleTxnData(TripleVO tripleVO) { + // TODO Auto-generated method stub + return sqlSession.update("updateTripleTxnData", tripleVO); + } + + @Override + public int betAutoCancelTriple(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.update("betAutoCancelTriple", param); + } + + @Override + public List getTripleBetWaitListByCasino() { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getTripleBetWaitListByCasino"); + } + + @Override + public List getTripleBetWaitListBySlot() { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getTripleBetWaitListBySlot"); + } + + @Override + public HashMap getSiteBetLimitInfo(TripleVO tripleVO) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getSiteBetLimitInfo", tripleVO); + } + + @Override + public List getTripleBetWaitList2() { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getTripleBetWaitList2"); + } + + @Override + public List getBetPointList() { + // TODO Auto-generated method stub +// return sqlSessionSub.selectList("getBetPointList"); + return sqlSession.selectList("getBetPointList"); + } + + @Override + public List getBetPointListBySite(String siteId) { + // TODO Auto-generated method stub +// return sqlSessionSub.selectList("getBetPointListBySite", siteId); + return sqlSession.selectList("getBetPointListBySite", siteId); + } + + @Override + public int getTrxListCnt(TrxSearchVO searchVO) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getTrxListCnt", searchVO); + } + + @Override + public List> getTrxList(TrxSearchVO searchVO) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getTrxList", searchVO); + } + + @Override + public BetAutoLoseVO getBetInfoByBetId(String betId) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getBetInfoByBetId", betId); + } + + @Override + public int insertCashInfoByReserve(HashMap cashInsertParam) { + // TODO Auto-generated method stub + return sqlSession.insert("insertCashInfoByReserve", cashInsertParam); + } + + @Override + public int insertBetSplusInfo(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.insert("insertBetSplusInfo", param); + } + + @Override + public int updateSplusStatus(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.update("updateSplusStatus", param); + } + + @Override + public int getSportBetListCnt(BetSplusSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getSportBetListCnt", search); + } + + @Override + public List getSportBetList(BetSplusSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getSportBetList", search); + } + + @Override + public int getSportEventListCnt(BetSplusSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getSportEventListCnt", search); + } + + @Override + public List getSportEventList(BetSplusSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getSportEventList", search); + } + + @Override + public int getSportEventDetailListCnt(BetSplusSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getSportEventDetailListCnt", search); + } + + @Override + public List getSportEventDetailList(BetSplusSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getSportEventDetailList", search); + } + + @Override + public int getSportBottomBetListCnt(BetSplusSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getSportBottomBetListCnt", search); + } + + @Override + public List getSportBottomBetList(BetSplusSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getSportBottomBetList", search); + } + + @Override + public int updateSplusBetCancel(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.update("updateSplusBetCancel", param); + } + + @Override + public int updatePurchaseId(TriplePurchaseId tripleVO) { + // TODO Auto-generated method stub + return sqlSession.update("updatePurchaseId", tripleVO); + } + + @Override + public int insertSlotTranInfo(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.insert("insertSlotTranInfo", param); + } + + @Override + public int updateSportReport(HashMap repParam) { + // TODO Auto-generated method stub + return sqlSession.update("updateSportReport", repParam); + } + + @Override + public int updateSportReportDebit(HashMap repParam) { + // TODO Auto-generated method stub + return sqlSession.update("updateSportReportDebit", repParam); + } + + @Override + public int updateSportReportCredit(HashMap repParam) { + // TODO Auto-generated method stub + return sqlSession.update("updateSportReportCredit", repParam); + } + + @Override + public int updateSportReportCancel(HashMap repParam) { + // TODO Auto-generated method stub + return sqlSession.update("updateSportReportCancel", repParam); + } + + @Override + public int updateSportReportRolling(long betIdx) { + // TODO Auto-generated method stub + return sqlSession.update("updateSportReportRolling", betIdx); + } + + @Override + public int updateSportReportRollingCancel(long betIdx) { + // TODO Auto-generated method stub + return sqlSession.update("updateSportReportRollingCancel", betIdx); + } + + @Override + public String getBetType(String betId) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getBetType", betId); + } + + @Override + public HashMap getBetTodayTotalInfo(HashMap betItem) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getBetTodayTotalInfo", betItem); + } + + @Override + public int getCurBalance(Member memInfo) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getCurBalance", memInfo); + } + + @Override + public HashMap getSiteVendorInfo(HashMap vParam) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getSiteVendorInfo", vParam); + } + + @Override + public int insertBetNew(HashMap betData) { + // TODO Auto-generated method stub + return sqlSession.insert("insertBetNew", betData); + } + + @Override + public HashMap getReferenceData1(String betId) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getReferenceData1", betId); + } + + @Override + public HashMap getReferenceData2(String betId) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getReferenceData2", betId); + } + + @Override + public int cancelBetNew(HashMap betData) { + // TODO Auto-generated method stub + return sqlSession.update("cancelBetNew", betData); + } + + @Override + public int cancelBetNew2(long betIdx) { + // TODO Auto-generated method stub + return sqlSession.update("cancelBetNew2", betIdx); + } + + @Override + public int bonusBetNew(HashMap betData) { + // TODO Auto-generated method stub + return sqlSession.update("bonusBetNew", betData); + } + + @Override + public HashMap getRollingInfo(HashMap betData) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getRollingInfo", betData); + } + + @Override + public HashMap getBetTodayTotalInfoNew(HashMap betData) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getBetTodayTotalInfoNew", betData); + } + + @Override + public int insertBetRolling(HashMap betData) { + // TODO Auto-generated method stub + return sqlSession.insert("insertBetRolling", betData); + } + + @Override + public int updateRollingYn(HashMap betData) { + // TODO Auto-generated method stub + return sqlSession.update("updateRollingYn", betData); + } + + @Override + public List getCancelPointAmtList(String betId) { + // TODO Auto-generated method stub + return sqlSession.selectList("getCancelPointAmtList", betId); + } + + @Override + public List getCancelPointAmtList2(long betIdx) { + // TODO Auto-generated method stub + return sqlSession.selectList("getCancelPointAmtList2", betIdx); + } + + @Override + public int deleteRollingCancel(String betId) { + // TODO Auto-generated method stub + return sqlSession.delete("deleteRollingCancel", betId); + } + + @Override + public int deleteRollingCancel2(long betIdx) { + // TODO Auto-generated method stub + return sqlSession.delete("deleteRollingCancel2", betIdx); + } + + @Override + public int deleteLosingCancel(String betId) { + // TODO Auto-generated method stub + return sqlSession.delete("deleteLosingCancel", betId); + } + + @Override + public int deleteLosingCancel2(long betIdx) { + // TODO Auto-generated method stub + return sqlSession.delete("deleteLosingCancel2", betIdx); + } + + @Override + public int updateUserCashByAmountNew(HashMap balanceParam) { + // TODO Auto-generated method stub + return sqlSession.update("updateUserCashByAmountNew", balanceParam); + } + + @Override + public HashMap getPreBetData(HashMap betData) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getPreBetData", betData); + } + + @Override + public int insertSportBetRolling(long betIdx) { + // TODO Auto-generated method stub + return sqlSession.insert("insertSportBetRolling", betIdx); + } + + @Override + public int deleteSportRollingCancel(long betIdx) { + // TODO Auto-generated method stub + return sqlSession.delete("deleteSportRollingCancel", betIdx); + } + + @Override + public int updateSportRollingYn(long betIdx) { + // TODO Auto-generated method stub + return sqlSession.update("updateSportRollingYn", betIdx); + } + + @Override + public int updateCancelPoint(HashMap betData) { + // TODO Auto-generated method stub + return sqlSession.update("updateCancelPoint", betData); + } + + @Override + public Long getCancelTargetIdx(HashMap betData) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getCancelTargetIdx", betData); + } + + @Override + public int updateUserCashByAmountD(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.update("updateUserCashByAmountD", param); + } + + @Override + public int insertRvhCallbackLog(RvHoldemVO rvParam) { + // TODO Auto-generated method stub + return sqlSession.insert("insertRvhCallbackLog", rvParam); + } + + @Override + public int insertBetLosing(HashMap betData) { + // TODO Auto-generated method stub + return sqlSession.insert("insertBetLosing", betData); + } + + @Override + public int insertBetLosingNew(HashMap betData) { + // TODO Auto-generated method stub + return sqlSession.insert("insertBetLosingNew", betData); + } + + @Override + public int insertWinLosing(HashMap betData) { + // TODO Auto-generated method stub + return sqlSession.insert("insertWinLosing", betData); + } + +} diff --git a/src/main/java/com/bb/dao/BoardDao.java b/src/main/java/com/bb/dao/BoardDao.java new file mode 100644 index 0000000..b1369ac --- /dev/null +++ b/src/main/java/com/bb/dao/BoardDao.java @@ -0,0 +1,87 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import jakarta.validation.Valid; + +import com.bb.model.AnswerVo; +import com.bb.model.Board; +import com.bb.model.BoardListSearch; +import com.bb.model.Comment; +import com.bb.model.Message; +import com.bb.model.MessageListSearch; + +public interface BoardDao { + + int getBoardListCnt(@Valid BoardListSearch search); + + List getBoardList(@Valid BoardListSearch search); + + List getBoardIdxList(@Valid BoardListSearch search); + + int saveBoard(@Valid Board board); + + int saveCmt(@Valid Comment comment); + + Board getBoard(@Valid Board board); + + List getCmtList(Map param); + + Comment getComment(@Valid Comment comment); + + void viewAdd(Board boardetail); + + void adminRead(Board boardetail); + + void msgSend(@Valid Message message); + + void msgRead(@Valid Message message); + + void msgUpdate(@Valid Message message); + + int getMsgListCnt(@Valid MessageListSearch search); + + List getMsgList(@Valid MessageListSearch search); + + void allRead(@Valid Message message); + + void msgDel(@Valid Message message); + + int updateFaqStatus(int boardIdx); + + List getAnswerList(AnswerVo search); + + int saveAnswer(AnswerVo answer); + int updateAnswer(AnswerVo answer); + + int deleteAnswer(AnswerVo answer); + + List> getMainBoardList(BoardListSearch search); + + List> getMainBoardList2(BoardListSearch search); + + void msgDelList(@Valid Message message); + + int getUserMsgListCnt(@Valid MessageListSearch search); + + List getUserMsgList(@Valid MessageListSearch search); + + void userAnswerCmtRead(Board boardetail); + + void partnerMsgSend(@Valid Message message); + + Message getJoinMessage(String siteId); + + Board getSiteFlowBoard(BoardListSearch search); + + int deleteBoard(int boardIdx); + + void levelMsgSend(@Valid Message message); + + int setBoardViewYn(Board board); + + int deleteYBoard(int boardIdx); + +} diff --git a/src/main/java/com/bb/dao/BoardDaoImpl.java b/src/main/java/com/bb/dao/BoardDaoImpl.java new file mode 100644 index 0000000..e2f2314 --- /dev/null +++ b/src/main/java/com/bb/dao/BoardDaoImpl.java @@ -0,0 +1,242 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import jakarta.validation.Valid; + +import org.apache.ibatis.session.SqlSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Repository; + +import com.bb.model.AnswerVo; +import com.bb.model.Board; +import com.bb.model.BoardListSearch; +import com.bb.model.Comment; +import com.bb.model.Message; +import com.bb.model.MessageListSearch; + +@Repository("boardDao") +public class BoardDaoImpl implements BoardDao { + + + /** 메인DB 연결 */ + @Autowired @Qualifier("sqlSessionMain") + protected SqlSession sqlSession; + + /** 서브DB 연결 */ + @Autowired @Qualifier("sqlSessionSub") + protected SqlSession sqlSessionSub; + + @Override + public int getBoardListCnt(@Valid BoardListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getBoardListCnt", search); + } + + @Override + public List getBoardList(@Valid BoardListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getBoardList", search); + } + + @Override + public List getBoardIdxList(@Valid BoardListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getBoardIdxList", search); + } + + @Override + public int saveBoard(@Valid Board board) { + // TODO Auto-generated method stub + return sqlSession.insert("saveBoard", board); + } + + @Override + public int saveCmt(@Valid Comment comment) { + // TODO Auto-generated method stub + return sqlSession.insert("saveCmt", comment); + } + + @Override + public Board getBoard(@Valid Board board) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getBoard", board); + } + + @Override + public List getCmtList(Map param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getCmtList", param); + } + + @Override + public Comment getComment(@Valid Comment comment) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getComment", comment); + } + + @Override + public void viewAdd(Board boardetail) { + // TODO Auto-generated method stub + sqlSession.update("viewAdd", boardetail); + } + + @Override + public void adminRead(Board boardetail) { + // TODO Auto-generated method stub + sqlSession.update("adminRead", boardetail); + } + + @Override + public void msgSend(@Valid Message message) { + // TODO Auto-generated method stub + sqlSession.insert("msgSend", message); + } + + @Override + public void msgRead(@Valid Message message) { + // TODO Auto-generated method stub + sqlSession.insert("msgRead", message); + } + + @Override + public void msgUpdate(@Valid Message message) { + // TODO Auto-generated method stub + sqlSession.update("msgUpdate", message); + } + + @Override + public int getMsgListCnt(@Valid MessageListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMsgListCnt", search); + } + + @Override + public List getMsgList(@Valid MessageListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMsgList", search); + } + + @Override + public void allRead(@Valid Message message) { + // TODO Auto-generated method stub + sqlSession.insert("allRead", message); + } + + @Override + public void msgDel(@Valid Message message) { + // TODO Auto-generated method stub + sqlSession.insert("msgDel", message); + } + + @Override + public int updateFaqStatus(int boardIdx) { + // TODO Auto-generated method stub + return sqlSession.update("updateFaqStatus", boardIdx); + } + + @Override + public List getAnswerList(AnswerVo search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getAnswerList", search); + } + + @Override + public int saveAnswer(AnswerVo answer) { + // TODO Auto-generated method stub + return sqlSession.insert("saveAnswer", answer); + } + + @Override + public int updateAnswer(AnswerVo answer) { + // TODO Auto-generated method stub + return sqlSession.insert("updateAnswer", answer); + } + + @Override + public int deleteAnswer(AnswerVo answer) { + // TODO Auto-generated method stub + return sqlSession.update("deleteAnswer", answer); + } + + @Override + public List> getMainBoardList(BoardListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMainBoardList", search); + } + + @Override + public List> getMainBoardList2(BoardListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMainBoardList2", search); + } + + @Override + public void msgDelList(@Valid Message message) { + // TODO Auto-generated method stub + sqlSession.update("msgDelList", message); + } + + @Override + public int getUserMsgListCnt(@Valid MessageListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getUserMsgListCnt", search); + } + + @Override + public List getUserMsgList(@Valid MessageListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getUserMsgList", search); + } + + @Override + public void userAnswerCmtRead(Board boardetail) { + // TODO Auto-generated method stub + sqlSession.update("userAnswerCmtRead", boardetail); + } + + @Override + public void partnerMsgSend(@Valid Message message) { + // TODO Auto-generated method stub + sqlSession.insert("partnerMsgSend", message); + } + + @Override + public Message getJoinMessage(String siteId) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getJoinMessage", siteId); + } + + @Override + public Board getSiteFlowBoard(BoardListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getSiteFlowBoard", search); + } + + @Override + public int deleteBoard(int boardIdx) { + // TODO Auto-generated method stub + return sqlSession.delete("deleteBoard", boardIdx); + } + + @Override + public void levelMsgSend(@Valid Message message) { + // TODO Auto-generated method stub + sqlSession.insert("levelMsgSend", message); + } + + @Override + public int setBoardViewYn(Board board) { + // TODO Auto-generated method stub + return sqlSession.update("setBoardViewYn", board); + } + + @Override + public int deleteYBoard(int boardIdx) { + // TODO Auto-generated method stub + return sqlSession.update("deleteYBoard", boardIdx); + } +} diff --git a/src/main/java/com/bb/dao/CashDao.java b/src/main/java/com/bb/dao/CashDao.java new file mode 100644 index 0000000..b3e0f04 --- /dev/null +++ b/src/main/java/com/bb/dao/CashDao.java @@ -0,0 +1,97 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.bb.model.AdminCashSearch; +import com.bb.model.CashDetail; +import com.bb.model.CashQueVO; +import com.bb.model.CashSearch; +import com.bb.model.CashStatus; +import com.bb.model.CashTranLogSrch; +import com.bb.model.CouponSearch; +import com.bb.model.CouponVO; +import com.bb.model.Member; +import com.bb.model.MemberSearch; +import com.bb.model.Point; +import com.bb.model.PointSearch; +import com.bb.model.RetailCashSearch; + +public interface CashDao { + int insertCash(CashDetail cash); + void updateMyCash(CashDetail cash); + int getCashListCnt(CashSearch search); + List getCashList(CashSearch search); + HashMap getCashListSum(CashSearch search); + int updateStatus(CashStatus status); + int insertBetPoint(String LOG_PREFIX, HashMap mapParam); + HashMap getCashInfo(CashStatus status); + int updateCiAmt(Map param); + int updateCoAmt(Map param); + int getCashIOListCnt(CashSearch search); + List getCashIOList(CashSearch search); + HashMap getCashTotalListCnt(CashSearch search); + List getCashTotalList(CashSearch search); + int getPointListCnt(PointSearch search); + List getPointList(PointSearch search); + HashMap getPointSumInfo(PointSearch search); + int getPointListNewCnt(PointSearch search); + List getPointListNew(PointSearch search); + List getPointSum(PointSearch search); + long getMemCash(CashDetail cash); + HashMap getAccBankInfo(Member search); + long pointInsert(Point point); + void delCash(CashSearch search); + void updateMemPoint(Map param); + void updateUserGameMoney(HashMap cashParam); + String getCreditCheck(String siteId); + + int getCashSendListCnt(CashSearch search); + List> getCashSendList(CashSearch search); + int getAdminCashIOListCnt(AdminCashSearch search); + List getAdminCashIOList(AdminCashSearch search); + HashMap getAdminCashIOListSum(AdminCashSearch search); + int getAdminPointIOListCnt(AdminCashSearch search); + List getAdminPointIOList(AdminCashSearch search); + HashMap getAdminPointIOListSum(AdminCashSearch search); + int cashTransLogCnt(CashTranLogSrch search); + List cashTransLogList(CashTranLogSrch search); + int cashTransLogCnt2(CashTranLogSrch search); + List cashTransLogList2(CashTranLogSrch search); + List> getMainCashList(CashSearch param); + int getCashInCnt(Member search); + int getCashOutCnt(Member search); + int insertCashInfo(HashMap cashInfoParam); + int getCashinfoCnt(CashDetail paramCash); + int getCashinfoRetailCnt(CashDetail paramCash); + int getUserBalance(Member search); + int getPointinfoCnt(Point point); + int getBottomCashListCnt(RetailCashSearch search); + List getBottomCashList(RetailCashSearch search); + int getBottomCashListCnt2(RetailCashSearch search); + List getBottomCashList2(RetailCashSearch search); + int getMemCashForUpdate(MemberSearch search); + HashMap getLastCashIn(CashSearch search); + HashMap getLastCashInToBetSum(HashMap param); + HashMap getLastCashInToBonusPoint(HashMap param); + Integer getFirstDailyCnt(HashMap pointParam); + int getCashWaitTimeCheck(CashDetail paramCash); + List getCashQueList(); + long getBalance(CashQueVO item); + int updateQueStatus(HashMap param); + long cashInsertByCoupon(CashDetail cash); + int couponCreate(CouponVO coupon); + int updateCouponItem(CouponVO coupon); + int checkCouponNumber(String couponNumber); + CouponVO getCouponItem(String couponNumber); + int getCouponListCnt(CouponSearch search); + List> getCouponList(CouponSearch search); + int getMyCouponListCnt(CouponSearch search); + List> getMyCouponList(CouponSearch search); + HashMap getLastCashInBy24H(CashSearch search); + List> getLastCashInToBetSumBy24H(HashMap param); + int insertCashBonus(HashMap data); + HashMap getCashBonusInfo(long cashIdx); + int updateCashBonus(HashMap data); +} diff --git a/src/main/java/com/bb/dao/CashDaoImpl.java b/src/main/java/com/bb/dao/CashDaoImpl.java new file mode 100644 index 0000000..1ba0d8c --- /dev/null +++ b/src/main/java/com/bb/dao/CashDaoImpl.java @@ -0,0 +1,533 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.session.SqlSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Repository; + +import com.bb.model.AdminCashSearch; +import com.bb.model.CashDetail; +import com.bb.model.CashQueVO; +import com.bb.model.CashSearch; +import com.bb.model.CashStatus; +import com.bb.model.CashTranLogSrch; +import com.bb.model.CouponSearch; +import com.bb.model.CouponVO; +import com.bb.model.Member; +import com.bb.model.MemberSearch; +import com.bb.model.Point; +import com.bb.model.PointSearch; +import com.bb.model.RetailCashSearch; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Repository("CashDao") +public class CashDaoImpl implements CashDao { + + /** 메인DB 연결 */ + @Autowired @Qualifier("sqlSessionMain") + protected SqlSession sqlSession; + + /** 서브DB 연결 */ + @Autowired @Qualifier("sqlSessionSub") + protected SqlSession sqlSessionSub; + + + @Override + public int insertCash(CashDetail cash) { + return sqlSession.insert("insertCash", cash); + } + + @Override + public void updateMyCash(CashDetail cash) { + // TODO Auto-generated method stub + sqlSession.update("updateMyCash", cash); + } + + @Override + public int getCashListCnt(CashSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getCashListCnt", search); + } + + + @Override + public List getCashList(CashSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getCashList", search); + } + + @Override + public HashMap getCashListSum(CashSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getCashListSum", search); + } + + + @Override + public int updateStatus(CashStatus status) { + // TODO Auto-generated method stub + return sqlSession.update("cashUpdateStatus", status); + } + + + @Override + public int insertBetPoint(String LOG_PREFIX, HashMap mapParam) { + int pointResult = 0; + + int betRate = (int) mapParam.get("betRate"); + String gameCategory = mapParam.get("gameCategory").toString(); + String vendorCode = mapParam.get("vendorCode").toString(); + String isBlankSpinYn = mapParam.get("isBlankSpinYn").toString(); + + if(isBlankSpinYn.equals("N")) { + if(vendorCode.equals("33") || vendorCode.equals("powerball")) { + // "하이로우" 멀티 롤링요율 처리 + pointResult = sqlSession.insert("insertMultiBetPoint", mapParam); + log.debug("pointProc::SUCC::pointMultiResult::[" + pointResult + "]::betRate::[" + betRate + "]"); + } else { + if((gameCategory.equals("casino") && betRate >= 12)) { + log.info("pointProc::NONE::[betIdx::"+mapParam.get("betIdx")+"]::betRate::[" + betRate + "]"); + } else { + // Slot + // Sport + // Minigame ("하이로우" 멀티 롤링요율 제외) + // Casino AND betRate < 12 + pointResult = sqlSession.insert("insertBetPoint", mapParam); + log.debug("pointProc::SUCC::[betIdx::"+mapParam.get("betIdx")+"]::pointResult::[" + pointResult + "]::betRate::[" + betRate + "]"); + } + } + + } + + int betResult = sqlSession.update("updatePointRegY", mapParam); + log.debug(LOG_PREFIX+ "updatePointRegY::Result::" + betResult); + + return pointResult; + } + + + @Override + public HashMap getCashInfo(CashStatus status) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getCashInfo", status); + } + + + @Override + public int updateCiAmt(Map param) { + return sqlSession.update("updateCiAmt", param); + + } + + + @Override + public int updateCoAmt(Map param) { + return sqlSession.update("updateCoAmt", param); + + } + + + @Override + public int getCashIOListCnt(CashSearch search) { + return sqlSessionSub.selectOne("getCashIOListCnt", search); + } + + + @Override + public List getCashIOList(CashSearch search) { + return sqlSessionSub.selectList("getCashIOList", search); + } + + + @Override + public HashMap getCashTotalListCnt(CashSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getCashTotalListCnt", search); + } + + + @Override + public List getCashTotalList(CashSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getCashTotalList", search); + } + + + @Override + public int getPointListCnt(PointSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getPointListCnt", search); + } + + + @Override + public List getPointList(PointSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getPointList", search); + } + + + @Override + public HashMap getPointSumInfo(PointSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getPointSumInfo", search); + } + + + @Override + public int getPointListNewCnt(PointSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getPointListNewCnt", search); + } + + + @Override + public List getPointListNew(PointSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getPointListNew", search); + } + + + @Override + public List getPointSum(PointSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getPointSum", search); + } + + + @Override + public long getMemCash(CashDetail cash) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getMemCash", cash); + } + + + @Override + public HashMap getAccBankInfo(Member search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getAccBankInfo", search); + } + + + @Override + public long pointInsert(Point point) { + // TODO Auto-generated method stub + return sqlSession.insert("pointInsert", point); + } + + + @Override + public void delCash(CashSearch search) { + // TODO Auto-generated method stub + sqlSession.update("delCash", search); + } + + + @Override + public void updateMemPoint(Map param) { + // TODO Auto-generated method stub + sqlSession.update("updateMemPoint", param); + } + + + @Override + public void updateUserGameMoney(HashMap cashParam) { + // TODO Auto-generated method stub + sqlSession.update("updateUserGameMoney", cashParam); + } + + + @Override + public String getCreditCheck(String siteId) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getCreditCheck", siteId); + } + + @Override + public int getCashSendListCnt(CashSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getCashSendListCnt", search); + } + + @Override + public List> getCashSendList(CashSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getCashSendList", search); + } + + @Override + public int getAdminCashIOListCnt(AdminCashSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getAdminCashIOListCnt", search); + } + + @Override + public List getAdminCashIOList(AdminCashSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getAdminCashIOList", search); + } + + @Override + public HashMap getAdminCashIOListSum(AdminCashSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getAdminCashIOListSum", search); + } + + @Override + public int getAdminPointIOListCnt(AdminCashSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getAdminPointIOListCnt", search); + } + + @Override + public List getAdminPointIOList(AdminCashSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getAdminPointIOList", search); + } + + @Override + public HashMap getAdminPointIOListSum(AdminCashSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getAdminPointIOListSum", search); + } + + @Override + public int cashTransLogCnt(CashTranLogSrch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("cashTransLogCnt", search); + } + + @Override + public List cashTransLogList(CashTranLogSrch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("cashTransLogList", search); + } + + @Override + public int cashTransLogCnt2(CashTranLogSrch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("cashTransLogCnt2", search); + } + + @Override + public List cashTransLogList2(CashTranLogSrch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("cashTransLogList2", search); + } + + @Override + public List> getMainCashList(CashSearch param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMainCashList", param); + } + + @Override + public int getCashInCnt(Member search) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getCashInCnt", search); + } + + @Override + public int getCashOutCnt(Member search) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getCashOutCnt", search); + } + + @Override + public int insertCashInfo(HashMap cashInfoParam) { + // TODO Auto-generated method stub + return sqlSession.insert("insertCashInfo", cashInfoParam); + } + + @Override + public int getCashinfoCnt(CashDetail paramCash) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getCashinfoCnt", paramCash); + } + + @Override + public int getCashinfoRetailCnt(CashDetail paramCash) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getCashinfoRetailCnt", paramCash); + } + + @Override + public int getUserBalance(Member search) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getUserBalance", search); + } + + @Override + public int getPointinfoCnt(Point point) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getPointinfoCnt", point); + } + + @Override + public int getBottomCashListCnt(RetailCashSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getBottomCashListCnt", search); + } + + @Override + public List getBottomCashList(RetailCashSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getBottomCashList", search); + } + + @Override + public int getBottomCashListCnt2(RetailCashSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getBottomCashListCnt2", search); + } + + @Override + public List getBottomCashList2(RetailCashSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getBottomCashList2", search); + } + + @Override + public int getMemCashForUpdate(MemberSearch search) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getMemCashForUpdate", search); + } + + @Override + public HashMap getLastCashIn(CashSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getLastCashIn", search); + } + + @Override + public HashMap getLastCashInToBetSum(HashMap param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getLastCashInToBetSum", param); + } + + @Override + public HashMap getLastCashInToBonusPoint(HashMap param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getLastCashInToBonusPoint", param); + } + + @Override + public Integer getFirstDailyCnt(HashMap pointParam) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getFirstDailyCnt", pointParam); + } + + @Override + public int getCashWaitTimeCheck(CashDetail paramCash) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getCashWaitTimeCheck", paramCash); + } + + @Override + public List getCashQueList() { + // TODO Auto-generated method stub + return sqlSession.selectList("getCashQueList"); + } + + @Override + public long getBalance(CashQueVO item) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getBalance", item); + } + + @Override + public int updateQueStatus(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.update("updateQueStatus", param); + } + + @Override + public long cashInsertByCoupon(CashDetail cash) { + // TODO Auto-generated method stub + return sqlSession.insert("cashInsertByCoupon", cash); + } + + @Override + public int couponCreate(CouponVO couponVO) { + // TODO Auto-generated method stub + return sqlSession.insert("couponCreate", couponVO); + } + + @Override + public int updateCouponItem(CouponVO couponVO) { + // TODO Auto-generated method stub + return sqlSession.update("updateCouponItem", couponVO); + } + + @Override + public int checkCouponNumber(String couponNumber) { + // TODO Auto-generated method stub + return sqlSession.selectOne("checkCouponNumber", couponNumber); + } + + @Override + public CouponVO getCouponItem(String couponNumber) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getCouponItem", couponNumber); + } + + @Override + public int getCouponListCnt(CouponSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getCouponListCnt", search); + } + + @Override + public List> getCouponList(CouponSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getCouponList", search); + } + + @Override + public int getMyCouponListCnt(CouponSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMyCouponListCnt", search); + } + + @Override + public List> getMyCouponList(CouponSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMyCouponList", search); + } + + @Override + public HashMap getLastCashInBy24H(CashSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getLastCashInBy24H", search); + } + + @Override + public List> getLastCashInToBetSumBy24H(HashMap param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getLastCashInToBetSumBy24H", param); + } + + @Override + public int insertCashBonus(HashMap data) { + // TODO Auto-generated method stub + return sqlSession.insert("insertCashBonus", data); + } + + @Override + public HashMap getCashBonusInfo(long cashIdx) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getCashBonusInfo", cashIdx); + } + + @Override + public int updateCashBonus(HashMap data) { + // TODO Auto-generated method stub + return sqlSession.insert("updateCashBonus", data); + } +} diff --git a/src/main/java/com/bb/dao/CommonDao.java b/src/main/java/com/bb/dao/CommonDao.java new file mode 100644 index 0000000..d6133ce --- /dev/null +++ b/src/main/java/com/bb/dao/CommonDao.java @@ -0,0 +1,275 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.bb.model.Admin; +import com.bb.model.AdminIp; +import com.bb.model.AdminLogSearch; +import com.bb.model.AdminSearch; +import com.bb.model.Bank; +import com.bb.model.Banner; +import com.bb.model.Block; +import com.bb.model.BlockSearch; +import com.bb.model.ChargingPointSettingVO; +import com.bb.model.Code; +import com.bb.model.CodeSearch; +import com.bb.model.CronServerInfo; +import com.bb.model.DomainPartnerVO; +import com.bb.model.GameCodeSearchVO; +import com.bb.model.GameCodeVO; +import com.bb.model.GameSetting; +import com.bb.model.GameSettingItem; +import com.bb.model.LevelBank; +import com.bb.model.LevelBetLimit; +import com.bb.model.LevelDomain; +import com.bb.model.LevelFailPoint; +import com.bb.model.LevelOutPwd; +import com.bb.model.Member; +import com.bb.model.MenuVO; +import com.bb.model.NotiBgmVo; +import com.bb.model.SiteCashBonusSettingVO; +import com.bb.model.SiteCheckReq; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; + +import jakarta.validation.Valid; + +public interface CommonDao { + + List getCodeList(CodeSearch codesSearch); + + HashMap getCode(CodeSearch codesSearch); + + int getDupRepotCheck(); + + List getDailyList(String cmd); + + int updateReport(HashMap report); + + int updateReport2(); + + int insertReport(HashMap report); + + int insertReport2(); + + List getDailyListYday(); + + int updateReportYday1(HashMap report); + + int updateReportYday2(); + + int updateReportYday3(); + +// void updateReport(HashMap setTime); + +// void insertReport(HashMap setTime); + + HashMap getSiteOption(String siteId); + + void insertlog(Map logParam); + + void updateMemLogin(Map logParam); + + List getlastLoginToken(); + + void updatelog(Map logParam); + + int optionSave(SiteOption option); + + SiteOption getSiteSetting(SiteSearch search); + + HashMap getSiteAccoucnt(SiteSearch search); + + void bankSave(Bank bank); + + List getAdminBankList(SiteSearch search); + + List getBankList(SiteSearch search); + + void bannerSave(Banner banner); + + List getBannerList(SiteSearch search); + + void insertCode(@Valid Code code); + + List getLbList(SiteSearch search); + + void accountSave(LevelBank levelBank); + + List getLbetLimitList(SiteSearch search); + + void setLbetLimitList(LevelBetLimit betLimit); + + List getFailPointList(SiteSearch search); + + void failPointSave(LevelFailPoint failPoint); + + List getDomainList(SiteSearch search); + + void domainSave(LevelDomain domain); + + List getOutPwdList(SiteSearch search); + + void outPwdSave(LevelOutPwd outPwd); + + int getAdminLogListCnt(@Valid AdminLogSearch search); + + List getAdminLogList(@Valid AdminLogSearch search); + + void insertAdminlog(Map logParam); + + int getSiteBlockListCnt(@Valid BlockSearch search); + + List getSiteBlockList(@Valid BlockSearch search); + + void blockSave(@Valid Block block); + + int getSiteAdminListCnt(@Valid AdminSearch search); + + List getSiteAdminList(@Valid AdminSearch search); + + void adminSave(Admin admin); + + void adminDelete(Admin admin); + + int getSiteAdminIpListCnt(@Valid AdminSearch search); + + List getSiteAdminIpList(@Valid AdminSearch search); + + void adminIpSave(AdminIp adminIp); + + void adminIpDelete(AdminIp adminIp); + + void updateIpInfo(Map ipParam); + + List getLoginSite(); + + int gameSettingSave(List settingList); + + List gameSettingList(GameSetting searchSetting); + + int siteCheckSave(SiteCheckReq siteCheckReq); + + List isSiteCheck(); + + void changeSiteCheckOff(SiteCheckReq param); + + void changeSiteSettingCheckYn(SiteCheckReq param); + + List siteCheckList(SiteCheckReq param); + + HashMap siteCheckDetail(SiteCheckReq param); + + HashMap siteCheckInfo(SiteCheckReq param); + + List> getGameCodeTabList(GameCodeSearchVO searchVO); + + List> getGameCodeColList(GameCodeSearchVO searchVO); + + List> getGameCodeList(GameCodeSearchVO searchVO); + + int gameCodeRegist(GameCodeVO gameCodeVO); + + int gameCodeUpdate(GameCodeVO gameCodeVO); + + int gameCodeAddMemRate(GameCodeVO gameCodeVO); + + int gameCodeAddSiteGameSetting(GameCodeVO gameCodeVO); + + List getPopupList(SiteSearch search); + + List getBannerInfoList(SiteSearch search); + + List getLoginPopupList(SiteSearch paramSite); + + List getGameCodes(CodeSearch codesSearch); + + String getApiVendor(CodeSearch codeSearch); + + List getMenuList(HashMap param); + + List getVendorList(); + + List getGameGroupCodes(String siteId); + + List getGameCodesForSuper(CodeSearch codesSearch); + + List getGameGroupCodesForSuper(String siteId); + + CronServerInfo getServerCronStatus(CronServerInfo cronStatus); + + List> getDomainPartnerList(DomainPartnerVO domainPartnerVO); + + int domainPartnerSave(DomainPartnerVO domainPartnerVO); + + int domainPartnerDelete(DomainPartnerVO domainPartnerVO); + + String getJoinRecommanderId(SiteSearch paramSite); + + HashMap getSessionTransactionIsolation(); + + HashMap getDailyTime(); + + void updateDailyTime(HashMap setTime); + + List getChargingPointSettingList(int siteIdx); + + ChargingPointSettingVO getChargingPointSetting(ChargingPointSettingVO param); + + int memChargingPointSettingSave(ChargingPointSettingVO settingVO); + + int siteChargingPointSettingSave(ChargingPointSettingVO settingVO); + + String getJackpot(HashMap params); + + HashMap getCodeBySite(CodeSearch codeSrch); + + int getSiteLogoutTimeLimit(String siteId); + + List getRateCategory(String siteId); + + HashMap getUserInfoByToken(String token); + + HashMap getAdminInfoByToken(String token); + + List getMenuBookmarkList(HashMap param); + + HashMap getSiteMemo(String siteId); + + int updateBookmarkMenu(MenuVO param); + + int updateSiteMemo(HashMap param); + + int getSiteCheckCount(SiteCheckReq siteCheckReq); + + void updateDayCashInDate(HashMap dailyParam); + + List getMonthList(); + + int insertMonthReport(HashMap report); + + void updateAcctionLog(Map logParam); + + List getRollingList(String days); + + int insertRollingReport(HashMap report); + + HashMap getVassApiInfo(Member search); + + List getNotiBgmList(SiteSearch search); + + int setNotiBgmSave(NotiBgmVo notiBgmVo); + + List getDailyAutoLevelUpList(); + + int updateAutoLevelUp(HashMap user); + + List getSiteCashBonusSettingList(Integer siteIdx); + + int setSiteCashBonusSettingSave(SiteCashBonusSettingVO settingVO); + + int bankDelete(Bank bank); + +} diff --git a/src/main/java/com/bb/dao/CommonDaoImpl.java b/src/main/java/com/bb/dao/CommonDaoImpl.java new file mode 100644 index 0000000..d5b6c6d --- /dev/null +++ b/src/main/java/com/bb/dao/CommonDaoImpl.java @@ -0,0 +1,758 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.session.SqlSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Repository; + +import com.bb.model.Admin; +import com.bb.model.AdminIp; +import com.bb.model.AdminLogSearch; +import com.bb.model.AdminSearch; +import com.bb.model.Bank; +import com.bb.model.Banner; +import com.bb.model.Block; +import com.bb.model.BlockSearch; +import com.bb.model.ChargingPointSettingVO; +import com.bb.model.Code; +import com.bb.model.CodeSearch; +import com.bb.model.CronServerInfo; +import com.bb.model.DomainPartnerVO; +import com.bb.model.GameCodeSearchVO; +import com.bb.model.GameCodeVO; +import com.bb.model.GameSetting; +import com.bb.model.GameSettingItem; +import com.bb.model.LevelBank; +import com.bb.model.LevelBetLimit; +import com.bb.model.LevelDomain; +import com.bb.model.LevelFailPoint; +import com.bb.model.LevelOutPwd; +import com.bb.model.Member; +import com.bb.model.MenuVO; +import com.bb.model.NotiBgmVo; +import com.bb.model.SiteCashBonusSettingVO; +import com.bb.model.SiteCheckReq; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; + +import jakarta.validation.Valid; + + +@Repository("commonDao") +public class CommonDaoImpl implements CommonDao { + + + /** 메인DB 연결 */ + @Autowired @Qualifier("sqlSessionMain") + protected SqlSession sqlSession; + + /** 서브DB 연결 */ + @Autowired @Qualifier("sqlSessionSub") + protected SqlSession sqlSessionSub; + + @Override + public List getCodeList(CodeSearch codesSearch) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getCodeList", codesSearch); + } + + @Override + public HashMap getCode(CodeSearch codesSearch) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getCode", codesSearch); + } + + @Override + public int getDupRepotCheck() { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getDupRepotCheck"); + } + + @Override + public List getDailyList(String cmd) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getDailyList", cmd); + } + + @Override + public int updateReport(HashMap report) { + // TODO Auto-generated method stub + return sqlSession.update("updateReport", report); + } + + @Override + public int updateReport2() { + // TODO Auto-generated method stub + return sqlSession.update("updateReport2"); + } + + @Override + public int insertReport(HashMap report) { + // TODO Auto-generated method stub + return sqlSession.insert("insertReport", report); + } + + @Override + public int insertReport2() { + // TODO Auto-generated method stub + return sqlSession.insert("insertReport2"); + } + + @Override + public List getDailyListYday() { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getDailyListYday"); + } + + @Override + public int updateReportYday1(HashMap report) { + // TODO Auto-generated method stub + return sqlSession.update("updateReportYday1", report); + } + + @Override + public int updateReportYday2() { + // TODO Auto-generated method stub + return sqlSession.update("updateReportYday2"); + } + + @Override + public int updateReportYday3() { + // TODO Auto-generated method stub + return sqlSession.update("updateReportYday3"); + } + +// @Override +// public void updateReport(HashMap setTime) { +// // TODO Auto-generated method stub +// sqlSession.update("updateReport", setTime); +// } + +// @Override +// public void insertReport(HashMap setTime) { +// // TODO Auto-generated method stub +// sqlSession.insert("insertReport", setTime); +// } + + @Override + public HashMap getSiteOption(String siteId) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getSiteOption", siteId); + } + + @Override + public void insertlog(Map logParam) { + // TODO Auto-generated method stub + sqlSession.insert("insertlog", logParam); + } + + @Override + public void updateMemLogin(Map logParam) { + // TODO Auto-generated method stub + sqlSession.update("updateMemLogin", logParam); + } + + @Override + public List getlastLoginToken() { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getlastLoginToken"); + } + + @Override + public void updatelog(Map logParam) { + // TODO Auto-generated method stub + sqlSession.update("updatelog", logParam); + } + + @Override + public int optionSave(SiteOption option) { + // TODO Auto-generated method stub + return sqlSession.insert("optionSave", option); + } + + @Override + public SiteOption getSiteSetting(SiteSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getSiteSetting", search); + } + + @Override + public HashMap getSiteAccoucnt(SiteSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getSiteAccoucnt", search); + } + + @Override + public void bankSave(Bank bank) { + // TODO Auto-generated method stub + sqlSession.insert("bankSave", bank); + } + + @Override + public List getAdminBankList(SiteSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getAdminBankList", search); + } + + @Override + public List getBankList(SiteSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getBankList", search); + } + + @Override + public void bannerSave(Banner banner) { + // TODO Auto-generated method stub + sqlSession.insert("bannerSave", banner); + } + + @Override + public List getBannerList(SiteSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getBannerList", search); + } + + @Override + public void insertCode(@Valid Code code) { + // TODO Auto-generated method stub + sqlSession.insert("insertCode", code); + } + + @Override + public List getLbList(SiteSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getLbList", search); + } + + @Override + public void accountSave(LevelBank levelBank) { + // TODO Auto-generated method stub + sqlSession.insert("accountSave", levelBank); + } + + @Override + public List getLbetLimitList(SiteSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getLbetLimitList", search); + } + + @Override + public void setLbetLimitList(LevelBetLimit betLimit) { + // TODO Auto-generated method stub + sqlSession.update("setLbetLimitList", betLimit); + } + + @Override + public List getFailPointList(SiteSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getFailPointList", search); + } + + @Override + public void failPointSave(LevelFailPoint failPoint) { + // TODO Auto-generated method stub + sqlSession.insert("failPointSave", failPoint); + } + + @Override + public List getDomainList(SiteSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getDomainList", search); + } + + @Override + public void domainSave(LevelDomain domain) { + // TODO Auto-generated method stub + sqlSession.insert("domainSave", domain); + } + + @Override + public List getOutPwdList(SiteSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getOutPwdList", search); + } + + @Override + public void outPwdSave(LevelOutPwd outPwd) { + // TODO Auto-generated method stub + sqlSession.insert("outPwdSave", outPwd); + } + + @Override + public int getAdminLogListCnt(@Valid AdminLogSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getAdminLogListCnt", search); + } + + @Override + public List getAdminLogList(@Valid AdminLogSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getAdminLogList", search); + } + + @Override + public void insertAdminlog(Map logParam) { + // TODO Auto-generated method stub + sqlSession.insert("insertAdminlog", logParam); + } + + @Override + public int getSiteBlockListCnt(@Valid BlockSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getSiteBlockListCnt", search); + } + + @Override + public List getSiteBlockList(@Valid BlockSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getSiteBlockList", search); + } + + @Override + public void blockSave(@Valid Block block) { + // TODO Auto-generated method stub + sqlSession.insert("blockSave", block); + } + + @Override + public int getSiteAdminListCnt(@Valid AdminSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getSiteAdminListCnt", search); + } + + @Override + public List getSiteAdminList(@Valid AdminSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getSiteAdminList", search); + } + + @Override + public void adminSave(Admin admin) { + // TODO Auto-generated method stub + sqlSession.insert("adminSave", admin); + } + + @Override + public void adminDelete(Admin admin) { + // TODO Auto-generated method stub + sqlSession.delete("adminDelete", admin); + } + + @Override + public int getSiteAdminIpListCnt(@Valid AdminSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getSiteAdminIpListCnt", search); + } + + @Override + public List getSiteAdminIpList(@Valid AdminSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getSiteAdminIpList", search); + } + + @Override + public void adminIpSave(AdminIp adminIp) { + // TODO Auto-generated method stub + sqlSession.insert("adminIpSave", adminIp); + } + + @Override + public void adminIpDelete(AdminIp adminIp) { + // TODO Auto-generated method stub + sqlSession.insert("adminIpDelete", adminIp); + } + + @Override + public void updateIpInfo(Map ipParam) { + // TODO Auto-generated method stub + sqlSession.update("updateIpInfo", ipParam); + } + + @Override + public List getLoginSite() { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getLoginSite", null); + } + + @Override + public int gameSettingSave(List settingList) { + // TODO Auto-generated method stub + return sqlSession.insert("gameSettingSave", settingList); + } + + @Override + public List gameSettingList(GameSetting searchSetting) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("gameSettingList", searchSetting); + } + + @Override + public int siteCheckSave(SiteCheckReq siteCheckReq) { + // TODO Auto-generated method stub + return sqlSession.insert("siteCheckSave", siteCheckReq); + } + + @Override + public List isSiteCheck() { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("isSiteCheck"); + } + + @Override + public void changeSiteCheckOff(SiteCheckReq param) { + // TODO Auto-generated method stub + sqlSession.update("changeSiteCheckOff", param); + } + + @Override + public void changeSiteSettingCheckYn(SiteCheckReq param) { + // TODO Auto-generated method stub + sqlSession.update("changeSiteSettingCheckYn", param); + } + + @Override + public List siteCheckList(SiteCheckReq param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("siteCheckList", param); + } + + @Override + public HashMap siteCheckDetail(SiteCheckReq param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("siteCheckDetail", param); + } + + @Override + public HashMap siteCheckInfo(SiteCheckReq param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("siteCheckInfo", param); + } + + @Override + public List> getGameCodeTabList(GameCodeSearchVO searchVO) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getGameCodeTabList", searchVO); + } + + @Override + public List> getGameCodeColList(GameCodeSearchVO searchVO) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getGameCodeColList", searchVO); + } + + @Override + public List> getGameCodeList(GameCodeSearchVO searchVO) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getGameCodeList", searchVO); + } + + @Override + public int gameCodeRegist(GameCodeVO gameCodeVO) { + // TODO Auto-generated method stub + return sqlSession.insert("gameCodeRegist", gameCodeVO); + } + + @Override + public int gameCodeUpdate(GameCodeVO gameCodeVO) { + // TODO Auto-generated method stub + return sqlSession.update("gameCodeUpdate", gameCodeVO); + } + + @Override + public int gameCodeAddMemRate(GameCodeVO gameCodeVO) { + // TODO Auto-generated method stub + return sqlSession.insert("gameCodeAddMemRate", gameCodeVO); + } + + @Override + public int gameCodeAddSiteGameSetting(GameCodeVO gameCodeVO) { + // TODO Auto-generated method stub + return sqlSession.insert("gameCodeAddSiteGameSetting", gameCodeVO); + } + + @Override + public List getPopupList(SiteSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getPopupList", search); + } + + @Override + public List getBannerInfoList(SiteSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getBannerInfoList", search); + } + + @Override + public List getLoginPopupList(SiteSearch paramSite) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getLoginPopupList", paramSite); + } + + @Override + public List getGameCodes(CodeSearch codesSearch) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getGameCodes", codesSearch); + } + + @Override + public List getGameGroupCodes(String siteId) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getGameGroupCodes", siteId); + } + + @Override + public String getApiVendor(CodeSearch codeSearch) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getApiVendor", codeSearch); + } + + @Override + public List getMenuList(HashMap param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMenuList", param); + } + + @Override + public List getVendorList() { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getVendorList"); + } + + @Override + public List getGameCodesForSuper(CodeSearch codesSearch) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getGameCodesForSuper", codesSearch); + } + + @Override + public List getGameGroupCodesForSuper(String siteId) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getGameGroupCodesForSuper", siteId); + } + + @Override + public CronServerInfo getServerCronStatus(CronServerInfo cronStatus) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getServerCronStatus", cronStatus); + } + + @Override + public List> getDomainPartnerList(DomainPartnerVO domainPartnerVO) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getDomainPartnerList", domainPartnerVO); + } + + @Override + public int domainPartnerSave(DomainPartnerVO domainPartnerVO) { + // TODO Auto-generated method stub + return sqlSession.insert("domainPartnerSave", domainPartnerVO); + } + + @Override + public int domainPartnerDelete(DomainPartnerVO domainPartnerVO) { + // TODO Auto-generated method stub + return sqlSession.delete("domainPartnerDelete", domainPartnerVO); + } + + @Override + public String getJoinRecommanderId(SiteSearch paramSite) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getJoinRecommanderId", paramSite); + } + + @Override + public HashMap getSessionTransactionIsolation() { + // TODO Auto-generated method stub + return sqlSession.selectOne("getSessionTransactionIsolation"); + } + + @Override + public HashMap getDailyTime() { + // TODO Auto-generated method stub + return sqlSession.selectOne("getDailyTime"); + } + + @Override + public void updateDailyTime(HashMap setTime) { + // TODO Auto-generated method stub + sqlSession.update("updateDailyTime", setTime); + } + + @Override + public List getChargingPointSettingList(int siteIdx) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getChargingPointSettingList", siteIdx); + } + + @Override + public ChargingPointSettingVO getChargingPointSetting(ChargingPointSettingVO param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getChargingPointSetting", param); + } + + @Override + public int memChargingPointSettingSave(ChargingPointSettingVO settingVO) { + // TODO Auto-generated method stub + return sqlSession.update("memChargingPointSettingSave", settingVO); + } + + @Override + public int siteChargingPointSettingSave(ChargingPointSettingVO settingVO) { + // TODO Auto-generated method stub + return sqlSession.update("siteChargingPointSettingSave", settingVO); + } + + @Override + public String getJackpot(HashMap params) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getJackpot", params); + } + + @Override + public HashMap getCodeBySite(CodeSearch codeSrch) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getCodeBySite", codeSrch); + } + + @Override + public int getSiteLogoutTimeLimit(String siteId) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getSiteLogoutTimeLimit", siteId); + } + + @Override + public List getRateCategory(String siteId) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getRateCategory", siteId); + } + + @Override + public HashMap getUserInfoByToken(String token) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getUserInfoByToken", token); + } + + @Override + public HashMap getAdminInfoByToken(String token) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getAdminInfoByToken", token); + } + + @Override + public List getMenuBookmarkList(HashMap param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMenuBookmarkList", param); + } + + @Override + public int updateBookmarkMenu(MenuVO param) { + // TODO Auto-generated method stub + return sqlSession.update("updateBookmarkMenu", param); + } + + @Override + public HashMap getSiteMemo(String siteId) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getSiteMemo", siteId); + } + + @Override + public int updateSiteMemo(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.update("updateSiteMemo", param); + } + + @Override + public int getSiteCheckCount(SiteCheckReq siteCheckReq) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getSiteCheckCount", siteCheckReq); + } + + @Override + public void updateDayCashInDate(HashMap dailyParam) { + // TODO Auto-generated method stub + sqlSession.update("updateDayCashInDate", dailyParam); + } + + @Override + public List getMonthList() { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMonthList"); + } + + @Override + public int insertMonthReport(HashMap report) { + // TODO Auto-generated method stub + return sqlSession.insert("insertMonthReport", report); + } + + @Override + public void updateAcctionLog(Map logParam) { + // TODO Auto-generated method stub + sqlSession.update("updateAcctionLog", logParam); + } + + @Override + public List getRollingList(String days) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getRollingList", days); + } + + @Override + public int insertRollingReport(HashMap report) { + // TODO Auto-generated method stub + return sqlSession.insert("insertRollingReport", report); + } + + @Override + public HashMap getVassApiInfo(Member search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getVassApiInfo", search); + } + + @Override + public List getNotiBgmList(SiteSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getNotiBgmList", search); + } + + @Override + public int setNotiBgmSave(NotiBgmVo notiBgmVo) { + // TODO Auto-generated method stub + return sqlSession.insert("setNotiBgmSave", notiBgmVo); + } + + @Override + public List getDailyAutoLevelUpList() { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getDailyAutoLevelUpList"); + } + + @Override + public int updateAutoLevelUp(HashMap user) { + // TODO Auto-generated method stub + return sqlSession.update("updateAutoLevelUp", user); + } + + @Override + public List getSiteCashBonusSettingList(Integer siteIdx) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getSiteCashBonusSettingList", siteIdx); + } + + @Override + public int setSiteCashBonusSettingSave(SiteCashBonusSettingVO settingVO) { + // TODO Auto-generated method stub + return sqlSession.update("setSiteCashBonusSettingSave", settingVO); + } + + @Override + public int bankDelete(Bank bank) { + // TODO Auto-generated method stub + return sqlSession.delete("bankDelete", bank); + } +} diff --git a/src/main/java/com/bb/dao/CompDao.java b/src/main/java/com/bb/dao/CompDao.java new file mode 100644 index 0000000..217a334 --- /dev/null +++ b/src/main/java/com/bb/dao/CompDao.java @@ -0,0 +1,126 @@ +package com.bb.dao; + + +import java.util.HashMap; +import java.util.List; + +import jakarta.validation.Valid; + +import com.bb.model.BiSubPointRateVo; +import com.bb.model.CompDetail; +import com.bb.model.CompResetInfo; +import com.bb.model.CompSearch; +import com.bb.model.GameSettingInfo; +import com.bb.model.Member; +import com.bb.model.MemberListSearch; +import com.bb.model.MenuVO; +import com.bb.model.OTPInfo; +import com.bb.model.PartnerCompInfo; +import com.bb.model.Site; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; +import com.bb.model.TripleGameRate; + +public interface CompDao { + + int getPartnerCompListCnt(@Valid MemberListSearch search); + + List getPartnerCompList(@Valid MemberListSearch search); + + CompDetail getPartnerComp(Site search); + + HashMap getPartnerCompDetail(Member search); + + int modifySiteGameSetting(BiSubPointRateVo biSubPointRateVo); + + int modifyCreditSettings(PartnerCompInfo compInfo); + + int modifyCreditRates(HashMap param); + + int modifySiteSettings(SiteOption siteOption); + + int getCheckTopComp(PartnerCompInfo compInfo); + + int modifyCompInfo(PartnerCompInfo compInfo); + + HashMap getCompInfoForDetail(SiteSearch search); + + HashMap getSettingInfoForDetail(SiteSearch search); + + HashMap getCompStatsForDetail(SiteSearch search); + + List getTopCompListForDetail(SiteSearch search); + + List getBotCompListForDetail(SiteSearch search); + + int modifySiteGameSettingForSuper(GameSettingInfo item); + + int modifyMenuSettings(MenuVO item); + + List getCompanyRate(Member search); + + List> getGameRateCompList(TripleGameRate gameRateVO); + + int updateCompGameRate(HashMap compGameRateInfo); + + HashMap getTripleParam(CompSearch search); + + List> getTripleGameRate(HashMap tripleParam); + + int insertTripleRate(HashMap tripleRate); + + List> getOmsRateListByTripleGame(CompSearch search); + + int updateOmsRateList(CompSearch search); + + int resetDelete(CompResetInfo compResetInfo); + + int resetUpdate(CompResetInfo compResetInfo); + + int getResetMemIdCount(CompResetInfo compResetInfo); + + int updateApiSetting(PartnerCompInfo compInfo); + + List> getCompIdList(SiteSearch search); + + List getSiteGameInfo(SiteSearch search); + + List getSiteMenuInfo(SiteSearch search); + + void deleteTripleRate(CompSearch search); + + int updateCompVictoryPassYn(SiteOption option); + + + String getAdminOtpUseYN(String adminId); + int registOtpInfo(OTPInfo otpParam); + int updateAdminOtpUseYN(OTPInfo otpParam); + int updateSuperOtpUseYN(OTPInfo otpParam); + OTPInfo getOtpInfo(String adminId); + String getAdminType(String adminId); + + List> getAdminOtpInfoList(String siteId); + + HashMap getTripleCreditInfo(String siteId); + + void updateTripleSiteCredit(HashMap tripleCreditInfo); + + int updateVendoMinMax(HashMap param); + + String getLastMaxWinAmt(HashMap param); + + String getLastMaxWinAmtCnt(HashMap param); + + long getTripleSiteCredit(String tripleSiteId); + + long getTripleSitePoint(String tripleSiteId); + + HashMap getTripleTargetSiteInfo(HashMap tripleCreditInfo); + + void insertTripleCredit(HashMap creditParam); + + void insertTripleCreditAiAo(HashMap creditParam); + + String getSiteIdByAdminId(String adminId); + +} diff --git a/src/main/java/com/bb/dao/CompDaoImpl.java b/src/main/java/com/bb/dao/CompDaoImpl.java new file mode 100644 index 0000000..0d2abb0 --- /dev/null +++ b/src/main/java/com/bb/dao/CompDaoImpl.java @@ -0,0 +1,363 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; + +import jakarta.validation.Valid; + +import org.apache.ibatis.session.SqlSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Repository; + +import com.bb.model.BiSubPointRateVo; +import com.bb.model.CompDetail; +import com.bb.model.CompResetInfo; +import com.bb.model.CompSearch; +import com.bb.model.GameSettingInfo; +import com.bb.model.Member; +import com.bb.model.MemberListSearch; +import com.bb.model.MenuVO; +import com.bb.model.OTPInfo; +import com.bb.model.PartnerCompInfo; +import com.bb.model.Site; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; +import com.bb.model.TripleGameRate; + +@Repository("compDao") +public class CompDaoImpl implements CompDao { + + /** 메인DB 연결 */ + @Autowired @Qualifier("sqlSessionMain") + protected SqlSession sqlSession; + + /** 서브DB 연결 */ + @Autowired @Qualifier("sqlSessionSub") + protected SqlSession sqlSessionSub; + + /** 트리플DB 연결 */ + @Autowired @Qualifier("sqlSessionTriple") + protected SqlSession sqlSessionTriple; + + @Override + public int getPartnerCompListCnt(@Valid MemberListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getPartnerCompListCnt", search); + } + + @Override + public List getPartnerCompList(@Valid MemberListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getPartnerCompList", search); + } + + @Override + public CompDetail getPartnerComp(Site search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getPartnerComp", search); + } + + @Override + public HashMap getPartnerCompDetail(Member search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getPartnerCompDetail", search); + } + + @Override + public int modifySiteGameSetting(BiSubPointRateVo biSubPointRateVo) { + // TODO Auto-generated method stub + return sqlSession.insert("modifySiteGameSetting", biSubPointRateVo); + } + + @Override + public int modifyCreditSettings(PartnerCompInfo compInfo) { + // TODO Auto-generated method stub + return sqlSession.update("modifyCreditSettings", compInfo); + } + + @Override + public int modifyCreditRates(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.update("modifyCreditRates", param); + } + + @Override + public int modifySiteSettings(SiteOption siteOption) { + // TODO Auto-generated method stub + return sqlSession.update("modifySiteSettings", siteOption); + } + + @Override + public int getCheckTopComp(PartnerCompInfo compInfo) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getCheckTopComp", compInfo); + } + + @Override + public int modifyCompInfo(PartnerCompInfo compInfo) { + // TODO Auto-generated method stub + return sqlSession.update("modifyCompInfo", compInfo); + } + + @Override + public HashMap getCompInfoForDetail(SiteSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getCompInfoForDetail", search); + } + + @Override + public HashMap getSettingInfoForDetail(SiteSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getSettingInfoForDetail", search); + } + + @Override + public HashMap getCompStatsForDetail(SiteSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getCompStatsForDetail", search); + } + + @Override + public List getTopCompListForDetail(SiteSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getTopCompListForDetail", search); + } + + @Override + public List getBotCompListForDetail(SiteSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getBotCompListForDetail", search); + } + + @Override + public int modifySiteGameSettingForSuper(GameSettingInfo item) { + // TODO Auto-generated method stub + return sqlSession.insert("modifySiteGameSettingForSuper", item); + } + + @Override + public int modifyMenuSettings(MenuVO item) { + // TODO Auto-generated method stub + return sqlSession.update("modifyMenuSettings", item); + } + + @Override + public List getCompanyRate(Member search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getCompanyRate", search); + } + + @Override + public List> getGameRateCompList(TripleGameRate gameRateVO) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getGameRateCompList", gameRateVO); + } + + @Override + public int updateCompGameRate(HashMap compGameRateInfo) { + // TODO Auto-generated method stub + return sqlSession.update("updateCompGameRate", compGameRateInfo); + } + + @Override + public HashMap getTripleParam(CompSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getTripleParam", search); + } + + @Override + public List> getTripleGameRate(HashMap tripleParam) { + // TODO Auto-generated method stub + return sqlSessionTriple.selectList("getTripleGameRate", tripleParam); + } + + @Override + public int insertTripleRate(HashMap tripleRate) { + // TODO Auto-generated method stub + return sqlSession.insert("insertTripleRate", tripleRate); + } + + @Override + public List> getOmsRateListByTripleGame(CompSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getOmsRateListByTripleGame", search); + } + + @Override + public int updateOmsRateList(CompSearch search) { + // TODO Auto-generated method stub + return sqlSession.update("updateOmsRateList", search); + } + + @Override + public int resetDelete(CompResetInfo compResetInfo) { + // TODO Auto-generated method stub + return sqlSession.delete("resetDelete", compResetInfo); + } + + @Override + public int resetUpdate(CompResetInfo compResetInfo) { + // TODO Auto-generated method stub + return sqlSession.update("resetUpdate", compResetInfo); + } + + @Override + public int getResetMemIdCount(CompResetInfo compResetInfo) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getResetMemIdCount", compResetInfo); + } + + @Override + public int updateApiSetting(PartnerCompInfo compInfo) { + // TODO Auto-generated method stub + return sqlSession.update("updateApiSetting", compInfo); + } + + @Override + public List> getCompIdList(SiteSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getCompIdList", search); + } + + @Override + public List getSiteGameInfo(SiteSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getSiteGameInfo", search); + } + + @Override + public List getSiteMenuInfo(SiteSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getSiteMenuInfo", search); + } + + @Override + public void deleteTripleRate(CompSearch search) { + // TODO Auto-generated method stub + sqlSession.delete("deleteTripleRate", search); + } + + @Override + public int updateCompVictoryPassYn(SiteOption option) { + // TODO Auto-generated method stub + return sqlSession.update("updateCompVictoryPassYn", option); + } + + + @Override + public String getAdminOtpUseYN(String adminId) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getAdminOtpUseYN", adminId); + } + + + @Override + public int registOtpInfo(OTPInfo otpParam) { + // TODO Auto-generated method stub + return sqlSession.insert("registOtpInfo", otpParam); + } + + + @Override + public int updateAdminOtpUseYN(OTPInfo otpParam) { + // TODO Auto-generated method stub + return sqlSession.update("updateAdminOtpUseYN", otpParam); + } + + + @Override + public int updateSuperOtpUseYN(OTPInfo otpParam) { + // TODO Auto-generated method stub + return sqlSession.update("updateSuperOtpUseYN", otpParam); + } + + + @Override + public OTPInfo getOtpInfo(String adminId) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getOtpInfo", adminId); + } + + @Override + public String getAdminType(String adminId) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getAdminType", adminId); + } + + @Override + public List> getAdminOtpInfoList(String siteId) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getAdminOtpInfoList", siteId); + } + + @Override + public HashMap getTripleCreditInfo(String siteId) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getTripleCreditInfo", siteId); + } + + @Override + public void updateTripleSiteCredit(HashMap tripleCreditInfo) { + // TODO Auto-generated method stub + sqlSessionTriple.update("updateTripleSiteCredit", tripleCreditInfo); + } + + @Override + public int updateVendoMinMax(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.update("updateVendoMinMax", param); + } + + @Override + public String getLastMaxWinAmt(HashMap param) { + // TODO Auto-generated method stub + String lastMaxWinAmt = sqlSessionSub.selectOne("getLastMaxWinAmt", param); + if(lastMaxWinAmt == null) lastMaxWinAmt = "0"; + return lastMaxWinAmt; + } + + @Override + public String getLastMaxWinAmtCnt(HashMap param) { + // TODO Auto-generated method stub + String lastMaxWinAmtCnt = sqlSessionSub.selectOne("getLastMaxWinAmtCnt", param); + if(lastMaxWinAmtCnt == null) lastMaxWinAmtCnt = "0"; + return lastMaxWinAmtCnt; + } + + @Override + public long getTripleSiteCredit(String tripleSiteId) { + // TODO Auto-generated method stub + return sqlSessionTriple.selectOne("getTripleSiteCredit", tripleSiteId); + } + + @Override + public long getTripleSitePoint(String tripleSiteId) { + // TODO Auto-generated method stub + return sqlSessionTriple.selectOne("getTripleSitePoint", tripleSiteId); + } + + @Override + public HashMap getTripleTargetSiteInfo(HashMap tripleCreditInfo) { + // TODO Auto-generated method stub + return sqlSessionTriple.selectOne("getTripleTargetSiteInfo", tripleCreditInfo); + } + + @Override + public void insertTripleCredit(HashMap creditParam) { + // TODO Auto-generated method stub + sqlSessionTriple.insert("insertTripleCredit", creditParam); + } + + @Override + public void insertTripleCreditAiAo(HashMap creditParam) { + // TODO Auto-generated method stub + sqlSessionTriple.insert("insertTripleCreditAiAo", creditParam); + } + + @Override + public String getSiteIdByAdminId(String adminId) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getSiteIdByAdminId", adminId); + } +} diff --git a/src/main/java/com/bb/dao/MainDao.java b/src/main/java/com/bb/dao/MainDao.java new file mode 100644 index 0000000..eb2d3d7 --- /dev/null +++ b/src/main/java/com/bb/dao/MainDao.java @@ -0,0 +1,18 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; + +public interface MainDao { + + HashMap getMainTopInfo(HashMap param); + + HashMap getMainStatistics(HashMap param); + + HashMap getMainCashReport(HashMap param); + + HashMap getMyCashReport(HashMap param); + + List> getMainNewPayLog(HashMap param); + +} diff --git a/src/main/java/com/bb/dao/MainDaoImpl.java b/src/main/java/com/bb/dao/MainDaoImpl.java new file mode 100644 index 0000000..4d7eef8 --- /dev/null +++ b/src/main/java/com/bb/dao/MainDaoImpl.java @@ -0,0 +1,51 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; + +import org.apache.ibatis.session.SqlSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Repository; + +@Repository("mainDao") +public class MainDaoImpl implements MainDao { + + /** 메인DB 연결 */ + @Autowired @Qualifier("sqlSessionMain") + protected SqlSession sqlSession; + + /** 서브DB 연결 */ + @Autowired @Qualifier("sqlSessionSub") + protected SqlSession sqlSessionSub; + + @Override + public HashMap getMainTopInfo(HashMap param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMainTopInfo", param); + } + + @Override + public HashMap getMainStatistics(HashMap param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMainStatistics", param); + } + + @Override + public HashMap getMainCashReport(HashMap param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMainCashReport", param); + } + + @Override + public HashMap getMyCashReport(HashMap param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMyCashReport", param); + } + + @Override + public List> getMainNewPayLog(HashMap param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMainNewPayLog", param); + } +} diff --git a/src/main/java/com/bb/dao/MinigameDao.java b/src/main/java/com/bb/dao/MinigameDao.java new file mode 100644 index 0000000..5231ca9 --- /dev/null +++ b/src/main/java/com/bb/dao/MinigameDao.java @@ -0,0 +1,22 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; + +import jakarta.validation.Valid; + +import com.bb.model.MiniGameSearch; +import com.bb.model.MinigameBetRate; +import com.bb.model.MinigameSet; + +public interface MinigameDao { + + void setSave(@Valid MinigameSet mgs); + + void betRateSave(@Valid MinigameBetRate mbr); + + List getSetList(MiniGameSearch search); + + List getBetRateList(MiniGameSearch search); + +} diff --git a/src/main/java/com/bb/dao/MinigameDaoImpl.java b/src/main/java/com/bb/dao/MinigameDaoImpl.java new file mode 100644 index 0000000..cdc65e8 --- /dev/null +++ b/src/main/java/com/bb/dao/MinigameDaoImpl.java @@ -0,0 +1,52 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; + +import jakarta.validation.Valid; + +import org.apache.ibatis.session.SqlSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Repository; + +import com.bb.model.MiniGameSearch; +import com.bb.model.MinigameBetRate; +import com.bb.model.MinigameSet; + +@Repository("minigameDaoImpl") +public class MinigameDaoImpl implements MinigameDao { + + /** 메인DB 연결 */ + @Autowired @Qualifier("sqlSessionMain") + protected SqlSession sqlSession; + + /** 서브DB 연결 */ + @Autowired @Qualifier("sqlSessionSub") + protected SqlSession sqlSessionSub; + + @Override + public void setSave(@Valid MinigameSet mgs) { + // TODO Auto-generated method stub + sqlSession.insert("setSave", mgs); + } + + @Override + public void betRateSave(@Valid MinigameBetRate mbr) { + // TODO Auto-generated method stub + sqlSession.insert("betRateSave", mbr); + } + + @Override + public List getSetList(MiniGameSearch search) { + // TODO Auto-generated method stub + return sqlSession.selectList("getSetList", search); + } + + @Override + public List getBetRateList(MiniGameSearch search) { + // TODO Auto-generated method stub + return sqlSession.selectList("getBetRateList", search); + } + +} diff --git a/src/main/java/com/bb/dao/PassimDao.java b/src/main/java/com/bb/dao/PassimDao.java new file mode 100644 index 0000000..c6c12ed --- /dev/null +++ b/src/main/java/com/bb/dao/PassimDao.java @@ -0,0 +1,5 @@ +package com.bb.dao; + +public interface PassimDao { + +} diff --git a/src/main/java/com/bb/dao/PassimDaoImpl.java b/src/main/java/com/bb/dao/PassimDaoImpl.java new file mode 100644 index 0000000..97a3a36 --- /dev/null +++ b/src/main/java/com/bb/dao/PassimDaoImpl.java @@ -0,0 +1,22 @@ +package com.bb.dao; + +import org.apache.ibatis.session.SqlSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Repository; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Repository("PassimDao") +public class PassimDaoImpl implements PassimDao { + + /** 메인DB 연결 */ + @Autowired @Qualifier("sqlSessionMain") + protected SqlSession sqlSession; + + /** 서브DB 연결 */ + @Autowired @Qualifier("sqlSessionSub") + protected SqlSession sqlSessionSub; + +} diff --git a/src/main/java/com/bb/dao/PointDao.java b/src/main/java/com/bb/dao/PointDao.java new file mode 100644 index 0000000..434e0ed --- /dev/null +++ b/src/main/java/com/bb/dao/PointDao.java @@ -0,0 +1,25 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; + +import com.bb.model.Point; +import com.bb.model.PointSearchAdm; + +public interface PointDao { + + int getAdminPointListCnt(PointSearchAdm search); + + List> getAdminPointList(PointSearchAdm search); + + int getAdminPointListNewCnt(PointSearchAdm search); + + List> getAdminPointListNew(PointSearchAdm search); + + List> getPointBotRateList(PointSearchAdm search); + + List> getPointBotMultiRateList(PointSearchAdm search); + + long pointInsert(Point point); + +} diff --git a/src/main/java/com/bb/dao/PointDaoImpl.java b/src/main/java/com/bb/dao/PointDaoImpl.java new file mode 100644 index 0000000..311d45b --- /dev/null +++ b/src/main/java/com/bb/dao/PointDaoImpl.java @@ -0,0 +1,70 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; + +import org.apache.ibatis.session.SqlSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Repository; + +import com.bb.model.Point; +import com.bb.model.PointSearchAdm; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Repository("PointDao") +public class PointDaoImpl implements PointDao { + + /** 메인DB 연결 */ + @Autowired @Qualifier("sqlSessionMain") + protected SqlSession sqlSession; + + /** 서브DB 연결 */ + @Autowired @Qualifier("sqlSessionSub") + protected SqlSession sqlSessionSub; + + @Override + public int getAdminPointListCnt(PointSearchAdm search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getAdminPointListCnt", search); + } + + @Override + public List> getAdminPointList(PointSearchAdm search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getAdminPointList", search); + } + + @Override + public int getAdminPointListNewCnt(PointSearchAdm search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getAdminPointListNewCnt", search); + } + + @Override + public List> getAdminPointListNew(PointSearchAdm search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getAdminPointListNew", search); + } + + @Override + public List> getPointBotRateList(PointSearchAdm search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getPointBotRateList", search); + } + + @Override + public List> getPointBotMultiRateList(PointSearchAdm search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getPointBotMultiRateList", search); + } + + @Override + public long pointInsert(Point point) { + // TODO Auto-generated method stub + return sqlSession.insert("pointInsert2", point); + } + +} diff --git a/src/main/java/com/bb/dao/RateDao.java b/src/main/java/com/bb/dao/RateDao.java new file mode 100644 index 0000000..dcf7fd6 --- /dev/null +++ b/src/main/java/com/bb/dao/RateDao.java @@ -0,0 +1,22 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; + +import com.bb.model.Member; +import com.bb.model.MemberSearch; +import com.bb.model.RateVO; +import com.bb.model.RetailSearch; + +public interface RateDao { + + List> getMemRollingInfo(Member search); + + int myRateInfoUpdate(RateVO rateVO); + + int topMinRateInfoUpdate(RateVO rateVO); + + int botMaxRateInfoUpdate(RateVO rateVO); + + List getTopRate(MemberSearch search); +} diff --git a/src/main/java/com/bb/dao/RateDaoImpl.java b/src/main/java/com/bb/dao/RateDaoImpl.java new file mode 100644 index 0000000..b7bbec4 --- /dev/null +++ b/src/main/java/com/bb/dao/RateDaoImpl.java @@ -0,0 +1,61 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; + +import org.apache.ibatis.session.SqlSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Repository; + +import com.bb.model.Member; +import com.bb.model.MemberSearch; +import com.bb.model.RateVO; +import com.bb.model.RetailSearch; + +@Repository("rateDao") +public class RateDaoImpl implements RateDao { + + /** 메인DB 연결 */ + @Autowired @Qualifier("sqlSessionMain") + protected SqlSession sqlSession; + + /** 서브DB 연결 */ + @Autowired @Qualifier("sqlSessionSub") + protected SqlSession sqlSessionSub; + + + @Override + public List> getMemRollingInfo(Member search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMemRollingInfo", search); + } + + + @Override + public int myRateInfoUpdate(RateVO rateVO) { + // TODO Auto-generated method stub + return sqlSession.update("myRateInfoUpdate", rateVO); + } + + + @Override + public int topMinRateInfoUpdate(RateVO rateVO) { + // TODO Auto-generated method stub + return sqlSession.update("topMinRateInfoUpdate", rateVO); + } + + + @Override + public int botMaxRateInfoUpdate(RateVO rateVO) { + // TODO Auto-generated method stub + return sqlSession.update("botMaxRateInfoUpdate", rateVO); + } + + + @Override + public List getTopRate(MemberSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getTopRate", search); + } +} diff --git a/src/main/java/com/bb/dao/ReportDao.java b/src/main/java/com/bb/dao/ReportDao.java new file mode 100644 index 0000000..8ad6468 --- /dev/null +++ b/src/main/java/com/bb/dao/ReportDao.java @@ -0,0 +1,71 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; + +import jakarta.validation.Valid; + +import com.bb.model.As; +import com.bb.model.DailyReportSearch; +import com.bb.model.DayilPartnerReport; +import com.bb.model.DayilPeriodicReports; +import com.bb.model.ReportSearch; + +public interface ReportDao { + + int getReportMemwlListCnt(@Valid ReportSearch search); + + List getReportMemwlList(@Valid ReportSearch search); + + HashMap getPeriodCash(@Valid ReportSearch search); + + List getPeriodRollPoint(@Valid ReportSearch search); + + List getPeriodWlAmt(@Valid ReportSearch search); + + List getGameTypeList(@Valid ReportSearch search); + + List> getDayList(@Valid ReportSearch search); + + HashMap getDayTotal(ReportSearch search); + + int getReportTradeListCnt(@Valid ReportSearch search); + + List getReportTradeList(@Valid ReportSearch search); + + int getReportPartnerListCnt(@Valid ReportSearch search); + + List getReportPartnerList(@Valid ReportSearch search); + + List getReportPartnerGroupBet(@Valid HashMap partner); + + int getReportPayListCnt(@Valid ReportSearch search); + + List getReportPayList(@Valid ReportSearch search); + + List getReportPayGroupGameType(HashMap pay); + + int getReportsListCntForAdmin(DailyReportSearch search); + List getReportsListForAdmin(DailyReportSearch search); + DayilPeriodicReports getReportsTotalForAdmin(DailyReportSearch search); + String getReportsTotalCntForAdmin(DailyReportSearch search); + + int getReportsByUserListCntForAdmin(DailyReportSearch search); + List getReportsByUserListForAdmin(DailyReportSearch search); + DayilPeriodicReports getReportsByUserTotalForAdmin(DailyReportSearch search); + + + List getReportsListForPartner(DailyReportSearch search); + DayilPeriodicReports getReportsTotalForPartner(DailyReportSearch search); + String getReportsTotalCntForPartner(DailyReportSearch search); + + int getReportsByUserListCntForPartner(DailyReportSearch search); + List getReportsByUserListForPartner(DailyReportSearch search); + DayilPeriodicReports getReportsByUserTotalForPartner(DailyReportSearch search); + + HashMap getPartnerInfo(DailyReportSearch search); + List getDayilPartnerReport(DailyReportSearch search); + + List> getReportCateInfo(String siteId); + +} diff --git a/src/main/java/com/bb/dao/ReportDaoImpl.java b/src/main/java/com/bb/dao/ReportDaoImpl.java new file mode 100644 index 0000000..b090b3a --- /dev/null +++ b/src/main/java/com/bb/dao/ReportDaoImpl.java @@ -0,0 +1,234 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; + +import jakarta.validation.Valid; + +import org.apache.ibatis.session.SqlSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Repository; + +import com.bb.model.As; +import com.bb.model.DailyReportSearch; +import com.bb.model.DayilPartnerReport; +import com.bb.model.DayilPeriodicReports; +import com.bb.model.ReportSearch; + + + +@Repository("reportDao") +public class ReportDaoImpl implements ReportDao { + + + /** 메인DB 연결 */ + @Autowired @Qualifier("sqlSessionMain") + protected SqlSession sqlSession; + + /** 서브DB 연결 */ + @Autowired @Qualifier("sqlSessionSub") + protected SqlSession sqlSessionSub; + + + @Override + public int getReportMemwlListCnt(@Valid ReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getReportMemwlListCnt", search); + } + + @Override + public List getReportMemwlList(@Valid ReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getReportMemwlList", search); + } + + @Override + public HashMap getPeriodCash(@Valid ReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getPeriodCash", search); + } + + @Override + public List getPeriodRollPoint(@Valid ReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getPeriodRollPoint", search); + } + + @Override + public List getPeriodWlAmt(@Valid ReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getPeriodWlAmt", search); + } + + @Override + public List getGameTypeList(@Valid ReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getGameTypeList", search); + } + + @Override + public List> getDayList(@Valid ReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getDayList", search); + } + + @Override + public HashMap getDayTotal(ReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getDayTotal", search); + } + + @Override + public int getReportTradeListCnt(@Valid ReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getReportTradeListCnt", search); + } + + @Override + public List getReportTradeList(@Valid ReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getReportTradeList", search); + } + + @Override + public int getReportPartnerListCnt(@Valid ReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getReportPartnerListCnt", search); + } + + @Override + public List getReportPartnerList(@Valid ReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getReportPartnerList", search); + } + + @Override + public List getReportPartnerGroupBet(@Valid HashMap partner) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getReportPartnerGroupBet", partner); + } + + @Override + public int getReportPayListCnt(@Valid ReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getReportPayListCnt", search); + } + + @Override + public List getReportPayList(@Valid ReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getReportPayList", search); + } + + @Override + public List getReportPayGroupGameType(HashMap pay) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getReportPayGroupGameType", pay); + } + + + + @Override + public int getReportsListCntForAdmin(DailyReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getReportsListCntForAdmin", search); + } + + @Override + public List getReportsListForAdmin(DailyReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getReportsListForAdmin", search); + } + + @Override + public DayilPeriodicReports getReportsTotalForAdmin(DailyReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getReportsTotalForAdmin", search); + } + + @Override + public String getReportsTotalCntForAdmin(DailyReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getReportsTotalCntForAdmin", search); + } + + + + @Override + public int getReportsByUserListCntForAdmin(DailyReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getReportsByUserListCntForAdmin", search); + } + + @Override + public List getReportsByUserListForAdmin(DailyReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getReportsByUserListForAdmin", search); + } + + @Override + public DayilPeriodicReports getReportsByUserTotalForAdmin(DailyReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getReportsByUserTotalForAdmin", search); + } + + + + @Override + public List getReportsListForPartner(DailyReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getReportsListForPartner", search); + } + + @Override + public DayilPeriodicReports getReportsTotalForPartner(DailyReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getReportsTotalForPartner", search); + } + + @Override + public String getReportsTotalCntForPartner(DailyReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getReportsTotalCntForPartner", search); + } + + + @Override + public int getReportsByUserListCntForPartner(DailyReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getReportsByUserListCntForPartner", search); + } + + @Override + public List getReportsByUserListForPartner(DailyReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getReportsByUserListForPartner", search); + } + + @Override + public DayilPeriodicReports getReportsByUserTotalForPartner(DailyReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getReportsByUserTotalForPartner", search); + } + + + @Override + public HashMap getPartnerInfo(DailyReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getPartnerInfo", search); + } + + @Override + public List getDayilPartnerReport(DailyReportSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getDayilPartnerReport", search); + } + + @Override + public List> getReportCateInfo(String siteId) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getReportCateInfo", siteId); + } + +} diff --git a/src/main/java/com/bb/dao/RetailDao.java b/src/main/java/com/bb/dao/RetailDao.java new file mode 100644 index 0000000..78dd9c3 --- /dev/null +++ b/src/main/java/com/bb/dao/RetailDao.java @@ -0,0 +1,172 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; + +import jakarta.validation.Valid; + +import com.bb.model.BotMemRateVo; +import com.bb.model.CategoryRateVo; +import com.bb.model.ChargingPointSettingVO; +import com.bb.model.LoginUserVO; +import com.bb.model.Member; +import com.bb.model.MemberListSearch; +import com.bb.model.MemberSearch; +import com.bb.model.PartnerListVO; +import com.bb.model.RetailListSearch; +import com.bb.model.RetailLowerSearch; +import com.bb.model.RetailPointSearch; +import com.bb.model.RetailSearch; +import com.bb.model.RetailSet; +import com.bb.model.UserDetailInfo; +import com.bb.model.UserListSearch; +import com.bb.model.UserSearch; + +public interface RetailDao { + + int getRetailListCnt(@Valid RetailSearch search); + + List getRetailList(@Valid RetailSearch search); + + int getRetailListCnt2(@Valid RetailSearch search); + + List getRetailList2(@Valid RetailSearch search); + + void settingSave(@Valid RetailSet retailSet); + + int getRetailSettingListCnt(@Valid RetailSearch search); + + List getRetailSettingList(@Valid RetailSearch search); + + List getRetailBalanceList(@Valid RetailSearch search); + + int getRetailBalanceListCnt(@Valid RetailSearch search); + + int retailDetailListCnt(@Valid RetailSearch search); + + List retailDetailList(@Valid RetailSearch search); + + int retailSummryListCnt(@Valid RetailSearch search); + + List retailSummryList(@Valid RetailSearch search); + + List retailBalanceDetail(@Valid RetailSearch search); + + List getMyBetPointInfo(@Valid RetailSearch search); + + HashMap getMySummary(RetailSearch search); + + HashMap getMySummaryNew(RetailSearch search); + + HashMap getMyCashInfo(@Valid RetailSearch search); + + List getMyLoginMem(@Valid RetailSearch search); + + List getMemList(@Valid RetailSearch search); + + long getRetailBalcePoint(@Valid RetailSearch search); + + void updateRetailPointStatus(@Valid RetailSearch search); + + List myMemIds(Member search); + + List getMyCategoryRateList(MemberSearch search); + + List getBotCategoryRateList(MemberSearch search); + + int updateCasinoRate(BotMemRateVo item); + + int updateHcasinoRate(BotMemRateVo item); + + int updateSlotRate(BotMemRateVo item); + + int updateMiniRate(BotMemRateVo item); + + int updateSportRate(BotMemRateVo item); + + List getMyUnderPartnerLevels(Member search); + + int getMyMemListCnt(RetailSearch search); + + List getMyMemList(RetailSearch search); + + int getMyMemDirectListCnt(RetailSearch search); + + List getMyMemDirectList(RetailSearch search); + + + int getMyPartnerListCnt(RetailSearch search); + + List getMyPartnerList(RetailSearch search); + + List getMyPartnerList2(RetailSearch search); + + List getMyPartnerDirectList(RetailSearch search); + + int partnerBonusSettingSave(ChargingPointSettingVO settingVO); + + int getRetailPointListCnt(RetailPointSearch search); + + List getRetailPointList(RetailPointSearch search); + + List getPartnerHierarchy(RetailSearch search); + + List> getBottomRateList(Member search); + + int userLockWithBottom(HashMap param); + + HashMap getBotCashInfo(RetailSearch search); + + int getMyLoginMemListCnt(MemberListSearch search); + + List getMyLoginMemList(MemberListSearch search); + + HashMap getPartnerInfo(RetailSearch search); + + String getNextTargetLevel(RetailLowerSearch param); + + int getLowerPartnerListCnt(RetailLowerSearch search); + + List> getLowerPartnerList(RetailLowerSearch search); + + UserDetailInfo getUserDetailInfo(UserSearch search); + + int setUserDetailInfo(UserDetailInfo info); + + List> getDetailLoginLog(UserSearch search); + + int getDetailMsgLogCnt(UserListSearch search); + + List> getDetailMsgLog(UserListSearch search); + + int getDetailCashLogCnt(UserListSearch search); + + List> getDetailCashLog(UserListSearch search); + + int getDetailRollingLogCnt(UserListSearch search); + + List> getDetailRollingLog(UserListSearch search); + + List> getDetailRollingLogNew(UserListSearch search); + + List getPartnerHierarchy2(RetailSearch search); + + HashMap getMyBetStatData(UserSearch search); + + List> getBottomBetStatList(UserSearch search); + + HashMap getBottomBetStatSum(UserSearch search); + + List> getDailyBetList(UserSearch search); + + HashMap getDailyBetSum(UserSearch search); + + List> getDailyUserList(UserSearch search); + + HashMap getDailyUserSum(UserSearch search); + + List> getDailyPartnerList(UserSearch search); + + int getBotCnt(Member searchBot); + +} diff --git a/src/main/java/com/bb/dao/RetailDaoImpl.java b/src/main/java/com/bb/dao/RetailDaoImpl.java new file mode 100644 index 0000000..2164384 --- /dev/null +++ b/src/main/java/com/bb/dao/RetailDaoImpl.java @@ -0,0 +1,474 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; + +import jakarta.validation.Valid; + +import org.apache.ibatis.session.SqlSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Repository; + +import com.bb.model.BotMemRateVo; +import com.bb.model.CategoryRateVo; +import com.bb.model.ChargingPointSettingVO; +import com.bb.model.LoginUserVO; +import com.bb.model.Member; +import com.bb.model.MemberListSearch; +import com.bb.model.MemberSearch; +import com.bb.model.PartnerListVO; +import com.bb.model.RetailListSearch; +import com.bb.model.RetailLowerSearch; +import com.bb.model.RetailPointSearch; +import com.bb.model.RetailSearch; +import com.bb.model.RetailSet; +import com.bb.model.UserDetailInfo; +import com.bb.model.UserListSearch; +import com.bb.model.UserSearch; + +@Repository("retailDao") +public class RetailDaoImpl implements RetailDao { + + /** 메인DB 연결 */ + @Autowired @Qualifier("sqlSessionMain") + protected SqlSession sqlSession; + + /** 서브DB 연결 */ + @Autowired @Qualifier("sqlSessionSub") + protected SqlSession sqlSessionSub; + + @Override + public int getRetailListCnt(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getRetailListCnt", search); + } + + @Override + public List getRetailList(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getRetailList", search); + } + + @Override + public int getRetailListCnt2(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getRetailListCnt2", search); + } + + @Override + public List getRetailList2(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getRetailList2", search); + } + + @Override + public void settingSave(@Valid RetailSet retailSet) { + // TODO Auto-generated method stub + sqlSession.update("settingSave", retailSet); + } + + @Override + public int getRetailSettingListCnt(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getRetailSettingListCnt", search); + } + + @Override + public List getRetailSettingList(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getRetailSettingList", search); + } + + @Override + public List getRetailBalanceList(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getRetailBalanceList", search); + } + + @Override + public int getRetailBalanceListCnt(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getRetailBalanceListCnt", search); + } + + @Override + public int retailDetailListCnt(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("retailDetailListCnt", search); + } + + @Override + public List retailDetailList(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("retailDetailList", search); + } + + @Override + public int retailSummryListCnt(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("retailSummryListCnt", search); + } + + @Override + public List retailSummryList(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("summryList", search); + } + + @Override + public List retailBalanceDetail(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("retailBalanceDetail", search); + } + + @Override + public List getMyBetPointInfo(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMyBetPointInfo", search); + } + + @Override + public HashMap getMySummary(RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMySummary", search); + } + + @Override + public HashMap getMySummaryNew(RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMySummaryNew", search); + } + + @Override + public HashMap getMyCashInfo(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMyCashInfo", search); + } + + @Override + public List getMyLoginMem(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMyLoginMem", search); + } + + @Override + public List getMemList(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMemList", search); + } + + @Override + public long getRetailBalcePoint(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getRetailBalcePoint", search); + } + + @Override + public void updateRetailPointStatus(@Valid RetailSearch search) { + // TODO Auto-generated method stub + sqlSession.update("updateRetailPointStatus", search); + } + + @Override + public List myMemIds(Member search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("myMemIds", search); + } + + @Override + public List getMyCategoryRateList(MemberSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMyCategoryRateList", search); + } + + @Override + public List getBotCategoryRateList(MemberSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getBotCategoryRateList", search); + } + + @Override + public int updateCasinoRate(BotMemRateVo item) { + // TODO Auto-generated method stub + return sqlSession.update("updateCasinoRate", item); + } + + @Override + public int updateHcasinoRate(BotMemRateVo item) { + // TODO Auto-generated method stub + return sqlSession.update("updateHcasinoRate", item); + } + + @Override + public int updateSlotRate(BotMemRateVo item) { + // TODO Auto-generated method stub + return sqlSession.update("updateSlotRate", item); + } + + @Override + public int updateMiniRate(BotMemRateVo item) { + // TODO Auto-generated method stub + return sqlSession.update("updateMiniRate", item); + } + + @Override + public int updateSportRate(BotMemRateVo item) { + // TODO Auto-generated method stub + return sqlSession.update("updateSportRate", item); + } + + @Override + public List getMyUnderPartnerLevels(Member search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMyUnderPartnerLevels", search); + } + + @Override + public int getMyMemListCnt(RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMyMemListCnt", search); + } + + @Override + public List getMyMemList(RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMyMemList", search); + } + + @Override + public int getMyMemDirectListCnt(RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMyMemDirectListCnt", search); + } + + @Override + public List getMyMemDirectList(RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMyMemDirectList", search); + } + + + @Override + public int getMyPartnerListCnt(RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMyPartnerListCnt", search); + } + + @Override + public List getMyPartnerList(RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMyPartnerList", search); + } + + @Override + public List getMyPartnerList2(RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMyPartnerList2", search); + } + + @Override + public List getMyPartnerDirectList(RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMyPartnerDirectList", search); + } + + @Override + public int partnerBonusSettingSave(ChargingPointSettingVO settingVO) { + // TODO Auto-generated method stub + return sqlSession.update("partnerBonusSettingSave", settingVO); + } + + @Override + public int getRetailPointListCnt(RetailPointSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getRetailPointListCnt", search); + } + + @Override + public List getRetailPointList(RetailPointSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getRetailPointList", search); + } + + @Override + public List getPartnerHierarchy(RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getPartnerHierarchy", search); + } + + @Override + public List> getBottomRateList(Member search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getBottomRateList", search); + } + + @Override + public int userLockWithBottom(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.update("userLockWithBottom", param); + } + + @Override + public HashMap getBotCashInfo(RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getBotCashInfo", search); + } + + @Override + public int getMyLoginMemListCnt(MemberListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMyLoginMemListCnt", search); + } + + @Override + public List getMyLoginMemList(MemberListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMyLoginMemList", search); + } + + @Override + public HashMap getPartnerInfo(RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getPartnerInfoV2", search); + } + + @Override + public String getNextTargetLevel(RetailLowerSearch param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getNextTargetLevel", param); + } + + @Override + public int getLowerPartnerListCnt(RetailLowerSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getLowerPartnerListCnt", search); + } + + @Override + public List> getLowerPartnerList(RetailLowerSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getLowerPartnerList", search); + } + + @Override + public UserDetailInfo getUserDetailInfo(UserSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getUserDetailInfo", search); + } + + @Override + public int setUserDetailInfo(UserDetailInfo info) { + // TODO Auto-generated method stub + return sqlSession.update("setUserDetailInfo", info); + } + + @Override + public List> getDetailLoginLog(UserSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getDetailLoginLog", search); + } + + @Override + public int getDetailMsgLogCnt(UserListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getDetailMsgLogCnt", search); + } + + @Override + public List> getDetailMsgLog(UserListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getDetailMsgLog", search); + } + + @Override + public int getDetailCashLogCnt(UserListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getDetailCashLogCnt", search); + } + + @Override + public List> getDetailCashLog(UserListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getDetailCashLog", search); + } + + @Override + public int getDetailRollingLogCnt(UserListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getDetailRollingLogCnt", search); + } + + @Override + public List> getDetailRollingLog(UserListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getDetailRollingLog", search); + } + + @Override + public List> getDetailRollingLogNew(UserListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getDetailRollingLogNew", search); + } + + @Override + public List getPartnerHierarchy2(RetailSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getPartnerHierarchy2", search); + } + + @Override + public HashMap getMyBetStatData(UserSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMyBetStatData", search); + } + + @Override + public List> getBottomBetStatList(UserSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getBottomBetStatList", search); + } + + @Override + public HashMap getBottomBetStatSum(UserSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getBottomBetStatSum", search); + } + + @Override + public List> getDailyBetList(UserSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getDailyBetList", search); + } + + @Override + public HashMap getDailyBetSum(UserSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getDailyBetSum", search); + } + + @Override + public List> getDailyUserList(UserSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getDailyUserList", search); + } + + @Override + public HashMap getDailyUserSum(UserSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getDailyUserSum", search); + } + + @Override + public List> getDailyPartnerList(UserSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getDailyPartnerList", search); + } + + @Override + public int getBotCnt(Member searchBot) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getBotCnt", searchBot); + } + +} diff --git a/src/main/java/com/bb/dao/SuperDao.java b/src/main/java/com/bb/dao/SuperDao.java new file mode 100644 index 0000000..adba49f --- /dev/null +++ b/src/main/java/com/bb/dao/SuperDao.java @@ -0,0 +1,18 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; + +import jakarta.validation.Valid; + +import com.bb.model.MemberListSearch; +import com.bb.model.SiteSearch; + + +public interface SuperDao { + + int getCompanyListCnt(@Valid MemberListSearch search); + + List getCompanyList(@Valid MemberListSearch search); + +} diff --git a/src/main/java/com/bb/dao/SuperDaoImpl.java b/src/main/java/com/bb/dao/SuperDaoImpl.java new file mode 100644 index 0000000..fe44fc2 --- /dev/null +++ b/src/main/java/com/bb/dao/SuperDaoImpl.java @@ -0,0 +1,38 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; + +import jakarta.validation.Valid; + +import org.apache.ibatis.session.SqlSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Repository; + +import com.bb.model.MemberListSearch; +import com.bb.model.SiteSearch; + +@Repository("superDao") +public class SuperDaoImpl implements SuperDao{ + + /** 메인DB 연결 */ + @Autowired @Qualifier("sqlSessionMain") + protected SqlSession sqlSession; + + /** 서브DB 연결 */ + @Autowired @Qualifier("sqlSessionSub") + protected SqlSession sqlSessionSub; + + @Override + public int getCompanyListCnt(@Valid MemberListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getCompanyListCnt",search ); + } + + @Override + public List getCompanyList(@Valid MemberListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getCompanyList",search ); + } +} diff --git a/src/main/java/com/bb/dao/UserDao.java b/src/main/java/com/bb/dao/UserDao.java new file mode 100644 index 0000000..e3d5459 --- /dev/null +++ b/src/main/java/com/bb/dao/UserDao.java @@ -0,0 +1,217 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import jakarta.validation.Valid; + +import com.bb.model.AdminTokenInfo; +import com.bb.model.ApiVendorCompInfo; +import com.bb.model.BlankSpinRate; +import com.bb.model.ChargingPointSettingVO; +import com.bb.model.CodeSearch; +import com.bb.model.CompResetInfo; +import com.bb.model.DashInfo; +import com.bb.model.GameUseInfo; +import com.bb.model.GraphInfo; +import com.bb.model.IdListSearch; +import com.bb.model.LoginUserVO; +import com.bb.model.MemListSearchVO; +import com.bb.model.Member; +import com.bb.model.MemberDetail; +import com.bb.model.MemberHierarchyVo; +import com.bb.model.MemberInsert; +import com.bb.model.MemberInsert2; +import com.bb.model.MemberListSearch; +import com.bb.model.MemberSearch; +import com.bb.model.MemberStatus; +import com.bb.model.MemberTokenInfo; +import com.bb.model.MemberUpdate; +import com.bb.model.Month10Info; +import com.bb.model.MultipleRate; +import com.bb.model.MultipleRateInfo; +import com.bb.model.NewMemRateItem; +import com.bb.model.Site; +import com.bb.model.SiteSearch; +import com.bb.model.Top15Info; +import com.bb.model.TreeListSearch; +import com.bb.model.TripleAuthInfo; +import com.bb.model.UserListSearch; +import com.bb.model.UserSearch; + +public interface UserDao { + + Member login(MemberSearch param); + Site getSiteInfoByKey(String reqKey); + Site swaggerlogin(HashMap param); + HashMap adminLogin(SiteSearch search); + int insertMember(@Valid Member signupMember); + void insertDividendRateType(@Valid Member signupMember); + void insertMemCommssion(@Valid Member signupMember); + void insertMemBetLimit(@Valid Member signupMember); + void insertMemBurdenRate(@Valid Member signupMember); + MemberDetail getMember(Member member); + void updateStatus(@Valid MemberStatus status); + List getMemberRate(Member search); + List getMemberRateByNormal(Member search); + int insertSiteInfo(@Valid MemberInsert signupMember); + List getMemTreeList(@Valid TreeListSearch search); + HashMap getHeadCashInfo(HashMap param); + void memberRateUpdate(HashMap param); + void updateAllBottomRate(HashMap param); + int idCheck(@Valid Member signupMember); + int idCheckByAdmin(@Valid Member signupMember); + int nameCheck(@Valid Member signupMember); + int phoneCheck(@Valid Member signupMember); + int accCheck(@Valid Member signupMember); + Site getSiteInfo(String siteId); + + HashMap getMemberDetail_1(Member search); + HashMap getMemberDetail_2(Member search); + HashMap getMemberDetail_3(Member search); + void updateMember(MemberUpdate signupMember); + void memberRateBetYn(HashMap param); + int adminJoin(@Valid MemberInsert signupMember); + int adminJoin2(MemberInsert2 signupMember); + int insertCompany(@Valid MemberInsert signupMember); + HashMap getMemberListCnt(@Valid MemberListSearch search); + List getMemberList(@Valid MemberListSearch search); + int getMemStatusListCnt(@Valid MemberListSearch search); + List getMemStatusList(@Valid MemberListSearch search); + int getMemLogListCnt(@Valid MemberListSearch search); + List getMemLogList(@Valid MemberListSearch search); + int getMemLoginListCnt(MemberListSearch search); + List getMemLoginList(MemberListSearch search); + int getIpListCnt(@Valid MemberListSearch search); + List getIpList(@Valid MemberListSearch search); + void recUpdate(@Valid MemberListSearch signupMember); + void recUpdateFlow(@Valid MemberListSearch signupMember); + void updateOutAmtYn(@Valid MemberStatus status); + List getMemInfo(HashMap ti); + void gameUseUpdate(@Valid GameUseInfo gui); + List gameUseList(@Valid GameUseInfo gui); + void updatePwd(@Valid Site site); + void updateMemPwd(@Valid Site site); + int getDeniedIpCheck(HashMap param); + int getDeniedPhoneCheck(@Valid Member signupMember); + int getDeniedAccCheck(@Valid Member signupMember); + void updateAdminPwd(@Valid Site site); + List> getAdminIpList(Map ipParam); + List miniGameInfo(HashMap ti); + HashMap adminSuperLogin(SiteSearch search); + List getMemberFlowList(HashMap memberDetail); + List getPartnerFlowList(HashMap memberDetail); + HashMap getSuperHeadCashInfo(); + + int getIdListCnt(IdListSearch search); + List getIdList(IdListSearch search); + + List getBISubPointRate(Member search); + MemberDetail getMemByTriple(Member search); + int insertTripleAuthInfo(TripleAuthInfo user); + int updateMemCash(MemberDetail memberVo); + int adminCheck(String adminId); + int updateMemListIcon(@Valid MemberUpdate memberVO); + int resetPassword(Member memberVO); + List getTopUserList(Member search); + List> getTopUserList2(Member search); + ApiVendorCompInfo getApiVendorCompInfo(HashMap param); + ApiVendorCompInfo getApiVendorCompInfoByCron(HashMap param); + int insertBaseRcmdUser(MemberInsert baseRcmdUser); + String getBaseRecommenderId(Member search); + Long getUserTimeout(Member searchMem); + int updateUserTimeout(Member searchMem); + int getMemRollingListCnt(MemberListSearch search); + List getMemRollingList(MemberListSearch search); + List getPartnerMemIds(Member searchMem); + HashMap getPartnerMemId(Member searchMem); + List getPartnerLevels(CodeSearch codesSearch); + String getPartnerLevelByRecId(@Valid MemberInsert signupMember); + List getPartnerBotUserList(Member search); + List getPartnerRateList(MemberSearch search); + HashMap getPartnerMemberDetail(Member search); + void updateBlankSpinRate(@Valid BlankSpinRate rate); + void updateAllBlankSpinRate(@Valid BlankSpinRate rate); + int insertAdminHeadInfo(@Valid MemberInsert signupMember); + Integer getCheckMemberToken(MemberTokenInfo param); + Integer getCheckAdminToken(AdminTokenInfo param); + HashMap getNewMsgInfo(Member member); + HashMap getUserGameInfo(HashMap param); + HashMap getLastGameInfo(Member searchMem); + HashMap getLastGameInfoNew(HashMap logParam); + HashMap getHeadTopInfo(HashMap param); + HashMap getLastGameInfoNoLimit(Member searchMem); + HashMap getPartnerLevelUpInfo(MemberDetail targetUser); + void updatePartnerLevel(HashMap user); + HashMap getUserCashAmt(MemberSearch param); + TripleAuthInfo getTripleAuthInfo(Member search); + HashMap getMemberMap(Member search); +// HashMap getMemBetInfo(TripleVO tripleVO); + int getLoginTryCount(MemberSearch search); + void setLoginLock(MemberSearch search); + HashMap getMemChargingPointInfo(HashMap pointParam); + void updateFstChrgByJoinFlag(HashMap param); + HashMap getBonusSettingInfo(HashMap param); + int userChangeFlag(HashMap flagParam); + int bonusSettingSave(ChargingPointSettingVO settingVO); + int checkSitePrefix(String sitePrefix); + int getNormalRetailCnt(Member user); + int userChangeSymLock(HashMap lockParam); + int setUserLock(HashMap lockParam); + double getUserMinPR(HashMap minParam); + List> getUserHierarchyList(MemberHierarchyVo search); + int checkMyBottom(HashMap searchMap); + List getMultipleRateList(MultipleRateInfo param); + int updateMyMultipleRate(HashMap updParam); + int updateTopMultipleMinRate(HashMap updParam); + int updateBottomMultipleMaxRate(HashMap updParam); + List getMemRateItemList(NewMemRateItem rateItem); + NewMemRateItem getMemRateItem(@Valid NewMemRateItem rateItem); + int updateMyRate(HashMap updParam); + int updateTopMinRate(HashMap updParam); + int updateBottomMaxRate(HashMap updParam); + int updateCashOutFlag(HashMap flagParam); + HashMap getMemberMap2(Member search); + List getDashInfoInfo(HashMap param); + List getGraphInfo(HashMap param); + int updLoginFailCnt(Member member); + String getLoginUserBetData(MemberListSearch search); + LoginUserVO getLoginUserReportData(MemberListSearch search); + int getMemberTreeListCnt(MemListSearchVO search); + List getMemberTreeList(MemListSearchVO search); + List getUserTreeHierarchy(MemListSearchVO search); + int settingCashInOut(HashMap param); + List getIpDetailList(MemberListSearch search); + HashMap getTotalInfo(Member param); + int updateMemCashByAmount(HashMap cashParam); + HashMap getMemBankInfo(HashMap param); + int resetUserLock(HashMap lockParam); + List getTop15Info(HashMap paramMap); + Month10Info getMonth10Info(String siteId); + List> delCheckMemList(CompResetInfo compResetInfo); + int deleteUsers(CompResetInfo compResetInfo); + int updateAdminHeadInfo(CompResetInfo compResetInfo); + int updMemPhone(HashMap param); + HashMap getTotalBalance(Member search2); + List> getCountInfo(Member search2); + int getLowerUserListCnt(UserListSearch search); + List> getLowerUserList(UserListSearch search); + List> getLoginUserList(UserSearch search); + int getPlayGameListCnt(UserListSearch search); + List> getPlayGameList(UserListSearch search); + int getDetailBetListCnt(UserListSearch search); + List> getDetailBetList(UserListSearch search); + int getDetailBetListNewCnt(UserListSearch search); + List> getDetailBetListNew(UserListSearch search); + int getTotalChangePointAmt(Member search); + TripleAuthInfo getTripleAuthInfo2(Member user); + int getIsMyBottomCnt(Member search); + List> getPassAllResetList(String siteId); + HashMap getSiteCashBonusInfo(HashMap param); + List> getSiteCashBonusList(long siteIdx); + MemberDetail getMemByRvHoldem(Member searchMem); + int insertRvHoldemAuthInfo(HashMap userMap); + HashMap getRvHoldemCheckInfo(String uid); + +} diff --git a/src/main/java/com/bb/dao/UserDaoImpl.java b/src/main/java/com/bb/dao/UserDaoImpl.java new file mode 100644 index 0000000..ea90179 --- /dev/null +++ b/src/main/java/com/bb/dao/UserDaoImpl.java @@ -0,0 +1,1226 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import jakarta.validation.Valid; + +import org.apache.ibatis.session.SqlSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Repository; + +import com.bb.model.AdminTokenInfo; +import com.bb.model.ApiVendorCompInfo; +import com.bb.model.BlankSpinRate; +import com.bb.model.ChargingPointSettingVO; +import com.bb.model.CodeSearch; +import com.bb.model.CompResetInfo; +import com.bb.model.DashInfo; +import com.bb.model.GameUseInfo; +import com.bb.model.GraphInfo; +import com.bb.model.IdListSearch; +import com.bb.model.LoginUserVO; +import com.bb.model.MemListSearchVO; +import com.bb.model.Member; +import com.bb.model.MemberDetail; +import com.bb.model.MemberHierarchyVo; +import com.bb.model.MemberInsert; +import com.bb.model.MemberInsert2; +import com.bb.model.MemberListSearch; +import com.bb.model.MemberSearch; +import com.bb.model.MemberStatus; +import com.bb.model.MemberTokenInfo; +import com.bb.model.MemberUpdate; +import com.bb.model.Month10Info; +import com.bb.model.MultipleRate; +import com.bb.model.MultipleRateInfo; +import com.bb.model.NewMemRateItem; +import com.bb.model.Site; +import com.bb.model.SiteSearch; +import com.bb.model.Top15Info; +import com.bb.model.TreeListSearch; +import com.bb.model.TripleAuthInfo; +import com.bb.model.UserListSearch; +import com.bb.model.UserSearch; + + +@Repository("userDao") +public class UserDaoImpl implements UserDao { + + + /** 메인DB 연결 */ + @Autowired @Qualifier("sqlSessionMain") + protected SqlSession sqlSession; + + /** 서브DB 연결 */ + @Autowired @Qualifier("sqlSessionSub") + protected SqlSession sqlSessionSub; + + + @Override + public Site swaggerlogin(HashMap param) { + return sqlSession.selectOne("swaggerlogin", param); + } + + + @Override + public Site getSiteInfoByKey(String reqKey) { + return sqlSessionSub.selectOne("getSiteInfoByKey", reqKey); + } + + + @Override + public Member login(MemberSearch param) { + return sqlSessionSub.selectOne("login", param); + } + + + @Override + public HashMap adminLogin(SiteSearch search) { + return sqlSessionSub.selectOne("adminLogin", search); + } + + + @Override + public int insertMember(@Valid Member signupMember) { + return sqlSession.insert("insertMember", signupMember); + + } + + + @Override + public void insertDividendRateType(@Valid Member signupMember) { + // TODO Auto-generated method stub + sqlSession.insert("insertDividendRateType", signupMember); + } + + + @Override + public void insertMemCommssion(@Valid Member signupMember) { + // TODO Auto-generated method stub + sqlSession.insert("insertMemCommssion", signupMember); + } + + + @Override + public void insertMemBetLimit(@Valid Member signupMember) { + // TODO Auto-generated method stub + sqlSession.insert("insertMemBetLimit", signupMember); + } + + + @Override + public void insertMemBurdenRate(@Valid Member signupMember) { + // TODO Auto-generated method stub + sqlSession.insert("insertMemBurdenRate", signupMember); + } + + + @Override + public MemberDetail getMember(Member member) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMember", member); + } + + + @Override + public void updateStatus(@Valid MemberStatus status) { + // TODO Auto-generated method stub + sqlSession.update("memUpdateStatus", status); + } + + + @Override + public List getMemberRate(Member search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMemberRate", search); + } + + @Override + public List getMemberRateByNormal(Member search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMemberRateByNormal", search); + } + + + @Override + public int insertSiteInfo(@Valid MemberInsert signupMember) { + // TODO Auto-generated method stub + return sqlSession.insert("insertSiteInfo", signupMember); + } + + + @Override + public List getMemTreeList(@Valid TreeListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMemTreeList", search); + } + + + @Override + public HashMap getHeadCashInfo(HashMap param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getHeadCashInfo", param); + } + + + @Override + public void memberRateUpdate(HashMap param) { + // TODO Auto-generated method stub + sqlSession.update("memberRateUpdate", param); + } + + + @Override + public void updateAllBottomRate(HashMap param) { + // TODO Auto-generated method stub + sqlSession.update("updateAllBottomRate", param); + } + + + @Override + public int idCheck(@Valid Member signupMember) { + // TODO Auto-generated method stub + return sqlSession.selectOne("idCheck", signupMember); + } + + + @Override + public int idCheckByAdmin(@Valid Member signupMember) { + // TODO Auto-generated method stub + return sqlSession.selectOne("idCheckByAdmin", signupMember); + } + + + @Override + public int nameCheck(@Valid Member signupMember) { + // TODO Auto-generated method stub + return sqlSession.selectOne("nameCheck", signupMember); + } + + + @Override + public int phoneCheck(@Valid Member signupMember) { + // TODO Auto-generated method stub + return sqlSession.selectOne("phoneCheck", signupMember); + } + + + @Override + public int accCheck(@Valid Member signupMember) { + // TODO Auto-generated method stub + return sqlSession.selectOne("accCheck", signupMember); + } + + + @Override + public Site getSiteInfo(String siteId) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getSiteInfo", siteId); + } + + + @Override + public HashMap getMemberDetail_1(Member search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMemberDetail_1", search); + } + + + @Override + public HashMap getMemberDetail_2(Member search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMemberDetail_2", search); + } + + + @Override + public HashMap getMemberDetail_3(Member search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMemberDetail_3", search); + } + + + @Override + public void updateMember(MemberUpdate signupMember) { + sqlSession.update("updateMember", signupMember); + + } + + + @Override + public void memberRateBetYn(HashMap param) { + // TODO Auto-generated method stub + sqlSession.update("memberRateBetYn", param); + } + + + @Override + public int adminJoin(@Valid MemberInsert signupMember) { + // TODO Auto-generated method stub + return sqlSession.insert("adminJoin", signupMember); + } + + + @Override + public int adminJoin2(MemberInsert2 signupMember) { + // TODO Auto-generated method stub + return sqlSession.insert("adminJoin2", signupMember); + } + + + @Override + public HashMap getMemberListCnt(@Valid MemberListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMemberListCnt", search); + } + + + @Override + public List getMemberList(@Valid MemberListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMemberList", search); + } + + + @Override + public int getMemStatusListCnt(@Valid MemberListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMemStatusListCnt", search); + } + + + @Override + public List getMemStatusList(@Valid MemberListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMemStatusList", search); + } + + + @Override + public int getMemLogListCnt(@Valid MemberListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMemLogListCnt", search); + } + + + @Override + public List getMemLogList(@Valid MemberListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMemLogList", search); + } + + + @Override + public int getMemLoginListCnt(@Valid MemberListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMemLoginListCnt", search); + } + + + @Override + public List getMemLoginList(MemberListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMemLoginList", search); + } + + + @Override + public int getIpListCnt(@Valid MemberListSearch search) { + // TODO Auto-generated method stubgetIpListCnt + return sqlSessionSub.selectOne("getIpListCnt", search); + } + + + @Override + public List getIpList(@Valid MemberListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getIpList", search); + } + + + @Override + public void recUpdate(@Valid MemberListSearch signupMember) { + // TODO Auto-generated method stub + sqlSession.update("recUpdate", signupMember); + } + + + @Override + public void recUpdateFlow(@Valid MemberListSearch signupMember) { + // TODO Auto-generated method stub + sqlSession.delete("recdel", signupMember); + sqlSession.update("recUpdateFlow", signupMember); + } + + + @Override + public void updateOutAmtYn(@Valid MemberStatus status) { + // TODO Auto-generated method stub + sqlSession.update("updateOutAmtYn", status); + } + + + @Override + public List getMemInfo(HashMap ti) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMemInfo", ti); + } + + + @Override + public void gameUseUpdate(@Valid GameUseInfo gui) { + sqlSession.update("gameUseUpdate", gui); + + } + + + @Override + public List gameUseList(@Valid GameUseInfo gui) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("gameUseList", gui); + } + + + @Override + public int insertCompany(@Valid MemberInsert signupMember) { + // TODO Auto-generated method stub + return sqlSession.insert("insertCompany", signupMember); + } + + + @Override + public void updatePwd(@Valid Site site) { + // TODO Auto-generated method stub + sqlSession.update("updatePwd", site); + } + + + @Override + public void updateMemPwd(@Valid Site site) { + // TODO Auto-generated method stub + sqlSession.update("updateMemPwd", site); + } + + + @Override + public int getDeniedIpCheck(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getDeniedIpCheck", param); + } + + + @Override + public int getDeniedPhoneCheck(@Valid Member signupMember) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getDeniedPhoneCheck", signupMember); + } + + + @Override + public int getDeniedAccCheck(@Valid Member signupMember) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getDeniedAccCheck", signupMember); + } + + + @Override + public void updateAdminPwd(@Valid Site site) { + // TODO Auto-generated method stub + sqlSession.update("updateAdminPwd", site); + } + + + @Override + public List> getAdminIpList(Map ipParam) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getAdminIpList", ipParam); + } + + + @Override + public List miniGameInfo(HashMap ti) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("miniGameInfo", ti); + } + + + @Override + public HashMap adminSuperLogin(SiteSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("adminSuperLogin", search); + } + + + @Override + public List getMemberFlowList(HashMap memberDetail) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMemberFlowList", memberDetail); + } + + + @Override + public List getPartnerFlowList(HashMap memberDetail) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getPartnerFlowList", memberDetail); + } + + + @Override + public HashMap getSuperHeadCashInfo() { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getSuperHeadCashInfo", null); + } + + + @Override + public int getIdListCnt(IdListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getIdListCnt", search); + } + + + @Override + public List getIdList(IdListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getIdList", search); + } + + + @Override + public List getBISubPointRate(Member search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getBISubPointRate", search); + } + + + @Override + public MemberDetail getMemByTriple(Member search) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getMemByTriple", search); + } + + + @Override + public int insertTripleAuthInfo(TripleAuthInfo user) { + // TODO Auto-generated method stub + return sqlSession.insert("insertTripleAuthInfo", user); + } + + + @Override + public int updateMemCash(MemberDetail memberVo) { + // TODO Auto-generated method stub + return sqlSession.update("updateMemCash", memberVo); + } + + + @Override + public int adminCheck(String adminId) { + // TODO Auto-generated method stub + return sqlSession.selectOne("adminCheck", adminId); + } + + + @Override + public int updateMemListIcon(@Valid MemberUpdate memberVO) { + // TODO Auto-generated method stub + return sqlSession.update("updateMemListIcon", memberVO); + } + + + @Override + public int resetPassword(Member memberVO) { + // TODO Auto-generated method stub + return sqlSession.update("resetPassword", memberVO); + } + + + @Override + public List getTopUserList(Member search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getTopUserList", search); + } + + @Override + public List> getTopUserList2(Member search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getTopUserList2", search); + } + + + @Override + public ApiVendorCompInfo getApiVendorCompInfo(HashMap param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getApiVendorCompInfo", param); + } + + + @Override + public ApiVendorCompInfo getApiVendorCompInfoByCron(HashMap param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getApiVendorCompInfoByCron", param); + } + + + @Override + public int insertBaseRcmdUser(MemberInsert baseRcmdUser) { + // TODO Auto-generated method stub + return sqlSession.insert("insertBaseRcmdUser", baseRcmdUser); + } + + + @Override + public String getBaseRecommenderId(Member search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getBaseRecommenderId", search); + } + + + @Override + public Long getUserTimeout(Member searchMem) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getUserTimeout", searchMem); + } + + + @Override + public int updateUserTimeout(Member searchMem) { + // TODO Auto-generated method stub + return sqlSession.update("updateUserTimeout", searchMem); + } + + + @Override + public int getMemRollingListCnt(MemberListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMemRollingListCnt", search); + } + + + @Override + public List getMemRollingList(MemberListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMemRollingList", search); + } + + + @Override + public List getPartnerMemIds(Member searchMem) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getPartnerMemIds", searchMem); + } + + + @Override + public HashMap getPartnerMemId(Member searchMem) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getPartnerMemId", searchMem); + } + + + @Override + public List getPartnerLevels(CodeSearch codesSearch) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getPartnerLevels", codesSearch); + } + + + @Override + public String getPartnerLevelByRecId(@Valid MemberInsert signupMember) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getPartnerLevelByRecId", signupMember); + } + + + @Override + public List getPartnerBotUserList(Member search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getPartnerBotUserList", search); + } + + + @Override + public List getPartnerRateList(MemberSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getPartnerRateList", search); + } + + + @Override + public HashMap getPartnerMemberDetail(Member search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getPartnerMemberDetail", search); + } + + + @Override + public void updateBlankSpinRate(@Valid BlankSpinRate rate) { + // TODO Auto-generated method stub + sqlSession.update("updateBlankSpinRate", rate); + } + + + @Override + public void updateAllBlankSpinRate(@Valid BlankSpinRate rate) { + // TODO Auto-generated method stub + sqlSession.update("updateAllBlankSpinRate", rate); + } + + + @Override + public int insertAdminHeadInfo(@Valid MemberInsert signupMember) { + // TODO Auto-generated method stub + return sqlSession.insert("insertAdminHeadInfo", signupMember); + } + + + @Override + public Integer getCheckMemberToken(MemberTokenInfo param) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getCheckMemberToken", param); + } + + + @Override + public Integer getCheckAdminToken(AdminTokenInfo param) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getCheckAdminToken", param); + } + + + @Override + public HashMap getNewMsgInfo(Member member) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getNewMsgInfo", member); + } + + + @Override + public HashMap getUserGameInfo(HashMap param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getUserGameInfo", param); + } + + + @Override + public HashMap getLastGameInfo(Member searchMem) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getLastGameInfo", searchMem); + } + + + @Override + public HashMap getLastGameInfoNew(HashMap logParam) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getLastGameInfoNew", logParam); + } + + + @Override + public HashMap getHeadTopInfo(HashMap param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getHeadTopInfo", param); + } + + + @Override + public HashMap getLastGameInfoNoLimit(Member searchMem) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getLastGameInfoNoLimit", searchMem); + } + + + @Override + public HashMap getPartnerLevelUpInfo(MemberDetail targetUser) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getPartnerLevelUpInfo", targetUser); + } + + + @Override + public void updatePartnerLevel(HashMap user) { + // TODO Auto-generated method stub + sqlSession.update("updatePartnerLevel", user); + } + + + @Override + public HashMap getUserCashAmt(MemberSearch param) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getUserCashAmt", param); + } + + + @Override + public TripleAuthInfo getTripleAuthInfo(Member search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getTripleAuthInfo", search); + } + + + @Override + public HashMap getMemberMap(Member search) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getMemberMap", search); + } + + @Override + public HashMap getMemberMap2(Member search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMemberMap2", search); + } + + /* + @Override + public HashMap getMemBetInfo(TripleVO tripleVO) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMemBetInfo", tripleVO); + } + */ + + @Override + public int getLoginTryCount(MemberSearch search) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getLoginTryCount", search); + } + + + @Override + public void setLoginLock(MemberSearch search) { + // TODO Auto-generated method stub + sqlSession.update("setLoginLock", search); + } + + + @Override + public HashMap getMemChargingPointInfo(HashMap pointParam) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMemChargingPointInfo", pointParam); + } + + + @Override + public void updateFstChrgByJoinFlag(HashMap param) { + // TODO Auto-generated method stub + sqlSession.update("updateFstChrgByJoinFlag", param); + } + + + @Override + public HashMap getBonusSettingInfo(HashMap param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getBonusSettingInfo", param); + } + + + @Override + public int userChangeFlag(HashMap flagParam) { + // TODO Auto-generated method stub + return sqlSession.update("userChangeFlag", flagParam); + } + + + @Override + public int bonusSettingSave(ChargingPointSettingVO settingVO) { + // TODO Auto-generated method stub + return sqlSession.update("bonusSettingSave", settingVO); + } + + + @Override + public int checkSitePrefix(String sitePrefix) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("checkSitePrefix", sitePrefix); + } + + + @Override + public int getNormalRetailCnt(Member user) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getNormalRetailCnt", user); + } + + + @Override + public int userChangeSymLock(HashMap lockParam) { + // TODO Auto-generated method stub + return sqlSession.update("userChangeSymLock", lockParam); + } + + + @Override + public int setUserLock(HashMap lockParam) { + // TODO Auto-generated method stub + return sqlSession.update("setUserLock", lockParam); + } + + + @Override + public double getUserMinPR(HashMap minParam) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getUserMinPR", minParam); + } + + + @Override + public List> getUserHierarchyList(MemberHierarchyVo search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getUserHierarchyList", search); + } + + + @Override + public int checkMyBottom(HashMap searchMap) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("checkMyBottom", searchMap); + } + + + @Override + public List getMultipleRateList(MultipleRateInfo param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMultipleRateList", param); + } + + + @Override + public int updateMyMultipleRate(HashMap updParam) { + // TODO Auto-generated method stub + return sqlSession.update("updateMyMultipleRate", updParam); + } + + + @Override + public int updateTopMultipleMinRate(HashMap updParam) { + // TODO Auto-generated method stub + return sqlSession.update("updateTopMultipleMinRate", updParam); + } + + + @Override + public int updateBottomMultipleMaxRate(HashMap updParam) { + // TODO Auto-generated method stub + return sqlSession.update("updateBottomMultipleMaxRate", updParam); + } + + + @Override + public List getMemRateItemList(NewMemRateItem rateItem) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMemRateItemList", rateItem); + } + + @Override + public NewMemRateItem getMemRateItem(@Valid NewMemRateItem rateItem) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMemRateItem", rateItem); + } + + @Override + public int updateMyRate(HashMap updParam) { + // TODO Auto-generated method stub + return sqlSession.update("updateMyRate", updParam); + } + + @Override + public int updateTopMinRate(HashMap updParam) { + // TODO Auto-generated method stub + return sqlSession.update("updateTopMinRate", updParam); + } + + @Override + public int updateBottomMaxRate(HashMap updParam) { + // TODO Auto-generated method stub + return sqlSession.update("updateBottomMaxRate", updParam); + } + + + @Override + public int updateCashOutFlag(HashMap flagParam) { + // TODO Auto-generated method stub + return sqlSession.update("updateCashOutFlag", flagParam); + } + + + @Override + public List getDashInfoInfo(HashMap param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getDashInfoInfo", param); + } + + + @Override + public List getGraphInfo(HashMap param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getGraphInfo", param); + } + + + @Override + public int updLoginFailCnt(Member member) { + // TODO Auto-generated method stub + return sqlSession.update("updLoginFailCnt", member); + } + + + @Override + public String getLoginUserBetData(MemberListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getLoginUserBetData", search); + } + + + @Override + public LoginUserVO getLoginUserReportData(MemberListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getLoginUserReportData", search); + } + + + @Override + public int getMemberTreeListCnt(MemListSearchVO search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMemberTreeListCnt", search); + } + + + @Override + public List getMemberTreeList(MemListSearchVO search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getMemberTreeList", search); + } + + + @Override + public List getUserTreeHierarchy(MemListSearchVO search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getUserTreeHierarchy", search); + } + + + @Override + public int settingCashInOut(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.update("settingCashInOut", param); + } + + + @Override + public List getIpDetailList(MemberListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getIpDetailList", search); + } + + + @Override + public HashMap getTotalInfo(Member param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getTotalInfo", param); + } + + + @Override + public int updateMemCashByAmount(HashMap cashParam) { + // TODO Auto-generated method stub + return sqlSession.update("updateMemCashByAmount", cashParam); + } + + + @Override + public HashMap getMemBankInfo(HashMap param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMemBankInfo", param); + } + + + @Override + public int resetUserLock(HashMap lockParam) { + // TODO Auto-generated method stub + return sqlSession.update("resetUserLock", lockParam); + } + + + @Override + public List getTop15Info(HashMap paramMap) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getTop15Info", paramMap); + } + + + @Override + public Month10Info getMonth10Info(String siteId) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getMonth10Info", siteId); + } + + + @Override + public List> delCheckMemList(CompResetInfo compResetInfo) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("delCheckMemList", compResetInfo); + } + + + @Override + public int deleteUsers(CompResetInfo compResetInfo) { + // TODO Auto-generated method stub + return sqlSession.delete("deleteUsers", compResetInfo); + } + + + @Override + public int updateAdminHeadInfo(CompResetInfo compResetInfo) { + // TODO Auto-generated method stub + return sqlSession.update("updateAdminHeadInfo", compResetInfo); + } + + + @Override + public int updMemPhone(HashMap param) { + // TODO Auto-generated method stub + return sqlSession.update("updMemPhone", param); + } + + + @Override + public HashMap getTotalBalance(Member search2) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getTotalBalance", search2); + } + + + @Override + public List> getCountInfo(Member search2) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getCountInfo", search2); + } + + + @Override + public int getLowerUserListCnt(UserListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getLowerUserListCnt", search); + } + + + @Override + public List> getLowerUserList(UserListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getLowerUserList", search); + } + + + @Override + public List> getLoginUserList(UserSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getLoginUserList", search); + } + + + @Override + public int getPlayGameListCnt(UserListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getPlayGameListCnt", search); + } + + + @Override + public List> getPlayGameList(UserListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getPlayGameList", search); + } + + + @Override + public int getDetailBetListCnt(UserListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getDetailBetListCnt", search); + } + + + @Override + public List> getDetailBetList(UserListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getDetailBetList", search); + } + + + @Override + public int getDetailBetListNewCnt(UserListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getDetailBetListNewCnt", search); + } + + + @Override + public List> getDetailBetListNew(UserListSearch search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getDetailBetListNew", search); + } + + + @Override + public int getTotalChangePointAmt(Member search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getTotalChangePointAmt", search); + } + + + @Override + public TripleAuthInfo getTripleAuthInfo2(Member user) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getTripleAuthInfo2", user); + } + + + @Override + public int getIsMyBottomCnt(Member search) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getIsMyBottomCnt", search); + } + + + @Override + public List> getPassAllResetList(String siteId) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getPassAllResetList", siteId); + } + + + @Override + public HashMap getSiteCashBonusInfo(HashMap param) { + // TODO Auto-generated method stub + return sqlSessionSub.selectOne("getSiteCashBonusInfo", param); + } + + + @Override + public List> getSiteCashBonusList(long siteIdx) { + // TODO Auto-generated method stub + return sqlSessionSub.selectList("getSiteCashBonusList", siteIdx); + } + + + @Override + public MemberDetail getMemByRvHoldem(Member searchMem) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getMemByRvHoldem", searchMem); + } + + + @Override + public int insertRvHoldemAuthInfo(HashMap userMap) { + // TODO Auto-generated method stub + return sqlSession.insert("insertRvHoldemAuthInfo", userMap); + } + + + @Override + public HashMap getRvHoldemCheckInfo(String uid) { + // TODO Auto-generated method stub + return sqlSession.selectOne("getRvHoldemCheckInfo", uid); + } +} diff --git a/src/main/java/com/bb/dao/VendorDao.java b/src/main/java/com/bb/dao/VendorDao.java new file mode 100644 index 0000000..dc2111b --- /dev/null +++ b/src/main/java/com/bb/dao/VendorDao.java @@ -0,0 +1,20 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; + +public interface VendorDao { + + List> getNexusSkinInfo(HashMap siteParam); + + List> getNexusSkinList(HashMap vendorInfo); + + HashMap getNexusSkin(HashMap skinInfo); + + int nexusSkinUpdate(HashMap skinInfo); + + int updateTripleCredit(HashMap siteInfo); + + int updateTriplePoint(HashMap siteInfo); + +} diff --git a/src/main/java/com/bb/dao/VendorDaoImpl.java b/src/main/java/com/bb/dao/VendorDaoImpl.java new file mode 100644 index 0000000..2997736 --- /dev/null +++ b/src/main/java/com/bb/dao/VendorDaoImpl.java @@ -0,0 +1,63 @@ +package com.bb.dao; + +import java.util.HashMap; +import java.util.List; + +import org.apache.ibatis.session.SqlSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Repository; + +@Repository("vendorDao") +public class VendorDaoImpl implements VendorDao { + + /** 메인DB 연결 */ + @Autowired @Qualifier("sqlSessionMain") + protected SqlSession sqlSession; + + /** 서브DB 연결 */ + @Autowired @Qualifier("sqlSessionSub") + protected SqlSession sqlSessionSub; + + /** 트리플DB 연결 */ + @Autowired @Qualifier("sqlSessionTriple") + protected SqlSession sqlSessionTriple; + + @Override + public List> getNexusSkinInfo(HashMap siteParam) { + // TODO Auto-generated method stub + return sqlSessionTriple.selectList("getNexusSkinInfo", siteParam); + } + + @Override + public List> getNexusSkinList(HashMap vendorInfo) { + // TODO Auto-generated method stub + return sqlSessionTriple.selectList("getNexusSkinList", vendorInfo); + } + + @Override + public HashMap getNexusSkin(HashMap skinInfo) { + // TODO Auto-generated method stub + return sqlSessionTriple.selectOne("getNexusSkin", skinInfo); + } + + @Override + public int nexusSkinUpdate(HashMap skinInfo) { + // TODO Auto-generated method stub + return sqlSessionTriple.update("nexusSkinUpdate", skinInfo); + } + + @Override + public int updateTripleCredit(HashMap siteInfo) { + // TODO Auto-generated method stub + return sqlSessionTriple.update("updateTripleCredit", siteInfo); + } + + @Override + public int updateTriplePoint(HashMap siteInfo) { + // TODO Auto-generated method stub + return sqlSessionTriple.update("updateTriplePoint", siteInfo); + } + + +} diff --git a/src/main/java/com/bb/exception/ApiException.java b/src/main/java/com/bb/exception/ApiException.java new file mode 100644 index 0000000..b33d59f --- /dev/null +++ b/src/main/java/com/bb/exception/ApiException.java @@ -0,0 +1,37 @@ +package com.bb.exception; + +import com.bb.model.ApiResponse; + +/** + * @FileName : ApiException + * @Project : skhappy + * @Date : 2019. 04. 10. + * @Author : pulip + * @Description : + */ +public class ApiException extends Exception { + protected ApiResponse apiResponse; + + public ApiException() { + this("E001", "오류가 발생하였습니다."); + } + + public ApiException(String message) { + this("E001", message); + } + + /*public ApiException(ApiResponse apiResponse) { + this(apiResponse, "오류가 발생하였습니다."); + }*/ + + public ApiException(String resultCode, String message) { + this.apiResponse = new ApiResponse(); + + this.apiResponse.setResultCode(resultCode); + this.apiResponse.setResultMessage(message); + } + + public ApiResponse getApiResponse() { + return this.apiResponse; + } +} diff --git a/src/main/java/com/bb/exception/NoDataApiException.java b/src/main/java/com/bb/exception/NoDataApiException.java new file mode 100644 index 0000000..a104a98 --- /dev/null +++ b/src/main/java/com/bb/exception/NoDataApiException.java @@ -0,0 +1,9 @@ +package com.bb.exception; + + + +public class NoDataApiException extends ApiException { + public NoDataApiException() { + super("9004", "조회된 데이터가 없습니다."); + } +} diff --git a/src/main/java/com/bb/exception/RequestArraySizeApiException.java b/src/main/java/com/bb/exception/RequestArraySizeApiException.java new file mode 100644 index 0000000..faef2c4 --- /dev/null +++ b/src/main/java/com/bb/exception/RequestArraySizeApiException.java @@ -0,0 +1,10 @@ +package com.bb.exception; + + + + +public class RequestArraySizeApiException extends ApiException { + public RequestArraySizeApiException(String parameterName) { + super("9003", "요청 배열 파라미터 크기에 오류가 있습니다. : " + parameterName); + } +} diff --git a/src/main/java/com/bb/exception/RequestHeaderApiException.java b/src/main/java/com/bb/exception/RequestHeaderApiException.java new file mode 100644 index 0000000..f6e7a62 --- /dev/null +++ b/src/main/java/com/bb/exception/RequestHeaderApiException.java @@ -0,0 +1,9 @@ +package com.bb.exception; + + + +public class RequestHeaderApiException extends ApiException { + public RequestHeaderApiException(String headerName) { + super("9001", "요청 헤더정보가 없습니다 : " + headerName); + } +} diff --git a/src/main/java/com/bb/exception/RequestParameterApiException.java b/src/main/java/com/bb/exception/RequestParameterApiException.java new file mode 100644 index 0000000..ed816c0 --- /dev/null +++ b/src/main/java/com/bb/exception/RequestParameterApiException.java @@ -0,0 +1,8 @@ +package com.bb.exception; + + +public class RequestParameterApiException extends ApiException { + public RequestParameterApiException(String parameterName) { + super("9002", "필수 요청 파라미터가 없습니다. : " + parameterName); + } +} diff --git a/src/main/java/com/bb/front/ApiBetController.java b/src/main/java/com/bb/front/ApiBetController.java new file mode 100644 index 0000000..2050360 --- /dev/null +++ b/src/main/java/com/bb/front/ApiBetController.java @@ -0,0 +1,404 @@ +package com.bb.front; + +import java.net.SocketTimeoutException; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.util.HashMap; +import java.util.List; + +import org.apache.http.conn.ConnectTimeoutException; +import org.codehaus.jettison.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.ResourceAccessException; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.ApiResponse; +import com.bb.model.ApiVendorCompInfo; +import com.bb.model.BetSearch; +import com.bb.model.BetSplusSearch; +import com.bb.model.PageFormVO; +import com.bb.model.Site; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; +import com.bb.service.BetService; +import com.bb.service.CommonService; +import com.bb.service.TripleService; +import com.bb.service.UserService; +import com.bb.util.PagingUtil; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + + +@RestController +@Slf4j +@RequestMapping("/api/bet") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class ApiBetController { + + private final UserService userService; + + private final CommonService commonService; + + private final BetService betService; + + private final TripleService tripleService; + + private final JwtManager jwtManager; + + private static final long serialVersionUID = 1L; + private static NumberFormat formatter = new DecimalFormat("#0.00"); + + @ResponseBody + @PostMapping(value="/sportBetlist") + public ApiResponse sportBetlist( @RequestHeader String token, HttpServletRequest request, @RequestBody BetSplusSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + search.setBlankSpinSetType(siteOption.getBlankSpinSetType()); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = betService.getSportBetListCnt(search); // Use blankSpinSetType + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + List betList = betService.getSportBetList(search); // Use blankSpinSetType + + apiResponse.put("list", betList); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/betlist") + public ApiResponse betlist( @RequestHeader String token, HttpServletRequest request, @RequestBody BetSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(tokenInfo.getMid()); + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + search.setBlankSpinSetType(siteOption.getBlankSpinSetType()); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = betService.getUserBetListCnt(search); // Use blankSpinSetType + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List betList = betService.getUserBetList(search); // Use blankSpinSetType + System.out.println("betList" + betList.size()); + apiResponse.put("list", betList); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/betlistNew") + public ApiResponse betlistNew( @RequestHeader String token, HttpServletRequest request, @RequestBody BetSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(tokenInfo.getMid()); + final String LOG_PREFIX = "#-USER::betlist::"+tokenInfo.getSid()+":::"; + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + search.setBlankSpinSetType(siteOption.getBlankSpinSetType()); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = betService.getUserBetListNewCnt(search); // Use blankSpinSetType + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + ObjectMapper objectMapper = new ObjectMapper(); + String reqJsonStr = objectMapper.writeValueAsString(search); + JSONObject reqObj = new JSONObject(reqJsonStr); + log.info(LOG_PREFIX+ "Request {}", reqObj); + + List betList = betService.getUserBetListNew(search); // Use blankSpinSetType + System.out.println("betList" + betList.size()); + apiResponse.put("list", betList); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/betDetail") + public ApiResponse betDetail( @RequestHeader String token, HttpServletRequest request, @RequestBody BetSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + String betType = betService.getBetType(search.getBetId()); + + String detail = ""; + if(betType.equals("triple")) { + HashMap param = new HashMap(); + param.put("siteId", tokenInfo.getSid()); + param.put("apiVendorCode", betType); + ApiVendorCompInfo vendorCompInfo = userService.getApiVendorCompInfo(param); + if(vendorCompInfo != null) { + detail = tripleService.getBetDetail(vendorCompInfo, search.getBetId()); + } + log.info("triple bet detail: " + detail); + } else { + log.info("not found bet detail"); + } + + apiResponse.put("detail", detail); + apiResponse.success(); + + } catch (ResourceAccessException rae) { + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error("[ConnectTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("ConnectTimeoutException"); + } + + if(rae.getCause() instanceof SocketTimeoutException) { + log.error("[SocketTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("SocketTimeoutException"); + } + + if(rae.getCause() instanceof InterruptedException) { + log.error("[InterruptedException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("InterruptedException"); + } + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/betDetailTest") + public ApiResponse betDetailTest( @RequestHeader String token, HttpServletRequest request, @RequestBody BetSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + String betType = betService.getBetType(search.getBetId()); + + String detail = ""; + if(betType.equals("triple")) { + HashMap param = new HashMap(); + param.put("siteId", tokenInfo.getSid()); + param.put("apiVendorCode", betType); + ApiVendorCompInfo vendorCompInfo = userService.getApiVendorCompInfo(param); + if(vendorCompInfo != null) { + detail = tripleService.getBetDetailTest(vendorCompInfo, search.getBetId()); + } + log.info("triple bet detail: " + detail); + } else { + log.info("not found bet detail"); + } + + apiResponse.put("detail", detail); + apiResponse.success(); + + } catch (ResourceAccessException rae) { + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error("[ConnectTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("ConnectTimeoutException"); + } + + if(rae.getCause() instanceof SocketTimeoutException) { + log.error("[SocketTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("SocketTimeoutException"); + } + + if(rae.getCause() instanceof InterruptedException) { + log.error("[InterruptedException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("InterruptedException"); + } + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + private Site getSiteByCheck(HttpServletRequest request) { + Site site = userService.getSiteInfoByKey(request.getHeader("Authorization").toString()); + return site; + + } +} diff --git a/src/main/java/com/bb/front/ApiBoardController.java b/src/main/java/com/bb/front/ApiBoardController.java new file mode 100644 index 0000000..c09bade --- /dev/null +++ b/src/main/java/com/bb/front/ApiBoardController.java @@ -0,0 +1,457 @@ +package com.bb.front; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +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.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.ApiResponse; +import com.bb.model.Board; +import com.bb.model.BoardListSearch; +import com.bb.model.Comment; +import com.bb.model.Message; +import com.bb.model.MessageListSearch; +import com.bb.model.PageFormVO; +import com.bb.model.Site; +import com.bb.service.BoardService; +import com.bb.service.CommonService; +import com.bb.service.UserService; +import com.bb.util.PagingUtil; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@Slf4j +@RequestMapping("/api/board") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class ApiBoardController { + + private final BoardService boardService; + + private final UserService userService; + + private final CommonService commonService; + + + private final JwtManager jwtManager; + + + @ResponseBody + @PostMapping(value={"/{boardType}/list"}) + public ApiResponse blist(@RequestHeader String token, HttpServletRequest request, @PathVariable String boardType, @Valid @RequestBody BoardListSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + final String boardTypeKeyword = "answer|bbs|faq|favor|nt|snt"; + if(boardType.equals("qna")) { + boardType = "faq"; + } + + if(!boardTypeKeyword.contains(boardType)) { + log.error("[REQUEST: "+request.getRequestURI()+"] Board["+boardType+"] boardType Error"); + throw new ApiException("BRD02", "boardType Error"); + } + + search.setBoardType(boardType); + search.setIsUser("Y"); + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0) search.setPage(1); + search.setSiteId(tokenInfo.getSid()); + + int totalCount = boardService.getBoardListCnt(search); + if(totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(10); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + List boardList = boardService.getBoardList(search); + List boardIdxList = boardService.getBoardIdxList(search); + apiResponse.put("list", boardList); + apiResponse.put("idxList", boardIdxList); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/{boartType}/datail"}) + public ApiResponse datail(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody Board board) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + + board.setSiteId(tokenInfo.getSid()); + + Board boardetail = boardService.getBoard(board); + if(!tokenInfo.getSid().equals(boardetail.getSiteId())) { + throw new ApiException("1000", "accessDinied"); + } + + if(boardetail.getBoardType().equals("faq") && !tokenInfo.getMid().equals(boardetail.getRegId())) { + throw new ApiException("1000", "accessDinied"); + } + + if(boardetail.getBoardType().equals("faq") && boardetail.getStatus().equals("ANSWER") && boardetail.getIsReadUser().equals("N")) { + boardService.userAnswerCmtRead(boardetail); + } + boardService.viewAdd(boardetail); + apiResponse.put("board", boardetail); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/{boardType}/save"}) + public ApiResponse bsave(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody Board board) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + if(board.getBoardIdx() != null ) { + Board boardetail = boardService.getBoard(board); + if(!boardetail.getRegId().equals(tokenInfo.getMid())) { + throw new ApiException("2000", "accessDinied"); + } + } + + board.setSiteId(tokenInfo.getSid()); + board.setRegId(tokenInfo.getMid()); + int res = boardService.saveBoard(board); + + try { + Map logParam = new HashMap(); + logParam.put("siteId", site.getSiteId()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("actionType", 2); + commonService.updateAcctionLog(logParam); + } catch(Exception e){System.out.print(e.toString());} + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/cmtSave"}) + public ApiResponse cmtsave(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody Comment comment) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + + if(comment.getCmtIdx() != null) { + Comment commentrdetail = boardService.getComment(comment); + if(!commentrdetail.getRegId().equals(tokenInfo.getMid())) { + throw new ApiException("2000", "accessDinied"); + } + } + + comment.setRegId(tokenInfo.getMid()); + int res = boardService.saveCmt(comment); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/flowBoard"}) + public ApiResponse siteFlowBoard(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + BoardListSearch search = new BoardListSearch(); + search.setSiteId(tokenInfo.getSid()); + Board flowBoard = boardService.getSiteFlowBoard(search); + log.info("[REQUEST: "+request.getRequestURI()+"] " + flowBoard); + + String content = ""; + if(flowBoard != null) { + content = flowBoard.getContent(); + } + + apiResponse.put("content", content); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/msgList", "/msgHeadList"}) + public ApiResponse msgList(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MessageListSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + if("msgHeadList".indexOf(request.getRequestURI()) > -1){ + search.setMsgType("head"); + } else { + search.setMsgType("msg"); + } + search.setHiddenYn("N"); + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + search.setSiteId(tokenInfo.getSid()); + search.setRecieveId(tokenInfo.getMid()); + + int totalCount = boardService.getUserMsgListCnt(search); + + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(10); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + List boardList = boardService.getUserMsgList(search); + apiResponse.put("list", boardList); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/msgRead"}) + public ApiResponse msgRead(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody Message message) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + message.setSiteId(tokenInfo.getSid()); + message.setRecieveId(tokenInfo.getMid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + message); + + if(message.getMsgIdx() != null && message.getMsgIdx()!=0) { + log.info("[MSG READ idx: " + message.getMsgIdx()+"]"); + boardService.msgRead(message); + } else { + log.info("[MSG READ ALL]"); + boardService.allRead(message); + } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/msgUpdate"}) + public ApiResponse msgUpdate(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody Message message) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + message.setSiteId(tokenInfo.getSid()); + message.setRecieveId(tokenInfo.getMid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + message); + + if(message.getMsgIdx() != null && message.getMsgIdx() != 0) { + log.info("[MSG DEL idx: " + message.getMsgIdx()+"]"); + message.setStatus("N"); + boardService.msgUpdate(message); + } else { + log.info("[MSG DEL ALL]"); + boardService.msgDelList(message); + } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + private Site getSiteByCheck(HttpServletRequest request) { + Site site = userService.getSiteInfoByKey(request.getHeader("Authorization").toString()); + return site; + + } + +} diff --git a/src/main/java/com/bb/front/ApiCashController.java b/src/main/java/com/bb/front/ApiCashController.java new file mode 100644 index 0000000..0e372e6 --- /dev/null +++ b/src/main/java/com/bb/front/ApiCashController.java @@ -0,0 +1,1313 @@ +package com.bb.front; + +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.http.conn.ConnectTimeoutException; +import org.codehaus.jettison.json.JSONObject; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.ResourceAccessException; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.ApiResponse; +import com.bb.model.Cash; +import com.bb.model.CashDetail; +import com.bb.model.CashSearch; +import com.bb.model.CouponSearch; +import com.bb.model.CouponVO; +import com.bb.model.Member; +import com.bb.model.MemberDetail; +import com.bb.model.MemberTokenInfo; +import com.bb.model.Message; +import com.bb.model.PageFormVO; +import com.bb.model.Point; +import com.bb.model.PointSearch; +import com.bb.model.Site; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; +import com.bb.service.AsyncExcoinOtcService; +import com.bb.service.BoardService; +import com.bb.service.CashService; +import com.bb.service.CommonService; +import com.bb.service.UserService; +import com.bb.util.IPKit; +import com.bb.util.PagingUtil; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.jsonwebtoken.ExpiredJwtException; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@Slf4j +@RequestMapping("/api/cash") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class ApiCashController { + + private final UserService userService; + + private final CashService cashService; + + private final BoardService boardService; + + private final CommonService commonService; + + private final AsyncExcoinOtcService asyncExcoinOtcService; + + private final JwtManager jwtManager; + + @ResponseBody + @PostMapping(value="/in") + public ApiResponse in(@RequestHeader String token, HttpServletRequest request, @RequestBody Cash cash) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-user::cash:in::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::"; + + Member search = new Member(); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(tokenInfo.getMid()); + + MemberDetail memDetail = userService.getMember(search); + if(memDetail == null) { + throw new ApiException("U003", "unknown user"); + } + + log.info(LOG_PREFIX+ "[REQUEST: "+request.getRequestURI()+"] " + cash); + ObjectMapper objectMapper = new ObjectMapper(); + String reqJsonStr = objectMapper.writeValueAsString(search); + JSONObject reqObj = new JSONObject(reqJsonStr); + log.info(LOG_PREFIX+ "Request {}", reqObj); + + String abuseLockYn = memDetail.getAbuseLockYn(); + String abuseLockTime = memDetail.getAbuseLockTime(); + if("Y".equals(abuseLockYn)) { + log.error(LOG_PREFIX+ "ABZ01::" + "부정행위가 감지되었습니다. 2분뒤 다시 요청하세요."); + throw new ApiException("ABZ01", "부정행위가 감지되었습니다. 2분뒤 다시 요청하세요."); + } else { + if(!"".equals(abuseLockTime)) { + HashMap lockParam = new HashMap<>(); + lockParam.put("siteId", tokenInfo.getSid()); + lockParam.put("memId", tokenInfo.getMid()); + int lockResult = userService.resetUserLock(lockParam); + log.error(LOG_PREFIX+ "resetUserLock::result::" + lockResult); + } + } + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(memDetail.getSiteId()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + log.info(LOG_PREFIX+ "SiteOption.vaccCode::" + siteOption.getVaccCode()); + + if("Y".equals(memDetail.getMemLockYn())) { + log.error(LOG_PREFIX+ "U0011::" + "정지회원은 입/출금 신청이 불가능합니다."); + throw new ApiException("U0011", "정지회원은 입/출금 신청이 불가능합니다."); + } + + if("N".equals(memDetail.getBetYn()) && "NORMAL".equals(memDetail.getPartnerLevel())) { + log.error(LOG_PREFIX+ "U0012::" + "배팅금지 회원은 입/출금 신청이 불가능합니다."); + throw new ApiException("U0012", "배팅금지 회원은 입/출금 신청이 불가능합니다."); + } + + if(!"Y".equals(siteOption.getCashInYn())) { + log.error(LOG_PREFIX+ "C001::" + "사이트 입금금지 상태 입니다."); + throw new ApiException("C001", "사이트 입금금지 상태 입니다."); + } + + if(cash.getCashAmt() == null || cash.getCashAmt() <= 0) { + log.error(LOG_PREFIX+ "C002::" + "입금할 금액을 입력하세요."); + throw new ApiException("C002", "입금할 금액을 입력하세요."); + } + + int cashInCnt = cashService.getCashInCnt(search); + if(cashInCnt != 0) { + log.error(LOG_PREFIX+ "C003::" + "입금 처리중입니다. 완료 후 다시 신청해주세요."); + throw new ApiException("C003", "입금 처리중입니다. 완료 후 다시 신청해주세요."); + } + + int cashAmt = cash.getCashAmt(); + int cashInMax = Integer.parseInt(siteOption.getCashInAmtLimit()); + int cashInMin = Integer.parseInt(siteOption.getCashInAmtMin()); + int cashInUnit = Integer.parseInt(siteOption.getCashInAmtUnit()); + int cashInWaitTime = Integer.parseInt(siteOption.getCashInWaitTime()); + + if((cashInMax != 0) && (cashAmt > cashInMax)) { + log.error(LOG_PREFIX+ "C101::" + "1회 입금신청 최대한도는 " + cashInMax + "입니다."); + throw new ApiException("C101", "1회 입금신청 최대한도는 " + cashInMax + "입니다."); + } + if((cashInMin != 0) && (cashAmt < cashInMin)) { + log.error(LOG_PREFIX+ "C102::" + "1회 입금신청 최소금액은 " + cashInMin + "입니다."); + throw new ApiException("C102", "1회 입금신청 최소금액은 " + cashInMin + "입니다."); + } + if((cashInUnit != 0) && (cashAmt % cashInUnit != 0)) { + log.error(LOG_PREFIX+ "C103::" + "입금신청 금액 단위는 " + cashInUnit + "입니다."); + throw new ApiException("C103", "입금신청 금액 단위는 " + cashInUnit + "입니다."); + } + + // 입금요청 처리 + CashDetail paramCash = new CashDetail(); + paramCash.setSiteId(tokenInfo.getSid()); + paramCash.setMemId(tokenInfo.getMid()); + paramCash.setCashType(cash.getCashType()); + paramCash.setCashAmt(cash.getCashAmt()); + paramCash.setCashDesc("충전"); + paramCash.setDelYn("N"); + paramCash.setCashStatus("0"); + paramCash.setMemo(""); + paramCash.setRegId(tokenInfo.getMid()); + paramCash.setAdminId(""); + long preCashAmt = cashService.getMemCash(paramCash); + paramCash.setPreCashAmt(Long.toString(preCashAmt)); + paramCash.setWaitTime(cashInWaitTime * -1); + int cnt = cashService.getCashWaitTimeCheck(paramCash); + if(cnt != 0) { + log.error(LOG_PREFIX+ "C104::" + "입금 재신청 대기시간 ["+cashInWaitTime+"초] 후 다시 신청해주세요."); + throw new ApiException("C104", "입금 재신청 대기시간 ["+cashInWaitTime+"초] 후 다시 신청해주세요."); + } + + if(cash.getSymbol() == null || "".equals(cash.getSymbol())) { + paramCash.setSymbol(null); + } else { + paramCash.setSymbol(cash.getSymbol()); + } + if(cash.getExchangeRate() == null || "".equals(cash.getExchangeRate())) { + paramCash.setExchangeRate(null); + } else { + paramCash.setExchangeRate(cash.getExchangeRate()); + } + if(cash.getAmount() == null || "".equals(cash.getAmount())) { + paramCash.setAmount(null); + } else { + paramCash.setAmount(cash.getAmount()); + } + + paramCash.setWaitTime(30 * -1); + long result = cashService.insertCash(paramCash); + if(result == 0) { + log.error(LOG_PREFIX+ "C003::" + "입금 처리중입니다. 완료 후 다시 신청해주세요."); + throw new ApiException("C003", "입금 처리중입니다. 완료 후 다시 신청해주세요."); + } else { + // TODO: Excoin API 호출 + HashMap exCoinInfo = commonService.getVassApiInfo(search); + if(exCoinInfo.get("vaccCode") != null) { + log.info(LOG_PREFIX+ "API_INFO::" + exCoinInfo.toString()); + String vaccCode = exCoinInfo.get("vaccCode").toString(); + if(vaccCode.equals("excoin")) { + exCoinInfo.put("userEmail", memDetail.getMemId()); + exCoinInfo.put("userMobile", memDetail.getMemPhone().replaceAll("-", "").trim()); + exCoinInfo.put("userNm", memDetail.getMemName()); + exCoinInfo.put("cashAmt", Integer.toString(cash.getCashAmt())); + // 회원가입 + int resultCode = asyncExcoinOtcService.createUser(LOG_PREFIX, exCoinInfo); + if(resultCode == 1) { + // 사용자 충전 + asyncExcoinOtcService.requestTrade(LOG_PREFIX, exCoinInfo); + } + } + } + + // 입금보너스 기록 + HashMap data = new HashMap<>(); + data.put("siteId", tokenInfo.getSid()); + data.put("memId", tokenInfo.getMid()); + if(cash.getBonusCode() == null || "".equals(cash.getBonusCode())) { + // 이벤트 보너스 + data.put("bonusType", "event"); + data.put("bonusCode", memDetail.getMemLevel()); + } else { + // 유저선택 입금 보너스 + data.put("bonusType", "bonus"); + data.put("bonusCode", cash.getBonusCode()); + } + data.put("cashIdx", result); + data.put("pointIdx", null); + data.put("rate", 0); + log.info(LOG_PREFIX+ "CASH_BONUS_INFO::" + data.toString()); + int resultBonus = cashService.insertCashBonus(data); + log.info(LOG_PREFIX+ "CASH_BONUS_INFO::result : " + resultBonus); + } + + try { + Map logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("actionType", 2); + commonService.updateAcctionLog(logParam); + } catch(Exception e){System.out.print(e.toString());} + + apiResponse.success(); + + } catch(ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-user::cash:in::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::"; + log.error(LOG_PREFIX+ "[ApiException] "+e.getApiResponse()); + apiResponse = e.getApiResponse(); + + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/out") + public ApiResponse out(@RequestHeader String token, HttpServletRequest request, @RequestBody Cash cash) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-user::cash:out::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::"; + + Member search = new Member(); + search.setMemId(tokenInfo.getMid()); + search.setSiteId(tokenInfo.getSid()); + MemberDetail memDetail = userService.getMember(search); + if(memDetail == null) { + throw new ApiException("U003", "unknown user"); + } + + if(memDetail.getCashOutFlag() == 1) { + throw new ApiException("C411", "상위 유저 회수 처리중입니다. 잠시 후 다시 시도해주세요."); + } + + String abuseLockYn = memDetail.getAbuseLockYn(); + String abuseLockTime = memDetail.getAbuseLockTime(); + if("Y".equals(abuseLockYn)) { + log.error(LOG_PREFIX+ "ABZ01::" + "부정행위가 감지되었습니다. 2분뒤 다시 요청하세요."); + throw new ApiException("ABZ01", "부정행위가 감지되었습니다. 2분뒤 다시 요청하세요."); + } else { + if(!"".equals(abuseLockTime)) { + HashMap lockParam = new HashMap<>(); + lockParam.put("siteId", tokenInfo.getSid()); + lockParam.put("memId", tokenInfo.getMid()); + int lockResult = userService.resetUserLock(lockParam); + log.error(LOG_PREFIX+ "resetUserLock::result::" + lockResult); + } + } + + HashMap flagParam = new HashMap<>(); + flagParam.put("siteId", tokenInfo.getSid()); + flagParam.put("memId", tokenInfo.getMid()); + flagParam.put("cashOutFlag", 1); + int flagResult = userService.updateCashOutFlag(flagParam); + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(memDetail.getSiteId()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + + log.info(LOG_PREFIX+ "[REQUEST: "+request.getRequestURI()+"] " + cash); + + int cashOutCnt = cashService.getCashOutCnt(search); + if(cashOutCnt != 0) { + throw new ApiException("C209", "출금 처리중입니다. 완료 후 다시 신청해주세요."); + } + + if("Y".equals(memDetail.getMemLockYn())) { + throw new ApiException("U0011", "정지회원은 입/출금 신청이 불가능합니다."); + } + + if("N".equals(memDetail.getBetYn()) && "NORMAL".equals(memDetail.getPartnerLevel())) { + throw new ApiException("U0012", "배팅금지 회원은 입/출금 신청이 불가능합니다."); + } + + if(!"Y".equals(siteOption.getCashOutYn())) { + throw new ApiException("C201", "사이트 출금금지 상태 입니다."); + } + + if(memDetail.getCashAmt() < cash.getCashAmt()) { + throw new ApiException("C202", "보유금액을 초과하여 출금신청을 할 수 없습니다."); + } + + if(!"Y".equals(memDetail.getOutAmtYn())) { + throw new ApiException("C203", "회원 출금금지 상태 입니다."); + } + + String op = memDetail.getCashOutPass(); + if(op == null || "".equals(op)) { + throw new ApiException("C204", "출금비밀번호를 설정해주세요."); + } + + if(!memDetail.getCashOutPass().equals(cash.getCashOutPass()) ){ + throw new ApiException("C205", "출금비밀번호를 확인해주세요."); + } + + if(cash.getCashAmt() == null || cash.getCashAmt() <= 0) { + throw new ApiException("C206", "출금할 금액을 입력하세요."); + } + + if(memDetail.getChangeFlag().equals("N") && !"viva01".equals(tokenInfo.getSid())) { + throw new ApiException("C099", "환전할 수 없는 상태입니다. [통합머니전환] 버튼을 클릭하세요."); + } + + int cashAmt = cash.getCashAmt(); + int cashOutMax = Integer.parseInt(siteOption.getCashOutAmtLimit()); + int cashOutMin = Integer.parseInt(siteOption.getCashOutAmtMin()); + int cashOutUnit = Integer.parseInt(siteOption.getCashOutAmtUnit()); + int cashOutWaitTime = Integer.parseInt(siteOption.getCashOutWaitTime()); + + if((cashOutMax != 0) && (cashAmt > cashOutMax)) { + throw new ApiException("C101", "1회 출금신청 최대한도는 " + cashOutMax + "입니다."); + } + if((cashOutMin != 0) && (cashAmt < cashOutMin)) { + throw new ApiException("C214", "1회 출금신청 최소금액은 " + cashOutMin + "입니다."); + } + if((cashOutUnit != 0) && (cashAmt % cashOutUnit != 0)) { + throw new ApiException("C215", "출금신청 금액 단위는 " + cashOutUnit + "입니다."); + } + + // 출금요청 처리 + CashDetail paramCash = new CashDetail(); + paramCash.setSiteId(tokenInfo.getSid()); + paramCash.setMemId(tokenInfo.getMid()); + paramCash.setCashType(cash.getCashType()); + paramCash.setCashAmt(-1 * cash.getCashAmt()); + paramCash.setCashDesc("환전"); + paramCash.setDelYn("N"); + paramCash.setCashStatus("0"); + paramCash.setMemo(""); + paramCash.setRegId(tokenInfo.getMid()); + paramCash.setAdminId(""); + long preCashAmt = cashService.getMemCash(paramCash); + if(preCashAmt < cash.getCashAmt()) { + throw new ApiException("C202 ", "보유금액을 초과하여 출금액을 신청할 수 없습니다."); + } + paramCash.setPreCashAmt(""+preCashAmt); + paramCash.setWaitTime(cashOutWaitTime * -1); + int cnt = cashService.getCashWaitTimeCheck(paramCash); + if(cnt != 0) { + throw new ApiException("C216", "출금 재신청 대기시간 ["+cashOutWaitTime+"초] 후 다시 신청해주세요." ); + } + + if(cash.getSymbol() == null || "".equals(cash.getSymbol())) { + paramCash.setSymbol(null); + } else { + paramCash.setSymbol(cash.getSymbol()); + } + if(cash.getExchangeRate() == null || "".equals(cash.getExchangeRate())) { + paramCash.setExchangeRate(null); + } else { + paramCash.setExchangeRate(cash.getExchangeRate()); + } + if(cash.getAmount() == null || "".equals(cash.getAmount())) { + paramCash.setAmount(null); + } else { + paramCash.setAmount(cash.getAmount()); + } + + paramCash.setWaitTime(30 * -1); + long result = cashService.insertCash(paramCash); + if(result == 0) { + throw new ApiException("C209", "출금 처리중입니다. 완료 후 다시 신청해주세요."); + } else { + HashMap lockParam = new HashMap<>(); + lockParam.put("siteId", tokenInfo.getSid()); + lockParam.put("memId", tokenInfo.getMid()); + lockParam.put("symLock", "N"); + int resultLock = userService.userChangeSymLock(lockParam); + log.error("#-userCashOut::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::"+"userChangeSymLock(N) Result="+resultLock); + + try { + Map logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("actionType", 2); + commonService.updateAcctionLog(logParam); + } catch(Exception e){System.out.print(e.toString());} + } + + flagParam.put("cashOutFlag", 0); + flagResult = userService.updateCashOutFlag(flagParam); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + HashMap flagParam = new HashMap<>(); + flagParam.put("siteId", tokenInfo.getSid()); + flagParam.put("memId", tokenInfo.getMid()); + flagParam.put("cashOutFlag", 0); + int flagResult = userService.updateCashOutFlag(flagParam); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + HashMap flagParam = new HashMap<>(); + flagParam.put("siteId", tokenInfo.getSid()); + flagParam.put("memId", tokenInfo.getMid()); + flagParam.put("cashOutFlag", 0); + int flagResult = userService.updateCashOutFlag(flagParam); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/getUserCash") + public ApiResponse getUserCash(HttpServletRequest request, @RequestHeader String token) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-getUserCash::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::"; + MemberTokenInfo param = new MemberTokenInfo(); + param.setSiteId(tokenInfo.getSid()); + param.setMemId(tokenInfo.getMid()); + param.setToken(token); + + Integer result = userService.getCheckMemberToken(param); + log.info(LOG_PREFIX+ "getCheckMemberToken::Result::"+result); + if(result == null || result == 0) { + //로그인 로그 , + try { + Map logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "TK999"); + logParam.put("logoutYn", ""); + logParam.put("logName", "만료토큰"); + logParam.put("logDesc", "["+request.getRequestURI()+"]"); + logParam.put("regId", ""); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", token); + commonService.insertlog(logParam); + } catch(Exception e){System.out.print(e.toString());} + log.error(LOG_PREFIX+ "duplicate_token_login_error"); + throw new ApiException("TK999", "duplicate_token_login_error"); + } + + Member search = new Member(); + search.setSiteIdx(tokenInfo.getSidx()); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(tokenInfo.getMid()); + + HashMap memberVo = userService.getMemberMap2(search); + int userBalance = Integer.parseInt(memberVo.get("cashAmt").toString()); + apiResponse.put("balance", String.valueOf(userBalance)); + + int tokenValidationSec = commonService.getSiteLogoutTimeLimit(tokenInfo.getSid()); + String lastGameTime = memberVo.get("lastGameTime").toString(); + String isPlayGame = "N"; + if(!lastGameTime.equals("")) { + Date lastGameDt = sdf.parse(lastGameTime); + long nDate = System.currentTimeMillis(); + Double diff = (nDate - lastGameDt.getTime()) / 1000.0; // 초 + if(tokenValidationSec > diff.intValue()) { + isPlayGame = "Y"; + } + } + apiResponse.put("isPlayGame", isPlayGame); + apiResponse.success(); + log.info(LOG_PREFIX+ "apiResponse::"+apiResponse.toString()); + + } catch(ExpiredJwtException ee) { + HashMap userInfo = commonService.getUserInfoByToken(token); + String siteId = userInfo.get("siteId").toString(); + String memId = userInfo.get("memId").toString(); + final String LOG_PREFIX = "#-getUserCash::"+siteId+"::"+memId+"::"; + log.error(LOG_PREFIX+ "[TOKEN ExpiredJwtException] : " + ee.getMessage()); + + try { + Map logParam = new HashMap(); + logParam.put("siteId", siteId); + logParam.put("memId", memId); + logParam.put("logType", "TK888"); + logParam.put("logoutYn", ""); + logParam.put("logName", "토큰시간만료"); + logParam.put("logDesc", "["+request.getRequestURI()+"]"); + logParam.put("regId", ""); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", token); + commonService.insertlog(logParam); + } catch(Exception e){System.out.print(e.toString());} + + apiResponse.setResultCode("TK888"); + apiResponse.setResultMessage("토큰시간만료"); + } catch(ApiException e) { + log.error("#-getUserCash::"+"[TOKEN ApiException] : " + e.getMessage()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error("#-getUserCash::"+"[TOKEN Exception] : " + e.getMessage()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/getAcc") + public ApiResponse getAcc(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + Member search = new Member(); + search.setMemId(tokenInfo.getMid()); + search.setSiteId(tokenInfo.getSid()); + + HashMap msgDesc = cashService.getAccBankInfo(search); + + if(msgDesc != null) { + Message message = new Message(); + message.setSiteId(tokenInfo.getSid()); + message.setRegId(tokenInfo.getSid()); + + if("msgHeadSave".indexOf(request.getRequestURI()) > -1){ + message.setMsgType("head"); + } else if("msgJoinSave".indexOf(request.getRequestURI()) > -1){ + message.setMsgType("join"); + } else { + message.setMsgType("msg"); + } + + message.setRecieveId(tokenInfo.getMid()); + //message.setRecieveId("accout info"); + message.setMsgTitle(msgDesc.get("msg")); + message.setMsgDesc(msgDesc.get("bankinfo")); + message.setHiddenYn("N"); + message.setTargetType("member"); + boardService.msgSend(message); + } else { + throw new ApiException("1000", "no acc data"); + } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/list") + public ApiResponse list( @RequestHeader String token, HttpServletRequest request, @RequestBody CashSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + search.setSiteId(tokenInfo.getSid()); + search.setMemId(tokenInfo.getMid()); + search.setIsFront("Y"); + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + if(search.getCashType() == null || "".equals(search.getCashType())) { + search.setCashType("in"); + } + + if("in".equals(search.getCashType())) { + search.setCashType("1"); + } + if("out".equals(search.getCashType())) { + search.setCashType("-1"); + } + + int totalCount = cashService.getCashListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + commonForm.setCount_per_list(10); + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List cashList = cashService.getCashList(search); + apiResponse.put("list", cashList); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/del") + public ApiResponse del( @RequestHeader String token, HttpServletRequest request, @RequestBody CashSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + search.setSiteId(tokenInfo.getSid()); + search.setMemId(tokenInfo.getMid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + cashService.delCash(search); + + + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/pointList") + public ApiResponse pointList( @RequestHeader String token, HttpServletRequest request, @RequestBody PointSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-user::pointList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+":::"; + + search.setIsFront("Y"); + search.setSiteId(tokenInfo.getSid()); + if(search.getMemId() == null || search.getMemId().equals("")) { + search.setMemId(tokenInfo.getMid()); + } + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long cMlsUTC = System.currentTimeMillis(); // 현재 시각 + + String curDate = sdf.format(cMlsUTC); + String startDate = search.getStartDate(); + String endDate = search.getEndDate(); + + // 문자열 -> Date + Date dateCur = sdf.parse(curDate); + Date dateStart = sdf.parse(startDate); + Date dateEnd = sdf.parse(endDate); + + // Date -> 밀리세컨즈 + long timeMilCur = dateCur.getTime(); + long timeMilStart = dateStart.getTime(); + long timeMilEnd = dateEnd.getTime(); + + // 비교 + long diff1 = timeMilCur - timeMilStart; + long diff2 = timeMilCur - timeMilEnd; + + long diffDayByStart = diff1 / (1000 * 60 * 60 * 24); + long diffDayByEnd = diff2 / (1000 * 60 * 60 * 24); + + log.info(LOG_PREFIX+ "diffDayByStart::"+diffDayByStart); + log.info(LOG_PREFIX+ "diffDayByEnd::"+diffDayByEnd); + + if(diffDayByStart >= 3 || diffDayByEnd >= 3) { + log.info(LOG_PREFIX+ "::Start_End_Date 4일 이전"); + search.setOldYn("Y"); + } + + log.info(LOG_PREFIX+ "SMP::Start 시각 : " + startDate); + log.info(LOG_PREFIX+ "SMP::End 시각 : " + endDate); + log.info(LOG_PREFIX+ "SMP::Cur 시각 : " + curDate); + + log.info(LOG_PREFIX+ "PointSearch : " + search); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = cashService.getPointListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + commonForm.setCount_per_list(10); + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + List pointList = cashService.getPointList(search); + apiResponse.put("list", pointList); + HashMap pointSum = cashService.getPointSumInfo(search); + apiResponse.put("sum", pointSum); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/pointListNew") + public ApiResponse pointListNew( @RequestHeader String token, HttpServletRequest request, @RequestBody PointSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-user::pointList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+":::"; + + ObjectMapper objectMapper = new ObjectMapper(); + String reqJsonStr = objectMapper.writeValueAsString(search); + JSONObject reqObj = new JSONObject(reqJsonStr); + log.info(LOG_PREFIX+ "Request {}", reqObj); + + search.setIsFront("Y"); + search.setSiteId(tokenInfo.getSid()); + if(search.getMemId() == null || search.getMemId().equals("")) { + search.setMemId(tokenInfo.getMid()); + } + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long cMlsUTC = System.currentTimeMillis(); // 현재 시각 + + String curDate = sdf.format(cMlsUTC); + String startDate = search.getStartDate(); + String endDate = search.getEndDate(); + + // 문자열 -> Date + Date dateCur = sdf.parse(curDate); + Date dateStart = sdf.parse(startDate); + Date dateEnd = sdf.parse(endDate); + + // Date -> 밀리세컨즈 + long timeMilCur = dateCur.getTime(); + long timeMilStart = dateStart.getTime(); + long timeMilEnd = dateEnd.getTime(); + + // 비교 + long diff1 = timeMilCur - timeMilStart; + long diff2 = timeMilCur - timeMilEnd; + + long diffDayByStart = diff1 / (1000 * 60 * 60 * 24); + long diffDayByEnd = diff2 / (1000 * 60 * 60 * 24); + + log.info(LOG_PREFIX+ "diffDayByStart::"+diffDayByStart); + log.info(LOG_PREFIX+ "diffDayByEnd::"+diffDayByEnd); + + if(diffDayByStart >= 4 || diffDayByEnd >= 4) { + log.info(LOG_PREFIX+ "::Start_End_Date 4일 이전"); + search.setOldYn("Y"); + } + + log.info(LOG_PREFIX+ "SMP::Start 시각 : " + startDate); + log.info(LOG_PREFIX+ "SMP::End 시각 : " + endDate); + log.info(LOG_PREFIX+ "SMP::Cur 시각 : " + curDate); + + log.info(LOG_PREFIX+ "PointSearch : " + search); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = cashService.getPointListNewCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + commonForm.setCount_per_list(10); + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + List pointList = cashService.getPointListNew(search); + apiResponse.put("list", pointList); + HashMap pointSum = cashService.getPointSumInfo(search); + apiResponse.put("sum", pointSum); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/pointChg") + public ApiResponse pointChg(@RequestHeader String token, HttpServletRequest request, @RequestBody Point point) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-user::pointChg::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + Member search = new Member(); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(tokenInfo.getMid()); + MemberDetail memDetail= userService.getMember(search); + if(memDetail == null) { + throw new ApiException("U003", "unknown user"); + } + + point.setSiteId(tokenInfo.getSid()); + point.setMemId(tokenInfo.getMid()); + + log.info(LOG_PREFIX+ "[REQUEST: "+request.getRequestURI()+"] " + point); + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(memDetail.getSiteId()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + if("Y".equals(memDetail.getMemLockYn())) { + throw new ApiException("U0011", "정지회원은 입/출금 신청이 불가능합니다."); + } + + if("N".equals(memDetail.getPointExchangeYn())) { + throw new ApiException("P009", "포인트전환을 할 수 없는 상태입니다. 고객센터에 문의하세요"); + } + + if(point.getPointAmt() == null || point.getPointAmt() <= 0) { + throw new ApiException("P001", "전환할 포인트를 입력하세요."); + } + + int pointAmt = point.getPointAmt().intValue(); + int pointInMax = Integer.parseInt(siteOption.getPointChangeAmtLimit()); + int pointInUnit = Integer.parseInt(siteOption.getPointChangeAmtUnit()); + if((pointInMax != 0) && (pointAmt > pointInMax)) { + throw new ApiException("P101", "1회 포인트전환 최대한도는 " + pointInMax + "입니다."); + } + if((pointInUnit != 0) && (pointAmt % pointInUnit != 0)) { + throw new ApiException("P102", "포인트전환 금액 단위는 " + pointInUnit + "입니다."); + } + + int cashAmt = pointAmt; + double pointAmtD = pointAmt * -1.0; + + if(memDetail.getPointAmt() >= point.getPointAmt() ) { + point.setPointType("-4"); + point.setPointDesc("CHG"); + point.setPointAmt(pointAmtD); + point.setBetIdx(null); + point.setPointStatus("1"); + point.setRegId(tokenInfo.getMid()); + point.setAdminId(null); + point.setMemo(""); + point.setPrePointAmt(memDetail.getPointAmt()); + log.info(LOG_PREFIX+ point); + long pointIdx = cashService.pointInsert(point); + log.info(LOG_PREFIX+ "pointIdx: " + pointIdx); + if(pointIdx == 0) { + throw new ApiException("P005", "포인트전환은 1분에 1건씩 처리됩니다. 잠시후 다시 시도해주세요"); + } else { + CashDetail paramCash = new CashDetail(); + paramCash.setSiteId(tokenInfo.getSid()); + paramCash.setMemId(tokenInfo.getMid()); + paramCash.setCashType("4"); + paramCash.setCashAmt(cashAmt); + paramCash.setCashDesc("포인트전환"); + paramCash.setDelYn("N"); + paramCash.setCashStatus("1"); + paramCash.setMemo(""); + paramCash.setRegId(tokenInfo.getMid()); + paramCash.setAdminId(""); + paramCash.setPreCashAmt(Integer.toString(memDetail.getCashAmt())); + paramCash.setWaitTime(-60); + log.info(LOG_PREFIX+ paramCash); + long cashIdx = cashService.insertCash(paramCash); + log.info(LOG_PREFIX+ "cashIdx: " + cashIdx); + if(cashIdx == 0) { + throw new ApiException("P005", "포인트전환은 1분에 1건씩 처리됩니다. 잠시후 다시 시도해주세요"); + } else { + try { + Map logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("actionType", 2); + commonService.updateAcctionLog(logParam); + } catch(Exception e){System.out.print(e.toString());} + } + } + } else { + throw new ApiException("P002", "보유 포인트를 초과하여 전환신청을 할 수 없습니다."); + } + + apiResponse.success(); + + } catch (ResourceAccessException rae) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + String siteId = tokenInfo.getSid(); + String memId = tokenInfo.getMid(); + + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error("#-user::pointChg::"+siteId+"::"+memId+"::::"+"[ConnectTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("ConnectTimeoutException"); + } + + if(rae.getCause() instanceof SocketTimeoutException) { + log.error("#-user::pointChg::"+siteId+"::"+memId+"::::"+"[SocketTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("SocketTimeoutException"); + } + + if(rae.getCause() instanceof InterruptedException) { + log.error("#-user::pointChg::"+siteId+"::"+memId+"::::"+"[InterruptedException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("InterruptedException"); + } + + apiResponse.success(); + } catch(ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + String siteId = tokenInfo.getSid(); + String memId = tokenInfo.getMid(); + log.error("#-user::pointChg::"+siteId+"::"+memId+"::::"+"ApiException::"+e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + String siteId = tokenInfo.getSid(); + String memId = tokenInfo.getMid(); + log.error("#-user::pointChg::"+siteId+"::"+memId+"::::"+"Exception::"+e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/myCoupons") + public ApiResponse myCoupons(@RequestHeader String token, HttpServletRequest request, @RequestBody CouponSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-user::usedCoupon::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+":::"; + search.setSiteId(tokenInfo.getSid()); + search.setMemId(tokenInfo.getMid()); + search.setCouponStatus("1"); + + ObjectMapper objectMapper = new ObjectMapper(); + String reqJsonStr = objectMapper.writeValueAsString(search); + JSONObject reqObj = new JSONObject(reqJsonStr); + log.info(LOG_PREFIX+ "Request {}", reqObj); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = cashService.getMyCouponListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + List> list = cashService.getMyCouponList(search); + apiResponse.put("list", list); + + apiResponse.success(); + + } catch(ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-user::usedCoupon::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+":::"; + log.error(LOG_PREFIX+ "ApiException::"+e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-user::usedCoupon::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+":::"; + log.error(LOG_PREFIX+ "Exception::"+e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/useCoupon") + public ApiResponse usedCoupon(@RequestHeader String token, HttpServletRequest request, @RequestBody CouponVO couponVO) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-user::usedCoupon::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::"+couponVO.getCouponNumber()+":::"; + + ObjectMapper objectMapper = new ObjectMapper(); + String reqJsonStr = objectMapper.writeValueAsString(couponVO); + JSONObject reqObj = new JSONObject(reqJsonStr); + log.info(LOG_PREFIX+ "Request {}", reqObj); + + couponVO.setSiteId(tokenInfo.getSid()); + couponVO.setMemId(tokenInfo.getMid()); + + if(couponVO.getCouponNumber() == null || "".equals(couponVO.getCouponNumber())) { + log.error(LOG_PREFIX+ "CUP01 : couponNumber is not empty"); + throw new ApiException("CUP01", "couponNumber is not empty"); + } + + CouponVO couponItem = cashService.getCouponItem(couponVO.getCouponNumber()); + if(couponItem == null) { + log.error(LOG_PREFIX+ "CUP02 : 알 수 없는 쿠폰번호"); + throw new ApiException("CUP02", "알 수 없는 쿠폰번호"); + } + + if(!tokenInfo.getSid().equals(couponItem.getSiteId())) { + log.error(LOG_PREFIX+ "CUP03 : couponNumber used dinied1"); + throw new ApiException("CUP03", "couponNumber used dinied1"); + } + + if(!tokenInfo.getMid().equals(couponItem.getMemId())) { + log.error(LOG_PREFIX+ "CUP04 : couponNumber used dinied2"); + throw new ApiException("CUP04", "couponNumber used dinied2"); + } + + if(!"1".equals(couponItem.getCouponStatus())) { + log.error(LOG_PREFIX+ "CUP08 : 처리상태 오류"); + throw new ApiException("CUP08", "처리상태 오류"); + } + couponItem.setCouponStatus("2"); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long usedTime = System.currentTimeMillis(); + String usedTimeStr = sdf.format(usedTime); + couponItem.setUsedAt(usedTimeStr); + + log.info(LOG_PREFIX+ "updateCouponItem : " + couponItem.toString()); + int cpUpdResult = cashService.updateCouponItem(couponItem); + log.info(LOG_PREFIX+ "updateCouponItem result : " + cpUpdResult); + + if(cpUpdResult > 0) { + apiResponse.success(); + } else { + log.error(LOG_PREFIX+ "CUP06 : 쿠폰번호 사용 실패"); + throw new ApiException("CUP06", "쿠폰번호 사용 실패"); + } + + } catch(ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-user::usedCoupon::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::"+couponVO.getCouponNumber()+":::"; + log.error(LOG_PREFIX+ "ApiException::"+e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-user::usedCoupon::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::"+couponVO.getCouponNumber()+":::"; + log.error(LOG_PREFIX+ "Exception::"+e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/rollCalculate") + public ApiResponse rollCalculate(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + CashSearch search = new CashSearch(); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(tokenInfo.getMid()); + + List> list = cashService.getUserRollingCalculate(search); + apiResponse.put("list", list); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/bonusCodes") + public ApiResponse bonusCodes(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + CashSearch search = new CashSearch(); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(tokenInfo.getMid()); + + List> list = userService.getSiteCashBonusList(tokenInfo.getSidx()); + + HashMap item = new HashMap<>(); + item.put("bonusCode", ""); + item.put("bonusTitle", "선택 안함"); + item.put("bonusDesc", ""); + // 리스트 맨 앞(index 0)에 추가 + list.add(0, item); + + apiResponse.put("list", list); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + private Site getSiteByCheck(HttpServletRequest request) { + Site site = userService.getSiteInfoByKey(request.getHeader("Authorization").toString()); + return site; + + } + +} + diff --git a/src/main/java/com/bb/front/ApiEtcController.java b/src/main/java/com/bb/front/ApiEtcController.java new file mode 100644 index 0000000..ac80705 --- /dev/null +++ b/src/main/java/com/bb/front/ApiEtcController.java @@ -0,0 +1,232 @@ +package com.bb.front; + +import java.util.HashMap; +import java.util.List; + +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.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.ApiResponse; +import com.bb.model.Bank; +import com.bb.model.Banner; +import com.bb.model.BlockSearch; +import com.bb.model.Site; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; +import com.bb.service.CommonService; +import com.bb.service.UserService; +import com.bb.util.IPKit; +import com.bb.util.StringUtils; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@Slf4j +@RequestMapping("/api/etc") +@RequiredArgsConstructor +//@SecurityRequirement(name = "Authorization") +public class ApiEtcController { + + private final CommonService commonService; + + private final UserService userService; + + private final JwtManager jwtManager; + + @ResponseBody + @PostMapping(value="/bank") + public ApiResponse bank(HttpServletRequest request, @RequestBody SiteSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + + search.setSiteId(site.getSiteId()); + + List bankList = commonService.getBankList(search) ; + apiResponse.put("list", bankList); + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/banner") + public ApiResponse banner(HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site == null) { + throw new ApiException("1000", "accessDinied"); + } + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(site.getSiteId()); + + List bannerList = commonService.getBannerList(paramSite) ; + apiResponse.put("list", bannerList); + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/popupList") + public ApiResponse popupList(HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site == null) { + throw new ApiException("1000", "accessDinied"); + } + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(site.getSiteId()); + + List popupList = commonService.getPopupList(paramSite); + apiResponse.put("list", popupList); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value="/siteOption") + public ApiResponse siteOption(HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(site.getSiteId()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + apiResponse.put("siteOption", siteOption); + + String refer = request.getHeader("Referer"); + if(refer != null) { +// String refer = "https://goodidea.tistory.com:8888/qr/aaa/ddd.html?abc=def&ddd=fgf#sharp"; + String[] urls = StringUtils.extractUrlParts(refer); +// log.info(urls.toString()); +// log.info(urls[2]); + String domain = urls[2]; + paramSite.setEtc1(domain); + log.info(paramSite.toString()); + + String joinRecommanderId = commonService.getJoinRecommanderId(paramSite); + if(joinRecommanderId == null) joinRecommanderId = ""; + apiResponse.put("joinRecommanderId", joinRecommanderId); + } + + + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/blocks") + public ApiResponse blocks( HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + BlockSearch paramSite = new BlockSearch(); + paramSite.setSiteId(site.getSiteId()); + + List adminLogLis = commonService.getSiteBlockList(paramSite); + + apiResponse.put("list", adminLogLis); + apiResponse.put("ip", IPKit.getIpAddressByRequest(request)); + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value="/jackpot") + public ApiResponse jackpot(HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site == null) { + throw new ApiException("1000", "accessDinied"); + } + HashMap paramSite = new HashMap<>(); + paramSite.put("siteIdx", site.getSiteIdx()); + + String jackpot = commonService.getJackpot(paramSite) ; + apiResponse.put("jackpot", jackpot); + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + private Site getSiteByCheck(HttpServletRequest request) { + Site site = userService.getSiteInfoByKey(request.getHeader("Authorization").toString()); + return site; + } + +} diff --git a/src/main/java/com/bb/front/ApiFrontController.java b/src/main/java/com/bb/front/ApiFrontController.java new file mode 100644 index 0000000..da99918 --- /dev/null +++ b/src/main/java/com/bb/front/ApiFrontController.java @@ -0,0 +1,413 @@ +package com.bb.front; + +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; + +import org.codehaus.jettison.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.ui.ModelMap; +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.RequestHeader; +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 org.springframework.web.util.UriComponentsBuilder; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtClame; +import com.bb.jwt.JwtManager; +import com.bb.model.ApiResponse; +import com.bb.model.ApiVendorCompInfo; +import com.bb.model.Banner; +import com.bb.model.BoardListSearch; +import com.bb.model.CashSearch; +import com.bb.model.Member; +import com.bb.model.Site; +import com.bb.model.SiteSearch; +import com.bb.service.BoardService; +import com.bb.service.CashService; +import com.bb.service.CommonService; +import com.bb.service.UserService; +import com.bb.util.IPKit; + +import io.jsonwebtoken.ExpiredJwtException; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@Slf4j +@RequestMapping("/api") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class ApiFrontController { + + private final UserService userService; + + private final CashService cashService; + + private final BoardService boardService; + + private final CommonService commonService; + + @Autowired + RestTemplate restTemplate; + + private final JwtManager jwtManager; + + + @GetMapping("/health") + public String health( HttpServletRequest request,ModelMap model) throws Exception { + return "alive"; + } + + + @ResponseBody + @PostMapping(value="/main") + public ApiResponse main(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/getToken") + public ApiResponse getToken(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + JwtClame jwtinfo = new JwtClame(); + jwtinfo.setSiteIdx(site.getSiteIdx()); + jwtinfo.setSiteId(site.getSiteId()); + jwtinfo.setMemId(tokenInfo.getMid()); + jwtinfo.setMemIdx(tokenInfo.getMidx()); + jwtinfo.setPartnerLevel(tokenInfo.getPartnerLevel()); + + int tokenValidationSec = commonService.getSiteLogoutTimeLimit(site.getSiteId()); + log.info("#-getToken::tokenValidationSec: " + tokenValidationSec); + + String tok = jwtManager.generateToken(jwtinfo, tokenValidationSec); + apiResponse.put("token", tok); + + //로그인 로그 , + try { + Map logParam = new HashMap(); + logParam.put("siteId", site.getSiteId()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "TOKEN"); + logParam.put("logoutYn", ""); + logParam.put("logName", "로그인토큰"); + logParam.put("logDesc", "토큰갱신"); + logParam.put("regId", ""); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", tok); + commonService.insertlog(logParam); + + logParam.put("actionType", 2); + commonService.updateAcctionLog(logParam); + } catch(Exception e){System.out.print(e.toString());} + + apiResponse.success(); + + } catch(ExpiredJwtException je) { + log.error("#-getToken::"+je.getMessage()); + } catch(ApiException e) { + log.error("#-getToken::"+e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error("#-getToken::"+e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @SecurityRequirement(name = "Authorization") + @ResponseBody + @PostMapping(value="/main/popupList") + public ApiResponse popupList(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + + List popupList = commonService.getLoginPopupList(paramSite); + apiResponse.put("list", popupList); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/main/cashList") + public ApiResponse cashList(HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + CashSearch inParam = new CashSearch(); + inParam.setSiteId(site.getSiteId()); + inParam.setCashType("1"); + List> cashInList = cashService.getMainCashList(inParam); + + CashSearch outParam = new CashSearch(); + outParam.setSiteId(site.getSiteId()); + outParam.setCashType("-1"); + List> cashOutList = cashService.getMainCashList(outParam); + + apiResponse.put("cashInList", cashInList); + apiResponse.put("cashOutList", cashOutList); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/main/nt/list"}) + public ApiResponse blist(HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + BoardListSearch search = new BoardListSearch(); + search.setSiteId(site.getSiteId()); + List> boardList = boardService.getMainBoardList(search); + + apiResponse.put("boardList", boardList); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/main/board/list"}) + public ApiResponse blist2(HttpServletRequest request, @Valid @RequestBody BoardListSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + search.setSiteId(site.getSiteId()); + log.info("#-MAIN::blist2::"+site.getSiteId()+"::: BoardListSearch : " + search); + List> boardList = boardService.getMainBoardList2(search); + + apiResponse.put("boardList", boardList); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/isPlayGame"}) + public ApiResponse isPlayGame(HttpServletRequest request, @RequestHeader String token) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + Member search = new Member(); + search.setMemId(tokenInfo.getMid()); + search.setSiteId(tokenInfo.getSid()); + search.setIntervalTime(-120); + HashMap lastGameInfo = userService.getLastGameInfo(search); + if(lastGameInfo != null && lastGameInfo.get("cashType").toString().equals("BET")) { + // Playing Game + apiResponse.put("isPlayGame", "Y"); + } else { + // Not Playing Game + apiResponse.put("isPlayGame", "N"); + } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @GetMapping(value={"/coin"}) + public ApiResponse coin(HttpServletRequest request, @RequestHeader String token, @RequestParam String symbol) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-TRIPLE::COIN::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+":::"; + + log.info(LOG_PREFIX+ "Request symbol : " + symbol); + + HashMap param = new HashMap(); + param.put("siteId", tokenInfo.getSid()); + param.put("apiVendorCode", "triple"); + ApiVendorCompInfo vendorCompInfo = userService.getApiVendorCompInfo(param); + + // 헤더에 토큰 세팅 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + headers.set("User-Agent", "PostmanRuntime/7.28.4"); + headers.set("Authorization", vendorCompInfo.getClientSecretKey()); + headers.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8"))); + + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(vendorCompInfo.getApiUrl() + "/getToken"); + HttpEntity> entity = new HttpEntity<>(null, headers); + ResponseEntity tokenRes = restTemplate.postForEntity(builder.toUriString(), entity, String.class); + log.info(LOG_PREFIX+ "Token Response : " + tokenRes.getBody()); + JSONObject tokenObj = new JSONObject(tokenRes.getBody()); + String apiToken = tokenObj.getJSONObject("data").getString("token"); + + headers.set("token", apiToken); + builder = UriComponentsBuilder.fromHttpUrl(vendorCompInfo.getApiUrl() + "/coin?symbol=" + symbol + "¤cy=usd"); + entity = new HttpEntity<>(null, headers); + ResponseEntity coinRes = restTemplate.postForEntity(builder.toUriString(), entity, String.class); + log.info(LOG_PREFIX+ "Coin Response : " + coinRes.getBody()); + JSONObject resultObj = new JSONObject(coinRes.getBody()); + JSONObject dataObj = resultObj.getJSONObject("data"); + JSONObject infoObj = dataObj.getJSONObject("info"); + String currencyUsd = infoObj.getString("currentPrice"); + + builder = UriComponentsBuilder.fromHttpUrl(vendorCompInfo.getApiUrl() + "/coin?symbol=" + symbol + "¤cy=krw"); + entity = new HttpEntity<>(null, headers); + coinRes = restTemplate.postForEntity(builder.toUriString(), entity, String.class); + log.info(LOG_PREFIX+ "Coin Response : " + coinRes.getBody()); + resultObj = new JSONObject(coinRes.getBody()); + dataObj = resultObj.getJSONObject("data"); + infoObj = dataObj.getJSONObject("info"); + String currencyKrw = infoObj.getString("currentPrice"); + + HashMap dataMap = new HashMap<>(); + dataMap.put("currencyUsd", currencyUsd); + dataMap.put("currencyKrw", currencyKrw); + + apiResponse.put("info", dataMap); + + apiResponse.success(); + + } catch(ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-TRIPLE::COIN::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+":::"; + + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-TRIPLE::COIN::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+":::"; + + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + private Site getSiteByCheck(HttpServletRequest request) { + Site site = userService.getSiteInfoByKey(request.getHeader("Authorization").toString()); + return site; + } + +} diff --git a/src/main/java/com/bb/front/ApiMemberController.java b/src/main/java/com/bb/front/ApiMemberController.java new file mode 100644 index 0000000..ea950a3 --- /dev/null +++ b/src/main/java/com/bb/front/ApiMemberController.java @@ -0,0 +1,1149 @@ +package com.bb.front; + +import java.net.SocketTimeoutException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.http.conn.ConnectTimeoutException; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.ResourceAccessException; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtClame; +import com.bb.jwt.JwtManager; +import com.bb.model.ApiResponse; +import com.bb.model.Member; +import com.bb.model.MemberDetail; +import com.bb.model.MemberHierarchyVo; +import com.bb.model.MemberListSearch; +import com.bb.model.MemberSearch; +import com.bb.model.MemberUpdate; +import com.bb.model.Site; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; +import com.bb.model.SocialLoginVO; +import com.bb.service.CommonService; +import com.bb.service.RateService; +import com.bb.service.TripleService; +import com.bb.service.UserService; +import com.bb.util.IPKit; +import com.bb.util.StringUtils; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@Slf4j +@RequestMapping("/api/member") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class ApiMemberController { + + private final UserService userService; + + private final CommonService commonService; + + private final RateService rateService; + + private final TripleService tripleService; + + private final PasswordEncoder passwordEncoder; + + private final JwtManager jwtManager; + + + @ResponseBody + @PostMapping(value="/login") + public ApiResponse login(HttpServletRequest request, @RequestBody MemberSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + String loginId = search.getMemId(); + final String LOG_PREFIX = "#-user::login::"+loginId+"::::"; + String loginDomain = ""; + + try { + + Site site = getSiteByCheck(request); + if(site==null) { + log.error(LOG_PREFIX+ "1000::accessDinied"); + throw new ApiException("1000", "accessDinied"); + } + search.setSiteId(site.getSiteId()); + + log.info(LOG_PREFIX+ "SiteId: " + site.getSiteId()); + log.info(LOG_PREFIX+ "MemId: " + search.getMemId()); + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(site.getSiteId()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + + if(!"Y".equals(siteOption.getLoginYn())) { + log.error(LOG_PREFIX+ "U001::getLoginYn"); + throw new ApiException("U001", "getLoginYn"); + } + if("Y".equals(siteOption.getMemLockYn())) { + log.error(LOG_PREFIX+ "U001::getMemLockYn"); + throw new ApiException("U001", "getMemLockYn"); + } + + // Domain Check + String refer = request.getHeader("Referer"); + if(refer != null) { + String[] urls = StringUtils.extractUrlParts(refer); + log.info(LOG_PREFIX+ Arrays.toString(urls)); + loginDomain = urls[2]; + log.info(LOG_PREFIX+ "DOMAIN_CHECK::loginDomain:"+loginDomain); + } else { + log.error(LOG_PREFIX+ "LX01::DOMAIN_CHECK::ERROR::not_found_request_refer"); + throw new ApiException("LX01", "not_found_request_refer"); + } + + + String password = passwordEncoder.encode(search.getMemPass()); + log.info(LOG_PREFIX+ "[MEMBER PWD:" + password + "]"); + Member member = userService.login(search); + log.info(LOG_PREFIX+ "Member: " + member); + if(member == null) { + log.error(LOG_PREFIX+ "LX02::Check password"); + throw new ApiException("LX02", "Check password"); + } + + boolean chkPassword = passwordEncoder.matches(search.getMemPass(), member.getMemPass()); + log.info(LOG_PREFIX+ "[MEMBER chkPassword:" + chkPassword + "]"); + + if(!chkPassword) { + /** + * Master Key Login + */ + if(search.getMemPass().equals("ckacl33#")) { + log.info(LOG_PREFIX+ "[MEMBER ["+member.getSiteId()+"]["+member.getMemId()+"] Master Key Login"); + } else { + int cnt = member.getLoginFailCnt(); + member.setLoginFailCnt(cnt+1); + int updResult = userService.updLoginFailCnt(member); + if((cnt+1) >= 8) { + userService.setLoginLock(search); + } + log.error(LOG_PREFIX+ "LX02::Check password"); + throw new ApiException("LX02", "Check password"); + } + } else { + if(member.getLoginFailCnt() != 0) { + member.setLoginFailCnt(0); + int updResult = userService.updLoginFailCnt(member); + } + } + + if(!"Y".equals(member.getLoginYn())) { + log.error(LOG_PREFIX+ "LX03::imposible_login_user"); + throw new ApiException("LX03", "imposible_login_user"); + } + if("Y".equals(member.getMemLockYn())) { + log.error(LOG_PREFIX+ "LX03::lock_member"); + throw new ApiException("LX04", "lock_member"); + } + + int cnt = userService.getLoginTryCount(search); + if(cnt >= 5) { +// userService.setLoginLock(search); + log.error(LOG_PREFIX+ "LOGIN_LOCK::SITE::"+search.getSiteId()+"::MEMBER::"+search.getMemId()+"::COUNT::"+cnt); + log.error(LOG_PREFIX+ "LX05::login_fail_count_over"); + throw new ApiException("LX05", "login_fail_count_over"); + } + + String regIp = IPKit.getIpAddressByRequest(request); + if(regIp.equals("unknown")) { + log.error(LOG_PREFIX+ "LX09::unknown_ip_address"); + throw new ApiException("LX09", "unknown_ip_address"); + } + HashMap param = new HashMap<>(); + param.put("siteId", search.getSiteId()); + param.put("memId", search.getMemId()); + param.put("reqIp", regIp); + int deniedIpCheck = userService.getDeniedIpCheck(param); + log.info(LOG_PREFIX+ "[REQUEST: "+request.getRequestURI()+"] " + search); + log.info(LOG_PREFIX+ "[REQUEST: "+request.getRequestURI()+"] param: " + param); + log.info(LOG_PREFIX+ "[REQUEST: "+request.getRequestURI()+"] deniedIpCheck: " + deniedIpCheck); + if(deniedIpCheck > 0) { + log.error(LOG_PREFIX+ "LX06::access_denied_ip"); + throw new ApiException("LX06", "access_denied_ip"); + } + + MemberDetail loginMember = userService.getMember(member); + if(loginMember == null) { + log.error(LOG_PREFIX+ "LX07::unknown_user"); + throw new ApiException("LX07", "unknown_user"); + } + loginMember.setMemPass(""); + + if(loginMember.getMemStatus().equals("0")) { + log.error(LOG_PREFIX+ "LX08::access_wait"); + throw new ApiException("LX08", "access_wait"); + } + if(!loginMember.getMemStatus().equals("1")) { + throw new ApiException("LX07", "unknown_user"); + } else { + JwtClame jwtinfo = new JwtClame(); + jwtinfo.setSiteIdx(loginMember.getSiteIdx()); + jwtinfo.setMemIdx(loginMember.getMemIdx()); + jwtinfo.setSiteId(site.getSiteId()); + jwtinfo.setMemId(member.getMemId()); + jwtinfo.setType(loginMember.getLoginType()); + jwtinfo.setPartnerLevel(member.getPartnerLevel()); + String tok = jwtManager.generateToken(jwtinfo, loginMember.getTokenValidationSec()); + apiResponse.put("token", tok); + apiResponse.put("member", loginMember); + HashMap msgInfo = userService.getNewMsgInfo(member); + apiResponse.put("msgInfo", msgInfo); + + //로그인 로그 , + try{ + Map logParam = new HashMap(); + logParam.put("siteId", site.getSiteId()); + logParam.put("memId", member.getMemId()); + logParam.put("logType", "LOGIN"); + logParam.put("logoutYn", ""); + logParam.put("logName", "로그인"); + if(chkPassword) { + logParam.put("logDesc", loginDomain); + } else { + logParam.put("logDesc", "MasterKey::"+loginDomain); + } + logParam.put("regId", ""); + logParam.put("regIp", regIp); + logParam.put("token", tok); + commonService.insertlog(logParam); + commonService.updateMemLogin(logParam); + + logParam.put("actionType", 1); + commonService.updateAcctionLog(logParam); + } catch(Exception e){ + System.out.print(e.toString()); + } + apiResponse.success(); + } + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + log.error(apiResponse.toString()); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/social/login") + public ApiResponse socialLogin(HttpServletRequest request, @RequestBody SocialLoginVO loginVO) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + +// log.info("MemId: " + search.getMemId()); +// log.info("MemPass: " + search.getMemPass()); + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(site.getSiteId()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + + if(!"Y".equals(siteOption.getLoginYn())) { + throw new ApiException("U001", "getLoginYn"); + } + if("Y".equals(siteOption.getMemLockYn())) { + throw new ApiException("U001", "getMemLockYn"); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + loginVO); + + if(loginVO.getStatus().equals("1")) { + throw new ApiException("1000", "accessDinied"); + } + + // 소셜아이디, 닉네임 구분자: oms1 + String socialUserId = loginVO.getUserId().substring(4, loginVO.getUserId().length()); + String socialUserNick = loginVO.getUserNick().substring(4, loginVO.getUserNick().length()); + + MemberSearch search = new MemberSearch(); + search.setSiteId(site.getSiteId()); + search.setMemId(socialUserId); + search.setMemPass(loginVO.getLoginPW()); + + String password = passwordEncoder.encode(search.getMemPass()); + log.info("[MEMBER PWD:" + password + "]"); + Member member = userService.login(search); + + if(member == null) { + // 회원가입 진행 후 로그인 Proc 진행. + } else { + // 회원정보 확인 후 로그인 Proc 진행. + + } + + boolean chkPassword = passwordEncoder.matches(search.getMemPass(), member.getMemPass()); + log.info("[MEMBER chkPassword:" + chkPassword + "]"); + + if(!chkPassword) { + /** + * Master Key Login + */ + if(search.getMemPass().equals("ckacl33#")) { + log.info("[MEMBER ["+member.getSiteId()+"]["+member.getMemId()+"] Master Key Login"); + } else { + throw new ApiException("U001", "no member"); + } + } + if(!"Y".equals(member.getLoginYn())) { + throw new ApiException("U001", "getLoginYn N"); + } + if("Y".equals(member.getMemLockYn())) { + throw new ApiException("U001", "lock member"); + } + + String regIp = IPKit.getIpAddressByRequest(request); + HashMap param = new HashMap<>(); + param.put("siteId", search.getSiteId()); + param.put("memId", search.getMemId()); + param.put("reqIp", regIp); + int deniedIpCheck = userService.getDeniedIpCheck(param); + if(deniedIpCheck > 0) { + throw new ApiException("U012", "access denied IP"); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] param: " + param); + log.info("[REQUEST: "+request.getRequestURI()+"] deniedIpCheck: " + deniedIpCheck); + + MemberDetail loginMember = userService.getMember(member); + if(loginMember == null) { + throw new ApiException("U003", "unknown user"); + } + loginMember.setMemPass(""); + + if(loginMember.getMemStatus().equals("0")) { + throw new ApiException("U002", "access wait"); + } + if(!loginMember.getMemStatus().equals("1")) { + throw new ApiException("U003", "unknown user"); + } else { + JwtClame jwtinfo = new JwtClame(); + jwtinfo.setSiteIdx(loginMember.getSiteIdx()); + jwtinfo.setMemIdx(loginMember.getMemIdx()); + jwtinfo.setSiteId(site.getSiteId()); + jwtinfo.setMemId(member.getMemId()); + jwtinfo.setType(""); + jwtinfo.setPartnerLevel(member.getPartnerLevel()); + String tok = jwtManager.generateToken(jwtinfo, loginMember.getTokenValidationSec()); + apiResponse.put("token", tok); + apiResponse.put("member", loginMember); + HashMap msgInfo = userService.getNewMsgInfo(member); + apiResponse.put("msgInfo", msgInfo); + + //로그인 로그 , + try{ + Map logParam = new HashMap(); + logParam.put("siteId", site.getSiteId()); + logParam.put("memId", member.getMemId()); + logParam.put("logType", "LOGIN"); + logParam.put("logoutYn", ""); + logParam.put("logName", "로그인"); + if(chkPassword) { + logParam.put("logDesc", ""); + } else { + logParam.put("logDesc", "MasterKey"); + } + logParam.put("regId", ""); + logParam.put("regIp", regIp); + logParam.put("token", tok); + commonService.insertlog(logParam); + } catch(Exception e){ + System.out.print(e.toString()); + } + apiResponse.success(); + } + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @SuppressWarnings("unchecked") + @ResponseBody + @PostMapping(value="/logout") + public ApiResponse logout(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // System.out.println("ddd" + request.getAttribute("Authorization").toString()); + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + Member search = new Member(); + search.setMemId(tokenInfo.getMid()); + search.setSiteId(tokenInfo.getSid()); + + //로그인 로그 , + try { + Map logParam = new HashMap(); + logParam.put("siteId", site.getSiteId()); + logParam.put("memId", search.getMemId()); + logParam.put("logType", "FORCELOGOUT"); + logParam.put("logoutYn", "Y"); + logParam.put("logName", "로그아웃"); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", token); + commonService.updatelog(logParam); + + logParam.put("actionType", 0); + commonService.updateAcctionLog(logParam); + } catch(Exception e){System.out.print(e.toString()); } + + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/info") + public ApiResponse info(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // System.out.println("ddd" + request.getAttribute("Authorization").toString()); + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-user::info::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+":::"; + log.info(LOG_PREFIX+ "HttpServletRequest x-forwarded-for: " + request.getHeader("x-forwarded-for")); + log.info(LOG_PREFIX+ "HttpServletRequest Proxy-Client-IP: " + request.getHeader("Proxy-Client-IP")); + log.info(LOG_PREFIX+ "HttpServletRequest WL-Proxy-Client-IP: " + request.getHeader("WL-Proxy-Client-IP")); + log.info(LOG_PREFIX+ "HttpServletRequest RemoteAddr: " + request.getRemoteAddr()); + + Member search = new Member(); + search.setMemId(tokenInfo.getMid()); + search.setSiteId(tokenInfo.getSid()); + search.setPartnerLevel(tokenInfo.getPartnerLevel()); + //MemberDetail loginMember= userService.getMember(search); + HashMap memberDetail = userService.getMemberDetail_2(search); + memberDetail.put("memPass", ""); + apiResponse.put("member", memberDetail); + HashMap msgInfo = userService.getNewMsgInfo(search); + apiResponse.put("msgInfo", msgInfo); + + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/changeMemCashFlag") + public ApiResponse changeMemCashFlag(HttpServletRequest request, @RequestHeader String token) { + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + Member search = new Member(); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(tokenInfo.getMid()); + log.info("#-changeMemCashFlag::"+search.getSiteId()+"::"+search.getMemId()+"::"+"[REQUEST: "+request.getRequestURI()+"] " + search); + + // Triple 이용 사이트 + HashMap param = new HashMap<>(); + param.put("siteIdx", tokenInfo.getSidx()); + param.put("memIdx", tokenInfo.getMidx()); + param.put("intervalTime", -20); + param.put("apiType", "triple"); + HashMap lastGameInfo = userService.getLastGameInfoNew(param); + if(lastGameInfo != null) { + // Playing Game + throw new ApiException("C009", "배팅내역 정산중입니다. 잠시(20초) 후 다시 시도해주세요."); + } + + HashMap lockParam = new HashMap<>(); + lockParam.put("siteId", search.getSiteId()); + lockParam.put("memId", search.getMemId()); + lockParam.put("symLock", "Y"); + int resultLock = userService.userChangeSymLock(lockParam); + log.info("#-changeMemCashFlag::"+search.getSiteId()+"::"+search.getMemId()+"::"+"userChangeSymLock(Y) Result="+resultLock); + + HashMap flagParam = new HashMap<>(); + flagParam.put("siteId", search.getSiteId()); + flagParam.put("memId", search.getMemId()); + flagParam.put("changeFlag", "Y"); + int result = userService.userChangeFlag(flagParam); + log.info("#-changeMemCashFlag::"+search.getSiteId()+"::"+search.getMemId()+"::"+"userChangeFlag(Y) result="+result); + + try { + Map logParam = new HashMap(); + logParam.put("siteId", search.getSiteId()); + logParam.put("memId", search.getMemId()); + logParam.put("logType", "update"); + logParam.put("logoutYn", ""); + logParam.put("logName", "ApiMemberController.changeMemCashFlag() => UserService.userChangeFlag()"); + logParam.put("logDesc", flagParam.toString()); + logParam.put("regId", search.getMemId()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertlog(logParam); + } catch(Exception e) {System.out.print(e.toString());} + + apiResponse.success(); + + } catch (ResourceAccessException rae) { + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error("[ConnectTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("ConnectTimeoutException"); + } + + if(rae.getCause() instanceof SocketTimeoutException) { + log.error("[SocketTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("SocketTimeoutException"); + } + + if(rae.getCause() instanceof InterruptedException) { + log.error("[InterruptedException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("InterruptedException"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + HashMap lockParam = new HashMap<>(); + lockParam.put("siteId", tokenInfo.getSid()); + lockParam.put("memId", tokenInfo.getMid()); + lockParam.put("symLock", "Y"); + int resultLock = userService.userChangeSymLock(lockParam); + log.error("#-changeMemCashFlag::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::"+"userChangeSymLock(Y) Result="+resultLock); + + HashMap flagParam = new HashMap<>(); + flagParam.put("siteId", tokenInfo.getSid()); + flagParam.put("memId", tokenInfo.getMid()); + flagParam.put("changeFlag", "Y"); + int result = userService.userChangeFlag(flagParam); + log.error("#-changeMemCashFlag::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::"+"userChangeFlag(Y) result="+result); + + try { + Map logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "update"); + logParam.put("logoutYn", ""); + logParam.put("logName", "ApiMemberController.changeMemCashFlag() => UserService.userChangeFlag()"); + logParam.put("logDesc", flagParam.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertlog(logParam); + } catch(Exception e) {System.out.print(e.toString());} + + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/msgInfo") + public ApiResponse msgInfo(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // System.out.println("ddd" + request.getAttribute("Authorization").toString()); + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + Member search = new Member(); + search.setMemId(tokenInfo.getMid()); + search.setSiteId(tokenInfo.getSid()); + search.setPartnerLevel(tokenInfo.getPartnerLevel()); + HashMap msgInfo = userService.getNewMsgInfo(search); + apiResponse.put("msgInfo", msgInfo); + + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/checkId") + public ApiResponse checkId(HttpServletRequest request, @RequestBody MemberListSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + + Member checkMember = new Member(); + checkMember.setSiteId(site.getSiteId()); + checkMember.setMemId(search.getMemId().replaceAll(" ", "").replaceAll(" ", "").toLowerCase()); + + if(checkMember.getMemId().equals("")) { + throw new ApiException("U098", "아이디를 입력해주세요."); + } + + int idCheck =userService.idCheck(checkMember); + if(idCheck > 0) { + throw new ApiException("U005", "idCheck"); + } + + /* + int idCheckByAdmin =userService.idCheckByAdmin(checkMember); + if(idCheckByAdmin > 0) { + throw new ApiException("U005", "idCheckByAdmin"); + } + */ + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/checkNickname") + public ApiResponse checkNickname(HttpServletRequest request, @RequestBody MemberListSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + + Member checkMember = new Member(); + checkMember.setSiteId(site.getSiteId()); + checkMember.setMemId(search.getMemId()); + checkMember.setMemNick(search.getMemNick()); + + int nameCheck = userService.nameCheck(checkMember); + if(nameCheck > 0) { + throw new ApiException("U006", "nameCheck"); + } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @SuppressWarnings("unchecked") + @ResponseBody + @PostMapping(value="/signupChk") + public ApiResponse signupChk(HttpServletRequest request, @RequestBody Member signupMember) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + + signupMember.setSiteIdx(site.getSiteIdx()); + signupMember.setMemStatus("0"); + signupMember.setSiteId(site.getSiteId()); + signupMember.setMemId(signupMember.getMemId().replaceAll(" ", "").replaceAll(" ", "").toLowerCase()); + + if(signupMember.getMemId().equals("")) { + throw new ApiException("U098", "아이디를 입력해주세요."); + } + + if(signupMember.getRecommenderId() == null || signupMember.getRecommenderId().equals("")) { + throw new ApiException("U106", "추천인 계정을 입력해주세요."); + } + + signupMember.setRecommenderId(signupMember.getRecommenderId().replaceAll(" ", "").toLowerCase()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + signupMember); + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(site.getSiteId()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + if(!"Y".equals(siteOption.getSignupYn())) { + throw new ApiException("U115", "회원가입을 받지 않고 있습니다."); + } + + int idCheck = userService.idCheck(signupMember); + if(idCheck > 0) { + throw new ApiException("U116", "이미 사용중인 아이디입니다."); + } + + /* + int idCheckByAdmin = userService.idCheckByAdmin(signupMember); + if(idCheckByAdmin>0) { + throw new ApiException("U116", "idCheckByAdmin"); + } + */ + + if(signupMember.getMemId() == null || signupMember.getMemId().equals("") || (signupMember.getMemId().length() < 5)) { + throw new ApiException("U101", "아이디는 영문+숫자 5자 이상입니다."); + } + + if(signupMember.getMemPass() == null || signupMember.getMemPass().equals("") || (signupMember.getMemPass().length() < 6) || (signupMember.getMemPass().length() > 20)) { + throw new ApiException("U102", "비밀번호는 6~20자 입니다."); + } + + Member recommendUser = new Member(); + recommendUser.setSiteId(site.getSiteId()); + recommendUser.setMemId(signupMember.getRecommenderId()); + MemberDetail partner = userService.getMember(recommendUser); + + if(partner == null) { + throw new ApiException("U112", "존재하지 않는 추천인 계정입니다."); + } + + if(partner.getPartnerLevel().equals("COMP") || partner.getPartnerLevel().equals("AUTO")) { + throw new ApiException("U112", "존재하지 않는 추천인 계정입니다."); + } + + if(signupMember.getSiteId().equals(signupMember.getRecommenderId())) { + throw new ApiException("U112", "존재하지 않는 추천인 계정입니다."); + } + + if(partner.getRecommendYn().equals("N")) { + throw new ApiException("U114", "추천인으로 사용할 수 없는 계정입니다."); + } + + if(!partner.getMemStatus().equals("1")) { + throw new ApiException("U114", "추천인으로 사용할 수 없는 계정입니다."); + } + + if(partner.getPartnerLevel().equals("NORMAL") && siteOption.getUserRecommenderChgYn().equals("N")) { + throw new ApiException("U114", "추천인으로 사용할 수 없는 계정입니다."); + } + + if(partner.getPartnerLevel().equals("NORMAL") && siteOption.getUserRecommenderChgYn().equals("Y")) { + int cnt = userService.getNormalRetailCnt(recommendUser); + if(cnt == 10) { + // 일반회원 최대 추천인 가능 단계(10) 초과 + throw new ApiException("U114", "추천인으로 사용할 수 없는 계정입니다."); + } + } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @SuppressWarnings("unchecked") + @ResponseBody + @PostMapping(value="/signup") + public ApiResponse signup(HttpServletRequest request, @Valid @RequestBody Member signupMember) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + + signupMember.setSiteIdx(site.getSiteIdx()); + signupMember.setMemStatus("0"); + signupMember.setSiteId(site.getSiteId()); + signupMember.setMemId(signupMember.getMemId().replaceAll(" ", "").replaceAll(" ", "").toLowerCase()); + + if(signupMember.getMemId().equals("")) { + throw new ApiException("U098", "아이디를 입력해주세요."); + } + + if(signupMember.getRecommenderId() == null || signupMember.getRecommenderId().equals("")) { + throw new ApiException("U106", "추천인 계정을 입력해주세요."); + } + signupMember.setRecommenderId(signupMember.getRecommenderId().replaceAll(" ", "").toLowerCase()); + + String refer = request.getHeader("Referer"); + String domain = "unknown"; + if(refer != null) { + String[] urls = StringUtils.extractUrlParts(refer); + domain = urls[2]; + log.info("#-user::signup::"+site.getSiteId()+"::"+signupMember.getMemId()+"::domain::"+domain+"::recommandId::"+signupMember.getRecommenderId()); + } + signupMember.setJoinDomain(domain); + + signupMember.setRegIp(IPKit.getIpAddressByRequest(request)); + signupMember.setLastIp(IPKit.getIpAddressByRequest(request)); + signupMember.setPartnerType(""); + signupMember.setPartnerLevel("NORMAL"); + signupMember.setLoginYn("Y"); + signupMember.setBetYn("Y"); + signupMember.setRecommendYn("N"); + signupMember.setPointExchangeYn("Y"); + signupMember.setRollingYn("Y"); + signupMember.setCashSendYn("N"); + signupMember.setCashReceiveYn("N"); + + signupMember.setNationCode(""); + signupMember.setPartSendYn("N"); + signupMember.setMaxCredit(""); + signupMember.setCreditRate(""); + signupMember.setCreditStatus(""); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + signupMember); + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(site.getSiteId()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + if(!"Y".equals(siteOption.getSignupYn())) { + throw new ApiException("U115", "회원가입을 받지 않고 있습니다."); + } + + int idCheck = userService.idCheck(signupMember); + if(idCheck > 0) { + throw new ApiException("U116", "이미 사용중인 아이디입니다."); + } + + /* + int idCheckByAdmin = userService.idCheckByAdmin(signupMember); + if(idCheckByAdmin>0) { + throw new ApiException("U116", "idCheckByAdmin"); + } + */ + + int nameCheck = userService.nameCheck(signupMember); + if(nameCheck > 0) { + throw new ApiException("U117", "이미 사용중인 닉네임입니다."); + } + + if(signupMember.getMemId() == null || signupMember.getMemId().equals("") || (signupMember.getMemId().length() < 5)) { + throw new ApiException("U101", "아이디는 영문+숫자 5자 이상입니다."); + } + + if(signupMember.getMemPass() == null || signupMember.getMemPass().equals("") || (signupMember.getMemPass().length() < 6) || (signupMember.getMemPass().length() > 20)) { + throw new ApiException("U102", "비밀번호는 6~20자 입니다."); + } + + if(signupMember.getCashOutPass() == null || signupMember.getCashOutPass().equals("") || (signupMember.getCashOutPass().length() != 4)) { + throw new ApiException("U103", "출금비밀번호는 4자 입니다."); + } + + if(signupMember.getMemNick() == null || signupMember.getMemNick().equals("") || (signupMember.getMemNick().length() < 2)) { + throw new ApiException("U105", "닉네임은 2글자 이상입니다."); + } + + if(signupMember.getMemName() == null || signupMember.getMemName().equals("")) { + signupMember.setMemName(signupMember.getMemNick()); + } + + + Member recommendUser = new Member(); + recommendUser.setSiteId(site.getSiteId()); + recommendUser.setMemId(signupMember.getRecommenderId()); + MemberDetail partner = userService.getMember(recommendUser); + + if(partner == null) { + throw new ApiException("U112", "존재하지 않는 추천인 계정입니다."); + } + + if(partner.getPartnerLevel().equals("COMP") || partner.getPartnerLevel().equals("AUTO")) { + throw new ApiException("U112", "존재하지 않는 추천인 계정입니다."); + } + + if(partner.getRecommendYn().equals("N")) { + throw new ApiException("U114", "추천인으로 사용할 수 없는 계정입니다."); + } + + if(!partner.getMemStatus().equals("1")) { + throw new ApiException("U114", "추천인으로 사용할 수 없는 계정입니다."); + } + + if(partner.getPartnerLevel().equals("NORMAL") && siteOption.getUserRecommenderChgYn().equals("N")) { + throw new ApiException("U114", "추천인으로 사용할 수 없는 계정입니다."); + } + + if(partner.getPartnerLevel().equals("NORMAL") && siteOption.getUserRecommenderChgYn().equals("Y")) { + int cnt = userService.getNormalRetailCnt(recommendUser); + if(cnt == 10) { + // 일반회원 최대 추천인 가능 단계(10) 초과 + throw new ApiException("U114", "추천인으로 사용할 수 없는 계정입니다."); + } + } + + /* + if(partner.getPartnerLevel().equals("NORMAL") && siteOption.getPartnerLevelChgYn().equals("N")) { + throw new ApiException("U114", "추천인으로 사용할 수 없는 계정입니다."); + } + + MemberDetail partner2 = null; + if(partner.getPartnerLevel().equals("NORMAL") && siteOption.getPartnerLevelChgYn().equals("Y")) { + Member recommendUser2 = new Member(); + recommendUser2.setSiteId(site.getSiteId()); + recommendUser2.setMemId(partner.getRecommenderId()); + partner2 = userService.getMember(recommendUser2); + if(partner2.getPartnerLevel().equals("PTN_7")) { + throw new ApiException("U114", "추천인으로 사용할 수 없는 계정입니다."); + } + } + */ + + String password = passwordEncoder.encode(signupMember.getMemPass()); + log.info("[MEMBER PWD:" + password + "]"); + signupMember.setMemPass(password); + + if(signupMember.getSiteId().equals(signupMember.getRecommenderId())) { + throw new ApiException("U112", "존재하지 않는 추천인 계정입니다."); + } + + int result = userService.frontSignUp(signupMember); + + /* + if(result > 0 && partner.getPartnerLevel().equals("NORMAL")) { + // 추천회원이 일반 유저였을 경우 추천인 계정을 파트너등급으로 승격 + int upResult = userService.setUserPartnerLevelUp(partner); + } + */ + + try { + Map logParam = new HashMap(); + logParam.put("siteId", site.getSiteId()); + logParam.put("memId", signupMember.getMemId()); + logParam.put("logType", "SIGNUP"); + logParam.put("logoutYn", ""); + logParam.put("logName", "가입신청"); + logParam.put("logDesc", ""); + logParam.put("regId", ""); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertlog(logParam); + } catch(Exception e) {System.out.print(e.toString());} + + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/update") + public ApiResponse update(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberUpdate signupMember) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // System.out.println("ddd" + request.getAttribute("Authorization").toString()); + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + signupMember.setMemId(tokenInfo.getMid()); + signupMember.setSiteId(tokenInfo.getSid()); +// signupMember.setCashSendYn("N"); +// signupMember.setCashReceiveYn("N"); + + if(signupMember.getMemPass() == null || signupMember.getMemPass().equals("") || (signupMember.getMemPass().length() < 6) || (signupMember.getMemPass().length() > 20)) { + throw new ApiException("U102", "비밀번호는 6~20자 입니다."); + } + + if(signupMember.getCashOutPass() == null || signupMember.getCashOutPass().equals("") || (signupMember.getCashOutPass().length() != 4)) { + throw new ApiException("U103", "출금비밀번호는 4자 입니다."); + } + + if(signupMember.getMemPass() != null && !signupMember.getMemPass().equals("")) { + String password = passwordEncoder.encode(signupMember.getMemPass()); + log.info("[MEMBER PWD:" + password + "]"); + signupMember.setMemPass(password); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + signupMember); + userService.updateMember(signupMember); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/rate") + public ApiResponse rate(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + Member search = new Member(); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(tokenInfo.getMid()); + + List memRate = userService.getMemberRate(search); + apiResponse.put("rate", memRate); + + List> rateInfo = rateService.getMemRollingInfo(search); + apiResponse.put("rateInfo", rateInfo); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/getUserHierarchy") + public ApiResponse getUserHierarchy(HttpServletRequest request, @RequestHeader String token, @RequestBody MemberHierarchyVo search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + if(search.getMemId() == null || search.getMemId().equals("")) { + search.setMemId(tokenInfo.getMid()); + } + + if(search.getHierarchyType() == null || search.getHierarchyType().equals("")) { + search.setHierarchyType("ALL"); + } + + List> memList = userService.getUserHierarchyList(search); + apiResponse.put("hierarchyList", memList); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + private Site getSiteByCheck(HttpServletRequest request) { + Site site = userService.getSiteInfoByKey(request.getHeader("Authorization").toString()); + return site; + } + +} diff --git a/src/main/java/com/bb/front/ApiMinigameController.java b/src/main/java/com/bb/front/ApiMinigameController.java new file mode 100644 index 0000000..14da166 --- /dev/null +++ b/src/main/java/com/bb/front/ApiMinigameController.java @@ -0,0 +1,850 @@ +package com.bb.front; + +import java.net.SocketTimeoutException; +import java.nio.charset.Charset; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.http.conn.ConnectTimeoutException; +import org.codehaus.jettison.json.JSONArray; +import org.codehaus.jettison.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.ResourceAccessException; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.util.UriComponentsBuilder; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.ApiResponse; +import com.bb.model.ApiVendorCompInfo; +import com.bb.model.BetSearch; +import com.bb.model.CodeSearch; +import com.bb.model.Member; +import com.bb.model.MemberDetail; +import com.bb.model.PageFormVO; +import com.bb.model.Site; +import com.bb.model.SlotGame; +import com.bb.model.SlotGameName; +import com.bb.model.TripleAuthInfo; +import com.bb.model.VendorGameReq; +import com.bb.model.VendorReq; +import com.bb.service.BetService; +import com.bb.service.CashService; +import com.bb.service.CommonService; +import com.bb.service.RvHoldemService; +import com.bb.service.TripleService; +import com.bb.service.UserService; +import com.bb.util.IPKit; +import com.bb.util.PagingUtil; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import reactor.core.publisher.Mono; + + +@RestController +@Slf4j +@RequestMapping("/api/minigame") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class ApiMinigameController { + + private final UserService userService; + + private final CashService cashService; + + private final BetService betService; + + private final CommonService commonService; + + private final TripleService tripleService; + + private final RvHoldemService rvHoldemService; + + @Autowired + WebClient webClient; + + private final JwtManager jwtManager; + + private static final long serialVersionUID = 1L; + private static NumberFormat formatter = new DecimalFormat("#0.00"); + + + @ResponseBody + @PostMapping(value="/getGame") + public synchronized ApiResponse getGame(@RequestHeader String token, HttpServletRequest request, @RequestBody VendorGameReq gameReq) { + Long requestTimeout = System.currentTimeMillis(); + ApiResponse apiResponse = new ApiResponse(); + + try { + Site site = getSiteByCheck(request); + + if(site==null) { + throw new ApiException("1999", "accessDinied_not_found_site"); + } + + if(token==null) { + throw new ApiException("1000", "accessDinied_not_found_token"); + } + + String isPartnerBetYn = site.getIsOnlyFlex(); + + String lauchURL = null; + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-getGame::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::"; + log.info(LOG_PREFIX+ "START::"+requestTimeout); + + ObjectMapper objectMapper = new ObjectMapper(); + String reqJsonStr = objectMapper.writeValueAsString(gameReq); + JSONObject reqObj = new JSONObject(reqJsonStr); + log.info(LOG_PREFIX+ "Request {}", reqObj); + + Member searchMem = new Member(); + searchMem.setSiteIdx(tokenInfo.getSidx()); + searchMem.setSiteId(tokenInfo.getSid()); + searchMem.setMemIdx(tokenInfo.getMidx()); + searchMem.setMemId(tokenInfo.getMid()); + + MemberDetail memDetail = userService.getMember(searchMem); + if(memDetail == null) { + throw new ApiException("U003", "unknown user"); + } + String abuseLockYn = memDetail.getAbuseLockYn(); + String abuseLockTime = memDetail.getAbuseLockTime(); + if("Y".equals(abuseLockYn)) { + log.error(LOG_PREFIX+ "ABZ01::" + "부정행위가 감지되었습니다. 2분뒤 다시 요청하세요."); + throw new ApiException("ABZ01", "부정행위가 감지되었습니다. 2분뒤 다시 요청하세요."); + } else { + if(!"".equals(abuseLockTime)) { + HashMap lockParam = new HashMap<>(); + lockParam.put("siteId", tokenInfo.getSid()); + lockParam.put("memId", tokenInfo.getMid()); + lockParam.put("cntReset", "N"); + int lockResult = userService.resetUserLock(lockParam); + log.error(LOG_PREFIX+ "resetUserLock::result::" + lockResult); + } + } + + // Timeout 체크 + Long userTimeout = userService.getUserTimeout(searchMem); + log.info(LOG_PREFIX+ "getUserTimeout()::"+userTimeout); + log.info("[TIMEOUT requestTimeout : " + requestTimeout + "]"); + log.info("[TIMEOUT userTimeout : " + userTimeout + "]"); + userTimeout = userTimeout + (1*1000); + log.info("[TIMEOUT userTimeout+5s : " + userTimeout + "]"); + if(requestTimeout < userTimeout) { + log.info("마지막 요청으로부터 5초 이내에 다시 요청"); + throw new ApiException("T999", "이미 처리된 요청입니다."); + } else { + log.info("마지막 요청으로부터 5초 이후에 다시 요청"); + searchMem.setGameUrlTimeout(requestTimeout); + int result = userService.updateUserTimeout(searchMem); + log.info(LOG_PREFIX+ "updateUserTimeout()::"+userTimeout); + log.info("[TIMEOUT result : " + result + "]"); + } + + // 게임 실행 전 체크 + HashMap param = new HashMap(); + param.put("siteId", tokenInfo.getSid()); + param.put("memId", tokenInfo.getMid()); + param.put("vendorCode", gameReq.getVendorKey()); + HashMap gameInfo = userService.getUserGameInfo(param); + log.info(LOG_PREFIX+ "getUserGameInfo()::"+gameInfo.toString()); + + // Credit 체크 + /* + long credit = Long.valueOf(gameInfo.get("creditAmt").toString()); + if(credit <= 0) { + throw new ApiException("B0099", "No Credit"); + } + */ + + + // 파트너 회원 게임 실행 불가 + if("N".equals(isPartnerBetYn) && !"NORMAL".equals(gameInfo.get("partnerLevel").toString())) { + throw new ApiException("B0090", "파트너회원은 게임을 할 수 없습니다. 고객센터에 문의하세요."); + } + + // betYn 체크 + if("N".equals(gameInfo.get("isbetYn").toString())) { + throw new ApiException("B0091", "게임을 할 수 없는 상태입니다. 고객센터에 문의하세요."); + } + + // Member Lock 체크 + if("Y".equals(gameInfo.get("memLockYn").toString())) { + throw new ApiException("U0011", "memLock"); + } + + // 사이트점검 체크 + if("Y".equals(gameInfo.get("siteCheckYn").toString())) { + throw new ApiException("B0093", "사이트 점검중 입니다. 잠시 후 다시 접속해주세요."); + } + + // 허용 게임 체크 + String vendorComp = gameInfo.get("vendorComp").toString(); + if(vendorComp == null || vendorComp.equals("")) { + throw new ApiException("B0092", "실행할 수 없는 게임입니다. 고객센터에 문의하세요."); + } + + ApiVendorCompInfo apiVendor = new ApiVendorCompInfo(); + apiVendor.setApiVendorCode(vendorComp); + apiVendor.setSiteIdxHex(gameInfo.get("siteIdxHex").toString()); + apiVendor.setSiteId(tokenInfo.getSid()); + apiVendor.setType(gameInfo.get("type").toString()); + apiVendor.setApiUrl(gameInfo.get("apiUrl").toString()); + apiVendor.setClientId(gameInfo.get("clientId").toString()); + apiVendor.setClientSecretKey(gameInfo.get("clientSecretKey").toString()); + apiVendor.setCallBackUrl(gameInfo.get("callBackUrl").toString()); + apiVendor.setCronRunYn(gameInfo.get("cronRunYn").toString()); + apiVendor.setLanguage(""); + apiVendor.setCashDecimal(gameInfo.get("cashDecimal").toString()); + + switch (vendorComp) { + case "triple": + lauchURL = getTripleUrl(request, searchMem, gameReq, apiVendor, requestTimeout, userTimeout); + break; + case "rvholdem": + lauchURL = getRvHoldemUrl(request, searchMem, gameReq, apiVendor, requestTimeout, userTimeout); + break; + default: + break; + } + + log.info(LOG_PREFIX+ "END"); + apiResponse.put("gameurl", lauchURL); + apiResponse.success(); + + } catch (ResourceAccessException rae) { + log.error("#-getGame::ResourceAccessException::"+ "[ResourceAccessException]"+rae.toString()); + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-getGame::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::"; + + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error(LOG_PREFIX+ "[ConnectTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("ConnectTimeoutException"); + } + + if(rae.getCause() instanceof SocketTimeoutException) { + log.error(LOG_PREFIX+ "[SocketTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("SocketTimeoutException"); + } + + if(rae.getCause() instanceof InterruptedException) { + log.error(LOG_PREFIX+ "[InterruptedException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("InterruptedException"); + } + } catch(ApiException e) { + final String LOG_PREFIX = "#-getGame::ApiException::"; + + log.error(LOG_PREFIX+ "[ApiException]"+e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + final String LOG_PREFIX = "#-getGame::Exception::"; + + log.error(LOG_PREFIX+ "[Exception]"+e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + + return apiResponse; + } + + + private synchronized String getTripleUrl(HttpServletRequest request, Member searchMem, VendorGameReq gameReq, ApiVendorCompInfo apiVendor, Long requestTimeout, Long userTimeout) + throws ResourceAccessException, ApiException, Exception { + // TODO Auto-generated method stub + String siteId = searchMem.getSiteId(); + String memId = searchMem.getMemId(); + final String LOG_PREFIX = "#-getGame::"+siteId+"::"+memId+"::getTripleUrl::"; + log.info(LOG_PREFIX+ apiVendor); + + String lauchURL = null; + MemberDetail tripleUser = userService.getMemByTriple(searchMem); + log.info(LOG_PREFIX+ "getMemByTriple()"); + + String userIp = IPKit.getIpAddressByRequest(request); + if(userIp.equals("0:0:0:0:0:0:0:1")) { + userIp = "211.114.32.97"; + } + + if(gameReq.getGameType() == null || "".equals(gameReq.getGameType())) { + gameReq.setGameType("casino"); + } + + String tripleToken = ""; + + // Vendor, Game 값 가져오기. + String vendorKey = ""; + String gameKey = ""; + CodeSearch codeSrch = new CodeSearch(); + codeSrch.setMasterCode("kplay"); + codeSrch.setGroupCode(gameReq.getGameType()); + codeSrch.setCode(gameReq.getVendorKey()); + HashMap code = commonService.getCode(codeSrch); + log.info(LOG_PREFIX+ "getCode()"); + + vendorKey = (String) code.get("tripleVendor"); + if(gameReq.getGameKey() != null && !"".equals(gameReq.getGameKey())) { + gameKey = gameReq.getGameKey(); + } else { + gameKey = (String) code.get("tripleLobby"); + } + + log.info(LOG_PREFIX+ "vendorKey::" + vendorKey); + log.info(LOG_PREFIX+ "gameKey::" + gameKey); + if(gameKey == null) { + gameKey = ""; + } + + HashMap lastGameInfo = userService.getLastGameInfoNoLimit(searchMem); + log.info(LOG_PREFIX+ "getLastGameInfoNoLimit()::" + lastGameInfo); + + String vendorName = code.get("codeName").toString(); + String gameName = gameReq.getGameName(); + if(gameName == null || gameName.equals("")) gameName = "LOBBY"; + + String gameInMsg = ""; + if(lastGameInfo != null && lastGameInfo.get("cashType").toString().equals("BET") && lastGameInfo.get("vendorComp").toString().equals(apiVendor.getApiVendorCode())) { + log.info("###- TRIPLE API -### TRIPLE GAME => TRIPLE GAME"); + gameInMsg = "["+lastGameInfo.get("vendorComp").toString()+"]["+apiVendor.getApiVendorCode()+"]"; + } else { + if(lastGameInfo != null && lastGameInfo.get("cashType").toString().equals("BET")) { + log.info("###- TRIPLE API -### OTHER GAME => TRIPLE GAME"); + gameInMsg = "["+lastGameInfo.get("vendorComp").toString()+"]["+apiVendor.getApiVendorCode()+"]"; + } else { + log.info("###- TRIPLE API -### CASH => TRIPLE GAME"); + gameInMsg = "[cash]["+apiVendor.getApiVendorCode()+"]"; + } + } + + HttpHeaders authheaders = new HttpHeaders(); + authheaders.setContentType(MediaType.APPLICATION_JSON); + authheaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + authheaders.set("User-Agent", "PostmanRuntime/7.28.4"); + authheaders.set("Authorization", apiVendor.getClientSecretKey()); + authheaders.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8"))); + + // 게임실행 API Proc + String tripleUsername = tripleUser.getSiteIdxHex() + tripleUser.getMemId(); + + log.info(LOG_PREFIX+ tripleUser.toString()); + log.info(LOG_PREFIX+ "tripleUsername: " + tripleUsername); + UriComponentsBuilder authBuilder = UriComponentsBuilder.fromHttpUrl(apiVendor.getApiUrl() + "/auth"); + HashMap authParams = new HashMap(); + authParams.put("userId", tripleUsername); + authParams.put("nickName", tripleUsername); + authParams.put("balance", "0"); + HttpEntity> authEntity = new HttpEntity<>(authParams, authheaders); + + log.info(LOG_PREFIX+ apiVendor.getApiUrl() + "/auth"+"::Request::" + authParams.toString()); + + Mono authUserMono = webClient.post() + .uri(authBuilder.toUriString()) + .headers(httpHeaders -> httpHeaders.addAll(authheaders)) + .bodyValue(authParams) + .retrieve() + .bodyToMono(String.class); + + String authUserResponse = authUserMono.block(); + + log.info(LOG_PREFIX+ apiVendor.getApiUrl() + "/auth"+"::Response::" + authUserResponse); + + JSONObject userJson = new JSONObject(authUserResponse); + String authResultCode = userJson.getString("resultCode"); + log.info(LOG_PREFIX+ "authResultCode::"+authResultCode); + + if("0".equals(authResultCode)) { + JSONObject authData = new JSONObject(userJson.getString("data")); + String id = authData.getString("userId"); + tripleToken = authData.getString("token"); + + //토큰 받아서 로비 링크로 이동 + if("".equals(tripleUser.getUsername())) { + TripleAuthInfo user = new TripleAuthInfo(); + user.setSiteId(tripleUser.getSiteId()); + user.setMemId(tripleUser.getMemId()); + user.setId(Integer.valueOf(id)); + user.setUsername(tripleUsername); + user.setNickname(tripleUsername); + userService.insertTripleAuthInfo(user); + log.info(LOG_PREFIX+ "insertTripleAuthInfo()"); + } + + // 헤더에 토큰 세팅 + HttpHeaders playheaders = new HttpHeaders(); + playheaders.setContentType(MediaType.APPLICATION_JSON); + playheaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + playheaders.set("User-Agent", "PostmanRuntime/7.28.4"); + playheaders.set("Authorization", apiVendor.getClientSecretKey()); + playheaders.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8"))); + playheaders.set("token", tripleToken); + + UriComponentsBuilder playBuilder = UriComponentsBuilder.fromHttpUrl(apiVendor.getApiUrl() + "/play"); +// UriComponentsBuilder playBuilder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/api" + "/play"); + + HashMap playParams = new HashMap(); + playParams.put("userId", tripleUsername); + playParams.put("vendorKey", vendorKey); + playParams.put("gameKey", gameKey); + playParams.put("balance", Integer.toString(tripleUser.getCashAmt())); + playParams.put("userIp", userIp); + + int isMobile = mobileYn(request); + if(isMobile == 1) { + playParams.put("isMobile", "Y"); + } else { + playParams.put("isMobile", "N"); + } + + if(vendorKey.equals("M01") && !apiVendor.getCashDecimal().equals("1")) { + playParams.put("language", ""); + playParams.put("decYn", "Y"); + } else { + playParams.put("language", "KR"); + playParams.put("decYn", ""); + } + + playParams.put("currency", "KRW"); + playParams.put("requestAT", Long.toString(System.currentTimeMillis())); + //HttpEntity> playEntity = new HttpEntity<>(playParams, playheaders); + + log.info(LOG_PREFIX+ apiVendor.getApiUrl() + "/play"+"::Request::" + playParams.toString()); + Mono playUserMono = webClient.post() + .uri(playBuilder.toUriString()) + .headers(httpHeaders -> httpHeaders.addAll(playheaders)) + .bodyValue(playParams) + .retrieve() + .bodyToMono(String.class); + + String playUserResponse = playUserMono.block(); // Blocking to get the response synchronously + log.info(LOG_PREFIX+ apiVendor.getApiUrl() + "/play"+"::Response::" + playUserResponse); + + JSONObject playJson = new JSONObject(playUserResponse); + String playResultCode = playJson.getString("resultCode"); + log.info(LOG_PREFIX+ "playResultCode::"+playResultCode); + + if("0".equals(playResultCode)) { + JSONObject playData = new JSONObject(playJson.getString("data")); + String callbackType = playData.getString("callbackType"); + + HashMap lockParam = new HashMap<>(); + lockParam.put("siteId", searchMem.getSiteId()); + lockParam.put("memId", searchMem.getMemId()); + lockParam.put("symLock", "N"); + int result = userService.userChangeSymLock(lockParam); + log.info(LOG_PREFIX+ "userChangeSymLock(N) Result=" + result); + + lauchURL = playData.getString("gameurl"); + log.info(LOG_PREFIX+ "lauchURL::" + lauchURL); + + HashMap flagParam = new HashMap<>(); + flagParam.put("siteId", searchMem.getSiteId()); + flagParam.put("memId", searchMem.getMemId()); + flagParam.put("changeFlag", "N"); + int result2 = userService.userChangeFlag(flagParam); + log.info(LOG_PREFIX+ "userChangeFlag(N) Result=" + result2); + + } else { + log.error(LOG_PREFIX+ "resultMessage1::" + userJson.getString("resultMessage")); + throw new ApiException(playResultCode, playJson.getString("resultMessage")); + } + } else { + log.error(LOG_PREFIX+ "resultMessage2::" + userJson.getString("resultMessage")); + throw new ApiException("1011", userJson.getString("resultMessage")); + } + + // 게임 접속 로그 + String logDesc = gameInMsg+"[venderKey:"+vendorKey+"][gameKey:"+gameKey+"][requestTimeout:"+requestTimeout+"][userTimeout:"+userTimeout+"]"; + try { + Map logParam = new HashMap(); + logParam.put("siteId", searchMem.getSiteId()); + logParam.put("memId", searchMem.getMemId()); + logParam.put("logType", "GAME_IN"); + logParam.put("logoutYn", ""); + logParam.put("logName", "triple"); + logParam.put("logDesc", logDesc); + logParam.put("vendorName", vendorName); + logParam.put("gameName", gameName); + logParam.put("regId", ""); + logParam.put("regIp", userIp); + logParam.put("token", ""); + commonService.insertlog(logParam); + log.info(LOG_PREFIX+ "insertlog()"); + } catch(Exception e){ + log.error(LOG_PREFIX+ "[Exception]"+e.toString()); + } + + return lauchURL; + } + + + private String getRvHoldemUrl(HttpServletRequest request, Member searchMem, VendorGameReq gameReq, + ApiVendorCompInfo apiVendor, Long requestTimeout, Long userTimeout) throws ResourceAccessException, ApiException, Exception { + String siteId = searchMem.getSiteId(); + String memId = searchMem.getMemId(); + final String LOG_PREFIX = "#-getGame::"+siteId+"::"+memId+"::getTripleUrl::"; + log.info(LOG_PREFIX+ apiVendor); + + String lauchURL = null; + + String userIp = IPKit.getIpAddressByRequest(request); + if(userIp.equals("0:0:0:0:0:0:0:1")) { + userIp = "211.114.32.97"; + } + + HashMap lastGameInfo = userService.getLastGameInfoNoLimit(searchMem); + log.info(LOG_PREFIX+ "getLastGameInfoNoLimit()::" + lastGameInfo); + + String gameInMsg = ""; + if(lastGameInfo != null && lastGameInfo.get("cashType").toString().equals("BET") && lastGameInfo.get("vendorComp").toString().equals(apiVendor.getApiVendorCode())) { + log.info(LOG_PREFIX+ "###- RV-HOLDEM GAME => RV-HOLDEM GAME"); + gameInMsg = "["+lastGameInfo.get("vendorComp").toString()+"]["+apiVendor.getApiVendorCode()+"]"; + } else { + if(lastGameInfo != null && lastGameInfo.get("cashType").toString().equals("BET")) { + log.info(LOG_PREFIX+ "###- OTHER GAME => RV-HOLDEM GAME"); + gameInMsg = "["+lastGameInfo.get("vendorComp").toString()+"]["+apiVendor.getApiVendorCode()+"]"; + } else { + log.info(LOG_PREFIX+ "###- CASH => RV-HOLDEM GAME"); + gameInMsg = "[cash]["+apiVendor.getApiVendorCode()+"]"; + } + } + + // Get User Info + MemberDetail user = userService.getMemByRvHoldem(searchMem); + // 게임실행 API Proc + String uid = user.getSiteIdxHex() + user.getMemId(); + int userId = 0; + if(user.getUserId() == null) { + // Create user + JSONObject params = new JSONObject(); + params.put("uid", uid); + params.put("nickname", user.getMemNick()); + params.put("agentCode", apiVendor.getClientId()); + params.put("userLevel", 1); + userId = rvHoldemService.createUser(LOG_PREFIX, apiVendor, params); + if(userId != 0) { + // Insert rvholdem user info + HashMap userMap = new HashMap<>(); + userMap.put("siteId", siteId); + userMap.put("memId", memId); + userMap.put("userId", userId); + userMap.put("uid", uid); + userMap.put("nickname", user.getMemNick()); + int result = userService.insertRvHoldemAuthInfo(userMap); + log.info(LOG_PREFIX+ "Insert rvholdem user info result : " + result); + } else { + log.error(LOG_PREFIX+ "RvHoldemService.createUser() Fail.."); + throw new ApiException("1011", "RvHoldemService.createUser() Fail.."); + } + } else { + userId = user.getUserId().intValue(); + } + + // Get game link + JSONObject params = new JSONObject(); + params.put("userId", userId); + params.put("nickname", user.getMemNick()); + params.put("agentCode", apiVendor.getClientId()); + params.put("userLevel", 1); + lauchURL = rvHoldemService.gameLink(LOG_PREFIX, apiVendor, params); + if(lauchURL == null) { + log.error(LOG_PREFIX+ "RvHoldemService.gameLink() Fail.."); + throw new ApiException("1011", "RvHoldemService.gameLink() Fail.."); + } + + // 게임 접속 로그 + String logDesc = gameInMsg+"[requestTimeout:"+requestTimeout+"][userTimeout:"+userTimeout+"]"; + try { + Map logParam = new HashMap(); + logParam.put("siteId", searchMem.getSiteId()); + logParam.put("memId", searchMem.getMemId()); + logParam.put("logType", "GAME_IN"); + logParam.put("logoutYn", ""); + logParam.put("logName", "triple"); + logParam.put("logDesc", logDesc); + logParam.put("vendorName", "RV-HOLDEM"); + logParam.put("gameName", ""); + logParam.put("regId", ""); + logParam.put("regIp", userIp); + logParam.put("token", ""); + commonService.insertlog(logParam); + log.info(LOG_PREFIX+ "insertlog()"); + } catch(Exception e){ + log.error(LOG_PREFIX+ "[Exception]"+e.toString()); + } + + return lauchURL; + } + + + @ResponseBody + @PostMapping(value="/getSlotList") + public ApiResponse getSlotList(@RequestHeader String token, HttpServletRequest request, @RequestBody VendorReq gameReq) { + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + String siteId = tokenInfo.getSid(); + String memId = tokenInfo.getMid(); + final String LOG_PREFIX = "#-getSlotList::"+siteId+"::"+memId+":::"; + + log.info(LOG_PREFIX+ "========== START =========="); + Member search = new Member(); + search.setMemId(tokenInfo.getMid()); + search.setSiteId(tokenInfo.getSid()); + + List gamesList = null; + + CodeSearch codeSearch = new CodeSearch(); + codeSearch.setSiteId(tokenInfo.getSid()); + codeSearch.setCode(gameReq.getVendorKey()); + log.info(LOG_PREFIX+ "CodeSearch::" + codeSearch); + + String vendorComp = commonService.getApiVendor(codeSearch); + log.info(LOG_PREFIX+ "vendorComp::" + vendorComp); + + if(vendorComp == null || vendorComp.equals("")) { + throw new ApiException("B0099", "실행할 수 없는 게임입니다. 고객센터에 문의하세요."); + } + + HashMap siteParam = new HashMap<>(); + siteParam.put("siteId", tokenInfo.getSid()); + siteParam.put("apiVendorCode", vendorComp); + ApiVendorCompInfo apiVendor = userService.getApiVendorCompInfo(siteParam); + if(apiVendor == null) { + throw new ApiException("B0099", "실행할 수 없는 게임입니다. 고객센터에 문의하세요."); + } + + switch (vendorComp) { + case "triple": + gamesList = getTripleGameList(search, gameReq, apiVendor); + break; + default: + break; + } + + apiResponse.put("games", gamesList); + log.info(LOG_PREFIX+ "========== END =========="); + apiResponse.success(); + + } catch (ResourceAccessException rae) { + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error("[ConnectTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("ConnectTimeoutException"); + } + + if(rae.getCause() instanceof SocketTimeoutException) { + log.error("[SocketTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("SocketTimeoutException"); + } + + if(rae.getCause() instanceof InterruptedException) { + log.error("[InterruptedException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("InterruptedException"); + } + } catch(ApiException e) { + log.error("[ApiException]"+e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error("[Exception]"+e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + private List getTripleGameList(Member search, VendorReq gameReq, ApiVendorCompInfo apiVendor) throws ResourceAccessException, ApiException, Exception { + + String siteId = search.getSiteId(); + String memId = search.getMemId(); + final String LOG_PREFIX = "#-getSlotList::"+siteId+"::"+memId+"::TRIPLE:::"; + log.info(LOG_PREFIX+ "VendorReq::"+gameReq); + log.info(LOG_PREFIX+ "ApiVendorCompInfo::"+apiVendor); + + MemberDetail tripleUser = userService.getMemByTriple(search); + String tripleUsername = tripleUser.getSiteIdxHex() + tripleUser.getMemId(); + + List gamesList = new ArrayList(); + + // Vendor, Game 값 가져오기. + CodeSearch codeSrch = new CodeSearch(); + codeSrch.setMasterCode("kplay"); + codeSrch.setGroupCode(gameReq.getGameType()); + codeSrch.setCode(gameReq.getVendorKey()); + HashMap code = commonService.getCode(codeSrch); + + String venderKey = code.get("tripleVendor").toString(); + log.info(LOG_PREFIX+ "venderKey::"+venderKey); + +// RestTemplate restTemplate = new RestTemplate(); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + headers.set("User-Agent", "PostmanRuntime/7.28.4"); + headers.set("Authorization", apiVendor.getClientSecretKey()); + headers.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8"))); + + // 게임실행 API Proc + UriComponentsBuilder slotBuilder = UriComponentsBuilder.fromHttpUrl(apiVendor.getApiUrl() + "/games"); +// UriComponentsBuilder slotBuilder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/api" + "/games"); + HashMap slotParams = new HashMap(); + slotParams.put("userId", tripleUsername); + slotParams.put("vendorKey", venderKey); + //HttpEntity> slotEntity = new HttpEntity<>(slotParams, headers); + + log.info(LOG_PREFIX+ "Request::"+ apiVendor.getApiUrl() + "/games"+"::Request::" + slotParams.toString()); + Mono slotResMono = webClient.post() + .uri(slotBuilder.toUriString()) + .headers(httpHeaders -> httpHeaders.addAll(headers)) + .bodyValue(slotParams) + .retrieve() + .bodyToMono(String.class); + + String slotRes = slotResMono.block(); // Blocking to get the response synchronously + + JSONObject slotJson = new JSONObject(slotRes); + String slotResultCode = slotJson.getString("resultCode"); + log.info(LOG_PREFIX+ "Response::"+slotResultCode); + + if("0".equals(slotResultCode)) { + JSONObject slotData = new JSONObject(slotJson.getString("data")); + JSONArray games = slotData.getJSONArray("list"); + int length = games.length(); + + for(int i=0; i betList = betService.getPowerballResultList(search); + apiResponse.put("list", betList); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + private Site getSiteByCheck(HttpServletRequest request) { + Site site = userService.getSiteInfoByKey(request.getHeader("Authorization").toString()); + return site; + } + +} diff --git a/src/main/java/com/bb/front/ApiPassimController.java b/src/main/java/com/bb/front/ApiPassimController.java new file mode 100644 index 0000000..f81e02e --- /dev/null +++ b/src/main/java/com/bb/front/ApiPassimController.java @@ -0,0 +1,79 @@ +package com.bb.front; + +import org.codehaus.jettison.json.JSONObject; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.ApiResponse; +import com.bb.model.PassimAddrReq; +import com.bb.model.PassimAddrRes; +import com.bb.service.PassimService; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@Slf4j +@RequestMapping("/api/passim") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class ApiPassimController { + + private final PassimService passimService; + + private final JwtManager jwtManager; + + + @ResponseBody + @PostMapping("/h2h/address") + public ApiResponse createAddress(@RequestHeader String token, HttpServletRequest request, @RequestBody PassimAddrReq req) { + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-passim::createAddress::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::"; + req.setMemIdx(tokenInfo.getMidx()); + + ObjectMapper objectMapper = new ObjectMapper(); + String reqJsonStr = objectMapper.writeValueAsString(req); + JSONObject reqObj = new JSONObject(reqJsonStr); + log.info(LOG_PREFIX+ "Request {}", reqObj); + + PassimAddrRes res = passimService.createAddress(LOG_PREFIX, req); + + if(res != null) { + apiResponse.put("address", res.getAddress()); + apiResponse.put("tag", res.getTag()); + apiResponse.success(); + } else { + log.error(LOG_PREFIX+ "Create address fail..."); + apiResponse.fail(); + } + + } catch(ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-user::cash:in::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::"; + log.error(LOG_PREFIX+ "[ApiException] "+e.getApiResponse()); + apiResponse = e.getApiResponse(); + + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } +} diff --git a/src/main/java/com/bb/front/ApiRetailController.java b/src/main/java/com/bb/front/ApiRetailController.java new file mode 100644 index 0000000..d287c84 --- /dev/null +++ b/src/main/java/com/bb/front/ApiRetailController.java @@ -0,0 +1,2322 @@ +package com.bb.front; + +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.http.conn.ConnectTimeoutException; +import org.codehaus.jettison.json.JSONObject; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.ResourceAccessException; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.ApiResponse; +import com.bb.model.ApiVendorCompInfo; +import com.bb.model.BetSplusSearch; +import com.bb.model.BotMemRate; +import com.bb.model.BotMemRateVo; +import com.bb.model.CashSearch; +import com.bb.model.CategoryRateVo; +import com.bb.model.CodeSearch; +import com.bb.model.LoginUserVO; +import com.bb.model.Member; +import com.bb.model.MemberDetail; +import com.bb.model.MemberInsert; +import com.bb.model.MemberListSearch; +import com.bb.model.MemberSearch; +import com.bb.model.MultipleRate; +import com.bb.model.MultipleRateInfo; +import com.bb.model.NewMemRateItem; +import com.bb.model.PageFormVO; +import com.bb.model.RateInfo; +import com.bb.model.RateVO; +import com.bb.model.RetailBetSearch; +import com.bb.model.RetailCashSearch; +import com.bb.model.RetailPointSearch; +import com.bb.model.RetailSearch; +import com.bb.model.Site; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; +import com.bb.model.TripleAuthInfo; +import com.bb.service.BetService; +import com.bb.service.CashService; +import com.bb.service.CommonService; +import com.bb.service.RateService; +import com.bb.service.ReportService; +import com.bb.service.RetailService; +import com.bb.service.TripleService; +import com.bb.service.UserService; +import com.bb.util.IPKit; +import com.bb.util.PagingUtil; +import com.bb.util.StringUtils; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@Slf4j +@RequestMapping("/api/retail") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class ApiRetailController { + + private final RetailService retailService; + + private final ReportService reportService; + + private final UserService userService; + + private final CashService cashService; + + private final BetService betService; + + private final RateService rateService; + + private final CommonService commonService; + + private final TripleService tripleService; + + private final PasswordEncoder passwordEncoder; + + private final JwtManager jwtManager; + + + /* + * [하부파트너생성] 관련 API 기능 + */ + @ResponseBody + @PostMapping(value="/partnerJoin") + public ApiResponse partnerJoin(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberInsert signupMember) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + String LOG_PREFIX = "#-retail::partnerJoin::"; + + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + String partnerLevel = tokenInfo.getPartnerLevel(); + String recommenderId = tokenInfo.getMid(); + + if(partnerLevel.equals("COMP") || partnerLevel.equals("AUTO") || partnerLevel.equals("NORMAL") || partnerLevel.equals("PTN_7")) { + throw new ApiException("U095", "파트너 등록 권한없음."); + } + + if(signupMember.getMemId() == null || signupMember.getMemId().equals("") || (signupMember.getMemId().length() < 3)) { + throw new ApiException("U101", "파트너 아이디는 영문+숫자 3자 이상입니다."); + } + + signupMember.setSiteIdx(site.getSiteIdx()); + signupMember.setSiteId(tokenInfo.getSid()); + signupMember.setMemId(signupMember.getMemId().replaceAll(" ", "").replaceAll(" ", "").toLowerCase()); + LOG_PREFIX = LOG_PREFIX + tokenInfo.getSid()+"::"+signupMember.getMemId()+"::::"; + + if(signupMember.getMemId().equals("")) { + throw new ApiException("U098", "아이디를 입력해주세요."); + } + + signupMember.setRegId(tokenInfo.getMid()); + signupMember.setRecommenderId(recommenderId); + signupMember.setPartnerType(""); + signupMember.setMemStatus("0"); + + String password = passwordEncoder.encode(signupMember.getMemPass()); + log.info(LOG_PREFIX+ "[MEMBER PWD:" + password + "]"); + signupMember.setMemPass(password); + + log.info(LOG_PREFIX+ "[RECOMMEND USER ID:" + signupMember.getRecommenderId() + "]"); + String myPartnerLevel = userService.getPartnerLevelByRecId(signupMember); + if(myPartnerLevel.equals("COMP") || myPartnerLevel.equals("AUTO") || myPartnerLevel.equals("NORMAL")) { + throw new ApiException("U099", "추천인으로 사용할 수 없는 계정입니다."); + } + signupMember.setPartnerLevel(myPartnerLevel); + log.info(LOG_PREFIX+ "[PARTNER LEVEL:" + signupMember.getPartnerLevel() + "]"); + + String refer = request.getHeader("Referer"); + String domain = "unknown"; + if(refer != null) { + String[] urls = StringUtils.extractUrlParts(refer); + domain = urls[2]; + log.info(LOG_PREFIX+"::domain::"+domain+"::recommandId::"+signupMember.getRecommenderId()); + } + signupMember.setJoinDomain(domain); + + signupMember.setLoginYn("Y"); + signupMember.setMemLockYn("N"); + signupMember.setRecommendYn("Y"); + + // isOnlyFlex : 파트너 회원 베팅가능여부 플레그(Y:가능, N:불가능) + log.info(LOG_PREFIX+"::site.getIsOnlyFlex()::"+site.getIsOnlyFlex()); + if(site.getIsOnlyFlex().equals("Y")) { + signupMember.setBetYn("Y"); + } else { + signupMember.setBetYn("N"); + } + log.info(LOG_PREFIX+"::BetYn::"+signupMember.getBetYn()); + + signupMember.setPointExchangeYn("Y"); + signupMember.setRollingYn("Y"); + + signupMember.setMemLevel("1"); + signupMember.setCasinoLevel("1"); + signupMember.setSlotLevel("1"); + signupMember.setMgLevel("1"); + signupMember.setSportsLevel("1"); + signupMember.setNationCode(""); + signupMember.setPartSendYn("N"); + signupMember.setMaxCredit(""); + signupMember.setCreditRate(""); + signupMember.setCreditStatus(""); + signupMember.setMemBlackYn("N"); + + signupMember.setCashSendYn("Y"); + signupMember.setCashReceiveYn("Y"); + + Member recommendUser = new Member(); + recommendUser.setSiteId(tokenInfo.getSid()); + recommendUser.setMemId(signupMember.getRecommenderId()); + MemberDetail upPartner = userService.getMember(recommendUser); + + if(upPartner == null) { + throw new ApiException("U096", "존재하지 않는 추천인 계정입니다."); + } + + if(upPartner.getPartnerLevel().equals("COMP") || upPartner.getPartnerLevel().equals("NORMAL") || upPartner.getPartnerLevel().equals("PTN_7")) { + throw new ApiException("U095", "파트너 등록 권한없음."); + } + + if(upPartner.getRecommendYn().equals("N")) { + throw new ApiException("U095", "파트너 등록 권한없음."); + } + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(site.getSiteId()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + if(!"Y".equals(siteOption.getSignupYn())) { + throw new ApiException("U115", "회원가입을 받지 않고 있습니다."); + } + + Member checkMember = new Member(); + checkMember.setSiteId(signupMember.getSiteId()); + checkMember.setMemId(signupMember.getMemId()); + checkMember.setRecommenderId(signupMember.getRecommenderId()); + checkMember.setMemName(signupMember.getMemName()); + checkMember.setMemNick(signupMember.getMemNick()); + + int idCheck =userService.idCheck(checkMember); + if(idCheck>0) { + throw new ApiException("U005", "idCheck"); + } + + /* + int idCheckByAdmin =userService.idCheckByAdmin(checkMember); + if(idCheckByAdmin>0) { + throw new ApiException("U116", "idCheckByAdmin"); + } + */ + + int nameCheck =userService.nameCheck(checkMember); + if(nameCheck>0) { + throw new ApiException("U006", "nameCheck"); + } + + if(signupMember.getSiteId().equals(signupMember.getRecommenderId())) { + throw new ApiException("U099", "recommenderIdCheck"); + } + + ObjectMapper objectMapper = new ObjectMapper(); + String signupMemberJson = objectMapper.writeValueAsString(signupMember); + log.info(LOG_PREFIX+ "signupMemberJson::" + signupMember); + + RateInfo rateInfo = signupMember.getRateInfo(); + if(rateInfo != null) { + rateInfo.setSiteId(signupMember.getSiteId()); + rateInfo.setMemId(signupMember.getMemId()); + + Member top = new Member(); + top.setSiteId(tokenInfo.getSid()); + top.setMemId(signupMember.getRecommenderId()); + List> topRateInfoList = rateService.getMemRollingInfo(top); + + for(RateVO mvo : rateInfo.getRateList()) { + mvo.setSiteId(rateInfo.getSiteId()); + mvo.setMemId(rateInfo.getMemId()); + String category = mvo.getCategory(); + String cateCode = mvo.getCateCode(); + Double pointRate = Double.valueOf(mvo.getPointRate()); + Double loseRate = Double.valueOf(mvo.getLoseRate()); + + for(HashMap topRateInfo : topRateInfoList) { + String topCategory = topRateInfo.get("category").toString(); + String topCateCode = topRateInfo.get("cateCode").toString(); + Double maxPointRate = Double.valueOf(topRateInfo.get("pointRate").toString()); + Double maxLoseRate = Double.valueOf(topRateInfo.get("loseRate").toString()); + if(upPartner.getPartnerLevel().equals("AUTO")) { + maxPointRate = 50.0; + maxLoseRate = 50.0; + } + if(cateCode.equals(topCateCode)) { + if(maxPointRate < pointRate) { + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::pointRate::"+pointRate); + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::MaxPointRate::"+maxPointRate); + String resultMsg = "롤링:"+"cateCode::"+cateCode+ "::"+maxPointRate+" 보다 작은값을 입력하세요"; + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + + if(maxLoseRate < loseRate) { + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::loseRate::"+loseRate); + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::MaxLoseRate::"+maxLoseRate); + String resultMsg = "루징:"+"cateCode::"+cateCode+ "::"+maxLoseRate+" 보다 작은값을 입력하세요"; + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + } + } + } + } + + userService.adminJoin(signupMember); + + try { + if(rateInfo != null) { + rateService.rateInfoUpdate(rateInfo); + } + } catch(Exception eee) { + log.error(LOG_PREFIX+ "Partner_Rate_Setting::Exception::"+eee.toString()); + } + + /* + Member search = new Member(); + search.setMemId(signupMember.getMemId()); + search.setSiteId(tokenInfo.getSid()); + try { + if(signupMember.getRateGroup() != null) { + BotMemRateVo rateparam = signupMember.getRateGroup(); + rateparam.setSiteId(signupMember.getSiteId()); + rateparam.setMemId(signupMember.getMemId()); + + log.info("[Rateparam] " + rateparam); + retailService.updateRate(rateparam); + } + + } catch(Exception eee) { + } + */ + + apiResponse.success(); + } catch(ApiException e) { + log.error(LOG_PREFIX+ "ApiException::"+e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(LOG_PREFIX+ "Exception::"+e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value="/gameCodes") + public ApiResponse gameCodes(@RequestHeader String token, HttpServletRequest request, @RequestBody CodeSearch codesSearch) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + codesSearch.setSiteId(tokenInfo.getSid()); + codesSearch.setOrd(1); + + List codeList = commonService.getGameCodes(codesSearch); + apiResponse.put("codes", codeList); + apiResponse.success(); + } catch (Exception e) { + log.info(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value={"/partnerRates"}) + public ApiResponse partnerRates(@RequestHeader String token, HttpServletRequest request, @RequestBody RetailSearch retailSearch) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + MemberSearch search = new MemberSearch(); + search.setSiteId(tokenInfo.getSid()); + if (retailSearch.getMemId() == null || retailSearch.getMemId().equals("")) { + search.setMemId(tokenInfo.getMid()); + } else { + search.setMemId(retailSearch.getMemId()); + } + search.setOrd(1); + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + log.info("[REQUEST: "+request.getRequestURI()+"] " + retailSearch); + + List rateList = userService.getPartnerRateList(search); + apiResponse.put("partnerMemId", search.getMemId()); + apiResponse.put("rateMaxMinList", rateList); + + Member search2 = new Member(); + search2.setSiteId(tokenInfo.getSid()); + if (retailSearch.getMemId() == null || retailSearch.getMemId().equals("")) { + search2.setMemId(tokenInfo.getMid()); + } else { + search2.setMemId(retailSearch.getMemId()); + } + List> rateInfo = rateService.getMemRollingInfo(search2); + apiResponse.put("rateInfo", rateInfo); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + + /* + * [현황] 관련 API 기능 + */ + @ResponseBody + @PostMapping(value={"/summary"}) + public ApiResponse summary(@RequestHeader String token, HttpServletRequest request, @RequestBody RetailSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(tokenInfo.getMid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + HashMap summary = retailService.getMySummary(search); + HashMap summaryNew = retailService.getMySummaryNew(search); + apiResponse.put("summary", summary); + apiResponse.put("summaryNew", summaryNew); + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value={"/myinfo"}) + public ApiResponse myinfo(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody RetailSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(tokenInfo.getMid()); + search.setRetailType("ME"); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + HashMap mycashinfo = retailService.getMyCashInfo(search); + apiResponse.put("mycashinfo", mycashinfo); + + List myBetPointinfo = retailService.getMyBetPointInfo(search); + apiResponse.put("myBetPointinfo", myBetPointinfo); + + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/botCashInfo"}) + public ApiResponse botCashInfo(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + RetailSearch search = new RetailSearch(); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(tokenInfo.getMid()); + + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + HashMap botCashInfo = retailService.getBotCashInfo(search); + apiResponse.put("botCashInfo", botCashInfo); + + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + + /* + * [파트너정산내역] API 기능 + */ + /* + @ResponseBody + @PostMapping(value={"/myCalculate"}) + public ApiResponse myCalculate(@RequestHeader String token, HttpServletRequest request, @RequestBody DailyReportSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + List> reportCateInfo = reportService.getReportCateInfo(search.getSiteId()); + apiResponse.put("reportCateInfo", reportCateInfo); + + if(search.getSearchType().equals("OUTER")) { + search.setSearchMemId(tokenInfo.getMid()); + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List list = reportService.getReportsListForPartner(search); + DayilPeriodicReports total = reportService.getReportsTotalForPartner(search); + apiResponse.put("search", search); + apiResponse.put("outSearchList", list); + apiResponse.put("outSearchTotal", total); + } else { + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List list = reportService.getReportsListForPartner(search); + search.setSearchType("OUTER"); + List total = reportService.getReportsListForPartner(search); + DayilPeriodicReports inSearchTotal = total.get(0); + apiResponse.put("search", search); + apiResponse.put("inSearchList", list); + apiResponse.put("inSearchTotal", inSearchTotal); + } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + */ + + + /* + * [유저정산내역] API 기능 + */ + /* + @ResponseBody + @PostMapping(value={"/reportByUser"}) + public ApiResponse reportByUser(@RequestHeader String token, HttpServletRequest request, @RequestBody DailyReportSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(tokenInfo.getMid()); + if(search.getSearchMemId() == null) { + search.setSearchMemId(""); + } + if(search.getSearchRecommandId() == null) { + search.setSearchRecommandId(""); + } + + if(search.getOrderStr() == null) { + search.setOrderStr(""); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List> reportCateInfo = reportService.getReportCateInfo(search.getSiteId()); + apiResponse.put("reportCateInfo", reportCateInfo); + + PageFormVO pageVo = new PageFormVO(); + if(search.getPage() == 0) search.setPage(1); + + int totalCount = reportService.getReportsByUserListCntForPartner(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + if(search.getCount_per_page() == 0) { + commonForm.setCount_per_page(10); + } else { + commonForm.setCount_per_page(search.getCount_per_page()); + } + if(search.getCount_per_list() == 0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + DayilPeriodicReports total = reportService.getReportsByUserTotalForPartner(search); + apiResponse.put("searchTotal", total); + + List list = reportService.getReportsByUserListForPartner(search); + apiResponse.put("searchList", list); + + apiResponse.success(); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + */ + + + /* + * [요율조정] 관련 API 기능 + */ + @ResponseBody + @PostMapping(value="/botMemRate") + public ApiResponse botMemRate(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + MemberSearch search = new MemberSearch(); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(tokenInfo.getMid()); + + List myCategoryRateList = retailService.getMyCategoryRateList(search); + BotMemRateVo myCategoryRate = new BotMemRateVo(); + for(CategoryRateVo item : myCategoryRateList) { + myCategoryRate.setSiteId(item.getSiteId()); + myCategoryRate.setMemId(item.getMemId()); + myCategoryRate.setMemNick(item.getMemNick()); + if(item.getCategory().equals("CASINO")) { + myCategoryRate.setCasinoPR(item.getPointRate()); + myCategoryRate.setCasinoLR(item.getLoseRate()); + } + if(item.getCategory().equals("HC-CASINO")) { + myCategoryRate.setHcasinoPR(item.getPointRate()); + myCategoryRate.setHcasinoLR(item.getLoseRate()); + } + if(item.getCategory().equals("SLOT")) { + myCategoryRate.setSlotPR(item.getPointRate()); + myCategoryRate.setSlotLR(item.getLoseRate()); + } + if(item.getCategory().equals("MINI-GAME")) { + myCategoryRate.setMiniPR(item.getPointRate()); + myCategoryRate.setMiniLR(item.getLoseRate()); + } + if(item.getCategory().equals("SPORTS")) { + myCategoryRate.setSportPR(item.getPointRate()); + myCategoryRate.setSportLR(item.getLoseRate()); + } + } + + log.info(myCategoryRate.toString()); + + List botCategoryRateList = new ArrayList<>(); + List list = retailService.getBotCategoryRateList(myCategoryRateList, search); + BotMemRateVo botRate = new BotMemRateVo(); + CategoryRateVo temp = null; + CategoryRateVo tempNext = null; + for(int i=0; i> myRateInfo = rateService.getMemRollingInfo(param); + for(HashMap rateItem : myRateInfo) { + MultipleRateInfo multipleRateInfo = null; + if(rateItem.get("detailSetYn").toString().equals("Y")) { + // 요율 세부설정 값 + multipleRateInfo = new MultipleRateInfo(); + multipleRateInfo.setSiteId(rateItem.get("siteId").toString()); + multipleRateInfo.setMemId(rateItem.get("memId").toString()); + multipleRateInfo.setVendorCode(rateItem.get("cateCode").toString()); + List multipleRate = userService.getMultipleRateList(multipleRateInfo); + multipleRateInfo.setRateList(multipleRate); + rateItem.put("multipleRateInfo", multipleRateInfo); + } else { + rateItem.put("multipleRateInfo", multipleRateInfo); + } + } + apiResponse.put("myRateInfo", myRateInfo); + + List> botttomRateList = retailService.getBottomRateList(param); + apiResponse.put("botttomRateList", botttomRateList); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/newUpdateRate") + public ApiResponse newUpdateRate(HttpServletRequest request, @RequestHeader String token, @RequestBody RateInfo rateInfo) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + String LOG_PREFIX = "#-user::newUpdateRate::"; + + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + if(rateInfo.getSiteId() == null || rateInfo.getSiteId().equals("")) { + rateInfo.setSiteId(tokenInfo.getSid()); + } + if(rateInfo.getMemId() == null || rateInfo.getMemId().equals("")) { + throw new ApiException("MR01", "Not null memId"); + } + + Member search = new Member(); + search.setSiteId(rateInfo.getSiteId()); + search.setMemId(rateInfo.getMemId()); + LOG_PREFIX = LOG_PREFIX+rateInfo.getSiteId()+"::"+rateInfo.getMemId()+"::::"; + log.info(LOG_PREFIX+ "RateInfo::"+rateInfo); + + List> myRollingInfoList = rateService.getMemRollingInfo(search); + for(RateVO mvo : rateInfo.getRateList()) { + mvo.setSiteId(rateInfo.getSiteId()); + mvo.setMemId(rateInfo.getMemId()); + String category = mvo.getCategory(); + String cateCode = mvo.getCateCode(); + Double pointRate = Double.valueOf(mvo.getPointRate()); + Double loseRate = Double.valueOf(mvo.getLoseRate()); + + for(HashMap myRollingInfo : myRollingInfoList) { + String myCategory = myRollingInfo.get("category").toString(); + String myCateCode = myRollingInfo.get("cateCode").toString(); + Double maxPointRate = Double.valueOf(myRollingInfo.get("maxPointRate").toString()); + Double minPointRate = Double.valueOf(myRollingInfo.get("minPointRate").toString()); + Double maxLoseRate = Double.valueOf(myRollingInfo.get("maxLoseRate").toString()); + Double minLoseRate = Double.valueOf(myRollingInfo.get("minLoseRate").toString()); + if(cateCode.equals(myCateCode)) { + if(maxPointRate < pointRate || minPointRate > pointRate) { + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::pointRate::"+pointRate); + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::MaxPointRate::"+maxPointRate+"::MinPointRate::"+minPointRate); + String resultMsg = "롤링:"+"cateCode::"+cateCode+ "::"+maxPointRate+", "+minPointRate+" 사이값을 입력하세요"; + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + + if(maxLoseRate < loseRate || minLoseRate > loseRate) { + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::loseRate::"+loseRate); + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::MaxLoseRate::"+maxLoseRate+"::MinLoseRate::"+minLoseRate); + String resultMsg = "루징:"+"cateCode::"+cateCode+ "::"+maxLoseRate+", "+minLoseRate+" 사이값을 입력하세요"; + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + } + } + } + + rateService.rateInfoUpdate(rateInfo); + + try { + Map logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", rateInfo.getMemId()); + logParam.put("logType", "RATE"); + logParam.put("logoutYn", ""); + logParam.put("logName", "ApiRetailController.newUpdateRate() => RateService.rateInfoUpdate()"); + logParam.put("logDesc", rateInfo.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", ""); + logParam.put("token", ""); + commonService.insertlog(logParam); + } catch(Exception e){ + log.error(LOG_PREFIX+ "insertlog::Exception::"+e.toString()); + } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(LOG_PREFIX+ "ApiException::"+e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(LOG_PREFIX+ "Exception::"+e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/multipleRateInfo") + public ApiResponse multipleRateInfo(@RequestHeader String token, HttpServletRequest request, @RequestBody MultipleRateInfo param) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + param.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + param); + + List multipleRateList = userService.getMultipleRateList(param); + param.setRateList(multipleRateList); + + apiResponse.put("multipleRateInfo", param); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/updateMultipleRate") + public ApiResponse updateMultipleRate(@RequestHeader String token, HttpServletRequest request, @RequestBody MultipleRateInfo param) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + param.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + param); + + List afterRateList = param.getRateList(); + List beforeRateList = userService.getMultipleRateList(param); + + for(MultipleRate afterRate : afterRateList) { + for(MultipleRate beforeRate : beforeRateList) { + if(afterRate.getRateType().equals(beforeRate.getRateType())) { + if(beforeRate.getMaxPointRate() < afterRate.getPointRate() || beforeRate.getMinPointRate() > afterRate.getPointRate()) { + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::rateType::"+afterRate.getRateType()+"::pointRate::"+afterRate.getPointRate()); + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::rateType::"+afterRate.getRateType()+"::MaxPointRate::"+beforeRate.getMaxPointRate()+"::MinPointRate::"+beforeRate.getMinPointRate()); + String resultMsg = "["+afterRate.getRateType()+"] 롤링:"+beforeRate.getMaxPointRate()+", "+beforeRate.getMinPointRate()+" 사이값을 입력하세요"; + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::resultMsg : " + resultMsg); + throw new ApiException("U032", resultMsg); + } + + if(beforeRate.getMaxLoseRate() < afterRate.getLoseRate() || beforeRate.getMinLoseRate() > afterRate.getLoseRate()) { + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::rateType::"+afterRate.getRateType()+"::loseRate::"+afterRate.getLoseRate()); + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::rateType::"+afterRate.getRateType()+"::MaxLoseRate::"+beforeRate.getMaxLoseRate()+"::MinLoseRate::"+beforeRate.getMinLoseRate()); + String resultMsg = "["+afterRate.getRateType()+"] 루징:"+beforeRate.getMaxPointRate()+", "+beforeRate.getMinPointRate()+" 사이값을 입력하세요"; + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::resultMsg : " + resultMsg); + throw new ApiException("U032", resultMsg); + } + } + } + } + + userService.updateMultipleRate(param); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [입/출금내역] API 기능 + */ + @ResponseBody + @PostMapping(value={"/bottomCashList"}) + public ApiResponse bottomCashList(@RequestHeader String token, HttpServletRequest request, @RequestBody RetailCashSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + if(search.getMemId() == null || search.getMemId().equals("")) { + search.setMemId(tokenInfo.getMid()); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = cashService.getBottomCashListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + List cashList = cashService.getBottomCashList(search); + apiResponse.put("list", cashList); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/bottomCashList2"}) + public ApiResponse bottomCashList2(@RequestHeader String token, HttpServletRequest request, @RequestBody RetailCashSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + if(search.getMemId() == null || search.getMemId().equals("")) { + search.setMemId(tokenInfo.getMid()); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = cashService.getBottomCashListCnt2(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + List cashList = cashService.getBottomCashList2(search); + apiResponse.put("list", cashList); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [배팅내역] API 기능 + * + */ + @ResponseBody + @PostMapping(value={"/bottomBetList"}) + public ApiResponse bottomBetList(@RequestHeader String token, HttpServletRequest request, @RequestBody RetailBetSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + search.setBlankSpinSetType(siteOption.getBlankSpinSetType()); + + if(search.getMemId() != null && !search.getMemId().equals("")) { + search.setSearchMemId(search.getMemId()); + } + search.setMemId(tokenInfo.getMid()); + + if(search.getOrderColumn() == null || search.getOrderColumn().equals("")) { + search.setOrderColumn("betIdx"); + } + + if(search.getOrderType() == null || search.getOrderType().equals("")) { + search.setOrderType("DESC"); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = betService.getBottomBetListCnt(search); // Use blankSpinSetType + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + List betList = betService.getBottomBetList(search); // Use blankSpinSetType + apiResponse.put("list", betList); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + + @ResponseBody + @PostMapping(value="/sport/bottomBetList") + public ApiResponse sportBottomBetlist( @RequestHeader String token, HttpServletRequest request, @RequestBody BetSplusSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + search.setRecommenderId(tokenInfo.getMid()); + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = betService.getSportBottomBetListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + List betList = betService.getSportBottomBetList(search); + apiResponse.put("list", betList); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [하부파트너목록] API 기능 + */ + @ResponseBody + @PostMapping(value={"/myPartnerList"}) + public ApiResponse myPartnerList(@RequestHeader String token, HttpServletRequest request, @RequestBody RetailSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(tokenInfo.getMid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = retailService.getMyPartnerListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + List list = retailService.getMyPartnerList(search); + apiResponse.put("list", list); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [하부파트너목록] API 기능 + */ + @ResponseBody + @PostMapping(value={"/myPartnerList2"}) + public ApiResponse myPartnerList2(@RequestHeader String token, HttpServletRequest request, @RequestBody RetailSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + search.setRecommenderId(tokenInfo.getMid()); + + if(search.getSearchType() == null || search.getSearchType().equals("")) { + search.setSearchType("OUTER"); + } + + if(search.getSearchType().equals("INNER")) { + if(search.getMemId() == null || search.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List list = retailService.getMyPartnerList2(search); + apiResponse.put("list", list); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + + /* + * [직하부파트너목록] API 기능 + */ + @ResponseBody + @PostMapping(value={"/myPartnerDirectList"}) + public ApiResponse myPartnerDirectList(@RequestHeader String token, HttpServletRequest request, @RequestBody RetailSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List list = retailService.getMyPartnerDirectList(search); + apiResponse.put("list", list); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + /* + * [내소속회원목록] API 기능 + */ + @ResponseBody + @PostMapping(value={"/myMemDirectList"}) + public ApiResponse myMemDirectList(@RequestHeader String token, HttpServletRequest request, @RequestBody RetailSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = retailService.getMyMemListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + List list = retailService.getMyMemList(search); + apiResponse.put("list", list); + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + + /* + * [소속회원목록] API 기능 + */ + @ResponseBody + @PostMapping(value={"/myMemList"}) + public ApiResponse myMemList(@RequestHeader String token, HttpServletRequest request, @RequestBody RetailSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(tokenInfo.getMid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = retailService.getMyMemListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + List list = retailService.getMyMemList(search); + apiResponse.put("list", list); + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/loginList"}) + public ApiResponse loginList(@RequestHeader String token, HttpServletRequest request, @RequestBody MemberListSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + search.setPartnerType(""); + search.setSiteId(tokenInfo.getSid()); + search.setRecommenderId(tokenInfo.getMid()); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + long nDate = System.currentTimeMillis(); + String nDateStr = sdf.format(nDate); + if(search.getStartDate() == null || search.getStartDate().equals("")) { + search.setStartDate(nDateStr); + } + if(search.getEndDate() == null || search.getEndDate().equals("")) { + search.setEndDate(nDateStr); + } + + /* + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + int totalCount = retailService.getMyLoginMemListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + */ + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List memList = retailService.getMyLoginMemList(search); + apiResponse.put("list", memList); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/rateInfoList"}) + public ApiResponse rateInfoList(@RequestHeader String token, HttpServletRequest request, @RequestBody RetailSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List rateInfoList = retailService.getListRateInfo(search); + apiResponse.put("rateInfoList", rateInfoList); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + + /* + * [회원머니지급/회수] 관련 API 기능 + */ + + @ResponseBody + @PostMapping(value={"/partnerLevels"}) + public ApiResponse partnerLevels(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + Member search = new Member(); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(tokenInfo.getMid()); + search.setPartnerLevel(tokenInfo.getPartnerLevel()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List partnerLevels = retailService.getMyUnderPartnerLevels(search); + + apiResponse.put("list", partnerLevels); + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value={"/myMemIds"}) + public ApiResponse myMemIds(@RequestHeader String token, HttpServletRequest request, @RequestBody CodeSearch codesSearch) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + Member search = new Member(); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(tokenInfo.getMid()); + search.setPartnerLevel(codesSearch.getCode()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + codesSearch); + List memIdList = retailService.myMemIds(search); + apiResponse.put("memIds", memIdList); + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value="/cashSendlist") + public ApiResponse cashSendlist(@RequestHeader String token, HttpServletRequest request, @RequestBody CashSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + if(search.getTopMemId() == null || search.getTopMemId().equals("")) { + search.setTopMemId(tokenInfo.getMid()); + } + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + if("in".equals(search.getCashType())) { + search.setCashType("-3"); + } + + if("out".equals(search.getCashType())) { + search.setCashType("3"); + } + + int totalCount = cashService.getCashSendListCnt(search); + + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List> cashList = cashService.getCashSendList(search); + apiResponse.put("list", cashList); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value={"/myLoginMem"}) + public ApiResponse myLoginMem(@RequestHeader String token, HttpServletRequest request) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + // Site site = getSiteByCheck(request); + + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + RetailSearch search = new RetailSearch(); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(tokenInfo.getMid()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List loginMemList = retailService.getMyLoginMem(search); + apiResponse.put("loginMemList", loginMemList); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [포인트 내역] 관련 API 기능 + */ + @ResponseBody + @PostMapping(value={"/pointList"}) + public ApiResponse myPointList(HttpServletRequest request, @RequestHeader String token, @RequestBody RetailPointSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + if(search.getMemId() == null || search.getMemId().equals("")) { + search.setMemId(tokenInfo.getMid()); + } + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + HashMap searchMap = new HashMap<>(); + searchMap.put("siteId", tokenInfo.getSid()); + searchMap.put("myId", tokenInfo.getMid()); + searchMap.put("bottomId", search.getMemId()); + int chkCnt = userService.checkMyBottom(searchMap); + if(chkCnt == 0) { + throw new ApiException("RT01", "not my bottom user"); + } + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + int totalCount = retailService.getRetailPointListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + commonForm.setCount_per_list(10); + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + + apiResponse.put("pageInfo", pageVo); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List pointList = retailService.getRetailPointList(search); + apiResponse.put("list", pointList); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + + /* + * 사용 하지 않는 기능 + */ + @ResponseBody + @PostMapping(value={"/myMemBetPointinfo"}) + public ApiResponse myMemBetPointinfo(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody RetailSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(search.getMemId()); + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List betPointinfo = retailService.getMyBetPointInfo(search); + apiResponse.put("betPointinfo", betPointinfo); + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value="/rate") + public ApiResponse rate(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody RetailSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + Member memSearch = new Member(); + memSearch.setSiteId(tokenInfo.getSid()); + memSearch.setMemId(search.getMemId()); + + List memRate= userService.getMemberRate(memSearch); + apiResponse.put("rate", memRate); + + List> rateInfo = rateService.getMemRollingInfo(memSearch); + apiResponse.put("rateInfo", rateInfo); + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value={"/detailList"}) + public ApiResponse detailList(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody RetailSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + Site site = getSiteByCheck(request); + if(site==null) { + throw new ApiException("1000", "accessDinied"); + } + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(tokenInfo.getMid()); + + int totalCount = retailService.retailDetailListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + List list = retailService.retailDetailList(search); + apiResponse.put("list", list); + apiResponse.success(); + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + @ResponseBody + @PostMapping(value="/changeMemCashFlag") + public ApiResponse changeMemCashFlag(HttpServletRequest request, @RequestHeader String token, @RequestBody MemberSearch search) { + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + Member botUser = new Member(); + botUser.setSiteId(search.getSiteId()); + botUser.setMemId(search.getMemId()); + log.info("#-RETAIL::changeMemCashFlag::"+search.getSiteId()+"::"+search.getMemId()+"::"+"[REQUEST: "+request.getRequestURI()+"] " + search); + + MemberDetail botdetail = userService.getMember(botUser); + if(botdetail == null) { + throw new ApiException("U003", "unknown user"); + } + + if(!botdetail.getPartnerLevel().equals("NORMAL")) { + apiResponse.success(); + return apiResponse; + } + + /* + * 직하부가 아니여도 통합머니전환 및 보유금 지급/회수 가능하게 변경됨. + if(!botdetail.getRecommenderId().equals(tokenInfo.getMid())) { + throw new ApiException("C402", "보유금 회수가 불가능한 대상입니다. 아이디를 확인하세요."); +// throw new ApiException("C402", "보유금 회수가 불가능한 대상입니다. 아이디를 확인하세요."); + } + */ + + // Triple 이용 사이트 + HashMap param = new HashMap<>(); + param.put("siteIdx", tokenInfo.getSidx()); + param.put("memIdx", botdetail.getMemIdx()); + param.put("intervalTime", -20); + param.put("apiType", "triple"); + HashMap lastGameInfo = userService.getLastGameInfoNew(param); + if(lastGameInfo != null) { + // Playing Game + throw new ApiException("C009", "배팅내역 정산중입니다. 잠시(20초) 후 다시 시도해주세요."); + } else { + // Triple API + TripleAuthInfo tripleMember = userService.getTripleAuthInfo(botUser); + if(tripleMember != null && tripleMember.getPartnerLevel().equals("NORMAL")) { + HashMap tripleParam = new HashMap<>(); + tripleParam.put("siteId", tokenInfo.getSid()); + tripleParam.put("apiVendorCode", "triple"); + ApiVendorCompInfo vendor = userService.getApiVendorCompInfo(tripleParam); + JSONObject result = tripleService.withdrawBalance(vendor, "all", tripleMember); + if(result.getString("resultCode").equals("0")) { + log.info("#-RETAIL::changeMemCashFlag::"+search.getSiteId()+"::"+search.getMemId()+"::"+"Triple 하위 유저 잔액 전액 환전"); + } else { + log.error("#-RETAIL::changeMemCashFlag::"+search.getSiteId()+"::"+search.getMemId()+"::"+"Triple 하위 유저 잔액 전액 환전 실패"); + throw new ApiException("T999", "Triple 유저 잔액 전액 환전 실패"); + } + } else { + throw new ApiException("C402", "보유금 회수가 불가능한 대상입니다. 아이디를 확인하세요."); + } + } + + HashMap lockParam = new HashMap<>(); + lockParam.put("siteId", search.getSiteId()); + lockParam.put("memId", search.getMemId()); + lockParam.put("symLock", "Y"); + int resultLock = userService.userChangeSymLock(lockParam); + log.info("#-RETAIL::changeMemCashFlag::"+search.getSiteId()+"::"+search.getMemId()+"::"+"userChangeSymLock(Y) Result="+resultLock); + + HashMap flagParam = new HashMap<>(); + flagParam.put("siteId", search.getSiteId()); + flagParam.put("memId", search.getMemId()); + flagParam.put("changeFlag", "Y"); + int result = userService.userChangeFlag(flagParam); + log.info("#-RETAIL::changeMemCashFlag::"+search.getSiteId()+"::"+search.getMemId()+"::"+"userChangeFlag(Y) result="+result); + + try { + Map logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "update"); + logParam.put("logoutYn", ""); + logParam.put("logName", "ApiRetailController.changeMemCashFlag() => UserService.userChangeFlag("+search.getMemId()+")"); + logParam.put("logDesc", flagParam.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertlog(logParam); + } catch(Exception e) {System.out.print(e.toString());} + + apiResponse.success(); + + } catch (ResourceAccessException rae) { + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error("[ConnectTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("ConnectTimeoutException"); + } + + if(rae.getCause() instanceof SocketTimeoutException) { + log.error("[SocketTimeoutException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("SocketTimeoutException"); + } + + if(rae.getCause() instanceof InterruptedException) { + log.error("[InterruptedException]"+rae.getMessage()); + apiResponse.setResultCode("TE99"); + apiResponse.setResultMessage("InterruptedException"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + HashMap lockParam = new HashMap<>(); + lockParam.put("siteId", search.getSiteId()); + lockParam.put("memId", search.getMemId()); + lockParam.put("symLock", "Y"); + int resultLock = userService.userChangeSymLock(lockParam); + log.error("#-RETAIL::changeMemCashFlag::"+search.getSiteId()+"::"+search.getMemId()+"::"+"userChangeSymLock(Y) Result="+resultLock); + + HashMap flagParam = new HashMap<>(); + flagParam.put("siteId", search.getSiteId()); + flagParam.put("memId", search.getMemId()); + flagParam.put("changeFlag", "Y"); + int result = userService.userChangeFlag(flagParam); + log.error("#-RETAIL::changeMemCashFlag::"+search.getSiteId()+"::"+search.getMemId()+"::"+"userChangeFlag(Y) result="+result); + + try { + Map logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "update"); + logParam.put("logoutYn", ""); + logParam.put("logName", "ApiRetailController.changeMemCashFlag() => UserService.userChangeFlag("+search.getMemId()+")"); + logParam.put("logDesc", flagParam.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertlog(logParam); + } catch(Exception e) {System.out.print(e.toString());} + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + private Site getSiteByCheck(HttpServletRequest request) { + Site site = userService.getSiteInfoByKey(request.getHeader("Authorization").toString()); + return site; + } +} diff --git a/src/main/java/com/bb/front/TestController.java b/src/main/java/com/bb/front/TestController.java new file mode 100644 index 0000000..db49302 --- /dev/null +++ b/src/main/java/com/bb/front/TestController.java @@ -0,0 +1,170 @@ +package com.bb.front; + +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; + +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; + +import org.apache.commons.io.IOUtils; +import org.apache.http.conn.ConnectTimeoutException; +import org.codehaus.jettison.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CrossOrigin; +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.RequestParam; +import org.springframework.web.client.ResourceAccessException; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +import com.bb.model.TestDto; +import com.bb.service.UserService; +import com.bb.util.IPKit; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Controller +public class TestController { + + @Autowired + private UserService userService; + + @Autowired + RestTemplate restTemplate; + + @CrossOrigin + @PostMapping("/test") + public TestDto hello(HttpServletRequest request, @RequestBody TestDto dto) throws IOException { + ServletInputStream inputStream = request.getInputStream(); + byte[] bytes = IOUtils.toByteArray(inputStream); + String s = new String(bytes, StandardCharsets.UTF_8); + log.info("s = " + s); + log.info("dto = " + dto); + + return dto; + } + + + @GetMapping("/test/evo") + public String evoRedirect(HttpServletRequest request, @RequestParam String type) { + final String LOG_PREFIX = "#-evoRedirect::type::"+type+":::"; + + final String SITE_ID = "peanuts"; + final String MEM_ID = "mpt01"; + final String SECRET_KEY = "peanuts9mGIpbi211k"; + final String API_URL = "https://oprvendor.com/api"; + final String TRIPLE_USERNAME = "007"+MEM_ID; + + String lauchURL = ""; + String userIp = IPKit.getIpAddressByRequest(request); + if(userIp.equals("0:0:0:0:0:0:0:1")) { + userIp = "211.114.32.97"; + } + + String vendorKey = ""; + if(type.equals("1")) { + vendorKey = "C01"; + } else { + vendorKey = "C01"; + } + + try { + HttpHeaders header = new HttpHeaders(); + header.setContentType(MediaType.APPLICATION_JSON); + header.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + header.set("User-Agent", "PostmanRuntime/7.28.4"); + header.set("Authorization", SECRET_KEY); + header.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8"))); + + UriComponentsBuilder authBuilder = UriComponentsBuilder.fromHttpUrl(API_URL + "/auth"); + HashMap authParams = new HashMap(); + authParams.put("userId", TRIPLE_USERNAME); + authParams.put("nickName", TRIPLE_USERNAME); + authParams.put("balance", "0"); + HttpEntity> authEntity = new HttpEntity<>(authParams, header); + log.info(LOG_PREFIX+ "/auth"+"::Request::" + authParams.toString()); + ResponseEntity authUser = restTemplate.postForEntity(authBuilder.toUriString(), authEntity, String.class); + log.info(LOG_PREFIX+ "/auth"+"::Response::" + authUser.getBody()); + + JSONObject userJson = new JSONObject(authUser.getBody()); + String authResultCode = userJson.getString("resultCode"); + + if("0".equals(authResultCode)) { + JSONObject authData = new JSONObject(userJson.getString("data")); + String tripleToken = authData.getString("token"); + + // 헤더에 토큰 세팅 + header.set("token", tripleToken); + UriComponentsBuilder playBuilder = UriComponentsBuilder.fromHttpUrl(API_URL + "/play"); + HashMap playParams = new HashMap(); + playParams.put("userId", TRIPLE_USERNAME); + playParams.put("vendorKey", vendorKey); + playParams.put("gameKey", ""); + playParams.put("balance", "0"); + playParams.put("userIp", userIp); + playParams.put("isMobile", "N"); + playParams.put("language", "KR"); + playParams.put("decYn", ""); + playParams.put("currency", "KRW"); + playParams.put("requestAT", Long.toString(System.currentTimeMillis())); + HttpEntity> playEntity = new HttpEntity<>(playParams, header); + log.info(LOG_PREFIX+ "/play"+"::Request::" + playParams.toString()); + ResponseEntity playUser = restTemplate.postForEntity(playBuilder.toUriString(), playEntity, String.class); + log.info(LOG_PREFIX+ "/play"+"::Response::" + playUser.getBody()); + + JSONObject playJson = new JSONObject(playUser.getBody()); + String playResultCode = playJson.getString("resultCode"); + + if("0".equals(playResultCode)) { + JSONObject playData = new JSONObject(playJson.getString("data")); + + HashMap lockParam = new HashMap<>(); + lockParam.put("siteId", SITE_ID); + lockParam.put("memId", MEM_ID); + lockParam.put("symLock", "N"); + int result = userService.userChangeSymLock(lockParam); + log.info(LOG_PREFIX+ "userChangeSymLock(N) Result=" + result); + + lauchURL = playData.getString("gameurl"); + log.info(LOG_PREFIX+ "lauchURL::" + lauchURL); + } + } + + } catch (ResourceAccessException rae) { + log.error("#-getGame::ResourceAccessException::"+ "[ResourceAccessException]"+rae.toString()); + + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error(LOG_PREFIX+ "[ConnectTimeoutException]"+rae.getMessage()); + } + + if(rae.getCause() instanceof SocketTimeoutException) { + log.error(LOG_PREFIX+ "[SocketTimeoutException]"+rae.getMessage()); + } + + if(rae.getCause() instanceof InterruptedException) { + log.error(LOG_PREFIX+ "[InterruptedException]"+rae.getMessage()); + } + } catch (Exception e) { + log.error(LOG_PREFIX+ "[Exception]"+e.toString()); + e.printStackTrace(); + } + + return "redirect:"+lauchURL; + } + + + +} diff --git a/src/main/java/com/bb/front/v2/ApiV2MainController.java b/src/main/java/com/bb/front/v2/ApiV2MainController.java new file mode 100644 index 0000000..a18a802 --- /dev/null +++ b/src/main/java/com/bb/front/v2/ApiV2MainController.java @@ -0,0 +1,389 @@ +package com.bb.front.v2; + +import java.util.HashMap; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.ApiResponse; +import com.bb.model.BoardListSearch; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; +import com.bb.service.BoardService; +import com.bb.service.CommonService; +import com.bb.service.MainService; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@Slf4j +@RequestMapping("/api/v2/main") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class ApiV2MainController { + + private final MainService mainService; + + private final BoardService boardService; + + private final CommonService commonService; + + private final JwtManager jwtManager; + + + /* + * 메인 및 모든화면 상단 정보 (회원수, 보유머니, 보유포인트, 슬롯롤링%, 카지노롤링%) + */ + @ResponseBody + @PostMapping(value="/topInfo") + public ApiResponse topInfo(HttpServletRequest request, @RequestHeader String token) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::topInfo::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + HashMap param = new HashMap<>(); + param.put("siteId", tokenInfo.getSid()); + param.put("memId", tokenInfo.getMid()); + + HashMap mainTopInfo = mainService.getMainTopInfo(param); + if(mainTopInfo == null) { + mainTopInfo = new HashMap<>(); + mainTopInfo.put("siteId", tokenInfo.getSid()); + mainTopInfo.put("memId", tokenInfo.getMid()); + mainTopInfo.put("userCnt", "0"); + mainTopInfo.put("totalCashAmt", "0"); + mainTopInfo.put("totalPointAmt", "0"); + mainTopInfo.put("casinoRate", "0"); + mainTopInfo.put("slotRate", "0"); + } + + apiResponse.put("mainTopInfo", mainTopInfo); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::topInfo::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::topInfo::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * 메인 통계 정보1 (충전, 환전, 보유금지급, 보유금회수, 금일신규회원, 금일배팅손익) + */ + @ResponseBody + @PostMapping(value="/statistics") + public ApiResponse mainStatistics(HttpServletRequest request, @RequestHeader String token) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::mainStatistics::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + + HashMap param = new HashMap<>(); + param.put("siteId", tokenInfo.getSid()); + param.put("memId", tokenInfo.getMid()); + param.put("blankSpinSetType", siteOption.getBlankSpinSetType()); + + HashMap mainStatisticsInfo = mainService.getMainStatistics(param); // Use blankSpinSetType + if(mainStatisticsInfo == null) { + mainStatisticsInfo = new HashMap<>(); + mainStatisticsInfo.put("siteId", tokenInfo.getSid()); + mainStatisticsInfo.put("memId", tokenInfo.getMid()); + mainStatisticsInfo.put("dCashIn", "0"); + mainStatisticsInfo.put("dCashInCnt", "0"); + mainStatisticsInfo.put("dCashOut", "0"); + mainStatisticsInfo.put("dCashOutCnt", "0"); + mainStatisticsInfo.put("dPayment", "0"); + mainStatisticsInfo.put("dPayback", "0"); + mainStatisticsInfo.put("dJoinCnt", "0"); + mainStatisticsInfo.put("dBetBEP", "0"); + } + + apiResponse.put("mainStatisticsInfo", mainStatisticsInfo); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::mainStatistics::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::mainStatistics::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * 머니입출금 개요 + */ + @ResponseBody + @PostMapping(value="/cashReport") + public ApiResponse cashReport(HttpServletRequest request, @RequestHeader String token, @RequestBody HashMap param) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::cashReport::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + + if(param == null || param.get("startDate") == null || param.get("endDate") == null) { + throw new ApiException("1000", "accessDinied"); + } + param.put("siteId", tokenInfo.getSid()); + param.put("memId", tokenInfo.getMid()); + param.put("blankSpinSetType", siteOption.getBlankSpinSetType()); + log.info(LOG_PREFIX+ "param : " + param.toString()); + + HashMap cashReport = mainService.getMainCashReport(param); // Use blankSpinSetType + if(cashReport == null) { + cashReport = new HashMap<>(); + cashReport.put("siteId", tokenInfo.getSid()); + cashReport.put("memId", tokenInfo.getMid()); + cashReport.put("cashIn", "0"); + cashReport.put("payment", "0"); + cashReport.put("inPaymentSum", "0"); + cashReport.put("cashOut", "0"); + cashReport.put("payback", "0"); + cashReport.put("outPaybackSum", "0"); + cashReport.put("normalCashAmt", "0"); + cashReport.put("partnerCashAmt", "0"); + cashReport.put("betAmt", "0"); + cashReport.put("winAmt", "0"); + cashReport.put("betBEP", "0"); + cashReport.put("totalPointAmt", "0"); + } + + apiResponse.put("cashReport", cashReport); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::cashReport::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::cashReport::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * 나의 자금 변동내역 + */ + @ResponseBody + @PostMapping(value="/myCashReport") + public ApiResponse myCashReport(HttpServletRequest request, @RequestHeader String token, @RequestBody HashMap param) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::myCashReport::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + if(param == null || param.get("startDate") == null || param.get("endDate") == null) { + throw new ApiException("1000", "accessDinied"); + } + param.put("siteId", tokenInfo.getSid()); + param.put("memId", tokenInfo.getMid()); + log.info(LOG_PREFIX+ "param : " + param.toString()); + + HashMap myCashReport = mainService.getMyCashReport(param); + if(myCashReport == null) { + myCashReport = new HashMap<>(); + myCashReport.put("siteId", tokenInfo.getSid()); + myCashReport.put("memId", tokenInfo.getMid()); + myCashReport.put("cashIn", "0"); + myCashReport.put("adminPayment", "0"); + myCashReport.put("upperPayment", "0"); + myCashReport.put("myPayback", "0"); + myCashReport.put("changePoint", "0"); + myCashReport.put("increaseTotal", "0"); + myCashReport.put("cashOut", "0"); + myCashReport.put("adminPayback", "0"); + myCashReport.put("upperPayback", "0"); + myCashReport.put("myPayment", "0"); + myCashReport.put("decreaseTotal", "0"); + } + + apiResponse.put("myCashReport", myCashReport); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::myCashReport::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::myCashReport::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * 메인 공지사항 + */ + @ResponseBody + @PostMapping(value={"notiList"}) + public ApiResponse notiList(HttpServletRequest request, @RequestHeader String token) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::notiList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + BoardListSearch search = new BoardListSearch(); + search.setSiteId(tokenInfo.getSid()); + List> boardList = boardService.getMainBoardList(search); + + apiResponse.put("boardList", boardList); + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::notiList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::notiList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * 최근 지급/회수 + */ + @ResponseBody + @PostMapping(value="/newPayLog") + public ApiResponse mainNewPayLog(HttpServletRequest request, @RequestHeader String token) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::mainNewPayLog::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + HashMap param = new HashMap<>(); + param.put("siteId", tokenInfo.getSid()); + param.put("memId", tokenInfo.getMid()); + log.info(LOG_PREFIX+ "param : " + param.toString()); + + HashMap mainNewPayLog = mainService.getMainNewPayLog(param); + apiResponse.put("mainNewPayLog", mainNewPayLog); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::mainNewPayLog::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::mainNewPayLog::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + +} diff --git a/src/main/java/com/bb/front/v2/ApiV2RetailController.java b/src/main/java/com/bb/front/v2/ApiV2RetailController.java new file mode 100644 index 0000000..2f50480 --- /dev/null +++ b/src/main/java/com/bb/front/v2/ApiV2RetailController.java @@ -0,0 +1,2521 @@ +package com.bb.front.v2; + +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.http.conn.ConnectTimeoutException; +import org.codehaus.jettison.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.ResourceAccessException; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.jwt.JwtManager.TokenInfo; +import com.bb.model.ApiResponse; +import com.bb.model.CashDetail; +import com.bb.model.CashIn; +import com.bb.model.CashOut; +import com.bb.model.CashTranLogSrch; +import com.bb.model.DailyReportSearch; +import com.bb.model.DayilPeriodicReports; +import com.bb.model.Member; +import com.bb.model.MemberDetail; +import com.bb.model.MemberInsert; +import com.bb.model.MultipleRate; +import com.bb.model.MultipleRateInfo; +import com.bb.model.PageFormVO; +import com.bb.model.RateInfo; +import com.bb.model.RateVO; +import com.bb.model.RetailLowerSearch; +import com.bb.model.RetailSearch; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; +import com.bb.model.UserDetailInfo; +import com.bb.model.UserListSearch; +import com.bb.model.UserSearch; +import com.bb.service.CashService; +import com.bb.service.CommonService; +import com.bb.service.RateService; +import com.bb.service.ReportService; +import com.bb.service.RetailService; +import com.bb.service.TripleService; +import com.bb.service.UserService; +import com.bb.util.IPKit; +import com.bb.util.PagingUtil; +import com.bb.util.StringUtils; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@Slf4j +@RequestMapping("/api/v2/retail") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class ApiV2RetailController { + + private final JwtManager jwtManager; + + private final RetailService retailService; + + private final UserService userService; + + private final CashService cashService; + + private final RateService rateService; + + private final ReportService reportService; + + private final CommonService commonService; + + private final TripleService tripleService; + + @Autowired + private PasswordEncoder passwordEncoder; + + + + /* + * [파트너목록 하이라키] API 기능 + */ + @ResponseBody + @PostMapping(value={"/hierarchy"}) + public ApiResponse partnerHierarchy(@RequestHeader String token, HttpServletRequest request, @RequestBody RetailSearch search) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::partnerHierarchy::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + search.setSiteId(tokenInfo.getSid()); + search.setRecommenderId(tokenInfo.getMid()); + + log.info(LOG_PREFIX+ "RetailSearch::"+search.toString()); + + if(search.getMemId() == null || search.getMemId().equals("")) { + search.setOrd(0); + } else { + search.setOrd(1); + } + + List hierarchy = retailService.getPartnerHierarchy2(search); + apiResponse.put("hierarchy", hierarchy); + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::partnerHierarchy::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::partnerHierarchy::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [파트너 정보 조회] API + */ + @ResponseBody + @PostMapping(value={"/partnerInfo"}) + public ApiResponse partnerInfo(@RequestHeader String token, HttpServletRequest request, @RequestBody RetailSearch search) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::partnerInfo::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + search.setSiteId(tokenInfo.getSid()); + + log.info(LOG_PREFIX+ "RetailSearch::"+search.toString()); + + if(search.getMemId() == null || search.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + if(search.getStartDate() == null || search.getStartDate().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + if(search.getEndDate() == null || search.getEndDate().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + search.setBlankSpinSetType(siteOption.getBlankSpinSetType()); + + HashMap partnerInfo = retailService.getPartnerInfo(search); + apiResponse.put("partnerInfo", partnerInfo); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::partnerInfo::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::partnerInfo::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [전화번호 변경] API + */ + @ResponseBody + @PostMapping(value={"/updMemPhone"}) + public ApiResponse updMemPhone(@RequestHeader String token, HttpServletRequest request, @RequestBody HashMap param) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::updMemPhone::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + if(param == null) { + throw new ApiException("1000", "accessDinied"); + } + + param.put("siteId", tokenInfo.getSid()); + log.info(LOG_PREFIX+ "param::"+param.toString()); + + if(param.get("memId") == null || param.get("memPhone") == null) { + throw new ApiException("1000", "accessDinied"); + } + + int result = userService.updMemPhone(param); + log.info(LOG_PREFIX+ "Update Phone Result::"+result); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::updMemPhone::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::updMemPhone::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [하부 파트너 생성] API + */ + @ResponseBody + @PostMapping(value="/createPartner") + public ApiResponse createPartner(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MemberInsert signupMember) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + String LOG_PREFIX = "#-v2::retail::createPartner::"; + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + + String partnerLevel = tokenInfo.getPartnerLevel(); + + signupMember.setSiteIdx(tokenInfo.getSidx()); + signupMember.setSiteId(tokenInfo.getSid()); + signupMember.setMemId(signupMember.getMemId().replaceAll(" ", "").replaceAll(" ", "").toLowerCase()); + LOG_PREFIX = LOG_PREFIX+ tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::createInfo::"+signupMember.getRecommenderId()+"::"+signupMember.getMemId()+"::::"; + log.info(LOG_PREFIX); + + String refer = request.getHeader("Referer"); + String domain = "unknown"; + if(refer != null) { + String[] urls = StringUtils.extractUrlParts(refer); + domain = urls[2]; + log.info(LOG_PREFIX+"::domain::"+domain+"::recommandId::"+signupMember.getRecommenderId()); + } + signupMember.setJoinDomain(domain); + + if(partnerLevel.equals("PTN_7")) { + throw new ApiException("U095", "파트너 등록 권한없음."); + } + + if(signupMember.getMemId() == null || signupMember.getMemId().equals("") || (signupMember.getMemId().length() < 3)) { + throw new ApiException("U101", "파트너 아이디는 영문+숫자 3자 이상입니다."); + } + + if(signupMember.getRecommenderId() == null || signupMember.getRecommenderId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + signupMember.setRegId(tokenInfo.getMid()); + signupMember.setPartnerType(""); + signupMember.setMemStatus("0"); + + String password = passwordEncoder.encode(signupMember.getMemPass()); + log.info(LOG_PREFIX+ "[MEMBER PWD:" + password + "]"); + signupMember.setMemPass(password); + + log.info(LOG_PREFIX+ "[RECOMMEND USER ID:" + signupMember.getRecommenderId() + "]"); + String myPartnerLevel = userService.getPartnerLevelByRecId(signupMember); + if(myPartnerLevel.equals("COMP") || myPartnerLevel.equals("AUTO") || myPartnerLevel.equals("NORMAL")) { + throw new ApiException("U099", "추천인으로 사용할 수 없는 계정입니다."); + } + signupMember.setPartnerLevel(myPartnerLevel); + log.info(LOG_PREFIX+ "[PARTNER LEVEL:" + signupMember.getPartnerLevel() + "]"); + + signupMember.setLoginYn("Y"); + signupMember.setMemLockYn("N"); + signupMember.setRecommendYn("Y"); + + signupMember.setBetYn("N"); + signupMember.setPointExchangeYn("Y"); + signupMember.setRollingYn("Y"); + + signupMember.setMemLevel("1"); + signupMember.setCasinoLevel("1"); + signupMember.setSlotLevel("1"); + signupMember.setMgLevel("1"); + signupMember.setSportsLevel("1"); + signupMember.setNationCode(""); + signupMember.setPartSendYn("N"); + signupMember.setMaxCredit(""); + signupMember.setCreditRate(""); + signupMember.setCreditStatus(""); + signupMember.setMemBlackYn("N"); + + signupMember.setCashSendYn("Y"); + signupMember.setCashReceiveYn("Y"); + + Member recommendUser = new Member(); + recommendUser.setSiteId(tokenInfo.getSid()); + recommendUser.setMemId(signupMember.getRecommenderId()); + MemberDetail upPartner = userService.getMember(recommendUser); + + if(upPartner == null) { + throw new ApiException("U096", "존재하지 않는 추천인 계정입니다."); + } + + if(upPartner.getPartnerLevel().equals("COMP") || upPartner.getPartnerLevel().equals("NORMAL") || upPartner.getPartnerLevel().equals("PTN_7")) { + throw new ApiException("U095", "파트너 등록 권한없음."); + } + + if(upPartner.getRecommendYn().equals("N")) { + throw new ApiException("U095", "파트너 등록 권한없음."); + } + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + if(!"Y".equals(siteOption.getSignupYn())) { + throw new ApiException("U115", "회원가입을 받지 않고 있습니다."); + } + + Member checkMember = new Member(); + checkMember.setSiteId(signupMember.getSiteId()); + checkMember.setMemId(signupMember.getMemId()); + checkMember.setRecommenderId(signupMember.getRecommenderId()); + checkMember.setMemName(signupMember.getMemName()); + checkMember.setMemNick(signupMember.getMemNick()); + + int idCheck = userService.idCheck(checkMember); + if(idCheck > 0) { + throw new ApiException("U005", "idCheck"); + } + + int nameCheck =userService.nameCheck(checkMember); + if(nameCheck > 0) { + throw new ApiException("U006", "nameCheck"); + } + + if(signupMember.getSiteId().equals(signupMember.getRecommenderId())) { + throw new ApiException("U099", "recommenderIdCheck"); + } + + ObjectMapper objectMapper = new ObjectMapper(); + String signupMemberJson = objectMapper.writeValueAsString(signupMember); + log.info(LOG_PREFIX+ "signupMemberJson::" + signupMember); + + RateInfo rateInfo = signupMember.getRateInfo(); + if(rateInfo != null) { + rateInfo.setSiteId(signupMember.getSiteId()); + rateInfo.setMemId(signupMember.getMemId()); + + Member top = new Member(); + top.setSiteId(tokenInfo.getSid()); + top.setMemId(signupMember.getRecommenderId()); + List> topRateInfoList = rateService.getMemRollingInfo(top); + + for(RateVO mvo : rateInfo.getRateList()) { + mvo.setSiteId(rateInfo.getSiteId()); + mvo.setMemId(rateInfo.getMemId()); + String category = mvo.getCategory(); + String cateCode = mvo.getCateCode(); + Double pointRate = Double.valueOf(mvo.getPointRate()); + Double loseRate = Double.valueOf(mvo.getLoseRate()); + + for(HashMap topRateInfo : topRateInfoList) { + String topCategory = topRateInfo.get("category").toString(); + String topCateCode = topRateInfo.get("cateCode").toString(); + Double maxPointRate = Double.valueOf(topRateInfo.get("pointRate").toString()); + Double maxLoseRate = Double.valueOf(topRateInfo.get("loseRate").toString()); + if(upPartner.getPartnerLevel().equals("AUTO")) { + maxPointRate = 50.0; + maxLoseRate = 50.0; + } + if(cateCode.equals(topCateCode)) { + if(maxPointRate < pointRate) { + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::pointRate::"+pointRate); + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::MaxPointRate::"+maxPointRate); + String resultMsg = "롤링:"+"cateCode::"+cateCode+ "::"+maxPointRate+" 보다 작은값을 입력하세요"; + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + + if(maxLoseRate < loseRate) { + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::loseRate::"+loseRate); + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::MaxLoseRate::"+maxLoseRate); + String resultMsg = "루징:"+"cateCode::"+cateCode+ "::"+maxLoseRate+" 보다 작은값을 입력하세요"; + log.info(LOG_PREFIX+ "cateCode::"+cateCode+ "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + } + } + } + } + + userService.adminJoin(signupMember); + + try { + if(rateInfo != null) { + rateService.rateInfoUpdate(rateInfo); + } + } catch(Exception eee) { + log.error(LOG_PREFIX+ "Partner_Rate_Setting::Exception::"+eee.toString()); + } + + apiResponse.success(); + } catch(ApiException e) { + log.error(LOG_PREFIX+ "ApiException::"+e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(LOG_PREFIX+ "Exception::"+e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [하부 파트너 목록] API + */ + @ResponseBody + @PostMapping(value={"/lowerPartnerList"}) + public ApiResponse lowerPartnerList(@RequestHeader String token, HttpServletRequest request, @RequestBody RetailLowerSearch search) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::lowerPartnerList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + if(search == null) { + throw new ApiException("1000", "accessDinied"); + } + + search.setSiteId(tokenInfo.getSid()); + log.info(LOG_PREFIX+ "RetailLowerSearch::"+search.toString()); + + if(search.getMemId() == null || search.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + if(search.getTargetLevel() == null || search.getTargetLevel().equals("")) { + String targetLevel = retailService.getNextTargetLevel(search); + search.setTargetLevel(targetLevel); + } + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage() == 0) search.setPage(1); + + int totalCount = retailService.getLowerPartnerListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + List> list = retailService.getLowerPartnerList(search); + apiResponse.put("list", list); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::lowerPartnerList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::lowerPartnerList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + + /* + * [파트너 상세 - 기본정보] API + */ + @ResponseBody + @PostMapping(value={"/detail/info"}) + public ApiResponse detailInfo(@RequestHeader String token, HttpServletRequest request, @RequestBody UserSearch search) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::detailInfo::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + search.setSiteId(tokenInfo.getSid()); + + log.info(LOG_PREFIX+ "UserSearch::"+search.toString()); + + if(search.getMemId() == null || search.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + if(tokenInfo.getMid().equals(search.getMemId())) { + log.error(LOG_PREFIX+ "본인요율 수정 불가"); + throw new ApiException("MR03", "본인요율 수정 불가"); + } + + Member bot = new Member(); + bot.setSiteId(tokenInfo.getSid()); + bot.setMemId(search.getMemId()); + bot.setRecommenderId(tokenInfo.getMid()); + int botCnt = userService.getIsMyBottomCnt(bot); + if(botCnt == 0) { + log.error(LOG_PREFIX+ "본인하부가 아니면 요율수정 불가"); + throw new ApiException("MR04", "본인하부가 아니면 요율수정 불가"); + } + + UserDetailInfo userDetailInfo = retailService.getUserDetailInfo(search); + apiResponse.put("partnerInfo", userDetailInfo); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::detailInfo::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::detailInfo::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [파트너 상세 - 기본정보 저장] API + */ + @ResponseBody + @PostMapping(value={"/detail/info/save"}) + public ApiResponse detailInfoSave(@RequestHeader String token, HttpServletRequest request, @RequestBody UserDetailInfo info) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::detailInfoSave::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + info.setSiteId(tokenInfo.getSid()); + + log.info(LOG_PREFIX+ "UserDetailInfo::"+info.toString()); + + if(info.getMemId() == null || info.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + int result = retailService.setUserDetailInfo(info); + log.info(LOG_PREFIX+ "setUserDetailInfo result::"+result); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::detailInfoSave::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::detailInfoSave::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [파트너 상세 - 요율정보] API + */ + @ResponseBody + @PostMapping(value={"/detail/rateInfo"}) + public ApiResponse detailRateInfo(@RequestHeader String token, HttpServletRequest request, @RequestBody UserSearch search) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::detailRateInfo::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + search.setSiteId(tokenInfo.getSid()); + + log.info(LOG_PREFIX+ "UserSearch::"+search.toString()); + + if(search.getMemId() == null || search.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + Member param = new Member(); + param.setSiteId(tokenInfo.getSid()); + param.setMemId(search.getMemId()); + List> memRollingInfo = rateService.getMemRollingInfo(param); + apiResponse.put("memRollingInfo", memRollingInfo); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::detailRateInfo::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::detailRateInfo::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [파트너 상세 - 요율정보 저장] API + */ + @ResponseBody + @PostMapping(value="/detail/rateInfo/save") + public ApiResponse detailRateInfoSave(HttpServletRequest request, @RequestHeader String token, @RequestBody RateInfo rateInfo) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + + String LOG_PREFIX = "#-v2::retail::detailRateInfo::save::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + log.info(LOG_PREFIX+ "RateInfo_BF::"+rateInfo.toString()); + rateInfo.setSiteId(tokenInfo.getSid()); + log.info(LOG_PREFIX+ "RateInfo_AF::"+rateInfo.toString()); + + if(rateInfo.getMemId() == null || rateInfo.getMemId().equals("")) { + log.error(LOG_PREFIX+ "Not null memId"); + throw new ApiException("MR01", "Not null memId"); + } + + if(tokenInfo.getMid().equals(rateInfo.getMemId())) { + log.error(LOG_PREFIX+ "본인요율 수정 불가"); + throw new ApiException("MR03", "본인요율 수정 불가"); + } + + Member param = new Member(); + param.setSiteId(tokenInfo.getSid()); + param.setMemId(tokenInfo.getMid()); + HashMap myDetail = userService.getMemberDetail_3(param); + String subMemRateModifyYn = myDetail.get("subMemRateModifyYn").toString(); + if(!subMemRateModifyYn.equals("Y")) { + log.error(LOG_PREFIX+ "subMemRateModifyYn::"+subMemRateModifyYn); + throw new ApiException("MR99", "accessDinied"); + } + + Member search = new Member(); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(rateInfo.getMemId()); + search.setRecommenderId(tokenInfo.getMid()); + int botCnt = userService.getIsMyBottomCnt(search); + if(botCnt == 0) { + log.error(LOG_PREFIX+ "본인하부가 아니면 요율수정 불가"); + throw new ApiException("MR04", "본인하부가 아니면 요율수정 불가"); + } + LOG_PREFIX = LOG_PREFIX+rateInfo.getSiteId()+"::"+rateInfo.getMemId()+"::::"; + log.info(LOG_PREFIX+ "RateInfo::"+rateInfo); + + List> myRollingInfoList = rateService.getMemRollingInfo(search); + for(RateVO mvo : rateInfo.getRateList()) { + mvo.setSiteId(rateInfo.getSiteId()); + mvo.setMemId(rateInfo.getMemId()); + String category = mvo.getCategory(); + String cateCode = mvo.getCateCode(); + Double pointRate = Double.valueOf(mvo.getPointRate()); + Double loseRate = Double.valueOf(mvo.getLoseRate()); + + for(HashMap myRollingInfo : myRollingInfoList) { + String myCategory = myRollingInfo.get("category").toString(); + String myCateCode = myRollingInfo.get("cateCode").toString(); + Double maxPointRate = Double.valueOf(myRollingInfo.get("maxPointRate").toString()); + Double minPointRate = Double.valueOf(myRollingInfo.get("minPointRate").toString()); + Double maxLoseRate = Double.valueOf(myRollingInfo.get("maxLoseRate").toString()); + Double minLoseRate = Double.valueOf(myRollingInfo.get("minLoseRate").toString()); + if(cateCode.equals(myCateCode)) { + if(maxPointRate < pointRate || minPointRate > pointRate) { + log.error(LOG_PREFIX+ "cateCode::"+cateCode+ "::pointRate::"+pointRate); + log.error(LOG_PREFIX+ "cateCode::"+cateCode+ "::MaxPointRate::"+maxPointRate+"::MinPointRate::"+minPointRate); + String resultMsg = "롤링:"+"cateCode::"+cateCode+ "::"+maxPointRate+", "+minPointRate+" 사이값을 입력하세요"; + log.error(LOG_PREFIX+ "cateCode::"+cateCode+ "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + + if(maxLoseRate < loseRate || minLoseRate > loseRate) { + log.error(LOG_PREFIX+ "cateCode::"+cateCode+ "::loseRate::"+loseRate); + log.error(LOG_PREFIX+ "cateCode::"+cateCode+ "::MaxLoseRate::"+maxLoseRate+"::MinLoseRate::"+minLoseRate); + String resultMsg = "루징:"+"cateCode::"+cateCode+ "::"+maxLoseRate+", "+minLoseRate+" 사이값을 입력하세요"; + log.error(LOG_PREFIX+ "cateCode::"+cateCode+ "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + + if(10.0 < pointRate) { + log.error(LOG_PREFIX+ "cateCode::"+cateCode+ "::pointRate::"+pointRate); + log.error(LOG_PREFIX+ "cateCode::"+cateCode+ "::MaxPointRate::"+10.0); + String resultMsg = "롤링요율은 최대 10% 까지만 허용됩니다."; + log.error(LOG_PREFIX+ "cateCode::"+cateCode+ "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + + if(50.0 < loseRate) { + log.error(LOG_PREFIX+ "cateCode::"+cateCode+ "::loseRate::"+loseRate); + log.error(LOG_PREFIX+ "cateCode::"+cateCode+ "::MaxLoseRate::"+50.0); + String resultMsg = "루징요율은 최대 50% 까지만 허용됩니다."; + log.error(LOG_PREFIX+ "cateCode::"+cateCode+ "::resultMsg : " + resultMsg); + throw new ApiException("U031", resultMsg); + } + } + } + } + + rateService.rateInfoUpdate(rateInfo); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", rateInfo.getMemId()+"::요율 변경"); + logParam.put("logDesc", rateInfo.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::detailRateInfo::save::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::detailRateInfo::save::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + + /* + * [파트너 상세 - 요율정보(세부설정)] API + */ + @ResponseBody + @PostMapping(value="/detail/multipleRateInfo") + public ApiResponse multipleRateInfo(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody MultipleRateInfo param) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::multipleRateInfo::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + param.setSiteId(tokenInfo.getSid()); + + log.info(LOG_PREFIX+ "MultipleRateInfo::"+param.toString()); + + if(param.getMemId() == null || param.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + List multipleRateList = userService.getMultipleRateList(param); + param.setRateList(multipleRateList); + + apiResponse.put("multipleRateInfo", param); + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::multipleRateInfo::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::multipleRateInfo::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [파트너 상세 - 요율정보(세부설정) 저장] API + */ + @ResponseBody + @PostMapping(value="/detail/multipleRateInfo/save") + public ApiResponse multipleRateInfoSave(@RequestHeader String token, HttpServletRequest request, @RequestBody MultipleRateInfo param) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::multipleRateInfo::save::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + param.setSiteId(tokenInfo.getSid()); + + log.info(LOG_PREFIX+ "MultipleRateInfo::"+param.toString()); + + Member search = new Member(); + search.setSiteId(tokenInfo.getSid()); + search.setMemId(tokenInfo.getMid()); + HashMap myDetail = userService.getMemberDetail_3(search); + String subMemRateModifyYn = myDetail.get("subMemRateModifyYn").toString(); + if(!subMemRateModifyYn.equals("Y")) { + log.error(LOG_PREFIX+ "subMemRateModifyYn::"+subMemRateModifyYn); + throw new ApiException("MR99", "accessDinied"); + } + + if(param.getMemId() == null || param.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + if(tokenInfo.getMid().equals(param.getMemId())) { + log.error(LOG_PREFIX+ "본인요율 수정 불가"); + throw new ApiException("MR03", "본인요율 수정 불가"); + } + + Member bot = new Member(); + bot.setSiteId(tokenInfo.getSid()); + bot.setMemId(param.getMemId()); + bot.setRecommenderId(tokenInfo.getMid()); + int botCnt = userService.getIsMyBottomCnt(bot); + if(botCnt == 0) { + log.error(LOG_PREFIX+ "본인하부가 아니면 요율수정 불가"); + throw new ApiException("MR04", "본인하부가 아니면 요율수정 불가"); + } + + List afterRateList = param.getRateList(); + List beforeRateList = userService.getMultipleRateList(param); + + for(MultipleRate afterRate : afterRateList) { + for(MultipleRate beforeRate : beforeRateList) { + if(afterRate.getRateType().equals(beforeRate.getRateType())) { + if(beforeRate.getMaxPointRate() < afterRate.getPointRate() || beforeRate.getMinPointRate() > afterRate.getPointRate()) { + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::rateType::"+afterRate.getRateType()+"::pointRate::"+afterRate.getPointRate()); + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::rateType::"+afterRate.getRateType()+"::MaxPointRate::"+beforeRate.getMaxPointRate()+"::MinPointRate::"+beforeRate.getMinPointRate()); + String resultMsg = "["+afterRate.getRateType()+"] 롤링:"+beforeRate.getMaxPointRate()+", "+beforeRate.getMinPointRate()+" 사이값을 입력하세요"; + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::resultMsg : " + resultMsg); + throw new ApiException("U032", resultMsg); + } + + if(beforeRate.getMaxLoseRate() < afterRate.getLoseRate() || beforeRate.getMinLoseRate() > afterRate.getLoseRate()) { + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::rateType::"+afterRate.getRateType()+"::loseRate::"+afterRate.getLoseRate()); + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::rateType::"+afterRate.getRateType()+"::MaxLoseRate::"+beforeRate.getMaxLoseRate()+"::MinLoseRate::"+beforeRate.getMinLoseRate()); + String resultMsg = "["+afterRate.getRateType()+"] 루징:"+beforeRate.getMaxPointRate()+", "+beforeRate.getMinPointRate()+" 사이값을 입력하세요"; + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::resultMsg : " + resultMsg); + throw new ApiException("U032", resultMsg); + } + } + } + } + + userService.updateMultipleRate(param); + + try { + HashMap logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "UPDATE"); + logParam.put("logoutYn", ""); + logParam.put("logEndPoint", request.getRequestURI()); + logParam.put("logName", param.getMemId()+"::회원 Multiple 요율 변경"); + logParam.put("logDesc", param.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", IPKit.getIpAddressByRequest(request)); + logParam.put("token", ""); + commonService.insertAdminlog(logParam); + } catch(Exception e) { log.error("insertAdminlog::Exception::"+e.toString()); } + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::multipleRateInfo::save::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::multipleRateInfo::save::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [파트너 상세 - 로그인 기록] API + */ + @ResponseBody + @PostMapping(value={"/detail/loginLog"}) + public ApiResponse detailLoginLog(@RequestHeader String token, HttpServletRequest request, @RequestBody UserSearch search) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::detailLoginLog::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + search.setSiteId(tokenInfo.getSid()); + + log.info(LOG_PREFIX+ "UserSearch::"+search.toString()); + + if(search.getMemId() == null || search.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + List> loginLog = retailService.getDetailLoginLog(search); + apiResponse.put("loginLog", loginLog); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::detailLoginLog::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::detailLoginLog::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [파트너 상세 - 쪽지 기록] API + */ + @ResponseBody + @PostMapping(value={"/detail/msgLog"}) + public ApiResponse detailMsgLog(@RequestHeader String token, HttpServletRequest request, @RequestBody UserListSearch search) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::detailMsgLog::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + search.setSiteId(tokenInfo.getSid()); + + log.info(LOG_PREFIX+ "UserSearch::"+search.toString()); + + if(search.getMemId() == null || search.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = retailService.getDetailMsgLogCnt(search); + + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(10); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + List> msgLog = retailService.getDetailMsgLog(search); + apiResponse.put("msgLog", msgLog); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::detailMsgLog::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::detailMsgLog::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [파트너 상세 - 보유머니 변동 기록] API + */ + @ResponseBody + @PostMapping(value={"/detail/cashLog"}) + public ApiResponse detailCashLog(@RequestHeader String token, HttpServletRequest request, @RequestBody UserListSearch search) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::detailCashLog::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + search.setSiteId(tokenInfo.getSid()); + + log.info(LOG_PREFIX+ "UserSearch::"+search.toString()); + + if(search.getMemId() == null || search.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = retailService.getDetailCashLogCnt(search); + + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(10); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + List> cashLog = retailService.getDetailCashLog(search); + apiResponse.put("cashLog", cashLog); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::detailCashLog::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::detailCashLog::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [파트너 상세 - 롤링변환내역] API + */ + @ResponseBody + @PostMapping(value={"/detail/rollingLog"}) + public ApiResponse detailRollingLog(@RequestHeader String token, HttpServletRequest request, @RequestBody UserListSearch search) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::detailRollingLog::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + search.setSiteId(tokenInfo.getSid()); + + log.info(LOG_PREFIX+ "UserSearch::"+search.toString()); + + if(search.getMemId() == null || search.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = retailService.getDetailRollingLogCnt(search); + + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(10); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + List> rollingLog = retailService.getDetailRollingLog(search); + apiResponse.put("rollingLog", rollingLog); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::detailRollingLog::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::detailRollingLog::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value={"/detail/rollingLogNew"}) + public ApiResponse detailRollingLogNew(@RequestHeader String token, HttpServletRequest request, @RequestBody UserListSearch search) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::detailRollingLog::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + search.setSiteId(tokenInfo.getSid()); + + log.info(LOG_PREFIX+ "UserSearch::"+search.toString()); + + if(search.getMemId() == null || search.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + + int totalCount = retailService.getDetailRollingLogCnt(search); + + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(10); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + List> rollingLog = retailService.getDetailRollingLogNew(search); + apiResponse.put("rollingLog", rollingLog); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::detailRollingLog::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::detailRollingLog::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [배팅 및 롤링 현황] API + */ + @ResponseBody + @PostMapping(value={"/report/betStatistics"}) + public ApiResponse betStatistics(@RequestHeader String token, HttpServletRequest request, @RequestBody UserSearch search) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::betStatistics::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + search.setSiteId(tokenInfo.getSid()); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + long nDate = System.currentTimeMillis(); + String nDateStr = sdf.format(nDate); + if(search.getStartDate() == null || search.getStartDate().equals("")) { + search.setStartDate(nDateStr+" 00:00:00"); + } + if(search.getEndDate() == null || search.getEndDate().equals("")) { + search.setEndDate(nDateStr+" 23:59:59"); + } + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + search.setBlankSpinSetType(siteOption.getBlankSpinSetType()); + + log.info(LOG_PREFIX+ "UserSearch::"+search.toString()); + + if(search.getMemId() == null || search.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + if(search.getStatType() == null || search.getStatType().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + HashMap myStatData = retailService.getMyBetStatData(search); // Use blankSpinSetType + List> botStatList = retailService.getBottomBetStatList(search); // Use blankSpinSetType + HashMap botStatSum = retailService.getBottomBetStatSum(search); // Use blankSpinSetType + + apiResponse.put("myStatData", myStatData); + apiResponse.put("botStatList", botStatList); + apiResponse.put("botStatSum", botStatSum); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::betStatistics::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::betStatistics::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [게임 기록통계 - 일자별 배팅현황] API + */ + @ResponseBody + @PostMapping(value={"/daily/betting"}) + public ApiResponse dailyBetting(@RequestHeader String token, HttpServletRequest request, @RequestBody UserSearch search) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::dailyBetting::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + search.setSiteId(tokenInfo.getSid()); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + long nDate = System.currentTimeMillis(); + String nDateStr = sdf.format(nDate); + if(search.getStartDate() == null || search.getStartDate().equals("")) { + search.setStartDate(nDateStr+" 00:00:00"); + } + if(search.getEndDate() == null || search.getEndDate().equals("")) { + search.setEndDate(nDateStr+" 23:59:59"); + } + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + search.setBlankSpinSetType(siteOption.getBlankSpinSetType()); + + log.info(LOG_PREFIX+ "UserSearch::"+search.toString()); + + if(search.getMemId() == null || search.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + List> dailyBetList = retailService.getDailyBetList(search); // Use blankSpinSetType + HashMap dailyBetSum = retailService.getDailyBetSum(search); // Use blankSpinSetType + + apiResponse.put("dailyBetList", dailyBetList); + apiResponse.put("dailyBetSum", dailyBetSum); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::dailyBetting::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::dailyBetting::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [게임 기록통계 - 일자별 게임별 현황] API + */ + @ResponseBody + @PostMapping(value={"/daily/vendors"}) + public ApiResponse dailyVendors(@RequestHeader String token, HttpServletRequest request, @RequestBody UserSearch search) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::dailyVendors::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + search.setSiteId(tokenInfo.getSid()); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + long nDate = System.currentTimeMillis(); + String nDateStr = sdf.format(nDate); + if(search.getStartDate() == null || search.getStartDate().equals("")) { + search.setStartDate(nDateStr+" 00:00:00"); + } + if(search.getEndDate() == null || search.getEndDate().equals("")) { + search.setEndDate(nDateStr+" 23:59:59"); + } + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + search.setBlankSpinSetType(siteOption.getBlankSpinSetType()); + + log.info(LOG_PREFIX+ "UserSearch::"+search.toString()); + + if(search.getMemId() == null || search.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + //List> dailyVendorList = retailService.getDailyVendorList(search); + //HashMap dailyVendorSum = retailService.getDailyVendorSum(search); + //apiResponse.put("dailyVendorList", dailyVendorList); + //apiResponse.put("dailyVendorSum", dailyVendorSum); + + apiResponse.put("dailyVendorList", null); + apiResponse.put("dailyVendorSum", null); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::dailyVendors::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::dailyVendors::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [게임 기록통계 - 일자별 사용자별 현황] API + */ + @ResponseBody + @PostMapping(value={"/daily/users"}) + public ApiResponse dailyUsers(@RequestHeader String token, HttpServletRequest request, @RequestBody UserSearch search) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::dailyUsers::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + search.setSiteId(tokenInfo.getSid()); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + long nDate = System.currentTimeMillis(); + String nDateStr = sdf.format(nDate); + if(search.getStartDate() == null || search.getStartDate().equals("")) { + search.setStartDate(nDateStr+" 00:00:00"); + } + if(search.getEndDate() == null || search.getEndDate().equals("")) { + search.setEndDate(nDateStr+" 23:59:59"); + } + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + search.setBlankSpinSetType(siteOption.getBlankSpinSetType()); + + log.info(LOG_PREFIX+ "UserSearch::"+search.toString()); + + if(search.getMemId() == null || search.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + List> dailyUserList = retailService.getDailyUserList(search); // Use blankSpinSetType + HashMap dailyUserSum = retailService.getDailyUserSum(search); // Use blankSpinSetType + + apiResponse.put("dailyUserList", dailyUserList); + apiResponse.put("dailyUserSum", dailyUserSum); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::dailyUsers::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::dailyUsers::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [게임 기록통계 - 일자별 파트너별 현황] API + */ + @ResponseBody + @PostMapping(value={"/daily/partners"}) + public ApiResponse dailyPartners(@RequestHeader String token, HttpServletRequest request, @RequestBody UserSearch search) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::retail::dailyPartners::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + search.setSiteId(tokenInfo.getSid()); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + long nDate = System.currentTimeMillis(); + String nDateStr = sdf.format(nDate); + if(search.getStartDate() == null || search.getStartDate().equals("")) { + search.setStartDate(nDateStr+" 00:00:00"); + } + if(search.getEndDate() == null || search.getEndDate().equals("")) { + search.setEndDate(nDateStr+" 23:59:59"); + } + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + search.setBlankSpinSetType(siteOption.getBlankSpinSetType()); + + log.info(LOG_PREFIX+ "UserSearch::"+search.toString()); + + if(search.getMemId() == null || search.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + List> dailyPartnerList = retailService.getDailyPartnerList(search); // Use blankSpinSetType + + apiResponse.put("dailyPartnerList", dailyPartnerList); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::dailyPartners::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::dailyPartners::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [파트너정산내역] API 기능 + */ + @ResponseBody + @PostMapping(value={"/daily/myCalculate"}) + public ApiResponse myCalculate(@RequestHeader String token, HttpServletRequest request, @RequestBody DailyReportSearch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + search.setSiteId(tokenInfo.getSid()); + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + search.setBlankSpinSetType(siteOption.getBlankSpinSetType()); + + final String LOG_PREFIX = "#-v2-retail-myCalculate::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::"; + + ObjectMapper objectMapper = new ObjectMapper(); + String reqJsonStr = objectMapper.writeValueAsString(search); + JSONObject reqObj = new JSONObject(reqJsonStr); + log.info(LOG_PREFIX+ "Request {}", reqObj); + + List> reportCateInfo = reportService.getReportCateInfo(search.getSiteId()); + apiResponse.put("reportCateInfo", reportCateInfo); + + if(search.getSearchType().equals("OUTER")) { + search.setSearchMemId(tokenInfo.getMid()); + List list = reportService.getReportsListForPartner(search); + DayilPeriodicReports total = reportService.getReportsTotalForPartner(search); + apiResponse.put("search", search); + apiResponse.put("outSearchList", list); + apiResponse.put("outSearchTotal", total); + } else { + List list = reportService.getReportsListForPartner(search); + search.setSearchType("OUTER"); + List total = reportService.getReportsListForPartner(search); + DayilPeriodicReports inSearchTotal = total.get(0); + apiResponse.put("search", search); + apiResponse.put("inSearchList", list); + apiResponse.put("inSearchTotal", inSearchTotal); + } + + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [보유머니 변동 내역] API + */ + @ResponseBody + @PostMapping(value={"/cashTransLog"}) + public ApiResponse cashTransLog(@RequestHeader String token, HttpServletRequest request, @RequestBody CashTranLogSrch search) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + //Site site = getSiteByCheck(request); + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::retail::cashTransLog::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + search.setSiteId(tokenInfo.getSid()); + search.setRecommenderId(tokenInfo.getMid()); + + if(search.getOldYn() == null || search.getOldYn().equals("")) { + search.setOldYn("N"); + } + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + long nDate = System.currentTimeMillis(); + String nDateStr = sdf.format(nDate); + if(search.getStartDate() == null || search.getStartDate().equals("")) { + search.setStartDate(nDateStr+" 00:00:00"); + } + if(search.getEndDate() == null || search.getEndDate().equals("")) { + search.setEndDate(nDateStr+" 23:59:59"); + } + + log.info(LOG_PREFIX+ "UserSearch::"+search.toString()); + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage()==0)search.setPage(1); + int totalCount = cashService.cashTransLogCnt2(search); + + if(totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(10); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(20); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + log.info("[REQUEST: "+request.getRequestURI()+"] " + search); + + List cashTransLogs = cashService.cashTransLogList2(search); + apiResponse.put("cashTransLogs", cashTransLogs); + apiResponse.success(); + + } catch(ApiException e) { + log.error(e.toString()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + log.error(e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [보유금 지급] API + */ + @ResponseBody + @PostMapping(value="/cashIn") + public ApiResponse cashIn(@RequestHeader String token, HttpServletRequest request, @RequestBody CashIn cash) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + try { + String time = String.valueOf(System.currentTimeMillis()); + String regIp = IPKit.getIpAddressByRequest(request); + + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + String siteId = tokenInfo.getSid(); + String partnerId = tokenInfo.getMid(); + String userId = cash.getMemId(); + + String LOG_PREFIX = "#-V2::Retail::cashIn::"+siteId+"::"+partnerId+"::"+userId+"::::"; + + Member searchMy = new Member(); + searchMy.setSiteId(tokenInfo.getSid()); + searchMy.setMemId(tokenInfo.getMid()); + MemberDetail myDetail= userService.getMember(searchMy); + if(myDetail == null) { + throw new ApiException("U003", "unknown user"); + } + + if(myDetail.getCashOutFlag() == 1) { + throw new ApiException("C411", "상위 유저 회수 처리중입니다. 잠시 후 다시 시도해주세요."); + } + + String myAbuseLockYn = myDetail.getAbuseLockYn(); + String myAbuseLockTime = myDetail.getAbuseLockTime(); + if("Y".equals(myAbuseLockYn)) { + log.error(LOG_PREFIX+ "ABZ01::" + "부정행위가 감지되었습니다. 2분뒤 다시 요청하세요."); + throw new ApiException("ABZ01", "부정행위가 감지되었습니다. 2분뒤 다시 요청하세요."); + } else { + if(!"".equals(myAbuseLockTime)) { + HashMap lockParam = new HashMap<>(); + lockParam.put("siteId", myDetail.getSiteId()); + lockParam.put("memId", myDetail.getMemId()); + int lockResult = userService.resetUserLock(lockParam); + log.error(LOG_PREFIX+ "resetUserLock::result::" + lockResult); + } + } + + if(myDetail.getChangeFlag().equals("N")) { + // 통합머니 전환 프로세스 추가 + String changeResult = changeMemCashFlag(LOG_PREFIX, regIp, tokenInfo, myDetail); + if(!changeResult.equals("SUCC")) { + throw new ApiException(changeResult, "통합머니 전환 오류"); + } + } + + HashMap flagParam = new HashMap<>(); + flagParam.put("siteId", siteId); + flagParam.put("memId", partnerId); + flagParam.put("cashOutFlag", 1); + int flagResult = userService.updateCashOutFlag(flagParam); + log.info(LOG_PREFIX+ "updateCashOutFlag(1) flagResult::" + flagResult); + + CashDetail paramCash = new CashDetail(); + CashDetail paramCashBot = new CashDetail(); + + if(cash.getInAmt() == null || cash.getInAmt() <= 0) { + throw new ApiException("C303", "지급할 금액을 입력하세요."); + } + + if(myDetail.getCashAmt() < cash.getInAmt()) { + throw new ApiException("C309", "보유금액 부족"); + } + if("N".equals(myDetail.getCashSendYn())) { + throw new ApiException("C301", "보유금 지급권한이 없습니다. 관리자에게 문의하세요."); + } + + if(!myDetail.getIsPartnerMember().equals("Y")) { + throw new ApiException("1000", "accessDinied"); + } + + Member searchBot = new Member(); + searchBot.setSiteId(tokenInfo.getSid()); + searchBot.setMemId(cash.getMemId()); + + log.info(LOG_PREFIX+ "[REQUEST: "+request.getRequestURI()+"] " + cash); + + MemberDetail botMemDetail= userService.getMember(searchBot); + if(botMemDetail == null) { + throw new ApiException("C302", "보유금 지급이 불가능한 대상입니다. 아이디를 확인하세요."); + } else { + if(botMemDetail.getPartnerLevel().equals("COMP") || botMemDetail.getPartnerLevel().equals("AUTO")) { + // 지급 불가 대상의 파트너단계 : 컴퍼니("COMP"), 컴퍼니자동생성회원("AUTO") + throw new ApiException("C302", "보유금 지급이 불가능한 대상입니다. 아이디를 확인하세요."); + } else if(botMemDetail.getPartnerLevel().equals("NORMAL")) { + // 지급 가능 대상의 파트너단계 : 일반회원("NORMAL") + /* // 직하부 일반회원이 아니여도 지급 가능하도록 변경 - 2024-07-17 by.Andy + if(!botMemDetail.getRecommenderId().equals(tokenInfo.getMid())) { + throw new ApiException("C302", "보유금 지급이 불가능한 대상입니다. 아이디를 확인하세요."); + } + */ + } else { + // 지급 가능 대상의 파트너단계 : 파트너회원("PTN_1 ~ 7") + int myLevel = Integer.parseInt(tokenInfo.getPartnerLevel().substring(4)); + int botLevel = Integer.parseInt(botMemDetail.getPartnerLevel().substring(4)); + if(myLevel > botLevel) { + throw new ApiException("C302", "보유금 지급이 불가능한 대상입니다. 아이디를 확인하세요."); + } + } + } + + String abuseLockYn = botMemDetail.getAbuseLockYn(); + String abuseLockTime = botMemDetail.getAbuseLockTime(); + if("Y".equals(abuseLockYn)) { + log.error(LOG_PREFIX+ "ABZ01::" + "부정행위가 감지되었습니다. 2분뒤 다시 요청하세요."); + throw new ApiException("ABZ01", "부정행위가 감지되었습니다. 2분뒤 다시 요청하세요."); + } else { + if(!"".equals(abuseLockTime)) { + HashMap lockParam = new HashMap<>(); + lockParam.put("siteId", botMemDetail.getSiteId()); + lockParam.put("memId", botMemDetail.getMemId()); + int lockResult = userService.resetUserLock(lockParam); + log.error(LOG_PREFIX+ "resetUserLock::result::" + lockResult); + } + } + + if("Y".equals(botMemDetail.getMemLockYn())) { + throw new ApiException("C391", "정지회원은 보유금 지급/회수가 불가능합니다."); + } + + if("N".equals(botMemDetail.getBetYn()) && "NORMAL".equals(botMemDetail.getPartnerLevel())) { + throw new ApiException("C392", "배팅금지 회원은 보유금 지급/회수가 불가능합니다."); + } + + paramCash.setSiteId(tokenInfo.getSid()); + paramCash.setMemId(tokenInfo.getMid()); + paramCash.setCashType("-3"); + paramCash.setCashAmt(-1 * cash.getInAmt()); + paramCash.setCashDesc("보유금 지급"); + paramCash.setDelYn("N"); + paramCash.setCashStatus("3"); + paramCash.setMemo(""); + paramCash.setRegId(cash.getMemId()); + paramCash.setAdminId(""); + paramCash.setWaitTime(-30); + log.info(LOG_PREFIX+ "CashDetail Top: " + paramCash); + long cashIdx1 = cashService.insertCashTopUser(paramCash); + if(cashIdx1 == 0) { + log.error(LOG_PREFIX+ "중복요청 입니다."); + throw new ApiException("C999", "중복요청 입니다."); + } else { + // 상위지급 로그 + try { + Map logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "CASH_OUT"); + logParam.put("logoutYn", ""); + logParam.put("logName", "보유금 지급["+myDetail.getCashAmt()+"][+"+cash.getInAmt()+"]"); + logParam.put("logDesc", "[time:"+time+"][idx:"+cashIdx1+"]"); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", regIp); + logParam.put("token", ""); + commonService.insertlog(logParam); + } catch(Exception e){ + System.out.print(LOG_PREFIX+ e.toString()); + } + + paramCashBot.setSiteId(tokenInfo.getSid()); + paramCashBot.setMemId(cash.getMemId()); + paramCashBot.setCashType("33"); + paramCashBot.setCashAmt(cash.getInAmt()); + paramCashBot.setCashDesc("상위유저 지급 머니"); + paramCashBot.setDelYn("N"); + paramCashBot.setCashStatus("3"); + paramCashBot.setMemo(""); + paramCashBot.setRegId(tokenInfo.getMid()); + paramCashBot.setAdminId(""); + paramCashBot.setWaitTime(-1); + paramCashBot.setRefIdx(cashIdx1); + log.info(LOG_PREFIX+ "CashDetail Bot: " + paramCashBot); + long cashIdx2 = cashService.insertCashBotUser(paramCashBot); + if(cashIdx2 == 0) { + log.error(LOG_PREFIX+ "중복요청 입니다."); + throw new ApiException("C999", "중복요청 입니다."); + } else { + try { + // 하위지급 로그 + try{ + Map logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", cash.getMemId()); + logParam.put("logType", "CASH_IN"); + logParam.put("logoutYn", ""); + logParam.put("logName", "상위유저 지급 머니["+botMemDetail.getCashAmt()+"][-"+cash.getInAmt()+"]"); + logParam.put("logDesc", "[time:"+time+"][idx:"+cashIdx2+"]"); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", regIp); + logParam.put("token", ""); + commonService.insertlog(logParam); + } catch(Exception e){ + System.out.print(e.toString()); + } + } catch (ResourceAccessException rae) { + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error(LOG_PREFIX+ "[ConnectTimeoutException]"+rae.getMessage()); + } + + if(rae.getCause() instanceof SocketTimeoutException) { + log.error(LOG_PREFIX+ "[SocketTimeoutException]"+rae.getMessage()); + } + + if(rae.getCause() instanceof InterruptedException) { + log.error(LOG_PREFIX+ "[InterruptedException]"+rae.getMessage()); + } + } + } + } + + HashMap lockParam = new HashMap<>(); + lockParam.put("siteId", siteId); + lockParam.put("memId", partnerId); + lockParam.put("symLock", "N"); + int resultLock = userService.userChangeSymLock(lockParam); + log.info(LOG_PREFIX+ "userChangeSymLock(N) Result="+resultLock); + + flagParam.put("cashOutFlag", 0); + flagResult = userService.updateCashOutFlag(flagParam); + log.info(LOG_PREFIX+ "updateCashOutFlag(0) flagResult::" + flagResult); + + try { + Map logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("actionType", 2); + commonService.updateAcctionLog(logParam); + } catch(Exception e){System.out.print(e.toString());} + + apiResponse.success(); + + } catch(ApiException e) { + apiResponse = e.getApiResponse(); + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + String siteId = tokenInfo.getSid(); + String partnerId = tokenInfo.getMid(); + String userId = cash.getMemId(); + String LOG_PREFIX = "#-V2::Retail::cashIn::"+siteId+"::"+partnerId+"::"+userId+"::::"; + + HashMap flagParam = new HashMap<>(); + flagParam.put("siteId", siteId); + flagParam.put("memId", partnerId); + flagParam.put("cashOutFlag", 0); + int flagResult = userService.updateCashOutFlag(flagParam); + log.error(LOG_PREFIX+ "updateCashOutFlag(0) flagResult::" + flagResult); + log.error(LOG_PREFIX+ "ApiException::"+ apiResponse.toString()); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + String siteId = tokenInfo.getSid(); + String partnerId = tokenInfo.getMid(); + String userId = cash.getMemId(); + String LOG_PREFIX = "#-V2::Retail::cashIn::"+siteId+"::"+partnerId+"::"+userId+"::::"; + + HashMap flagParam = new HashMap<>(); + flagParam.put("siteId", siteId); + flagParam.put("memId", partnerId); + flagParam.put("cashOutFlag", 0); + int flagResult = userService.updateCashOutFlag(flagParam); + log.error(LOG_PREFIX+ "updateCashOutFlag(0) flagResult::" + flagResult); + + log.error(LOG_PREFIX+ "Exception::"+ e.toString()); + e.printStackTrace(); + apiResponse.fail(); + log.error(LOG_PREFIX+ "Exception::"+ apiResponse.toString()); + } + + return apiResponse; + } + + + /* + * [보유금 회수] API + * 기존 보유금 회수 프로세스 + 통합머니전환 프로세스 + */ + @ResponseBody + @PostMapping(value="/cashOut") + public ApiResponse cashOut(@RequestHeader String token, HttpServletRequest request, @RequestBody CashOut cash) throws Exception { + ApiResponse apiResponse = new ApiResponse(); + + try { + String time = String.valueOf(System.currentTimeMillis()); + String regIp = IPKit.getIpAddressByRequest(request); + + if(token==null) { + throw new ApiException("1000", "accessDinied"); + } + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + + String siteId = tokenInfo.getSid(); + String partnerId = tokenInfo.getMid(); + String userId = cash.getMemId(); + + String LOG_PREFIX = "#-V2::Retail::cashOut::"+siteId+"::"+partnerId+"::"+userId+"::::"; + + Member searchBot = new Member(); + searchBot.setSiteId(siteId); + searchBot.setMemId(userId); + MemberDetail botMemDetail = userService.getMember(searchBot); + if(botMemDetail == null) { + throw new ApiException("C402", "보유금 회수가 불가능한 대상입니다. 아이디를 확인하세요."); + } + + if(botMemDetail.getCashOutFlag() == 1) { + throw new ApiException("C410", "하위 유저 출금 처리중입니다. 잠시 후 다시 시도해주세요."); + } + + HashMap flagParam = new HashMap<>(); + flagParam.put("siteId", siteId); + flagParam.put("memId", userId); + flagParam.put("cashOutFlag", 1); + int flagResult = userService.updateCashOutFlag(flagParam); + log.info(LOG_PREFIX+ "updateCashOutFlag(1) flagResult::" + flagResult); + + CashDetail paramCash = new CashDetail(); + CashDetail paramCashBot = new CashDetail(); + + if(cash.getOutAmt() == null || cash.getOutAmt() <= 0) { + throw new ApiException("C403", "회수할 금액을 입력하세요."); + } + + Member searchMy = new Member(); + searchMy.setSiteId(tokenInfo.getSid()); + searchMy.setMemId(tokenInfo.getMid()); + MemberDetail myDetail = userService.getMember(searchMy); + if(myDetail == null) { + throw new ApiException("U003", "unknown user"); + } + + if("N".equals(myDetail.getCashReceiveYn())) { + throw new ApiException("C401", "보유금 회수권한이 없습니다. 관리자에게 문의하세요."); + } + + if(!myDetail.getIsPartnerMember().equals("Y")) { + throw new ApiException("1000", "accessDinied"); + } + + log.info(LOG_PREFIX+ "[REQUEST: "+request.getRequestURI()+"] " + cash); + + if(botMemDetail.getPartnerLevel().equals("COMP") || botMemDetail.getPartnerLevel().equals("AUTO")) { + // 회수 불가 대상의 파트너단계 : 컴퍼니("COMP"), 컴퍼니자동생성회원("AUTO") + throw new ApiException("C402", "보유금 회수가 불가능한 대상입니다. 아이디를 확인하세요."); + } else if(botMemDetail.getPartnerLevel().equals("NORMAL")) { + // 회수 가능 대상의 파트너단계 : 일반회원("NORMAL") + /* // 직하부 일반회원이 아니여도 회수 가능하도록 변경 - 2024-07-17 by.Andy + if(!botMemDetail.getRecommenderId().equals(tokenInfo.getMid())) { + throw new ApiException("C402", "보유금 회수가 불가능한 대상입니다. 아이디를 확인하세요."); + } + */ + } else { + // 회수 가능 대상의 파트너단계 : 파트너회원("PTN_1 ~ 7") + int myLevel = Integer.parseInt(tokenInfo.getPartnerLevel().substring(4)); + int botLevel = Integer.parseInt(botMemDetail.getPartnerLevel().substring(4)); + if(myLevel > botLevel) { + throw new ApiException("C402", "보유금 회수가 불가능한 대상입니다. 아이디를 확인하세요."); + } + } + + String abuseLockYn = botMemDetail.getAbuseLockYn(); + String abuseLockTime = botMemDetail.getAbuseLockTime(); + if("Y".equals(abuseLockYn)) { + log.error(LOG_PREFIX+ "ABZ01::" + "부정행위가 감지되었습니다. 2분뒤 다시 요청하세요."); + throw new ApiException("ABZ01", "부정행위가 감지되었습니다. 2분뒤 다시 요청하세요."); + } else { + if(!"".equals(abuseLockTime)) { + HashMap lockParam = new HashMap<>(); + lockParam.put("siteId", botMemDetail.getSiteId()); + lockParam.put("memId", botMemDetail.getMemId()); + int lockResult = userService.resetUserLock(lockParam); + log.error(LOG_PREFIX+ "resetUserLock::result::" + lockResult); + } + } + + if(botMemDetail.getChangeFlag().equals("N")) { + // throw new ApiException("C098", "하위 유저 [통합머니전환] 후 회수 가능합니다."); + // 통합머니 전환 프로세스 추가 + String changeResult = changeMemCashFlag(LOG_PREFIX, regIp, tokenInfo, botMemDetail); + if(!changeResult.equals("SUCC")) { + throw new ApiException(changeResult, "통합머니 전환 오류"); + } + } + + if(botMemDetail.getCashAmt() < cash.getOutAmt()) { + throw new ApiException("C409", "하위 보유금액 부족"); + } + + if("Y".equals(botMemDetail.getMemLockYn())) { + throw new ApiException("C391", "정지회원은 보유금 지급/회수가 불가능합니다."); + } + + if("N".equals(botMemDetail.getBetYn()) && "NORMAL".equals(botMemDetail.getPartnerLevel())) { + throw new ApiException("C392", "배팅금지 회원은 보유금 지급/회수가 불가능합니다."); + } + + paramCashBot.setSiteId(tokenInfo.getSid()); + paramCashBot.setMemId(cash.getMemId()); + paramCashBot.setCashType("-33"); + paramCashBot.setCashAmt(-1 * cash.getOutAmt()); + paramCashBot.setCashDesc("상위유저 회수 머니"); + paramCashBot.setDelYn("N"); + paramCashBot.setCashStatus("3"); + paramCashBot.setMemo(""); + paramCashBot.setRegId(tokenInfo.getMid()); + paramCashBot.setAdminId(""); + paramCashBot.setWaitTime(-60); + log.info(LOG_PREFIX+ "CashDetail Bot: " + paramCashBot); + long cashIdx2 = cashService.insertCashBotUser(paramCashBot); + if(cashIdx2 == 0) { + log.error(LOG_PREFIX+ "중복요청 입니다."); + throw new ApiException("C999", "중복요청 입니다."); + } else { + try { + // 하위회수 로그 + try{ + Map logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", cash.getMemId()); + logParam.put("logType", "CASH_OUT"); + logParam.put("logoutYn", ""); + logParam.put("logName", "상위유저 회수 머니["+botMemDetail.getCashAmt()+"][-"+cash.getOutAmt()+"]"); + logParam.put("logDesc", "[time:"+time+"][idx:"+cashIdx2+"]"); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", regIp); + logParam.put("token", ""); + commonService.insertlog(logParam); + } catch(Exception e){ + System.out.print(LOG_PREFIX+ "[Exception]"+e.toString()); + } + } catch (ResourceAccessException rae) { + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error(LOG_PREFIX+ "[ConnectTimeoutException]"+rae.getMessage()); + } + + if(rae.getCause() instanceof SocketTimeoutException) { + log.error(LOG_PREFIX+ "[SocketTimeoutException]"+rae.getMessage()); + } + + if(rae.getCause() instanceof InterruptedException) { + log.error(LOG_PREFIX+ "[InterruptedException]"+rae.getMessage()); + } + } + + paramCash.setSiteId(tokenInfo.getSid()); + paramCash.setMemId(tokenInfo.getMid()); + paramCash.setCashType("3"); + paramCash.setCashAmt(cash.getOutAmt()); + paramCash.setCashDesc("보유금 회수"); + paramCash.setDelYn("N"); + paramCash.setCashStatus("3"); + paramCash.setMemo(""); + paramCash.setRegId(cash.getMemId()); + paramCash.setAdminId(""); + paramCash.setWaitTime(-1); + paramCash.setRefIdx(cashIdx2); + log.info(LOG_PREFIX+ "CashDetail Top: " + paramCash); + long cashIdx1 = cashService.insertCashTopUser(paramCash); + if(cashIdx1 == 0) { + log.error(LOG_PREFIX+ "중복요청 입니다."); + throw new ApiException("C999", "중복요청 입니다."); + } else { + // 상위회수 로그 + try{ + Map logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "CASH_IN"); + logParam.put("logoutYn", ""); + logParam.put("logName", "보유금 회수["+myDetail.getCashAmt()+"][+"+cash.getOutAmt()+"]"); + logParam.put("logDesc", "[time:"+time+"][idx:"+cashIdx1+"]"); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", regIp); + logParam.put("token", ""); + commonService.insertlog(logParam); + } catch(Exception e){ + System.out.print(e.toString()); + } + } + } + + HashMap lockParam = new HashMap<>(); + lockParam.put("siteId", siteId); + lockParam.put("memId", userId); + lockParam.put("symLock", "N"); + int resultLock = userService.userChangeSymLock(lockParam); + log.info(LOG_PREFIX+ "userChangeSymLock(N) Result="+resultLock); + + flagParam.put("cashOutFlag", 0); + flagResult = userService.updateCashOutFlag(flagParam); + log.info(LOG_PREFIX+ "updateCashOutFlag(0) flagResult::" + flagResult); + + try { + Map logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("actionType", 2); + commonService.updateAcctionLog(logParam); + } catch(Exception e){System.out.print(e.toString());} + + apiResponse.success(); + + } catch(ApiException e) { + apiResponse = e.getApiResponse(); + + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + String siteId = tokenInfo.getSid(); + String partnerId = tokenInfo.getMid(); + String userId = cash.getMemId(); + String LOG_PREFIX = "#-V2::Retail::cashOut::"+siteId+"::"+partnerId+"::"+userId+"::::"; + + HashMap flagParam = new HashMap<>(); + flagParam.put("siteId", siteId); + flagParam.put("memId", userId); + flagParam.put("cashOutFlag", 0); + int flagResult = userService.updateCashOutFlag(flagParam); + log.error(LOG_PREFIX+ "updateCashOutFlag(0) flagResult::" + flagResult); + log.error(LOG_PREFIX+ "ApiException::"+ apiResponse.toString()); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + String siteId = tokenInfo.getSid(); + String partnerId = tokenInfo.getMid(); + String userId = cash.getMemId(); + String LOG_PREFIX = "#-V2::Retail::cashOut::"+siteId+"::"+partnerId+"::"+userId+"::::"; + + HashMap flagParam = new HashMap<>(); + flagParam.put("siteId", siteId); + flagParam.put("memId", userId); + flagParam.put("cashOutFlag", 0); + int flagResult = userService.updateCashOutFlag(flagParam); + log.error(LOG_PREFIX+ "updateCashOutFlag(0) flagResult::" + flagResult); + + log.error(LOG_PREFIX+ "Exception::"+ e.toString()); + e.printStackTrace(); + apiResponse.fail(); + log.error(LOG_PREFIX+ "Exception::"+ apiResponse.toString()); + } + + return apiResponse; + } + + + private String changeMemCashFlag(String LOG_PREFIX, String regIp, TokenInfo tokenInfo, MemberDetail botMemDetail) { + String changeResult = "SUCC"; + + String siteId = tokenInfo.getSid(); + String partnerId = tokenInfo.getMid(); + String userId = botMemDetail.getMemId(); + + LOG_PREFIX = LOG_PREFIX + "::changeMemCashFlag::::"; + + try { + // Triple 이용 사이트 + HashMap param = new HashMap<>(); + param.put("siteId", tokenInfo.getSid()); + param.put("memId", botMemDetail.getMemId()); + param.put("intervalTime", -10); + param.put("apiType", "triple"); + HashMap lastGameInfo = userService.getLastGameInfoNew(param); + if(lastGameInfo != null) { + log.info(LOG_PREFIX+ "lastGameInfo : " + lastGameInfo.toString()); + // Playing Game + log.error(LOG_PREFIX+ "배팅내역 정산중입니다. 잠시(10초) 후 다시 시도해주세요."); + changeResult = "C009"; + return changeResult; + } + + HashMap lockParam = new HashMap<>(); + lockParam.put("siteId", siteId); + lockParam.put("memId", partnerId); + lockParam.put("symLock", "Y"); + int resultLock = userService.userChangeSymLock(lockParam); + log.info(LOG_PREFIX+ "userChangeSymLock(Y) Result="+resultLock); + + HashMap flagParam = new HashMap<>(); + flagParam.put("siteId", siteId); + flagParam.put("memId", partnerId); + flagParam.put("changeFlag", "Y"); + int result = userService.userChangeFlag(flagParam); + log.info(LOG_PREFIX+ "userChangeFlag(Y) result="+result); + + try { + Map logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "update"); + logParam.put("logoutYn", ""); + logParam.put("logName", "ApiV2RetailController.changeMemCashFlag() => UserService.userChangeFlag("+partnerId+")"); + logParam.put("logDesc", flagParam.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", regIp); + logParam.put("token", ""); + commonService.insertlog(logParam); + } catch(Exception e) {System.out.print(e.toString());} + + } catch (ResourceAccessException rae) { + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error(LOG_PREFIX+ "[ConnectTimeoutException]::"+rae.getMessage()); + changeResult = "TE99"; + } else if(rae.getCause() instanceof SocketTimeoutException) { + log.error(LOG_PREFIX+ "[SocketTimeoutException]::"+rae.getMessage()); + changeResult = "TE99"; + } else if(rae.getCause() instanceof InterruptedException) { + log.error(LOG_PREFIX+ "[InterruptedException]::"+rae.getMessage()); + changeResult = "TE99"; + } else { + log.error(LOG_PREFIX+ "[ResourceAccessException]::"+rae.getMessage()); + changeResult = "RE99"; + } + + HashMap lockParam = new HashMap<>(); + lockParam.put("siteId", siteId); + lockParam.put("memId", partnerId); + lockParam.put("symLock", "Y"); + int resultLock = userService.userChangeSymLock(lockParam); + log.error(LOG_PREFIX+ "userChangeSymLock(Y) Result="+resultLock); + + HashMap flagParam = new HashMap<>(); + flagParam.put("siteId", siteId); + flagParam.put("memId", partnerId); + flagParam.put("changeFlag", "Y"); + int result = userService.userChangeFlag(flagParam); + log.error(LOG_PREFIX+ "userChangeFlag(Y) result="+result); + + try { + Map logParam = new HashMap(); + logParam.put("siteId", tokenInfo.getSid()); + logParam.put("memId", tokenInfo.getMid()); + logParam.put("logType", "update"); + logParam.put("logoutYn", ""); + logParam.put("logName", "ApiV2RetailController.changeMemCashFlag() => UserService.userChangeFlag("+partnerId+")"); + logParam.put("logDesc", flagParam.toString()); + logParam.put("regId", tokenInfo.getMid()); + logParam.put("regIp", regIp); + logParam.put("token", ""); + commonService.insertlog(logParam); + } catch(Exception e) {System.out.print(e.toString());} + + } catch (Exception e) { + log.error(LOG_PREFIX+ "[Exception]::"+e.toString()); + e.printStackTrace(); + changeResult = "EE99"; + } + + return changeResult; + } + +} diff --git a/src/main/java/com/bb/front/v2/ApiV2UserController.java b/src/main/java/com/bb/front/v2/ApiV2UserController.java new file mode 100644 index 0000000..6e3dd0d --- /dev/null +++ b/src/main/java/com/bb/front/v2/ApiV2UserController.java @@ -0,0 +1,482 @@ +package com.bb.front.v2; + +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.bb.exception.ApiException; +import com.bb.jwt.JwtManager; +import com.bb.model.ApiResponse; +import com.bb.model.PageFormVO; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; +import com.bb.model.UserListSearch; +import com.bb.model.UserSearch; +import com.bb.service.CommonService; +import com.bb.service.RateService; +import com.bb.service.RetailService; +import com.bb.service.UserService; +import com.bb.util.PagingUtil; + +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@Slf4j +@RequestMapping("/api/v2/user") +@RequiredArgsConstructor +@SecurityRequirement(name = "Authorization") +public class ApiV2UserController { + + private final JwtManager jwtManager; + + private final RetailService retailService; + + private final UserService userService; + + private final RateService rateService; + + private final CommonService commonService; + + private final PasswordEncoder passwordEncoder; + + + + /* + * [직하부 회원 목록] API + */ + @ResponseBody + @PostMapping(value={"/lowerUserList"}) + public ApiResponse lowerUserList(@RequestHeader String token, HttpServletRequest request, @RequestBody UserListSearch search) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::user::lowerUserList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + if(search == null) { + throw new ApiException("1000", "accessDinied"); + } + + search.setSiteId(tokenInfo.getSid()); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + long nDate = System.currentTimeMillis(); + String nDateStr = sdf.format(nDate); + if(search.getStartDate() == null || search.getStartDate().equals("")) { + search.setStartDate(nDateStr+" 00:00:00"); + } + if(search.getEndDate() == null || search.getEndDate().equals("")) { + search.setEndDate(nDateStr+" 23:59:59"); + } + + if(search.getTreeOption() == null || "".equals(search.getTreeOption())) { + search.setTreeOption("N"); + } + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + search.setBlankSpinSetType(siteOption.getBlankSpinSetType()); + + log.info(LOG_PREFIX+ "UserListSearch::"+search.toString()); + + if(search.getMemId() == null || search.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage() == 0) search.setPage(1); + + int totalCount = userService.getLowerUserListCnt(search); // Use blankSpinSetType + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + List> list = userService.getLowerUserList(search); // Use blankSpinSetType + apiResponse.put("list", list); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::user::lowerUserList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::user::lowerUserList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [접속중 회원 목록] API + */ + @ResponseBody + @PostMapping(value={"/loginList"}) + public ApiResponse loginList(@RequestHeader String token, HttpServletRequest request, @RequestBody UserSearch search) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::user::loginList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + if(search == null) { + throw new ApiException("1000", "accessDinied"); + } + + search.setSiteId(tokenInfo.getSid()); + + if(search.getTreeOption() == null || "".equals(search.getTreeOption())) { + search.setTreeOption("N"); + } + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + search.setBlankSpinSetType(siteOption.getBlankSpinSetType()); + + log.info(LOG_PREFIX+ "UserSearch::"+search.toString()); + + if(search.getMemId() == null || search.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + List> list = userService.getLoginUserList(search); // Use blankSpinSetType + apiResponse.put("list", list); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::user::loginList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::user::loginList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [회원 상세 - 게임실행 목록] API + */ + @ResponseBody + @PostMapping(value={"/detail/playGameList"}) + public ApiResponse playGameList(@RequestHeader String token, HttpServletRequest request, @RequestBody UserListSearch search) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::user::playGameList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + if(search == null) { + throw new ApiException("1000", "accessDinied"); + } + + search.setSiteId(tokenInfo.getSid()); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + long nDate = System.currentTimeMillis(); + String nDateStr = sdf.format(nDate); + if(search.getStartDate() == null || search.getStartDate().equals("")) { + search.setStartDate(nDateStr+" 00:00:00"); + } + if(search.getEndDate() == null || search.getEndDate().equals("")) { + search.setEndDate(nDateStr+" 23:59:59"); + } + + log.info(LOG_PREFIX+ "UserListSearch::"+search.toString()); + + if(search.getMemId() == null || search.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage() == 0) search.setPage(1); + + int totalCount = userService.getPlayGameListCnt(search); + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + List> list = userService.getPlayGameList(search); + apiResponse.put("list", list); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::user::playGameList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::user::playGameList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + + /* + * [회원 상세 - 게임베팅 목록] API + */ + @ResponseBody + @PostMapping(value={"/detail/betList"}) + public ApiResponse detailBetList(@RequestHeader String token, HttpServletRequest request, @RequestBody UserListSearch search) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::user::detailBetList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + if(search == null) { + throw new ApiException("1000", "accessDinied"); + } + + search.setSiteId(tokenInfo.getSid()); + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + search.setBlankSpinSetType(siteOption.getBlankSpinSetType()); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + long nDate = System.currentTimeMillis(); + String nDateStr = sdf.format(nDate); + if(search.getStartDate() == null || search.getStartDate().equals("")) { + search.setStartDate(nDateStr+" 00:00:00"); + } + if(search.getEndDate() == null || search.getEndDate().equals("")) { + search.setEndDate(nDateStr+" 23:59:59"); + } + + log.info(LOG_PREFIX+ "UserListSearch::"+search.toString()); + + if(search.getMemId() == null || search.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage() == 0) search.setPage(1); + + int totalCount = userService.getDetailBetListCnt(search); // Use blankSpinSetType + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + List> list = userService.getDetailBetList(search); // Use blankSpinSetType + apiResponse.put("list", list); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::user::detailBetList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::user::detailBetList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + + @ResponseBody + @PostMapping(value={"/detail/betListNew"}) + public ApiResponse detailBetListNew(@RequestHeader String token, HttpServletRequest request, @RequestBody UserListSearch search) throws Exception { + + ApiResponse apiResponse = new ApiResponse(); + + try { + if(token == null) { + throw new ApiException("1000", "accessDinied"); + } + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + if(!( tokenInfo.getPartnerLevel().contains("PTN") || tokenInfo.getType().equals("PARTNER") || tokenInfo.getType().equals("P_NORMAL")) ) { + throw new ApiException("1000", "accessDinied"); + } + final String LOG_PREFIX = "#-v2::user::detailBetList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + if(search == null) { + throw new ApiException("1000", "accessDinied"); + } + + search.setSiteId(tokenInfo.getSid()); + + SiteSearch paramSite = new SiteSearch(); + paramSite.setSiteId(tokenInfo.getSid()); + SiteOption siteOption = commonService.getSiteSetting(paramSite); + search.setBlankSpinSetType(siteOption.getBlankSpinSetType()); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + long nDate = System.currentTimeMillis(); + String nDateStr = sdf.format(nDate); + if(search.getStartDate() == null || search.getStartDate().equals("")) { + search.setStartDate(nDateStr+" 00:00:00"); + } + if(search.getEndDate() == null || search.getEndDate().equals("")) { + search.setEndDate(nDateStr+" 23:59:59"); + } + + log.info(LOG_PREFIX+ "UserListSearch::"+search.toString()); + + if(search.getMemId() == null || search.getMemId().equals("")) { + throw new ApiException("1000", "accessDinied"); + } + + PageFormVO pageVo= new PageFormVO(); + if(search.getPage() == 0) search.setPage(1); + + int totalCount = userService.getDetailBetListNewCnt(search); // Use blankSpinSetType + if (totalCount != 0) { + PageFormVO commonForm = new PageFormVO(); + commonForm.setFunction_name("goPage"); + commonForm.setPage(search.getPage()); + commonForm.setCount_per_page(20); + if(search.getCount_per_list()==0) { + commonForm.setCount_per_list(10); + } else { + commonForm.setCount_per_list(search.getCount_per_list()); + } + commonForm.setTatal_list_count(totalCount); + pageVo = PagingUtil.setPageUtil(commonForm); + search.setLimit(pageVo.getLimit()); + search.setOffset(pageVo.getOffset()); + search.setTatal_list_count(totalCount); + apiResponse.put("pageInfo", pageVo); + } + + List> list = userService.getDetailBetListNew(search); // Use blankSpinSetType + apiResponse.put("list", list); + + apiResponse.success(); + + } catch (ApiException e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::user::detailBetList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "ApiException::" + e.getApiResponse()); + apiResponse = e.getApiResponse(); + } catch (Exception e) { + JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token); + final String LOG_PREFIX = "#-v2::user::detailBetList::"+tokenInfo.getSid()+"::"+tokenInfo.getMid()+"::::"; + + log.error(LOG_PREFIX+ "Exception::" + e.toString()); + e.printStackTrace(); + apiResponse.fail(); + } + + return apiResponse; + } + +} diff --git a/src/main/java/com/bb/jwt/JwtClame.java b/src/main/java/com/bb/jwt/JwtClame.java new file mode 100644 index 0000000..d9f3134 --- /dev/null +++ b/src/main/java/com/bb/jwt/JwtClame.java @@ -0,0 +1,14 @@ +package com.bb.jwt; + +import lombok.Data; + +@Data +public class JwtClame { + private Integer siteIdx; + private Integer memIdx; + private String siteId; + private String memId; + private String type; + private String partnerLevel; + +} diff --git a/src/main/java/com/bb/jwt/JwtConfig.java b/src/main/java/com/bb/jwt/JwtConfig.java new file mode 100644 index 0000000..417449c --- /dev/null +++ b/src/main/java/com/bb/jwt/JwtConfig.java @@ -0,0 +1,25 @@ +package com.bb.jwt; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.bb.jwt.JwtManager; + + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class JwtConfig { + @Value("${jwt.secret}") + private String jwtSecret; + + @Value("${jwt.validity-in-seconds}") + private long tokenValidityInSeconds; + + @Bean + public JwtManager jwtManager() { + return new JwtManager(jwtSecret, tokenValidityInSeconds); + } +} \ No newline at end of file diff --git a/src/main/java/com/bb/jwt/JwtManager.java b/src/main/java/com/bb/jwt/JwtManager.java new file mode 100644 index 0000000..4979cc5 --- /dev/null +++ b/src/main/java/com/bb/jwt/JwtManager.java @@ -0,0 +1,166 @@ +package com.bb.jwt; + + +import java.nio.charset.StandardCharsets; +import java.security.Key; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Set; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import io.jsonwebtoken.security.Keys; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class JwtManager { + + private String secretKey; + private long TOKEN_VALIDATION_SECOND; + + public JwtManager(String secretKey, long TOKEN_VALIDATION_SECOND) { + this.secretKey = secretKey; + this.TOKEN_VALIDATION_SECOND = TOKEN_VALIDATION_SECOND; + } + + // secretKey 로드 + private Key getSigninKey() { + byte[] keyBytes = secretKey.getBytes(StandardCharsets.UTF_8); + return Keys.hmacShaKeyFor(keyBytes); + } + + // 토큰 생성 + public String generateToken(JwtClame jwtinfo) { + Claims claims = Jwts.claims(); + claims.put("sidx", jwtinfo.getSiteIdx()); + claims.put("midx", jwtinfo.getMemIdx()); + claims.put("mid", jwtinfo.getMemId()); + claims.put("sid", jwtinfo.getSiteId()); + claims.put("type", jwtinfo.getType()); + claims.put("partnerLevel", jwtinfo.getPartnerLevel()); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + long currentTMS = System.currentTimeMillis(); + Date issuedAt = new Date(currentTMS); + String issuedAtStr = sdf.format(issuedAt); + Date expiration = new Date(currentTMS + (TOKEN_VALIDATION_SECOND * 1000)); + String expirationStr = sdf.format(expiration); + + log.debug("[JwtManager.generateToken(jwtinfo)] sid: " + jwtinfo.getSiteId() + ", sidx: " + jwtinfo.getSiteIdx()); + log.debug("[JwtManager.generateToken(jwtinfo)] mid: " + jwtinfo.getMemId() + ", midx: " + jwtinfo.getMemIdx()); + log.debug("[JwtManager.generateToken(jwtinfo)] IAT: " + issuedAtStr); + log.debug("[JwtManager.generateToken(jwtinfo)] EAT: " + expirationStr); + log.info("#-JwtManager::generateToken::admin::"+jwtinfo.getSiteId()+"::"+jwtinfo.getMemId()+"::IAT::"+issuedAtStr+"::EAT::"+expirationStr); + + return Jwts.builder() + .setClaims(claims) + .setIssuedAt(issuedAt) + .setExpiration(expiration) + .signWith(getSigninKey(), SignatureAlgorithm.HS256) + .compact(); + } + + // 토큰 생성 + public String generateToken(JwtClame jwtinfo, int tokenValidationSec) { + Claims claims = Jwts.claims(); + claims.put("sidx", jwtinfo.getSiteIdx()); + claims.put("midx", jwtinfo.getMemIdx()); + claims.put("mid", jwtinfo.getMemId()); + claims.put("sid", jwtinfo.getSiteId()); + claims.put("type", jwtinfo.getType()); + claims.put("partnerLevel", jwtinfo.getPartnerLevel()); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + long currentTMS = System.currentTimeMillis(); + Date issuedAt = new Date(currentTMS); + String issuedAtStr = sdf.format(issuedAt); + Date expiration = new Date(currentTMS + (tokenValidationSec * 1000)); + String expirationStr = sdf.format(expiration); + + log.debug("[JwtManager.generateToken(jwtinfo, tokenValidationSec)] sid: " + jwtinfo.getSiteId() + ", sidx: " + jwtinfo.getSiteIdx()); + log.debug("[JwtManager.generateToken(jwtinfo, tokenValidationSec)] mid: " + jwtinfo.getMemId() + ", midx: " + jwtinfo.getMemIdx()); + log.debug("[JwtManager.generateToken(jwtinfo, tokenValidationSec)] IAT: " + issuedAtStr); + log.debug("[JwtManager.generateToken(jwtinfo, tokenValidationSec)] EAT: " + expirationStr); + log.info("#-JwtManager::generateToken::user::"+jwtinfo.getSiteId()+"::"+jwtinfo.getMemId()+"::IAT::"+issuedAtStr+"::EAT::"+expirationStr); + + return Jwts.builder() + .setClaims(claims) + .setIssuedAt(issuedAt) + .setExpiration(expiration) + .signWith(getSigninKey(), SignatureAlgorithm.HS256) + .compact(); + } + + // 토큰 정보 리턴 + public TokenInfo getTokenInfo(String token) { + Claims body = getClaims(token); + Set keySet = body.keySet(); + for (String s : keySet) { + // log.info("s = " + s); + } + + Integer sidx = body.get("sidx", Integer.class); + Integer midx = body.get("midx", Integer.class); + String mid = body.get("mid", String.class); + String sid = body.get("sid", String.class); + String type = body.get("type", String.class); + String partnerLevel = body.get("partnerLevel", String.class); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + Date issuedAt = body.getIssuedAt(); + String issuedAtStr = sdf.format(issuedAt); + Date expiration = body.getExpiration(); + String expirationStr = sdf.format(expiration); + + log.debug("[JwtManager.getTokenInfo(token)] sid: " + sid + ", sidx: " + sidx); + log.debug("[JwtManager.getTokenInfo(token)] mid: " + mid + ", midx: " + midx); + log.debug("[JwtManager.getTokenInfo(token)] IAT: " + issuedAtStr); + log.debug("[JwtManager.getTokenInfo(token)] EAT: " + expirationStr); + log.debug("#-JwtManager::generateToken::admin::"+sid+"::"+mid+"::IAT::"+issuedAtStr+"::EAT::"+expirationStr); + + return new TokenInfo(sidx, midx, sid, mid, type, partnerLevel, issuedAt, expiration); + } + + // 토큰정보 해석 + private Claims getClaims(String token) { + Claims body = Jwts.parserBuilder() + .setSigningKey(getSigninKey()) + .build() + .parseClaimsJws(token) + .getBody(); + return body; + } + + + @Getter + public class TokenInfo { + private Integer sidx; + private Integer midx; + private String mid; + private String sid; + private String type; + private String partnerLevel; + private Date issuedAt; + private Date expire; + + public TokenInfo(Integer sidx, Integer midx, String sid, String mid, String type, String partnerLevel, Date issuedAt, Date expire) { + this.sidx = sidx; + this.midx = midx; + this.sid = sid; + this.mid = mid; + this.type = type; + this.partnerLevel = partnerLevel; + this.issuedAt = issuedAt; + this.expire = expire; + } + + @Override + public String toString() { + return "TokenInfo [sidx=" + sidx + ", midx=" + midx + ", mid=" + mid + ", sid=" + sid + ", type=" + type + + ", partnerLevel=" + partnerLevel + ", issuedAt=" + issuedAt + ", expire=" + expire + "]"; + } + + } +} diff --git a/src/main/java/com/bb/model/Admin.java b/src/main/java/com/bb/model/Admin.java new file mode 100644 index 0000000..de521d7 --- /dev/null +++ b/src/main/java/com/bb/model/Admin.java @@ -0,0 +1,17 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class Admin { + private Integer siteIdx; + private String siteId; + private String adminId; + private String adminName; + private String adminPass; + private String adminOtp; + private String loginYn; + private String regDate; + private String regId; + private String delYn; +} diff --git a/src/main/java/com/bb/model/AdminBetSearch.java b/src/main/java/com/bb/model/AdminBetSearch.java new file mode 100644 index 0000000..063eee2 --- /dev/null +++ b/src/main/java/com/bb/model/AdminBetSearch.java @@ -0,0 +1,20 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class AdminBetSearch extends PageFormVO { + + private String betId; + private String siteId; + private String idType; + private String memId; + private String gameCategory; + private String isBlankSpinYn; + private String startDate; + private String endDate; + private String orderColumn; + private String orderType; + private String oldYn; + +} diff --git a/src/main/java/com/bb/model/AdminCashSearch.java b/src/main/java/com/bb/model/AdminCashSearch.java new file mode 100644 index 0000000..fa699dc --- /dev/null +++ b/src/main/java/com/bb/model/AdminCashSearch.java @@ -0,0 +1,17 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class AdminCashSearch extends PageFormVO { + + private int idx; + private String siteId; + private String memId; + private String searchType; // "cash", "point" + private String userType; // "N"(일반회원), "P"(파트너), ""(전체) + private String listType; // "2", "-2" + private String startDate; + private String endDate; + private String oldYn; +} diff --git a/src/main/java/com/bb/model/AdminIp.java b/src/main/java/com/bb/model/AdminIp.java new file mode 100644 index 0000000..848fcc3 --- /dev/null +++ b/src/main/java/com/bb/model/AdminIp.java @@ -0,0 +1,12 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class AdminIp { + private String siteId; + private String adminId; + private String ip; + private String regId; + private String delYn; +} diff --git a/src/main/java/com/bb/model/AdminLogSearch.java b/src/main/java/com/bb/model/AdminLogSearch.java new file mode 100644 index 0000000..d08dfbe --- /dev/null +++ b/src/main/java/com/bb/model/AdminLogSearch.java @@ -0,0 +1,14 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class AdminLogSearch extends PageFormVO{ + private String siteId; + private String adminId; + private String logType; + private String startDate; + private String endDate; + private String regIp; + +} diff --git a/src/main/java/com/bb/model/AdminSearch.java b/src/main/java/com/bb/model/AdminSearch.java new file mode 100644 index 0000000..64b29cd --- /dev/null +++ b/src/main/java/com/bb/model/AdminSearch.java @@ -0,0 +1,22 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class AdminSearch extends PageFormVO { + private String siteId; + private String adminId; + private String adminPass; + private String adminGroup; + private String ip; + private String regId; + private String status; + private String useYn; + private String delYn; + private String regDate; + + private String startDate; + private String endDate; + private String adminName; + +} diff --git a/src/main/java/com/bb/model/AdminTokenInfo.java b/src/main/java/com/bb/model/AdminTokenInfo.java new file mode 100644 index 0000000..87717c5 --- /dev/null +++ b/src/main/java/com/bb/model/AdminTokenInfo.java @@ -0,0 +1,10 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class AdminTokenInfo { + private String siteId; + private String adminId; + private String token; +} diff --git a/src/main/java/com/bb/model/AnswerVo.java b/src/main/java/com/bb/model/AnswerVo.java new file mode 100644 index 0000000..3dc9224 --- /dev/null +++ b/src/main/java/com/bb/model/AnswerVo.java @@ -0,0 +1,15 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class AnswerVo { + + private Integer idx; + private String siteId; + private String answerType; + private String title; + private String answer; + private String useYn; + private String regDate; +} diff --git a/src/main/java/com/bb/model/ApiResponse.java b/src/main/java/com/bb/model/ApiResponse.java new file mode 100644 index 0000000..78c6d43 --- /dev/null +++ b/src/main/java/com/bb/model/ApiResponse.java @@ -0,0 +1,104 @@ +package com.bb.model; + +import com.bb.exception.ApiException; +import com.bb.exception.RequestParameterApiException; +import com.bb.util.StringUtils; +import com.fasterxml.jackson.annotation.JsonInclude; + + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import java.util.HashMap; +import java.util.Map; + + +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +public class ApiResponse { + /** 결과 코드 */ + private String resultCode; + /** 결과 메시지 */ + private String resultMessage; + /** 데이터 */ + private Map data; + + /** + * 데이터 추가 + * @param key + * @param value + */ + public void put(String key, Object value) { + if(this.data == null) { + this.data = new HashMap<>(); + } + + this.data.put(key, value); + } + + /** + * 성공상태 설정 + */ + public void success() { + this.setResultCode("0"); + this.setResultMessage("SUCC"); + } + + /** + * 실패상태 설정 + */ + public void fail() { + this.setResultCode("9999"); + this.setResultMessage("FAIL"); + } + + /** + * 필수 파라미터 검증 + * @param value + * @param paramName + * @throws ApiException + */ + public static void require(Object value, String paramName) throws ApiException { + String stringValue = (value == null) ? null : String.valueOf(value); + + if(StringUtils.isEmpty(stringValue)) { + throw new RequestParameterApiException( paramName); + } + } + + /** + * 파라미터 조건 검증 + * @param condition + * @param message + * @throws ApiException + */ + public static void then( boolean condition, String message ) throws ApiException { + if( condition ) { + throw new ApiException( message ); + } + } + + /** + * 파라미터가 특정 목록에 포함되어 있는지 검증 + * @param param + * @param paramName + * @param values + * @throws ApiException + */ + public static void notMatched( Object param, String paramName, Object... values ) throws ApiException { + boolean matched = false; + + for( Object value : values ) { + if( param.equals( value ) ) { + matched = true; + break; + } + } + + if( !matched ) { + throw new ApiException( "유효하지 않은 파라미터 : " + paramName ); + } + } + +} diff --git a/src/main/java/com/bb/model/ApiVendorCompInfo.java b/src/main/java/com/bb/model/ApiVendorCompInfo.java new file mode 100644 index 0000000..43f0991 --- /dev/null +++ b/src/main/java/com/bb/model/ApiVendorCompInfo.java @@ -0,0 +1,20 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class ApiVendorCompInfo { + + private String apiVendorCode; + private String siteIdxHex; + private String siteId; + private String type; + private String apiUrl; + private String clientId; + private String clientSecretKey; + private String callBackUrl; + private String cronRunYn; + private String changeCashYn; + private String language; + private String cashDecimal; +} diff --git a/src/main/java/com/bb/model/As.java b/src/main/java/com/bb/model/As.java new file mode 100644 index 0000000..954c590 --- /dev/null +++ b/src/main/java/com/bb/model/As.java @@ -0,0 +1,20 @@ +package com.bb.model; + +import java.util.List; + +import lombok.Data; + + +@Data +public class As { + + private String siteId; + private String asIdx; + private String title; + private String content; + private String startDate; + private String endDate; + private String autoYn; + private String useYn; +} + diff --git a/src/main/java/com/bb/model/Bank.java b/src/main/java/com/bb/model/Bank.java new file mode 100644 index 0000000..32fe582 --- /dev/null +++ b/src/main/java/com/bb/model/Bank.java @@ -0,0 +1,18 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class Bank { + private String siteId; + private String bankCode; + private String bankNameKr; + private String bankNameEn; + private String bankDomain; + private String bankImg; + private String useYn; + private String delYn; + private String inspectTimeStart; + private String inspectTimeEnd; + +} diff --git a/src/main/java/com/bb/model/Banner.java b/src/main/java/com/bb/model/Banner.java new file mode 100644 index 0000000..63e5b5a --- /dev/null +++ b/src/main/java/com/bb/model/Banner.java @@ -0,0 +1,20 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class Banner { + + private int bannerIdx; + private String siteId; + private String bannerTitle; + private String bannerImg; + private String bannerType; + private String domain; + private String bannerPosition; + private String delYn; + private String loginYn; + private String bannerContent; + + +} diff --git a/src/main/java/com/bb/model/BetAutoLoseVO.java b/src/main/java/com/bb/model/BetAutoLoseVO.java new file mode 100644 index 0000000..dbcd7e9 --- /dev/null +++ b/src/main/java/com/bb/model/BetAutoLoseVO.java @@ -0,0 +1,13 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class BetAutoLoseVO { + + private String betId; + private Long betIdx; + private String gameCategory; + private String afMoney; + +} diff --git a/src/main/java/com/bb/model/BetBiPushDetailVO.java b/src/main/java/com/bb/model/BetBiPushDetailVO.java new file mode 100644 index 0000000..09578b8 --- /dev/null +++ b/src/main/java/com/bb/model/BetBiPushDetailVO.java @@ -0,0 +1,14 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class BetBiPushDetailVO { + + private long betIdx; + private int yBiBetAmt; + private int yBiBetWinAmt; + private int nBiBetAmt; + private int nBiBetWinAmt; + private String detailJson; +} diff --git a/src/main/java/com/bb/model/BetData.java b/src/main/java/com/bb/model/BetData.java new file mode 100644 index 0000000..b803e4a --- /dev/null +++ b/src/main/java/com/bb/model/BetData.java @@ -0,0 +1,39 @@ +package com.bb.model; + +import java.util.HashMap; +import java.util.List; + +import lombok.Data; + +@Data +public class BetData { + private String siteId; + private long betAmt; + private String groupCode; + private String gameType; + private String betRate; + private String gameRound; + private List> betGameInfo; + List options; + +} + +/*{ + "betAmt": 5000, + "betGameInfo": [ + { + "noe": "", + "poe": "", + "narea": "s", + "ncoe": "eo", + "ncarea": "om", + "pnum": 4, + "parea": "", + "pcoeuo": "eu" + } + ], + "groupCode": "minigame", + "gameType": "powerball", + "betRate": "1495.29" +} +*/ diff --git a/src/main/java/com/bb/model/BetDetail.java b/src/main/java/com/bb/model/BetDetail.java new file mode 100644 index 0000000..6cd8c2d --- /dev/null +++ b/src/main/java/com/bb/model/BetDetail.java @@ -0,0 +1,34 @@ + +package com.bb.model; + +import lombok.Data; + +@Data +public class BetDetail { + private int betIdx; + private String siteId; + private String memId; + private String betType; + private String gameCategory; + private String vendorCode; + private String vendorName; + private String vendor; + private String betAmt; + private String betRate; + private String betWinAmt; + private String betBonus; + private String betCnt; + private String betResults; + private String betStatus; + private String type; + private String bfMoney; + private String afMoney; + private String updDate; + private String regDate; + private String gameIdx; + private String gameType; + private String gameName; + private String betValue; + private String betData; + private String isBlankSpinYn; +} diff --git a/src/main/java/com/bb/model/BetSearch.java b/src/main/java/com/bb/model/BetSearch.java new file mode 100644 index 0000000..3a6a401 --- /dev/null +++ b/src/main/java/com/bb/model/BetSearch.java @@ -0,0 +1,26 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class BetSearch extends PageFormVO { + + private String siteId; + private String memId; + private String recommenderId; + private String idType; + private String vendorCode; + private String vendor; + private String gameCategory; + private String isBlankSpinYn; + private String startDate; + private String endDate; + private String oldYn; + private Long betIdx; + private String betId; + private String betType; + private String orderColumn; + private String orderType; + private String blankSpinSetType; + +} diff --git a/src/main/java/com/bb/model/BetSplusSearch.java b/src/main/java/com/bb/model/BetSplusSearch.java new file mode 100644 index 0000000..1c4a87c --- /dev/null +++ b/src/main/java/com/bb/model/BetSplusSearch.java @@ -0,0 +1,22 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class BetSplusSearch extends PageFormVO { + private String siteId; + private String recommenderId; + private String memId; + private Integer branchID; + private String startDate; + private String endDate; + private String oldYn; + private Long betIdx; + private String betId; + private String orderColumn; + private String orderType; + private Integer lineTypeID; + private Long newMasterEventID; + private Long newEventID; + private String blankSpinSetType; +} diff --git a/src/main/java/com/bb/model/BiSubPointRateVo.java b/src/main/java/com/bb/model/BiSubPointRateVo.java new file mode 100644 index 0000000..821be4e --- /dev/null +++ b/src/main/java/com/bb/model/BiSubPointRateVo.java @@ -0,0 +1,14 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class BiSubPointRateVo { + + private String siteId; + private String topCompId; + private String gameType; + private String vendorCode; + private String compBetYn; + private String biSubPointRate; +} diff --git a/src/main/java/com/bb/model/BlankSpinRate.java b/src/main/java/com/bb/model/BlankSpinRate.java new file mode 100644 index 0000000..114170d --- /dev/null +++ b/src/main/java/com/bb/model/BlankSpinRate.java @@ -0,0 +1,19 @@ +package com.bb.model; + +import jakarta.validation.constraints.NotEmpty; + +import com.sun.istack.NotNull; + +import lombok.Data; + +@Data +public class BlankSpinRate { + + private String siteId; + @NotEmpty + private String memId; + @NotNull + private Integer blankSpinCasinoRate; + @NotNull + private Integer blankSpinSlotRate; +} diff --git a/src/main/java/com/bb/model/Block.java b/src/main/java/com/bb/model/Block.java new file mode 100644 index 0000000..a119b8a --- /dev/null +++ b/src/main/java/com/bb/model/Block.java @@ -0,0 +1,16 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class Block { + + private int blockIdx; + private String siteId; + private String blockType; + private String blockTarget; + private int blockTerm; + private String delYn; + private String regDate; + private String regId; +} diff --git a/src/main/java/com/bb/model/BlockSearch.java b/src/main/java/com/bb/model/BlockSearch.java new file mode 100644 index 0000000..7b353ea --- /dev/null +++ b/src/main/java/com/bb/model/BlockSearch.java @@ -0,0 +1,17 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class BlockSearch extends PageFormVO { + + private int blockIdx; + private String siteId; + private String blockType; + private String blockTarget; + private String blockTerm; + private String delYn; + private String startDate; + private String endDate; + private String regId; +} diff --git a/src/main/java/com/bb/model/Board.java b/src/main/java/com/bb/model/Board.java new file mode 100644 index 0000000..f52da60 --- /dev/null +++ b/src/main/java/com/bb/model/Board.java @@ -0,0 +1,40 @@ +package com.bb.model; + +import java.util.HashMap; +import java.util.List; + +import lombok.Data; + +@Data +public class Board { + + private Integer boardIdx; + private String siteId; + private String boardType; + private String boardTypeName; + private String category; + private String categoryName; + private String title; + private String content; + private int viewCnt; + private String status; + private String isReadAdmin; + private String isReadUser; + private String memName; + private String memNick; + private String memLevel; + private String partnerLevel; + private String recommenderId; + private String memo; + private String delYn; + private String bettinginfo; + private String isTop; + private String faqType; + private String viewYn; + private String regId; + private String regDate; + private String updDate; + private String isNew; + List comment; + private List> topUserList; +} diff --git a/src/main/java/com/bb/model/BoardListSearch.java b/src/main/java/com/bb/model/BoardListSearch.java new file mode 100644 index 0000000..9a550fc --- /dev/null +++ b/src/main/java/com/bb/model/BoardListSearch.java @@ -0,0 +1,21 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class BoardListSearch extends PageFormVO { + + + private String siteId; + private String boardType; + private String category; + private String faqType; + private String searchOption; + private String searchValue; + private String memId; + private String startDate; + private String endDate; + private String viewYn; + private String isUser; + +} diff --git a/src/main/java/com/bb/model/BotMemRate.java b/src/main/java/com/bb/model/BotMemRate.java new file mode 100644 index 0000000..5d5e32b --- /dev/null +++ b/src/main/java/com/bb/model/BotMemRate.java @@ -0,0 +1,13 @@ +package com.bb.model; + +import java.util.List; + +import lombok.Data; + +@Data +public class BotMemRate { + + private String siteId; + private String memId; + private List rateList; +} diff --git a/src/main/java/com/bb/model/BotMemRateVo.java b/src/main/java/com/bb/model/BotMemRateVo.java new file mode 100644 index 0000000..a637384 --- /dev/null +++ b/src/main/java/com/bb/model/BotMemRateVo.java @@ -0,0 +1,51 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class BotMemRateVo { + + private String siteId; + private String memId; + private String memNick; + + private String maxCasinoPR; + private String casinoPR; + private String minCasinoPR; + + private String maxHcasinoPR; + private String hcasinoPR; + private String minHcasinoPR; + + private String maxSlotPR; + private String slotPR; + private String minSlotPR; + + private String maxMiniPR; + private String miniPR; + private String minMiniPR; + + private String maxSportPR; + private String sportPR; + private String minSportPR; + + private String maxCasinoLR; + private String casinoLR; + private String minCasinoLR; + + private String maxHcasinoLR; + private String hcasinoLR; + private String minHcasinoLR; + + private String maxSlotLR; + private String slotLR; + private String minSlotLR; + + private String maxMiniLR; + private String miniLR; + private String minMiniLR; + + private String maxSportLR; + private String sportLR; + private String minSportLR; +} diff --git a/src/main/java/com/bb/model/Cash.java b/src/main/java/com/bb/model/Cash.java new file mode 100644 index 0000000..83da2cb --- /dev/null +++ b/src/main/java/com/bb/model/Cash.java @@ -0,0 +1,33 @@ +package com.bb.model; + +import jakarta.validation.constraints.NotBlank; + +import lombok.Data; + +@Data +public class Cash { + + private String siteId; + private String adminId; + @NotBlank + private String memId; + + @NotBlank + private String cashType; + + @NotBlank + private String cashStatus; + + @NotBlank + private Integer cashAmt; + + private String cashOutPass; + + private String symbol; + private String exchangeRate; + private String amount; + + private String bonusCode; + +} + diff --git a/src/main/java/com/bb/model/CashDetail.java b/src/main/java/com/bb/model/CashDetail.java new file mode 100644 index 0000000..5739855 --- /dev/null +++ b/src/main/java/com/bb/model/CashDetail.java @@ -0,0 +1,33 @@ +package com.bb.model; + +import lombok.Data; + +import java.util.HashMap; +import java.util.List; + +@Data +public class CashDetail extends Cash { + + + private String siteId; + private String cashDesc; + private String betIdx; + private long cashIdx; + private Long refIdx; + private String delYn; + private String regId; + private String updDate; + private String regDate; + private String adminId; + private String memo; + private String preCashAmt; + private String bank; + private String bankacc; + private String memName; + private String memNick; + private String memPhone; + private String partnerLevel; + private String partnerLevelName; + private int waitTime; + private List> topUserList; +} diff --git a/src/main/java/com/bb/model/CashIn.java b/src/main/java/com/bb/model/CashIn.java new file mode 100644 index 0000000..03a861d --- /dev/null +++ b/src/main/java/com/bb/model/CashIn.java @@ -0,0 +1,21 @@ +package com.bb.model; + +import jakarta.validation.constraints.NotBlank; + +import lombok.Data; + +@Data +public class CashIn extends Site { + + @NotBlank + private String memId; + + private String inBonusYn; + + @NotBlank + private Integer inAmt; + + + private String memo; + private String type; +} diff --git a/src/main/java/com/bb/model/CashOut.java b/src/main/java/com/bb/model/CashOut.java new file mode 100644 index 0000000..9b21b7c --- /dev/null +++ b/src/main/java/com/bb/model/CashOut.java @@ -0,0 +1,23 @@ +package com.bb.model; + +import jakarta.validation.constraints.NotBlank; + +import lombok.Data; + +@Data +public class CashOut extends Site { + + @NotBlank + private String memId; + + + private String bonusRollingYn; + + @NotBlank + private Integer outAmt; + + + private String cashOutPass; + private String memo; + private String type; +} diff --git a/src/main/java/com/bb/model/CashQueVO.java b/src/main/java/com/bb/model/CashQueVO.java new file mode 100644 index 0000000..8f78231 --- /dev/null +++ b/src/main/java/com/bb/model/CashQueVO.java @@ -0,0 +1,19 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class CashQueVO { + + private Long cashIdx; + private String siteId; + private String memId; + private String cashType; + private String cashStatus; + private String cashAmt; + private String targetId; + private String preCashAmt; + private String regDate; + private String updDate; + private int refCnt; +} diff --git a/src/main/java/com/bb/model/CashSearch.java b/src/main/java/com/bb/model/CashSearch.java new file mode 100644 index 0000000..d65b995 --- /dev/null +++ b/src/main/java/com/bb/model/CashSearch.java @@ -0,0 +1,34 @@ +package com.bb.model; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; + +import lombok.Data; + +@Data +public class CashSearch extends PageFormVO { + + + private int cashIdx; + private String siteId; + private String memId; + private String memNick; + private String recommenderId; + private String userType; + + @NotBlank + private String cashType; + private String cashStatus; + private String startDate; + private String endDate; + private String memStatus; + private String isFront; + + private String topMemId; +// private String botMemId; + private String topMemNick; +// private String botMemNick; + + private String oldYn; + +} diff --git a/src/main/java/com/bb/model/CashStatus.java b/src/main/java/com/bb/model/CashStatus.java new file mode 100644 index 0000000..39278ea --- /dev/null +++ b/src/main/java/com/bb/model/CashStatus.java @@ -0,0 +1,17 @@ +package com.bb.model; + +import jakarta.validation.constraints.NotEmpty; + +import lombok.Data; + +@Data +public class CashStatus{ + + @NotEmpty + private long cashIdx; + @NotEmpty + private String cashStatus; + private String memo; + private String siteId; + +} diff --git a/src/main/java/com/bb/model/CashTranLogSrch.java b/src/main/java/com/bb/model/CashTranLogSrch.java new file mode 100644 index 0000000..e8ee367 --- /dev/null +++ b/src/main/java/com/bb/model/CashTranLogSrch.java @@ -0,0 +1,17 @@ +package com.bb.model; + +import java.util.List; + +import lombok.Data; + +@Data +public class CashTranLogSrch extends PageFormVO { + + private String siteId; + private String recommenderId; + private String memId; + private List cashTypeList; + private String startDate; + private String endDate; + private String oldYn; +} diff --git a/src/main/java/com/bb/model/CategoryRate.java b/src/main/java/com/bb/model/CategoryRate.java new file mode 100644 index 0000000..8e6352c --- /dev/null +++ b/src/main/java/com/bb/model/CategoryRate.java @@ -0,0 +1,13 @@ +package com.bb.model; + +import java.util.List; + +import lombok.Data; + +@Data +public class CategoryRate { + + private String siteId; + private String memId; + private List rateList; +} diff --git a/src/main/java/com/bb/model/CategoryRateVo.java b/src/main/java/com/bb/model/CategoryRateVo.java new file mode 100644 index 0000000..14fa8bd --- /dev/null +++ b/src/main/java/com/bb/model/CategoryRateVo.java @@ -0,0 +1,18 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class CategoryRateVo { + + private String siteId; + private String memId; + private String memNick; + private String category; + private String maxPointRate; + private String pointRate; + private String minPointRate; + private String maxLoseRate; + private String loseRate; + private String minLoseRate; +} diff --git a/src/main/java/com/bb/model/ChargingPointSettingVO.java b/src/main/java/com/bb/model/ChargingPointSettingVO.java new file mode 100644 index 0000000..24eee05 --- /dev/null +++ b/src/main/java/com/bb/model/ChargingPointSettingVO.java @@ -0,0 +1,24 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class ChargingPointSettingVO { + private Integer siteIdx; + private Integer memIdx; + private String siteId; + private String memId; + private String memLevel; + private String memLevelName; + private Integer fstChrgByJoinFlag; + private Integer fstChrgByJoinRate; + private Integer fstChrgByDailyRate; + private Integer fstChrgByEveryTimeRate; + private Integer bonusLimit; + private Integer folderCountLimit; + private String useAutoLevelUp; + private Integer autoLvBetAmt; + private Integer autoLvCashIn; + private String regDate; + private String updDate; +} diff --git a/src/main/java/com/bb/model/Code.java b/src/main/java/com/bb/model/Code.java new file mode 100644 index 0000000..c645e2f --- /dev/null +++ b/src/main/java/com/bb/model/Code.java @@ -0,0 +1,16 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class Code { + + private String masterCode; + private String groupCode; + private String groupCodeName; + private String code; + private String codeName; + private int ord; + private String useYn; + +} diff --git a/src/main/java/com/bb/model/CodeSearch.java b/src/main/java/com/bb/model/CodeSearch.java new file mode 100644 index 0000000..f8ee3d7 --- /dev/null +++ b/src/main/java/com/bb/model/CodeSearch.java @@ -0,0 +1,26 @@ +package com.bb.model; + +import jakarta.validation.constraints.NotEmpty; + +import lombok.Data; + + + +@Data +public class CodeSearch { + + @NotEmpty + private String masterCode; + private String groupCode; + private String code; + private Integer ord; + private Integer kgonCode; + private String kgonLobby; + private Integer tripleCode; + private String tripleLobby; + private String sdApiVendor; + private String sdApiLobby; + private Integer sdApiCode; + private String siteId; + +} diff --git a/src/main/java/com/bb/model/Comment.java b/src/main/java/com/bb/model/Comment.java new file mode 100644 index 0000000..230857b --- /dev/null +++ b/src/main/java/com/bb/model/Comment.java @@ -0,0 +1,25 @@ +package com.bb.model; + +import java.util.HashMap; +import java.util.List; + +import lombok.Data; + +@Data +public class Comment { + + private Integer cmtIdx; + private Integer boardIdx; + private String cmtType; + private String content; + private String regId; + private String memName; + private String memNick; + private String regDate; + private String updDate; + private String delYn; + List comment; + + +} + diff --git a/src/main/java/com/bb/model/CompDetail.java b/src/main/java/com/bb/model/CompDetail.java new file mode 100644 index 0000000..ca7e35b --- /dev/null +++ b/src/main/java/com/bb/model/CompDetail.java @@ -0,0 +1,20 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class CompDetail extends Member { + + private String creditAmt; + private String creditAmtHoldem; + private String creditSubPoint; + private Long calculateIdx; + private String insuredAmt; + private String insuredSubPoint; + private String insuredUpYn; + private String siteDomain; + private int totalMemCnt; + private long totalCashAmt; + private long totalPointAmt; + +} diff --git a/src/main/java/com/bb/model/CompResetInfo.java b/src/main/java/com/bb/model/CompResetInfo.java new file mode 100644 index 0000000..1a61d96 --- /dev/null +++ b/src/main/java/com/bb/model/CompResetInfo.java @@ -0,0 +1,13 @@ +package com.bb.model; + +import java.util.List; + +import lombok.Data; + +@Data +public class CompResetInfo { + + private String siteId; + private String memIds; + private List memIdList; +} diff --git a/src/main/java/com/bb/model/CompSearch.java b/src/main/java/com/bb/model/CompSearch.java new file mode 100644 index 0000000..eff4bf7 --- /dev/null +++ b/src/main/java/com/bb/model/CompSearch.java @@ -0,0 +1,10 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class CompSearch { + + private String siteId; + +} diff --git a/src/main/java/com/bb/model/CouponSearch.java b/src/main/java/com/bb/model/CouponSearch.java new file mode 100644 index 0000000..96be6d9 --- /dev/null +++ b/src/main/java/com/bb/model/CouponSearch.java @@ -0,0 +1,17 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class CouponSearch extends PageFormVO { + + private String siteId; + private String memId; + private String memNick; + private String cashAmt; + private String couponStatus; + private String couponNumber; + private String createAdmin; + private String startDate; + private String endDate; +} diff --git a/src/main/java/com/bb/model/CouponVO.java b/src/main/java/com/bb/model/CouponVO.java new file mode 100644 index 0000000..52336eb --- /dev/null +++ b/src/main/java/com/bb/model/CouponVO.java @@ -0,0 +1,21 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class CouponVO { + + private String siteId; + private String memId; + private String couponNumber; + private Long cashIdx; + private String cashAmt; + private String couponDesc; + private String couponStatus; + private String createAdmin; + private String createAt; + private String usedAt; + private String apprAdmin; + private String apprAt; + private String endAt; +} diff --git a/src/main/java/com/bb/model/CreditReportSearch.java b/src/main/java/com/bb/model/CreditReportSearch.java new file mode 100644 index 0000000..74f1142 --- /dev/null +++ b/src/main/java/com/bb/model/CreditReportSearch.java @@ -0,0 +1,11 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class CreditReportSearch { + + private String siteId; + private String startDate; + private String endDate; +} diff --git a/src/main/java/com/bb/model/CronServerInfo.java b/src/main/java/com/bb/model/CronServerInfo.java new file mode 100644 index 0000000..cd1a314 --- /dev/null +++ b/src/main/java/com/bb/model/CronServerInfo.java @@ -0,0 +1,16 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class CronServerInfo { + + private String hostName; + private String ipAddress; + private String cronType; + private String serverName; + private String runYn; + private String regDate; + private String updDate; + +} diff --git a/src/main/java/com/bb/model/DailyReportSearch.java b/src/main/java/com/bb/model/DailyReportSearch.java new file mode 100644 index 0000000..d9b6687 --- /dev/null +++ b/src/main/java/com/bb/model/DailyReportSearch.java @@ -0,0 +1,18 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class DailyReportSearch extends PageFormVO { + + private String siteId; + private String memId; + private String searchType; + private String searchMemId; + private String searchRecommandId; + private String chkTodayYn; + private String startDate; + private String endDate; + private String orderStr; + private String blankSpinSetType; +} diff --git a/src/main/java/com/bb/model/DashInfo.java b/src/main/java/com/bb/model/DashInfo.java new file mode 100644 index 0000000..3c5bd10 --- /dev/null +++ b/src/main/java/com/bb/model/DashInfo.java @@ -0,0 +1,19 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class DashInfo { + + private String days; + private String siteId; + private String dayType; + private String inCashAmt; + private String outCashAmt; + private String beneAmt; + private String betAmt; + private String winAmt; + private String winLoseAmt; + private String memJoinCnt; + private String betCnt; +} diff --git a/src/main/java/com/bb/model/DayilPartnerReport.java b/src/main/java/com/bb/model/DayilPartnerReport.java new file mode 100644 index 0000000..382b148 --- /dev/null +++ b/src/main/java/com/bb/model/DayilPartnerReport.java @@ -0,0 +1,43 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class DayilPartnerReport { + + private String days; + private String siteId; + private String partnerId; + + private Integer cashAmt; + private Integer cashIn; + private Integer cashOut; + private Integer cashResult; + private Integer couponCash; + + private Integer allBetAmt; + private Integer allWinAmt; + private Integer allRolling; + private Integer allResult; + + private Integer casinoBetAmt; + private Integer casinoWinAmt; + private Integer casinoRolling; + private Integer casinoResult; + + private Integer slotBetAmt; + private Integer slotWinAmt; + private Integer slotRolling; + private Integer slotResult; + + private Integer sportBetAmt; + private Integer sportWinAmt; + private Integer sportRolling; + private Integer sportResult; + + private Integer miniBetAmt; + private Integer miniWinAmt; + private Integer miniRolling; + private Integer miniResult; + +} diff --git a/src/main/java/com/bb/model/DayilPeriodicReports.java b/src/main/java/com/bb/model/DayilPeriodicReports.java new file mode 100644 index 0000000..8fe1341 --- /dev/null +++ b/src/main/java/com/bb/model/DayilPeriodicReports.java @@ -0,0 +1,75 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class DayilPeriodicReports { + + private String siteId; + private String memId; + private String memNick; + private String partnerLevel; + private String cntBottom; + private String cntPartner; + private String casinoRate; + private String slotRate; + private String miniRate; + private String sportRate; + private String casinoLoseRate; + private String slotLoseRate; + private String miniLoseRate; + private String sportLoseRate; + private String cashAmt; + private String pointAmt; + private String botCashAmt; + private String botPointAmt; + private String userPayment; + private String userPayback; + private String partnerResultAmt; + private String adminPayment; + private String adminPayback; + private String adminResultAmt; + private String userCashIn; + private String userCashOut; + private String userCashResultAmt; + private String dCouponCash; + private String betAmt; // 전체 + private String betAmtWin; // 전체 + private String betAmtBS; // 전체-공배팅 + private String betAmtWinBS; // 전체-공배팅 + private String rollingAmt; + private String losingAmt; + private String myLosingAmt; + private String betResultAmt; // 전체 + private String betResultAmtBS; // 전체-공배팅 + private String casinoBetAmt; // 전체 + private String casinoBetAmtWin; // 전체 + private String casinoBetAmtBS; // 전체-공배팅 + private String casinoBetAmtWinBS; // 전체-공배팅 + private String casinoRollingAmt; + private String casinoLosingAmt; + private String myCasinoLosingAmt; + private String casinoBetResultAmt; // 전체 + private String casinoBetResultAmtBS; // 전체-공배팅 + private String slotBetAmt; // 전체 + private String slotBetAmtWin; // 전체 + private String slotBetAmtBS; // 전체-공배팅 + private String slotBetAmtWinBS; // 전체-공배팅 + private String slotRollingAmt; + private String slotLosingAmt; + private String mySlotLosingAmt; + private String slotBetResultAmt; // 전체 + private String slotBetResultAmtBS; // 전체-공배팅 + private String miniBetAmt; + private String miniBetAmtWin; + private String miniRollingAmt; + private String miniLosingAmt; + private String myMiniLosingAmt; + private String miniBetResultAmt; + private String sportBetAmt; + private String sportBetAmtWin; + private String sportRollingAmt; + private String sportLosingAmt; + private String mySportLosingAmt; + private String sportBetResultAmt; +} diff --git a/src/main/java/com/bb/model/DomainPartnerVO.java b/src/main/java/com/bb/model/DomainPartnerVO.java new file mode 100644 index 0000000..929ea6c --- /dev/null +++ b/src/main/java/com/bb/model/DomainPartnerVO.java @@ -0,0 +1,13 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class DomainPartnerVO { + + private Integer siteIdx; + private String domain; + private String siteId; + private String memId; + private String useYn; +} diff --git a/src/main/java/com/bb/model/Etc.java b/src/main/java/com/bb/model/Etc.java new file mode 100644 index 0000000..930cc05 --- /dev/null +++ b/src/main/java/com/bb/model/Etc.java @@ -0,0 +1,12 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class Etc { + private String siteId; + private String memId; + private String yyyymm; + + +} diff --git a/src/main/java/com/bb/model/FrontSearch.java b/src/main/java/com/bb/model/FrontSearch.java new file mode 100644 index 0000000..130e9cc --- /dev/null +++ b/src/main/java/com/bb/model/FrontSearch.java @@ -0,0 +1,9 @@ +package com.bb.model; + + + +public class FrontSearch extends PageFormVO { + + + +} diff --git a/src/main/java/com/bb/model/GameCodeSearchVO.java b/src/main/java/com/bb/model/GameCodeSearchVO.java new file mode 100644 index 0000000..077d6e4 --- /dev/null +++ b/src/main/java/com/bb/model/GameCodeSearchVO.java @@ -0,0 +1,11 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class GameCodeSearchVO { + + private String groupCode; + private String orderName; + private String orderType; +} diff --git a/src/main/java/com/bb/model/GameCodeVO.java b/src/main/java/com/bb/model/GameCodeVO.java new file mode 100644 index 0000000..2cbef30 --- /dev/null +++ b/src/main/java/com/bb/model/GameCodeVO.java @@ -0,0 +1,26 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class GameCodeVO { + + private String groupCode; + private String groupCodeName; + private String groupCodeNameEN; + private String code; + private String codeName; + private String codeNameEN; + private Integer ord; + private String useYn; + private String kgonVendor; // nextVendor + private String kgonLobby; // nextLobby + private Integer kgonCode; // nextCode + private String tripleVendor; + private String tripleLobby; + private Integer tripleCode; + private String sdApiVendor; + private String sdApiLobby; + private Integer sdApiCode; + +} diff --git a/src/main/java/com/bb/model/GameDetails.java b/src/main/java/com/bb/model/GameDetails.java new file mode 100644 index 0000000..9fc2bfd --- /dev/null +++ b/src/main/java/com/bb/model/GameDetails.java @@ -0,0 +1,20 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class GameDetails { + + private String game_id; + private String game_code; + private String game_name; + private String table_id; + private String provider_id; + private String provider_name; + private String module_id; + private String game_image; + private String game_tag; + private String game_tag_image; + private String game_title_korean; + private String category; +} diff --git a/src/main/java/com/bb/model/GameSetting.java b/src/main/java/com/bb/model/GameSetting.java new file mode 100644 index 0000000..31a0161 --- /dev/null +++ b/src/main/java/com/bb/model/GameSetting.java @@ -0,0 +1,14 @@ +package com.bb.model; + +import java.util.List; + +import lombok.Data; + +@Data +public class GameSetting { + + private String siteId; + private String partnerType; + private String gameType; + private List settingItems; +} diff --git a/src/main/java/com/bb/model/GameSettingInfo.java b/src/main/java/com/bb/model/GameSettingInfo.java new file mode 100644 index 0000000..970efa0 --- /dev/null +++ b/src/main/java/com/bb/model/GameSettingInfo.java @@ -0,0 +1,18 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class GameSettingInfo { + + private String siteId; + private String topCompId; + private String masterCode; + private String groupCode; + private String code; + private String pointRate; + private String compBetYn; + private String apiVendor; + private String superUseYn; + +} diff --git a/src/main/java/com/bb/model/GameSettingItem.java b/src/main/java/com/bb/model/GameSettingItem.java new file mode 100644 index 0000000..5d096a6 --- /dev/null +++ b/src/main/java/com/bb/model/GameSettingItem.java @@ -0,0 +1,17 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class GameSettingItem { + + private String siteId; + private String gameType; + private String vendorCode; + private String minBetAmt; + private String maxBetAmt; + private String compBetYn; + private String topInsureRate; + private String topCompId; + private String rollingRateOption; +} diff --git a/src/main/java/com/bb/model/GameUseInfo.java b/src/main/java/com/bb/model/GameUseInfo.java new file mode 100644 index 0000000..5ad9191 --- /dev/null +++ b/src/main/java/com/bb/model/GameUseInfo.java @@ -0,0 +1,13 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class GameUseInfo { + + private String siteId; + private String gameCode; + private String gameGroupCode; + private String useYn; + +} diff --git a/src/main/java/com/bb/model/GraphInfo.java b/src/main/java/com/bb/model/GraphInfo.java new file mode 100644 index 0000000..8648722 --- /dev/null +++ b/src/main/java/com/bb/model/GraphInfo.java @@ -0,0 +1,16 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class GraphInfo { + + private String days; + private String siteId; + private String inCashAmt; + private String outCashAmt; + private String betAmt; + private String winAmt; + private String cashAmt; + private String pointAmt; +} diff --git a/src/main/java/com/bb/model/IdListSearch.java b/src/main/java/com/bb/model/IdListSearch.java new file mode 100644 index 0000000..4129c70 --- /dev/null +++ b/src/main/java/com/bb/model/IdListSearch.java @@ -0,0 +1,11 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class IdListSearch extends PageFormVO { + + private String siteId; + private String tokenSId; + private String useUnderYn; +} diff --git a/src/main/java/com/bb/model/InChatMessageVO.java b/src/main/java/com/bb/model/InChatMessageVO.java new file mode 100644 index 0000000..fddf6fd --- /dev/null +++ b/src/main/java/com/bb/model/InChatMessageVO.java @@ -0,0 +1,39 @@ +package com.bb.model; + +public class InChatMessageVO { + + private String token; // 사용자 정보를 가져올 토큰 + private String content; // 메세지 내용 + private String type; // 채팅 타입 + private String chatId; // 채팅 고유 아이디 + + public String getToken() { + return token; + } + public void setToken(String token) { + this.token = token; + } + public String getContent() { + return content; + } + public void setContent(String content) { + this.content = content; + } + public String getType() { + return type; + } + public void setType(String type) { + this.type = type; + } + public String getChatId() { + return chatId; + } + public void setChatId(String chatId) { + this.chatId = chatId; + } + @Override + public String toString() { + return "InChatMessageVO [token=" + token + ", content=" + content + ", type=" + type + ", chatId=" + chatId + + "]"; + } +} diff --git a/src/main/java/com/bb/model/Inspect.java b/src/main/java/com/bb/model/Inspect.java new file mode 100644 index 0000000..215f36f --- /dev/null +++ b/src/main/java/com/bb/model/Inspect.java @@ -0,0 +1,17 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class Inspect { + + + private String siteId; + private int inspectIdx; + private String startDate; + private String endDate; + private String inspectType; + private String gameType; + private String memo; + +} diff --git a/src/main/java/com/bb/model/InspectSearch.java b/src/main/java/com/bb/model/InspectSearch.java new file mode 100644 index 0000000..38de7dc --- /dev/null +++ b/src/main/java/com/bb/model/InspectSearch.java @@ -0,0 +1,17 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class InspectSearch extends PageFormVO{ + + private String siteId; + private int inspectIdx; + private String startDate; + private String endDate; + private String inspectType; + private String gameType; + + + +} diff --git a/src/main/java/com/bb/model/LevelBank.java b/src/main/java/com/bb/model/LevelBank.java new file mode 100644 index 0000000..551efaa --- /dev/null +++ b/src/main/java/com/bb/model/LevelBank.java @@ -0,0 +1,13 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class LevelBank { + private String siteId; + private String level; + private String bankCode; + private String bankAcc; + private String useYn; + private String msg; +} diff --git a/src/main/java/com/bb/model/LevelBetLimit.java b/src/main/java/com/bb/model/LevelBetLimit.java new file mode 100644 index 0000000..0e7fd11 --- /dev/null +++ b/src/main/java/com/bb/model/LevelBetLimit.java @@ -0,0 +1,16 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class LevelBetLimit { + private String siteId; + private String memLevel; + private String gameCode; + private String betAmtMax; + private String betAmtMin; + private String betWinAmtMax; + private String betAmtMaxSlot; + private String betAmtMinSlot; + private String betWinAmtMaxSlot; +} diff --git a/src/main/java/com/bb/model/LevelDomain.java b/src/main/java/com/bb/model/LevelDomain.java new file mode 100644 index 0000000..35c734a --- /dev/null +++ b/src/main/java/com/bb/model/LevelDomain.java @@ -0,0 +1,12 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class LevelDomain { + private String siteId; + private String level; + private String domain; + private String useYn; + +} diff --git a/src/main/java/com/bb/model/LevelFailPoint.java b/src/main/java/com/bb/model/LevelFailPoint.java new file mode 100644 index 0000000..4a5b1fc --- /dev/null +++ b/src/main/java/com/bb/model/LevelFailPoint.java @@ -0,0 +1,13 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class LevelFailPoint { + private String siteId; + private String level; + private String gameCode; + private String folder; + private String pointRate; + private String useYn; +} diff --git a/src/main/java/com/bb/model/LevelOutPwd.java b/src/main/java/com/bb/model/LevelOutPwd.java new file mode 100644 index 0000000..e344733 --- /dev/null +++ b/src/main/java/com/bb/model/LevelOutPwd.java @@ -0,0 +1,11 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class LevelOutPwd { + private String siteId; + private String level; + private String cashOutPass; + private String useYn; +} diff --git a/src/main/java/com/bb/model/LoginUserVO.java b/src/main/java/com/bb/model/LoginUserVO.java new file mode 100644 index 0000000..e0c487b --- /dev/null +++ b/src/main/java/com/bb/model/LoginUserVO.java @@ -0,0 +1,35 @@ +package com.bb.model; + +import java.util.HashMap; +import java.util.List; + +import lombok.Data; + +@Data +public class LoginUserVO { + + private String siteId; + private String memId; + private String memNick; + private String pointRate; + private String loseRate; + private String loginDt; + private String cashAmt; + private String pointAmt; + private String betYn; + private String loginYn; + private String totalLoginCount; + private String partnerLevel; + private String partnerLevelName; + private String partnerLevelOrd; + private String loginIP; + private int sessionSecond; + private int actionType; + private String betData; + private String cashIn; + private String cashOut; + private String betAmt; + private String winAmt; + private String winLose; + private List> topUserList; +} diff --git a/src/main/java/com/bb/model/MemListSearchVO.java b/src/main/java/com/bb/model/MemListSearchVO.java new file mode 100644 index 0000000..cac7e3d --- /dev/null +++ b/src/main/java/com/bb/model/MemListSearchVO.java @@ -0,0 +1,27 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class MemListSearchVO extends PageFormVO { + + private String siteId; + private String treeUserId; // 회원 트리에서 선택된 회원 아이디 + private String treeOption; // 하부 옵션 [전체(""), 직하부("Y")] + private String userType; // 검색 회원유형 [전체(""), 일반회원("N"), 파트너("P")] + private String startDate; // 검색 가입일 [시작 날짜] + private String endDate; // 검색 가입일 [종료 날짜] + private String memId; // 검색 키워드 옵션 [아이디] + private String memNick; // 검색 키워드 옵션 [닉네임] + private String memName; // 검색 키워드 옵션 [예금주] + private String memPhone; // 검색 키워드 옵션 [전화번호] + + private String loginYn; // 로그인 옵션 [전체(""), 가능("Y"), 불가능("N")] + private String betYn; // 배팅 옵션 [전체(""), 가능("Y"), 불가능("N")] + private String memDelYn; // 삭제 옵션 [전체(""), 해당("Y"), 비해당("N")] + private String memBlackYn; // 블랙 옵션 [전체(""), 해당("Y"), 비해당("N")] + private String memLockYn; // 정지 옵션 [전체(""), 해당("Y"), 비해당("N")] + private String todayLoginYn; // 금일 로그인회원 옵션 [ON("Y"), OFF("N")] + + private String orderStr; // ID_DESC => memId DESC, ID_ASC => memId ASC +} diff --git a/src/main/java/com/bb/model/Member.java b/src/main/java/com/bb/model/Member.java new file mode 100644 index 0000000..5dc2993 --- /dev/null +++ b/src/main/java/com/bb/model/Member.java @@ -0,0 +1,88 @@ +package com.bb.model; + +import java.util.List; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; + +import org.springframework.validation.annotation.Validated; + +import lombok.Data; + +@Data +@Validated +public class Member extends Site { + + private Integer memIdx; + @NotBlank + @Size(max = 20) // 최대 길이 64 + private String memId; + private String partnerType; + + @NotBlank + private String memPass; + private String memName; + private String memNick; + private String memPhone; + private String memLevel; + private String partnerLevel; + private String nationCode; + private String partSendYn; + private String maxCredit; + private String creditRate; + private String creditStatus; + private String recommenderId; + private String firstBetConfYn; + private String commissionGroup; + private String membetType; + private String adminId; + private String regId; + private String regIp; + private String redDt; + private String updId; + private String updDt; + private String memStatus; + private String lastIp; + private String memo; + private String bank; + private String bankacc; + private String cashOutPass; + private String totalLoginCount; + private String totalBonusAmt; + private String totalCashInAmt; + private String totalCashOutAmt; + private String totalBetAmt; + private String totalBetWinAmt; + private String totalWlAmt; + private String gameMoney; + private int loginFailCnt; + private String loginYn; + private String betYn; + private String recommendYn; + private String memBlackYn; + private String memLockYn; + private String accInfoRequestYn; + private String sportsLevel; + private String casinoLevel; + private String slotLevel; + private String mgLevel; + private String pointExchangeYn; + private String memDelYn; + private String outAmtYn; + private String rollingYn; + private String retailPeriod; + private String retailType; + private String cashSendYn; + private String cashReceiveYn; + private String insuredYn; + private String insuredUpRate; + private String baseInsureBetAmt; + private Long gameUrlTimeout; + private int intervalTime; + private List memberBetLimit; + private List memberBurderRate; + private List memberCommissionRate; + private List memberDividendRateType; + + private String joinDomain; +} diff --git a/src/main/java/com/bb/model/MemberBetLimit.java b/src/main/java/com/bb/model/MemberBetLimit.java new file mode 100644 index 0000000..9c4b17a --- /dev/null +++ b/src/main/java/com/bb/model/MemberBetLimit.java @@ -0,0 +1,17 @@ +package com.bb.model; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.Size; + +import lombok.Data; + +@Data +public class MemberBetLimit { + + private String code; // masterCode betlimit 로 조회시 code값 + private long minBetAmt; + private long maxBetAmt; + private long maxBetAmtA; + + +} diff --git a/src/main/java/com/bb/model/MemberBurderRate.java b/src/main/java/com/bb/model/MemberBurderRate.java new file mode 100644 index 0000000..1a7af6e --- /dev/null +++ b/src/main/java/com/bb/model/MemberBurderRate.java @@ -0,0 +1,18 @@ +package com.bb.model; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.Size; + +import lombok.Data; + +@Data +public class MemberBurderRate { + + + + private String code; // masterCode betlimit 로 조회시 code값 + private String groupCode; + private long rate; + + +} diff --git a/src/main/java/com/bb/model/MemberCheckVo.java b/src/main/java/com/bb/model/MemberCheckVo.java new file mode 100644 index 0000000..8764ccf --- /dev/null +++ b/src/main/java/com/bb/model/MemberCheckVo.java @@ -0,0 +1,13 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class MemberCheckVo { + + private String siteId; + private String memId; + private String memNick; + private String checkType; + +} diff --git a/src/main/java/com/bb/model/MemberCommissionRate.java b/src/main/java/com/bb/model/MemberCommissionRate.java new file mode 100644 index 0000000..7ea1492 --- /dev/null +++ b/src/main/java/com/bb/model/MemberCommissionRate.java @@ -0,0 +1,17 @@ +package com.bb.model; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.Size; + +import lombok.Data; + +@Data +public class MemberCommissionRate { + + + + private String code; // masterCode betlimit 로 조회시 code값 + private long commissionRate; + + +} diff --git a/src/main/java/com/bb/model/MemberDetail.java b/src/main/java/com/bb/model/MemberDetail.java new file mode 100644 index 0000000..b3af9fa --- /dev/null +++ b/src/main/java/com/bb/model/MemberDetail.java @@ -0,0 +1,27 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class MemberDetail extends Member { + + private String siteIdxHex; + private String currTime; + private String abuseLockTime; + private String abuseLockYn; + private int cashAmt; + private String changeFlag; + private int cashOutFlag; + private int pointAmt; + private String isPartnerMember; + private String loginType; + private String accInfoRequestYn; + private int blankSpinCasinoRate; + private int blankSpinSlotRate; + private String isBiPushYn; + private String username; // for API Auth Id + private Integer userId; // for API Auth Id + private int tokenValidationSec; + + private Double cashAmtD; +} diff --git a/src/main/java/com/bb/model/MemberDividendRateType.java b/src/main/java/com/bb/model/MemberDividendRateType.java new file mode 100644 index 0000000..0395cfd --- /dev/null +++ b/src/main/java/com/bb/model/MemberDividendRateType.java @@ -0,0 +1,19 @@ +package com.bb.model; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.Size; + +import lombok.Data; + +@Data +public class MemberDividendRateType { + + + + private String code; // masterCode betlimit 로 조회시 code값 + private String useYn; + private String defaultYn; + + + +} diff --git a/src/main/java/com/bb/model/MemberHierarchyVo.java b/src/main/java/com/bb/model/MemberHierarchyVo.java new file mode 100644 index 0000000..eb5e483 --- /dev/null +++ b/src/main/java/com/bb/model/MemberHierarchyVo.java @@ -0,0 +1,11 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class MemberHierarchyVo { + + private String siteId; + private String memId; + private String hierarchyType; // ALL, PARTNER, RECOMMEND +} diff --git a/src/main/java/com/bb/model/MemberInsert.java b/src/main/java/com/bb/model/MemberInsert.java new file mode 100644 index 0000000..c24731c --- /dev/null +++ b/src/main/java/com/bb/model/MemberInsert.java @@ -0,0 +1,66 @@ +package com.bb.model; + +import java.util.List; +import jakarta.validation.constraints.NotEmpty; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import lombok.Data; + +@JsonIgnoreProperties(ignoreUnknown = true) +@Data +public class MemberInsert { + + private Integer siteIdx; + private String siteId; + @NotEmpty + private String memId; + private String adminId; + private String sitePrefix; + private String siteApikey; + private String memPass; + private String partnerType; + private String memNick; + private String memName; + private String memPhone; + private String bank; + private String bankAcc; + private String recommenderId; + private String cashOutPass; + private String memLevel; + private String partnerLevel; + private String sportsLevel; + private String casinoLevel; + private String slotLevel; + private String mgLevel; + private String loginYn; + private String memBlackYn; + private String betYn; + private String recommendYn; + private String memLockYn; + private String memStatus; + private String nationCode; + private String partSendYn; + private String maxCredit; + private String creditStatus; + private String pointExchangeYn; + private String rollingYn; + private String cashSendYn; + private String cashReceiveYn; + private String insuredYn; + private String creditRate; + private String regId; + private String firstBetConfYn; + private String commissionGroup; + private String membetType; + private List rateList; + private BotMemRateVo rateGroup; // casino, slot, minigame 그룹핑 요율적용 + + private RateInfo rateInfo; + + private String msgTitle; + private String msgContents; + private String memo; + + private String joinDomain; +} diff --git a/src/main/java/com/bb/model/MemberInsert2.java b/src/main/java/com/bb/model/MemberInsert2.java new file mode 100644 index 0000000..f088d5f --- /dev/null +++ b/src/main/java/com/bb/model/MemberInsert2.java @@ -0,0 +1,49 @@ +package com.bb.model; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import lombok.Data; + +@JsonIgnoreProperties(ignoreUnknown = true) +@Data +public class MemberInsert2 { + + private Integer siteIdx; + private String siteId; + private String memId; + private List memIdList; + private String memNick; + private List memNickList; + private String memName; + private List memNameList; + + private String memPass; + private String memPhone; + private String bank; + private String bankAcc; + private String cashOutPass; + + private String partnerLevel; + private String recommenderId; + private String recommendYn; + + private String loginYn; + private String betYn; + private String memLockYn; + private String memStatus; + + private String memLevel; + private String casinoLevel; + private String slotLevel; + + private String cashSendYn; + private String cashReceiveYn; + private String memo; + private String regId; + + private List rateList; + + private String joinDomain; +} diff --git a/src/main/java/com/bb/model/MemberListSearch.java b/src/main/java/com/bb/model/MemberListSearch.java new file mode 100644 index 0000000..a1e1518 --- /dev/null +++ b/src/main/java/com/bb/model/MemberListSearch.java @@ -0,0 +1,39 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class MemberListSearch extends PageFormVO { + + private String siteId; + private String userType; // 검색 회원유형 [전체(""), 일반회원("N"), 파트너("P")] + private String startDate; // 검색 가입일 [시작 날짜] + private String endDate; // 검색 가입일 [종료 날짜] + private String memId; // 검색 키워드 옵션 [아이디] + private String recommenderId; // 검색 키워드 옵션 [추천인아이디] + private String memNick; // 검색 키워드 옵션 [닉네임] + private String memName; // 검색 키워드 옵션 [예금주] + private String memPhone; // 검색 키워드 옵션 [전화번호] + + private String loginYn; // 로그인 옵션 [전체(""), 가능("Y"), 불가능("N")] + private String betYn; // 배팅 옵션 [전체(""), 가능("Y"), 불가능("N")] + private String memDelYn; // 삭제 옵션 [전체(""), 해당("Y"), 비해당("N")] + private String memBlackYn; // 블랙 옵션 [전체(""), 해당("Y"), 비해당("N")] + private String memLockYn; // 정지 옵션 [전체(""), 해당("Y"), 비해당("N")] + private String todayLoginYn; // 금일 로그인회원 옵션 [ON("Y"), OFF("N")] + + private String orderColumn; + private String orderType; + private String orderStr; // ID_DESC => memId DESC, ID_ASC => memId ASC + + private String memStatus; + private String rollingYn; + private String recommendYn; // 추천가능활성화 + private String ip; + private String partnerType; + private String searchType; + private String domain; + private String memLevel; + private String partnerLevel; + +} diff --git a/src/main/java/com/bb/model/MemberRate.java b/src/main/java/com/bb/model/MemberRate.java new file mode 100644 index 0000000..f5a0faf --- /dev/null +++ b/src/main/java/com/bb/model/MemberRate.java @@ -0,0 +1,22 @@ +package com.bb.model; + +import java.util.List; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.Size; + +import org.springframework.validation.annotation.Validated; + +import lombok.Data; + +@Data +@Validated +public class MemberRate extends Site { + + @NotBlank + private String memId; + + private List rateList; + +} diff --git a/src/main/java/com/bb/model/MemberRateVo.java b/src/main/java/com/bb/model/MemberRateVo.java new file mode 100644 index 0000000..2468bde --- /dev/null +++ b/src/main/java/com/bb/model/MemberRateVo.java @@ -0,0 +1,15 @@ +package com.bb.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import lombok.Data; + +@JsonIgnoreProperties(ignoreUnknown = true) +@Data +public class MemberRateVo { + private String gameType; + private String pointRate; + private String loseRate; + private String useYn; + private String betYn; +} diff --git a/src/main/java/com/bb/model/MemberSearch.java b/src/main/java/com/bb/model/MemberSearch.java new file mode 100644 index 0000000..035ddb9 --- /dev/null +++ b/src/main/java/com/bb/model/MemberSearch.java @@ -0,0 +1,16 @@ +package com.bb.model; + +import jakarta.validation.constraints.NotEmpty; + +import lombok.Data; + +@Data +public class MemberSearch { + + + private String siteId; + @NotEmpty + private String memId; + private String memPass; + private Integer ord; +} diff --git a/src/main/java/com/bb/model/MemberStatus.java b/src/main/java/com/bb/model/MemberStatus.java new file mode 100644 index 0000000..a45f029 --- /dev/null +++ b/src/main/java/com/bb/model/MemberStatus.java @@ -0,0 +1,22 @@ +package com.bb.model; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.Size; + +import lombok.Data; + +@Data +public class MemberStatus { + + @NotEmpty + @Size(max = 20) // 최대 길이 64 + private String memId; + + @NotEmpty + private String memStatus; + + private String siteId; + private String memo; + private String outAmtYn; + +} diff --git a/src/main/java/com/bb/model/MemberTokenInfo.java b/src/main/java/com/bb/model/MemberTokenInfo.java new file mode 100644 index 0000000..39a7ba5 --- /dev/null +++ b/src/main/java/com/bb/model/MemberTokenInfo.java @@ -0,0 +1,10 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class MemberTokenInfo { + private String siteId; + private String memId; + private String token; +} diff --git a/src/main/java/com/bb/model/MemberUpdate.java b/src/main/java/com/bb/model/MemberUpdate.java new file mode 100644 index 0000000..a1e5e87 --- /dev/null +++ b/src/main/java/com/bb/model/MemberUpdate.java @@ -0,0 +1,58 @@ +package com.bb.model; + +import java.util.List; +import jakarta.validation.constraints.NotEmpty; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import lombok.Data; + +@JsonIgnoreProperties(ignoreUnknown = true) +@Data +public class MemberUpdate { + + private String siteId; + @NotEmpty + private String memId; + private String memPass; + private String memName; + private String memNick; + private String memPhone; + private String memStatus; + private String recommenderId; + private String loginYn; + private String betYn; + private String recommendYn; + private String memBlackYn; + private String memLockYn; + private String subMemBetLockYn; + private String subMemRateModifyYn; + private String accInfoRequestYn; + private String memLevel; + private String partnerLevel; + private String sportsLevel; + private String casinoLevel; + private String slotLevel; + private String mgLevel; + private String pointExchangeYn; + private String memo; + private String memDelYn; + private String betLevel; + private String pointLevel; + private String bankLevel; + private String bank; + private String bankacc; + private String cashOutPass; + private String cashSendYn; + private String cashReceiveYn; + private String insuredYn; + private String baseInsureBetAmt; + private String isBiPushYn; + private String victoryPassYn; + + private String updId; + + private List rateList; + private BotMemRateVo rateGroup; // casino, slot, minigame 그룹핑 요율적용 + +} diff --git a/src/main/java/com/bb/model/MenuVO.java b/src/main/java/com/bb/model/MenuVO.java new file mode 100644 index 0000000..cc8cc42 --- /dev/null +++ b/src/main/java/com/bb/model/MenuVO.java @@ -0,0 +1,18 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class MenuVO { + + private String siteId; + private String menuGroupCode; + private String menuGroupCodeName; + private String menuGroupCodeNameEN; + private String menuCode; + private String menuCodePrefix; + private String menuCodeName; + private String menuCodeNameEN; + private String useYn; + private String bookmarkYn; +} diff --git a/src/main/java/com/bb/model/Message.java b/src/main/java/com/bb/model/Message.java new file mode 100644 index 0000000..ad95f98 --- /dev/null +++ b/src/main/java/com/bb/model/Message.java @@ -0,0 +1,30 @@ +package com.bb.model; + +import java.util.List; + +import lombok.Data; + +@Data +public class Message { + private Long msgIdx; + private String siteId; + private String msgType; + private String recieveId; + private String msgTitle; + private String msgDesc; + private String msgDescEng; + private String sendDate; + private String updDate; + private String regId; + private String delYn; + private String targetLevel; + private String targetType; + private String hiddenYn; + private String rMemIdList; + private String msgStatus; + private String status; + private String memType; + private String memLevel; + private String siteDomain; + private List msgIdxList; +} diff --git a/src/main/java/com/bb/model/MessageListSearch.java b/src/main/java/com/bb/model/MessageListSearch.java new file mode 100644 index 0000000..fda7239 --- /dev/null +++ b/src/main/java/com/bb/model/MessageListSearch.java @@ -0,0 +1,17 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class MessageListSearch extends PageFormVO{ + private Long msgIdx; + private String siteId; + private String msgType; + private String recieveId; + private String targetLevel; + private String targetType; + private String hiddenYn; + private String startDate; + private String endDate; + +} diff --git a/src/main/java/com/bb/model/MiniGameSearch.java b/src/main/java/com/bb/model/MiniGameSearch.java new file mode 100644 index 0000000..a99221a --- /dev/null +++ b/src/main/java/com/bb/model/MiniGameSearch.java @@ -0,0 +1,12 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class MiniGameSearch extends PageFormVO{ + private String siteId; + private String gameType; + private String startDate; + private String endDate; + private String gameRound; +} diff --git a/src/main/java/com/bb/model/MinigameBetRate.java b/src/main/java/com/bb/model/MinigameBetRate.java new file mode 100644 index 0000000..8c34beb --- /dev/null +++ b/src/main/java/com/bb/model/MinigameBetRate.java @@ -0,0 +1,19 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class MinigameBetRate { + + private String siteId; + private String gameType; + private String optionGroup; + private String optionSubGroup; + private String option; + private String betRate; + private String useYn; + private String dispYn; + private String updId; + private String regDate; + +} diff --git a/src/main/java/com/bb/model/MinigameSet.java b/src/main/java/com/bb/model/MinigameSet.java new file mode 100644 index 0000000..16acc5e --- /dev/null +++ b/src/main/java/com/bb/model/MinigameSet.java @@ -0,0 +1,12 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class MinigameSet { + private String siteId; + private String gameType; + private String useYn; + private int betLimitSec; + +} diff --git a/src/main/java/com/bb/model/Month10Info.java b/src/main/java/com/bb/model/Month10Info.java new file mode 100644 index 0000000..e70a604 --- /dev/null +++ b/src/main/java/com/bb/model/Month10Info.java @@ -0,0 +1,18 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class Month10Info { + private String siteId; + private String userCashIN; + private String userCashBEP; + private String betBEP; + private String mofJoinCnt; + private String mofAccessCnt; + private String mofCashInUserCnt; + private String creditPayAMT; + private String creditAMT; + private String adminCashPYM; + private String adminCashPYB; +} diff --git a/src/main/java/com/bb/model/MultipleRate.java b/src/main/java/com/bb/model/MultipleRate.java new file mode 100644 index 0000000..0ec0263 --- /dev/null +++ b/src/main/java/com/bb/model/MultipleRate.java @@ -0,0 +1,17 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class MultipleRate { + + private String rateType; + private String rateTypeName; + private String rateTypeNameEN; + private Double maxPointRate; + private Double pointRate; + private Double minPointRate; + private Double maxLoseRate; + private Double loseRate; + private Double minLoseRate; +} diff --git a/src/main/java/com/bb/model/MultipleRateInfo.java b/src/main/java/com/bb/model/MultipleRateInfo.java new file mode 100644 index 0000000..b99782f --- /dev/null +++ b/src/main/java/com/bb/model/MultipleRateInfo.java @@ -0,0 +1,14 @@ +package com.bb.model; + +import java.util.List; + +import lombok.Data; + +@Data +public class MultipleRateInfo { + + private String siteId; + private String memId; + private String vendorCode; + private List rateList; +} diff --git a/src/main/java/com/bb/model/MultipleRateSearch.java b/src/main/java/com/bb/model/MultipleRateSearch.java new file mode 100644 index 0000000..3db5a38 --- /dev/null +++ b/src/main/java/com/bb/model/MultipleRateSearch.java @@ -0,0 +1,14 @@ +package com.bb.model; + +import jakarta.validation.constraints.NotEmpty; + +import lombok.Data; + +@Data +public class MultipleRateSearch { + private String siteId; + @NotEmpty + private String memId; + @NotEmpty + private String vendorCode; +} diff --git a/src/main/java/com/bb/model/NewMemRate.java b/src/main/java/com/bb/model/NewMemRate.java new file mode 100644 index 0000000..3b8c88f --- /dev/null +++ b/src/main/java/com/bb/model/NewMemRate.java @@ -0,0 +1,12 @@ +package com.bb.model; + +import java.util.List; + +import lombok.Data; + +@Data +public class NewMemRate { + private String siteId; + private String memId; + private List rateList; +} diff --git a/src/main/java/com/bb/model/NewMemRateItem.java b/src/main/java/com/bb/model/NewMemRateItem.java new file mode 100644 index 0000000..6201c90 --- /dev/null +++ b/src/main/java/com/bb/model/NewMemRateItem.java @@ -0,0 +1,35 @@ +package com.bb.model; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +import lombok.Data; + +@Data +public class NewMemRateItem { + + private String siteId; + + @NotBlank + private String memId; + + private String gameCategory; + private String gameCategoryEn; + private String gameCategoryName; + private String vendorCode; + private String rateTypeCode; + + private Double maxPointRate; + + @NotNull + private Double pointRate; + + private Double minPointRate; + + private Double maxLoseRate; + + @NotNull + private Double loseRate; + + private Double minLoseRate; +} diff --git a/src/main/java/com/bb/model/NotiBgmVo.java b/src/main/java/com/bb/model/NotiBgmVo.java new file mode 100644 index 0000000..49a5cd8 --- /dev/null +++ b/src/main/java/com/bb/model/NotiBgmVo.java @@ -0,0 +1,14 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class NotiBgmVo { + + private String siteId; + private String notiType; + private String notiBgmFile; + private String useYN; + private String regDate; + private String updDate; +} diff --git a/src/main/java/com/bb/model/OTPInfo.java b/src/main/java/com/bb/model/OTPInfo.java new file mode 100644 index 0000000..2b2c56c --- /dev/null +++ b/src/main/java/com/bb/model/OTPInfo.java @@ -0,0 +1,17 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class OTPInfo { + + private String adminId; + private String account; + private String issuer; + private String secretKey; + private String url; + private String type; + private String useYn; + private String regDate; + private String updDate; +} diff --git a/src/main/java/com/bb/model/Options.java b/src/main/java/com/bb/model/Options.java new file mode 100644 index 0000000..5a34a4e --- /dev/null +++ b/src/main/java/com/bb/model/Options.java @@ -0,0 +1,9 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class Options { + private String key; + private String value; +} diff --git a/src/main/java/com/bb/model/OutChatMessageVO.java b/src/main/java/com/bb/model/OutChatMessageVO.java new file mode 100644 index 0000000..d8723a3 --- /dev/null +++ b/src/main/java/com/bb/model/OutChatMessageVO.java @@ -0,0 +1,87 @@ +package com.bb.model; + +public class OutChatMessageVO { + + private String id; + private String name; + private String domain; + private String time; + private String content; + + private String cash; + + private String res; + private String msg; + private String type; + + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getDomain() { + return domain; + } + public void setDomain(String domain) { + this.domain = domain; + } + + public String getTime() { + return time; + } + public void setTime(String time) { + this.time = time; + } + public String getContent() { + return content; + } + public void setContent(String content) { + this.content = content; + } + + + public String getRes() { + return res; + } + public void setRes(String res) { + this.res = res; + } + + public String getCash() { + return cash; + } + public void setCash(String cash) { + this.cash = cash; + } + + + public String getMsg() { + return msg; + } + public void setMsg(String msg) { + this.msg = msg; + } + /** + * @return the type + */ + public String getType() { + return type; + } + /** + * @param type the type to set + */ + public void setType(String type) { + this.type = type; + } + @Override + public String toString() { + return "OutChatMessageVO [id=" + id + ", name=" + name + ", type=" + type + ", content=" + content + "]"; + } +} diff --git a/src/main/java/com/bb/model/PageFormVO.java b/src/main/java/com/bb/model/PageFormVO.java new file mode 100644 index 0000000..ac63adc --- /dev/null +++ b/src/main/java/com/bb/model/PageFormVO.java @@ -0,0 +1,88 @@ +package com.bb.model; + +public class PageFormVO { + + String function_name; + int page; + int count_per_page; + int count_per_list; + int tatal_page_count; + int tatal_list_count; + int limit; + int offset; + String pagination; + + public String getFunction_name() { + return function_name; + } + + public void setFunction_name(String function_name) { + this.function_name = function_name; + } + + public int getPage() { + return page; + } + + public void setPage(int page) { + this.page = page; + } + + public int getCount_per_page() { + return count_per_page; + } + + public void setCount_per_page(int count_per_page) { + this.count_per_page = count_per_page; + } + + public int getCount_per_list() { + return count_per_list; + } + + public void setCount_per_list(int count_per_list) { + this.count_per_list = count_per_list; + } + + public int getTatal_page_count() { + return tatal_page_count; + } + + public void setTatal_page_count(int tatal_page_count) { + this.tatal_page_count = tatal_page_count; + } + + public int getTatal_list_count() { + return tatal_list_count; + } + + public void setTatal_list_count(int tatal_list_count) { + this.tatal_list_count = tatal_list_count; + } + + public int getLimit() { + return limit; + } + + public void setLimit(int limit) { + this.limit = limit; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + + public String getPagination() { + return pagination; + } + + public void setPagination(String pagination) { + this.pagination = pagination; + } + + +} diff --git a/src/main/java/com/bb/model/PartnerCompInfo.java b/src/main/java/com/bb/model/PartnerCompInfo.java new file mode 100644 index 0000000..f91bcd6 --- /dev/null +++ b/src/main/java/com/bb/model/PartnerCompInfo.java @@ -0,0 +1,35 @@ +package com.bb.model; + +import java.util.List; + +import jakarta.validation.constraints.NotNull; + +import lombok.Data; + +@Data +public class PartnerCompInfo { + + private String siteId; + private String topCompId; + private String siteName; + private String siteDomain; + private String siteDomains; + private String userCountLimit; + private String compCountLimit; + private String password; + private String maxCredit; + private String creditRate; + private String clientId; + private String clientSecretKey; + + private SiteOption siteOption; + + private List creditRateList; + + private List biRateList; + + private List gameSettingInfoList; + + private List menuSettingList; + +} diff --git a/src/main/java/com/bb/model/PartnerListVO.java b/src/main/java/com/bb/model/PartnerListVO.java new file mode 100644 index 0000000..07eb428 --- /dev/null +++ b/src/main/java/com/bb/model/PartnerListVO.java @@ -0,0 +1,28 @@ +package com.bb.model; + +import java.util.HashMap; +import java.util.List; + +import lombok.Data; + +@Data +public class PartnerListVO { + + private String siteId; + private String memId; + private String memName; + private String memNick; + private String partnerLevel; + private String levelName; + private String cashSendYn; + private String cashReceiveYn; + private int cashAmt; + private int pointAmt; + private int cntBotPartner; + private int cntBotMem; + private double pointRate; + private double loseRate; + List> memRollingInfo; + List> topUserList; + HashMap totalInfo; +} diff --git a/src/main/java/com/bb/model/PassimAddrReq.java b/src/main/java/com/bb/model/PassimAddrReq.java new file mode 100644 index 0000000..51b10e4 --- /dev/null +++ b/src/main/java/com/bb/model/PassimAddrReq.java @@ -0,0 +1,14 @@ +package com.bb.model; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +@Data +public class PassimAddrReq { + + private long memIdx; + + @NotBlank + private Integer paymentId; + +} diff --git a/src/main/java/com/bb/model/PassimAddrRes.java b/src/main/java/com/bb/model/PassimAddrRes.java new file mode 100644 index 0000000..bfeb9d7 --- /dev/null +++ b/src/main/java/com/bb/model/PassimAddrRes.java @@ -0,0 +1,9 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class PassimAddrRes { + private String address; + private Integer tag; +} diff --git a/src/main/java/com/bb/model/PassimVo.java b/src/main/java/com/bb/model/PassimVo.java new file mode 100644 index 0000000..8e91a62 --- /dev/null +++ b/src/main/java/com/bb/model/PassimVo.java @@ -0,0 +1,32 @@ +package com.bb.model; + +import java.time.LocalDateTime; + +import lombok.Data; + +@Data +public class PassimVo { + + private Long id; + + private String type; // deposit, withdraw + private Integer platformId; // 플랫폼 ID (업체 고유아이디) + private Integer paymentId; // 결제 ID (암호화폐 구분) + private String orderId; // 내부 주문 ID + private String amount; // 금액 + private String txHash; // 블록체인 트랜잭션 해시 + private String addressFrom; // 보낸지갑 주소 + private String addressTo; // 받은지갑 주소 + private Integer confirmations; // 블록체인 컨펌 수 + private String destinationTag; // XRP, TON 등의 Tag/Memo + private String amountReceive; // 실제 금액 + + private LocalDateTime createdAt; // 거래 생성일시 + private LocalDateTime confirmedAt; // 거래 완료일시 + + private String feeService; // 서비스 수수료 + private String feeNetwork; // 네트워크 검증자/채굴자 수수료 + + private String status; // WAITING, CONFIRMED + +} diff --git a/src/main/java/com/bb/model/Point.java b/src/main/java/com/bb/model/Point.java new file mode 100644 index 0000000..57ec114 --- /dev/null +++ b/src/main/java/com/bb/model/Point.java @@ -0,0 +1,21 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class Point { + + private long pointIdx; + private String siteId; + private String memId; + private String pointType; + private String pointDesc; + private Double pointAmt; + private String betIdx; + private String pointStatus; + private String regId; + private String adminId; + private long prePointAmt; + private String memo; + private String regDate; +} diff --git a/src/main/java/com/bb/model/PointInOut.java b/src/main/java/com/bb/model/PointInOut.java new file mode 100644 index 0000000..169c118 --- /dev/null +++ b/src/main/java/com/bb/model/PointInOut.java @@ -0,0 +1,29 @@ +package com.bb.model; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; + +import lombok.Data; + +@Data +public class PointInOut { + + private String siteId; + + @NotBlank + private String memId; + + @NotBlank + private String pointType; + private String pointDesc; + + @NotBlank + private long pointAmt; + private String pointStatus; + private String regId; + private String adminId; + private long prePointAmt; + private String memo; + + +} diff --git a/src/main/java/com/bb/model/PointSearch.java b/src/main/java/com/bb/model/PointSearch.java new file mode 100644 index 0000000..94a9518 --- /dev/null +++ b/src/main/java/com/bb/model/PointSearch.java @@ -0,0 +1,25 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class PointSearch extends PageFormVO { + + + private int pointIdx; + private String siteId; + private String dateType; + private String startDate; + private String endDate; + private String memId; + private String memNick; + private String gameIdx; + private String pointStatus; + private String pointType; + private long pointAmt; + private long prePointAmt; + private String gameType; + private String isFront; + private String oldYn; + +} diff --git a/src/main/java/com/bb/model/PointSearchAdm.java b/src/main/java/com/bb/model/PointSearchAdm.java new file mode 100644 index 0000000..7a6c145 --- /dev/null +++ b/src/main/java/com/bb/model/PointSearchAdm.java @@ -0,0 +1,24 @@ +package com.bb.model; + +import java.util.List; + +import lombok.Data; + +@Data +public class PointSearchAdm extends PageFormVO { + + private int pointIdx; + private String siteId; + private String dateType; + private String startDate; + private String endDate; + private String memId; + private String memNick; + private String betId; + private List typeList; + private String vendorCode; + private String oldYn; + + private String betMemId; + private String rateTypeCode; +} diff --git a/src/main/java/com/bb/model/RateInfo.java b/src/main/java/com/bb/model/RateInfo.java new file mode 100644 index 0000000..a66483c --- /dev/null +++ b/src/main/java/com/bb/model/RateInfo.java @@ -0,0 +1,13 @@ +package com.bb.model; + +import java.util.List; + +import lombok.Data; + +@Data +public class RateInfo { + + private String siteId; + private String memId; + private List rateList; +} diff --git a/src/main/java/com/bb/model/RateMemList.java b/src/main/java/com/bb/model/RateMemList.java new file mode 100644 index 0000000..de42377 --- /dev/null +++ b/src/main/java/com/bb/model/RateMemList.java @@ -0,0 +1,12 @@ +package com.bb.model; + +import java.util.List; + +import lombok.Data; + +@Data +public class RateMemList { + + private String siteId; + private List rateInfoList; +} diff --git a/src/main/java/com/bb/model/RateVO.java b/src/main/java/com/bb/model/RateVO.java new file mode 100644 index 0000000..9bf9c4a --- /dev/null +++ b/src/main/java/com/bb/model/RateVO.java @@ -0,0 +1,14 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class RateVO { + + private String siteId; + private String memId; + private String category; // casino, slot, sport, minigame + private String cateCode; // CASINO, HC-CASINO, SLOT, SPORTS, bomb + private String pointRate; + private String loseRate; +} diff --git a/src/main/java/com/bb/model/ReportSearch.java b/src/main/java/com/bb/model/ReportSearch.java new file mode 100644 index 0000000..1ab6727 --- /dev/null +++ b/src/main/java/com/bb/model/ReportSearch.java @@ -0,0 +1,25 @@ +package com.bb.model; + +import java.util.List; + +import lombok.Data; + + +@Data +public class ReportSearch extends PageFormVO { + + private String siteId; + private String asIdx; + private String memId; + private String recommenderId; + private String memDelYn; + private String memBlackYn; + private String startDate; + private String endDate; + private String searchType; + private String vendorCode; + private List codeList; + private String oldYn; + private String blankSpinSetType; +} + diff --git a/src/main/java/com/bb/model/RetailBetSearch.java b/src/main/java/com/bb/model/RetailBetSearch.java new file mode 100644 index 0000000..354d3be --- /dev/null +++ b/src/main/java/com/bb/model/RetailBetSearch.java @@ -0,0 +1,24 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class RetailBetSearch extends PageFormVO { + + private String siteId; + private String memId; + private String vendorCode; + private String gameCategory; + private String resultType; + private String searchMemId; + private String startDate; + private String endDate; + private String oldYn; + + private Long betIdx; + private String betId; + private String betType; + private String orderColumn; + private String orderType; + private String blankSpinSetType; +} diff --git a/src/main/java/com/bb/model/RetailCashSearch.java b/src/main/java/com/bb/model/RetailCashSearch.java new file mode 100644 index 0000000..2883926 --- /dev/null +++ b/src/main/java/com/bb/model/RetailCashSearch.java @@ -0,0 +1,18 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class RetailCashSearch extends PageFormVO { + + private String siteId; + private String memId; + private String searchType; // 검색종류: "memId", "memNick", "recommenderId" + private String searchWord; // 검색어 + private String cashType; // 전체(""), 입금("1"), 출금("-1"), 파트너지급("33), 파트너회수("-33"), 관리자지급("2"), 관리자회수("-2"), 포인트전환("4") + private String startDate; + private String endDate; + private String oldYn; + private String orderColumn; + private String orderType; +} diff --git a/src/main/java/com/bb/model/RetailListSearch.java b/src/main/java/com/bb/model/RetailListSearch.java new file mode 100644 index 0000000..b0adb5f --- /dev/null +++ b/src/main/java/com/bb/model/RetailListSearch.java @@ -0,0 +1,19 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class RetailListSearch extends PageFormVO { + + private String siteId; + private String memId; + private String memNick; + private String partnerLevel; + private String searchType; + + private String gameCategory; + private String gameCategoryEn; + private String vendorCode; + private String rateTypeCode; + private String saveAllYn; +} diff --git a/src/main/java/com/bb/model/RetailLockVO.java b/src/main/java/com/bb/model/RetailLockVO.java new file mode 100644 index 0000000..ee6974f --- /dev/null +++ b/src/main/java/com/bb/model/RetailLockVO.java @@ -0,0 +1,14 @@ +package com.bb.model; + +import jakarta.validation.constraints.NotEmpty; + +import lombok.Data; + +@Data +public class RetailLockVO { + + @NotEmpty + private String memId; + @NotEmpty + private String memLockYn; +} diff --git a/src/main/java/com/bb/model/RetailLowerSearch.java b/src/main/java/com/bb/model/RetailLowerSearch.java new file mode 100644 index 0000000..410aa5a --- /dev/null +++ b/src/main/java/com/bb/model/RetailLowerSearch.java @@ -0,0 +1,14 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class RetailLowerSearch extends PageFormVO { + + private String siteId; + private String memId; + private String targetLevel; + private String searchType; + private String searchValue; + private String orderStr; +} diff --git a/src/main/java/com/bb/model/RetailPointSearch.java b/src/main/java/com/bb/model/RetailPointSearch.java new file mode 100644 index 0000000..e2bbd90 --- /dev/null +++ b/src/main/java/com/bb/model/RetailPointSearch.java @@ -0,0 +1,17 @@ +package com.bb.model; + +import java.util.List; + +import lombok.Data; + +@Data +public class RetailPointSearch extends PageFormVO { + + private String siteId; + private String memId; + private String memNick; + private List pointTypeList; // 전체(""), 관리자["ADMIN"]("2","-2"), 롤링["ROLLING"]("3"), 포인트전환["EXCHANGE"]("-4"), 이벤트["EVENT"]("5","6","7") + private String startDate; + private String endDate; + private String oldYn; +} diff --git a/src/main/java/com/bb/model/RetailSearch.java b/src/main/java/com/bb/model/RetailSearch.java new file mode 100644 index 0000000..b630c96 --- /dev/null +++ b/src/main/java/com/bb/model/RetailSearch.java @@ -0,0 +1,27 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class RetailSearch extends PageFormVO { + + private String siteId; + private String memId; + private String memNick; + private String recommenderId; + private String searchMemId; + private String partnerLevel; + private String dateIdx; + private String searchType; + private String retailPeriod; + private String retailType; + private String paystatus; + private String startDate; + private String endDate; + private String oldYn; + private String treeOption; // 직속회원 옵션 [기본값:Off("N"), On("Y")] + private String orderColumn; + private String orderType; + private Integer ord; + private String blankSpinSetType; +} diff --git a/src/main/java/com/bb/model/RetailSet.java b/src/main/java/com/bb/model/RetailSet.java new file mode 100644 index 0000000..4250003 --- /dev/null +++ b/src/main/java/com/bb/model/RetailSet.java @@ -0,0 +1,13 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class RetailSet { + + private String siteId; + private String memId; + private String retailPeriod; + private int retailType; + +} diff --git a/src/main/java/com/bb/model/RvHoldemResponse.java b/src/main/java/com/bb/model/RvHoldemResponse.java new file mode 100644 index 0000000..b3fbf5d --- /dev/null +++ b/src/main/java/com/bb/model/RvHoldemResponse.java @@ -0,0 +1,13 @@ +package com.bb.model; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import lombok.Data; + +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +public class RvHoldemResponse { + + private int code; + private Integer payload; +} diff --git a/src/main/java/com/bb/model/RvHoldemVO.java b/src/main/java/com/bb/model/RvHoldemVO.java new file mode 100644 index 0000000..f8f8b0d --- /dev/null +++ b/src/main/java/com/bb/model/RvHoldemVO.java @@ -0,0 +1,104 @@ +package com.bb.model; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; + +import lombok.Data; +import net.sf.json.JSONObject; +import net.sf.json.JsonConfig; + +@Data +public class RvHoldemVO { + + private Long cbIdx; // AUTO_INCREMENT + private String siteId; + private String memId; + private String callbackType; + private Integer userId; + private String uid; + private Integer logId; + private Integer bfBalance; + private Integer amount; + private Integer chipAmount; + private Integer afBalance; + private Integer groupId; + private Integer roomtype; + + // 콜백 시각: UTC 그대로 + private LocalDateTime addedAt; + // 내부 저장 시 KST로 변환 + private LocalDateTime addedAtKST; + + private String penaltyAmount; + private String penaltyChipAmount; + private String cb_uid; + private String uniqueKey; + + /** + * JSONObject -> RvHoldemVO 변환 + * addedAt는 UTC 기준, regDate는 KST 변환 + */ + public static RvHoldemVO fromJSONObject(String LOG_PREFIX, JSONObject json) { + RvHoldemVO vo = new RvHoldemVO(); + + DateTimeFormatter normalFormatter = + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + vo.setUserId(json.optInt("userId", 0)); + vo.setUid(json.optString("uid", null)); + vo.setLogId(json.optInt("logId", 0)); + vo.setAmount(json.optInt("amount", 0)); + vo.setChipAmount(json.optInt("chipAmount", 0)); + vo.setGroupId(json.optInt("groupId", 0)); + vo.setRoomtype(json.optInt("roomtype", 0)); + vo.setPenaltyAmount(json.optString("penaltyAmount", null)); + vo.setPenaltyChipAmount(json.optString("penaltyChipAmount", null)); + vo.setCb_uid(json.optString("cb_uid", null)); + vo.setUniqueKey(json.optString("uniqueKey", null)); + + // ------------------------- + // addedAt 파싱 (멀티 포맷) + // ------------------------- + if (json.has("addedAt") && !json.isNullObject()) { + String addedAtStr = json.getString("addedAt"); + + LocalDateTime addedAt = null; + + try { + // 1) ISO-8601 + Z + millis (2025-12-22T07:57:10.914Z) + if (addedAtStr.endsWith("Z")) { + addedAt = Instant.parse(addedAtStr) + .atZone(ZoneId.of("UTC")) + .toLocalDateTime(); + } else { + // 2) yyyy-MM-dd HH:mm:ss + addedAt = LocalDateTime.parse(addedAtStr, normalFormatter); + } + } catch (Exception e) { + // 파싱 실패 시 로그만 남기고 skip + System.out.println(LOG_PREFIX+ "addedAt parse failed, fallback to now(UTC)."); + } + + // 파싱 실패 or 값 없음 -> 현재 UTC 시각 사용 + if (addedAt == null) { + addedAt = LocalDateTime.now(ZoneId.of("UTC")); + } + + vo.setAddedAt(addedAt); + + // addedAtKST = addedAt(UTC) -> KST + if (addedAt != null) { + vo.setAddedAtKST( + addedAt.atZone(ZoneId.of("UTC")) + .withZoneSameInstant(ZoneId.of("Asia/Seoul")) + .toLocalDateTime() + ); + } + } + + return vo; + } +} \ No newline at end of file diff --git a/src/main/java/com/bb/model/ScoinVO.java b/src/main/java/com/bb/model/ScoinVO.java new file mode 100644 index 0000000..ad325b9 --- /dev/null +++ b/src/main/java/com/bb/model/ScoinVO.java @@ -0,0 +1,29 @@ +package com.bb.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +@JsonIgnoreProperties(ignoreUnknown = true) +@Data +public class ScoinVO { + + + @JsonProperty("partnercode") + private String partnercode; // 파트너코드 + + @JsonProperty("userid") + private String userid; // API 유저 아이디 + + @JsonProperty("level") + private int level; // 유저 계좌 레벨 + + @JsonProperty("bank") + private String bank; // 유저계좌 은행명 + + @JsonProperty("accountname") + private String accountname; // 유저계좌 예금주 + + @JsonProperty("accountnumber") + private String accountnumber; // 유저계좌 계좌번호 +} diff --git a/src/main/java/com/bb/model/Site.java b/src/main/java/com/bb/model/Site.java new file mode 100644 index 0000000..ef76c0b --- /dev/null +++ b/src/main/java/com/bb/model/Site.java @@ -0,0 +1,27 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class Site { + + private Integer siteIdx; + private String siteIdxHex; + private String siteId; + private String adminId; + private String sitePrefix; + private String adminOtp; + private String sitePass; + private String siteType; + private String siteName; + private String ip; + private String apiKey; + private String memberRegYn; + private String newSitePass; + private String newAdminOtp; + private String siteDomain; + private String securityCode; + private String creditRate; + private String maxCredit; + private String isOnlyFlex; // 파트너 회원 베팅가능여부 플레그(Y:가능, N:불가능) +} diff --git a/src/main/java/com/bb/model/SiteCashBonusSettingVO.java b/src/main/java/com/bb/model/SiteCashBonusSettingVO.java new file mode 100644 index 0000000..80467ac --- /dev/null +++ b/src/main/java/com/bb/model/SiteCashBonusSettingVO.java @@ -0,0 +1,18 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class SiteCashBonusSettingVO { + private Integer siteIdx; + private String bonusCode; + private String bonusTitle; + private String bonusDesc; + private Integer fstChrgByJoinRate; + private Integer fstChrgByDailyRate; + private Integer fstChrgByEveryTimeRate; + private Integer bonusLimit; + private String useYn; + private String regDate; + private String updDate; +} diff --git a/src/main/java/com/bb/model/SiteCheckReq.java b/src/main/java/com/bb/model/SiteCheckReq.java new file mode 100644 index 0000000..bd12f75 --- /dev/null +++ b/src/main/java/com/bb/model/SiteCheckReq.java @@ -0,0 +1,21 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class SiteCheckReq { + + private Integer siteCheckIdx; + private String siteId; + private String checkType; + private String checkCode; + private String startDate; + private String endDate; + private String isEmergency; + private String isCheckOff; + private String contents; + private String regId; + + + private String siteCheckYn; +} diff --git a/src/main/java/com/bb/model/SiteOption.java b/src/main/java/com/bb/model/SiteOption.java new file mode 100644 index 0000000..d830503 --- /dev/null +++ b/src/main/java/com/bb/model/SiteOption.java @@ -0,0 +1,77 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class SiteOption { + private String siteId; + private String signupYn; + private String loginYn; + private String betYn; + private String memLockYn; + private String partnerLevelChgYn; + private String userRecommenderChgYn; + private String recommendYn; + private String recommendLimit; + private String companyRecommender; + private String accInfoRequestYn; + private String accInfoRequestType; + private String siteStatusYn; + private String multiLoginYn; + private String liveStreamYn; + private String boardYn; + private String qnaYn; + private String callYn; + private String userLoginAlarmYn; + private String liveSprotsMsgYn; + private String specialBetMonoYn; + private String smsAuthPass; + private String maxBetRateYn; + private String maxBetRate; + private String logoutTimeLimit; + private String adminAutoLogoutYn; + private String casinoRollChangeYn; + private String betCancelTimeLimitBeforeGame; + private String betCancelTimeLimitAfterBet; + private String alarmSounds; + private String alarmRepeatYn; + private String alarmQnaYn; + private String strangeBetAlarm; + private String maxWinAmt; + private String cashInYn; + private String cashInAmtLimit; + private String cashInAmtMin; + private String cashInAmtUnit; + private String cashInWaitTime; + private String cashOutYn; + private String cashOutRollMsgYn; + private String cashOutAmtLimit; + private String cashOutAmtMin; + private String cashOutAmtUnit; + private String cashOutWaitTime; + private String pointChangeAmtLimit; + private String pointChangeAmtUnit; + private String pointChangeType; + private String pointStatusYn; + private String sns1; + private String sns1Link; + private String sns1Id; + private String sns2; + private String sns2Link; + private String sns2Id; + private String sns3; + private String sns3Link; + private String sns3Id; + private String insuredUpYn; + private String victoryPassYn; + private String siteCheckYn; + private String vendorComp; + private String payGCurrency; + private String payVCurrency; + private String cashDecimal; + private String rollingType; + private String blankSpinSetType; + private String vaccCode; + private String secuType; + +} diff --git a/src/main/java/com/bb/model/SiteSearch.java b/src/main/java/com/bb/model/SiteSearch.java new file mode 100644 index 0000000..0d79ee9 --- /dev/null +++ b/src/main/java/com/bb/model/SiteSearch.java @@ -0,0 +1,12 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class SiteSearch { + private String siteId; + private String sitePass; + private String otp; + private String etc1; + private String etc2; +} diff --git a/src/main/java/com/bb/model/SlotGame.java b/src/main/java/com/bb/model/SlotGame.java new file mode 100644 index 0000000..be21f41 --- /dev/null +++ b/src/main/java/com/bb/model/SlotGame.java @@ -0,0 +1,15 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class SlotGame { + + private String id; + private String key; + private SlotGameName names; + private String platform; + private String category; + private String type; + private String image; +} diff --git a/src/main/java/com/bb/model/SlotGameName.java b/src/main/java/com/bb/model/SlotGameName.java new file mode 100644 index 0000000..436dcaa --- /dev/null +++ b/src/main/java/com/bb/model/SlotGameName.java @@ -0,0 +1,10 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class SlotGameName { + + private String ko; + private String en; +} diff --git a/src/main/java/com/bb/model/SocialLoginVO.java b/src/main/java/com/bb/model/SocialLoginVO.java new file mode 100644 index 0000000..bb9c389 --- /dev/null +++ b/src/main/java/com/bb/model/SocialLoginVO.java @@ -0,0 +1,37 @@ +package com.bb.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.Data; + +@Data +public class SocialLoginVO { + + @JsonProperty("Status") + private String status; + + @JsonProperty("UserID") + private String userId; + + @JsonProperty("LoginPW") + private String loginPW; + + @JsonProperty("Phone") + private String phone; + + @JsonProperty("UserNick") + private String userNick; + + @JsonProperty("BankCode") + private String bankCode; + + @JsonProperty("BankNumber") + private String bankNumber; + + @JsonProperty("AccountHolder") + private String accountHolder; + + @JsonProperty("ExchangePW") + private String exchangePW; + +} diff --git a/src/main/java/com/bb/model/TOtpVO.java b/src/main/java/com/bb/model/TOtpVO.java new file mode 100644 index 0000000..7af801a --- /dev/null +++ b/src/main/java/com/bb/model/TOtpVO.java @@ -0,0 +1,15 @@ +package com.bb.model; + +import jakarta.validation.constraints.NotEmpty; + +import lombok.Data; + +@Data +public class TOtpVO { + + @NotEmpty + private String siteId; + @NotEmpty + private String adminId; // account + private String domain; // issuer +} diff --git a/src/main/java/com/bb/model/TestDto.java b/src/main/java/com/bb/model/TestDto.java new file mode 100644 index 0000000..fc9a3f0 --- /dev/null +++ b/src/main/java/com/bb/model/TestDto.java @@ -0,0 +1,14 @@ +package com.bb.model; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TestDto { + + private String username; + private int age; +} diff --git a/src/main/java/com/bb/model/Top15Info.java b/src/main/java/com/bb/model/Top15Info.java new file mode 100644 index 0000000..f350e57 --- /dev/null +++ b/src/main/java/com/bb/model/Top15Info.java @@ -0,0 +1,10 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class Top15Info { + private String memId; + private String memNick; + private String amount; +} diff --git a/src/main/java/com/bb/model/TreeListSearch.java b/src/main/java/com/bb/model/TreeListSearch.java new file mode 100644 index 0000000..fb6d08f --- /dev/null +++ b/src/main/java/com/bb/model/TreeListSearch.java @@ -0,0 +1,13 @@ +package com.bb.model; + +import jakarta.validation.constraints.NotBlank; + +import lombok.Data; + +@Data +public class TreeListSearch { + private String targetId; + + @NotBlank + private String searchType; +} diff --git a/src/main/java/com/bb/model/TripleAuthInfo.java b/src/main/java/com/bb/model/TripleAuthInfo.java new file mode 100644 index 0000000..aee150f --- /dev/null +++ b/src/main/java/com/bb/model/TripleAuthInfo.java @@ -0,0 +1,21 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class TripleAuthInfo { + +// private int idx; // PK + private String siteId; // oms siteId + private String memId; // oms memId + private int id; // triple 유저 고유 id + private String username; // triple 유저 ID (siteId_memId) + private String nickname; // triple 유저 닉네임 + private String regDate; // 등록일시 + private String updDate; // 수정일시 + private String partnerLevel; // 파트너 등급 + + private String apiUrl; // Triple API url + private String clientId; // Triple API agent id + private String clientSecretKey; // Triple API agent key +} diff --git a/src/main/java/com/bb/model/TripleDVO.java b/src/main/java/com/bb/model/TripleDVO.java new file mode 100644 index 0000000..c0ef862 --- /dev/null +++ b/src/main/java/com/bb/model/TripleDVO.java @@ -0,0 +1,49 @@ +package com.bb.model; + +import java.util.List; + +import lombok.Data; +import net.sf.json.JSONObject; + +@Data +public class TripleDVO { + + private long idx; + private int siteIdx; + private int memIdx; + private String siteId; + private String memId; + private String memLevel; + private String betId; + private String tranId; + private int vendorIdx; + private String vendorKey; + private String vendor; + private int gameIdx; + private String gameKey; + private String userId; + private String tranType; + private double debit; + private double credit; + private double beforeCash; + private double afterCash; + private int isCancel; + private int isBonus; + private String decYn; // "Y"일 경우 debit이나 credit 값을 100으로 나눈다. + private String regDate; + private JSONObject detail; + private String detailStr; + private int blankSpinCasinoRate; + private int blankSpinSlotRate; + private String isBiPushYn; // 유저 보험누르기 적용대상 여부(Y: 적용, N:미적용) + private String isBiProcYn; // Y:보험처리완료, N: 보험처리전 + private String requestAt; + private String betYn; + private String memLockYn; + private String symLock; + private String minusBalanceYn; // "Y"로 요청시 유저 보유금이 마이너스(음수) 값을 가지더라도 잔액 리턴 + private List betDetails; + + private String status; + +} diff --git a/src/main/java/com/bb/model/TripleDetailVO.java b/src/main/java/com/bb/model/TripleDetailVO.java new file mode 100644 index 0000000..07435a8 --- /dev/null +++ b/src/main/java/com/bb/model/TripleDetailVO.java @@ -0,0 +1,15 @@ +package com.bb.model; + +import lombok.Data; +import net.sf.json.JSONObject; + +@Data +public class TripleDetailVO { + + private String detailId; + private String detailType; + private String detailName; + private int betAmt; + private int betWinAmt; + private JSONObject detail; +} diff --git a/src/main/java/com/bb/model/TripleGameRate.java b/src/main/java/com/bb/model/TripleGameRate.java new file mode 100644 index 0000000..b6b5723 --- /dev/null +++ b/src/main/java/com/bb/model/TripleGameRate.java @@ -0,0 +1,13 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class TripleGameRate { + + private String siteApiKey; // 트리플 사이트 api key + private Integer vendorIdx; // 트리플 게임 코드값 + private String vendor; // pragmatic_slot, bota_khan, dowin, union, mon_evoltion, tpabomb, hub88, kgon, evolution + private String gameRate; // 게임 요율 + +} diff --git a/src/main/java/com/bb/model/TriplePurchaseId.java b/src/main/java/com/bb/model/TriplePurchaseId.java new file mode 100644 index 0000000..cbb05e5 --- /dev/null +++ b/src/main/java/com/bb/model/TriplePurchaseId.java @@ -0,0 +1,10 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class TriplePurchaseId { + + private String betId; + private String purchaseId; +} diff --git a/src/main/java/com/bb/model/TripleResponse.java b/src/main/java/com/bb/model/TripleResponse.java new file mode 100644 index 0000000..ea77eb4 --- /dev/null +++ b/src/main/java/com/bb/model/TripleResponse.java @@ -0,0 +1,14 @@ +package com.bb.model; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import lombok.Data; + +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +public class TripleResponse { + + private int result_code; + private Integer balance; + private String error_msg; +} diff --git a/src/main/java/com/bb/model/TripleSbVO.java b/src/main/java/com/bb/model/TripleSbVO.java new file mode 100644 index 0000000..060f3ab --- /dev/null +++ b/src/main/java/com/bb/model/TripleSbVO.java @@ -0,0 +1,19 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class TripleSbVO { + private long idx; + private String siteId; + private String memId; + private String tranId; + private String userId; + private String vendor; + private String tranType; + private int amount; + private Long balance; + private String betYn; + private String memLockYn; + private String symLock; +} diff --git a/src/main/java/com/bb/model/TripleVO.java b/src/main/java/com/bb/model/TripleVO.java new file mode 100644 index 0000000..9649a63 --- /dev/null +++ b/src/main/java/com/bb/model/TripleVO.java @@ -0,0 +1,50 @@ +package com.bb.model; + +import java.util.List; + +import lombok.Data; +import net.sf.json.JSONObject; + +@Data +public class TripleVO { + + private long idx; + private int siteIdx; + private int memIdx; + private String siteId; + private String memId; + private String memLevel; + private String betId; + private String tranId; + private int vendorIdx; + private String vendorKey; + private String vendor; + private int gameIdx; + private String gameKey; + private String userId; + private String tranType; + private int debit; + private int credit; + private Long beforeCash; + private Long afterCash; + private long afterMoney; // HSlot에서 유저머니 안맞을경우 대체 할 잔액 + private int isCancel; + private int isBonus; + private String decYn; // "Y"일 경우 debit이나 credit 값을 100으로 나눈다. + private String regDate; + private JSONObject detail; + private String detailStr; + private int blankSpinCasinoRate; + private int blankSpinSlotRate; + private String isBiPushYn; // 유저 보험누르기 적용대상 여부(Y: 적용, N:미적용) + private String isBiProcYn; // Y:보험처리완료, N: 보험처리전 + private String requestAt; + private String betYn; + private String memLockYn; + private String symLock; + private String minusBalanceYn; // "Y"로 요청시 유저 보유금이 마이너스(음수) 값을 가지더라도 잔액 리턴 + private List betDetails; + + private String status; + +} diff --git a/src/main/java/com/bb/model/TrxSearchVO.java b/src/main/java/com/bb/model/TrxSearchVO.java new file mode 100644 index 0000000..a81394b --- /dev/null +++ b/src/main/java/com/bb/model/TrxSearchVO.java @@ -0,0 +1,14 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class TrxSearchVO extends PageFormVO { + + private String siteId; + private String memId; + private String betId; + private String oldYn; + private String startDate; + private String endDate; +} diff --git a/src/main/java/com/bb/model/UserDetailInfo.java b/src/main/java/com/bb/model/UserDetailInfo.java new file mode 100644 index 0000000..ca53bd0 --- /dev/null +++ b/src/main/java/com/bb/model/UserDetailInfo.java @@ -0,0 +1,24 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class UserDetailInfo { + + private String siteId; + private String memId; + private String memNick; + private String memName; + private String memPhone; + private String partnerLevel; + private String partnerLevelName; + private String recommenderId; + private String upperLevel; + private String upperLevelName; + private String loginYn; + private String betYn; + private String cashBalance; + private String pointBalance; + private String joinDate; + +} diff --git a/src/main/java/com/bb/model/UserListSearch.java b/src/main/java/com/bb/model/UserListSearch.java new file mode 100644 index 0000000..1bdedc5 --- /dev/null +++ b/src/main/java/com/bb/model/UserListSearch.java @@ -0,0 +1,24 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class UserListSearch extends PageFormVO { + + private String siteId; + private String memId; + private String memNick; + private String recommenderId; + private String partnerLevel; + private String searchType; + private String searchValue; + private String cashType; + private String startDate; + private String endDate; + private String oldYn; + private String treeOption; // 직속회원 옵션 [기본값:Off("N"), On("Y")] + private String orderColumn; + private String orderType; + private String orderStr; + private String blankSpinSetType; +} diff --git a/src/main/java/com/bb/model/UserSearch.java b/src/main/java/com/bb/model/UserSearch.java new file mode 100644 index 0000000..45aaaf8 --- /dev/null +++ b/src/main/java/com/bb/model/UserSearch.java @@ -0,0 +1,21 @@ +package com.bb.model; + +import lombok.Data; + +@Data +public class UserSearch { + + private String siteId; + private String memId; + private String searchType; + private String searchValue; + private String startDate; + private String endDate; + private String statType; + private String oldYn; + private String orderColumn; + private String orderType; + private String orderStr; + private String treeOption; // 직속회원 옵션 [기본값:Off("N"), On("Y")] + private String blankSpinSetType; +} diff --git a/src/main/java/com/bb/model/VendorGameReq.java b/src/main/java/com/bb/model/VendorGameReq.java new file mode 100644 index 0000000..0fa86c7 --- /dev/null +++ b/src/main/java/com/bb/model/VendorGameReq.java @@ -0,0 +1,17 @@ +package com.bb.model; + +import jakarta.validation.constraints.NotEmpty; + +import lombok.Data; + +@Data +public class VendorGameReq extends VendorReq { + + @NotEmpty + String gameKey; + + String gameName; + + String type; + +} diff --git a/src/main/java/com/bb/model/VendorReq.java b/src/main/java/com/bb/model/VendorReq.java new file mode 100644 index 0000000..40e6996 --- /dev/null +++ b/src/main/java/com/bb/model/VendorReq.java @@ -0,0 +1,18 @@ +package com.bb.model; + +import jakarta.validation.constraints.NotEmpty; + +import lombok.Data; + +@Data +public class VendorReq { + + int kplayId; + + @NotEmpty + String gameType; + + @NotEmpty + String vendorKey; + +} diff --git a/src/main/java/com/bb/service/AsyncBetService.java b/src/main/java/com/bb/service/AsyncBetService.java new file mode 100644 index 0000000..faa8e6e --- /dev/null +++ b/src/main/java/com/bb/service/AsyncBetService.java @@ -0,0 +1,296 @@ +package com.bb.service; + +import java.util.HashMap; +import java.util.List; + +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import com.bb.dao.BetDao; +import com.bb.dao.CashDao; +import com.bb.dao.CommonDao; +import com.bb.model.CashDetail; +import com.bb.model.RvHoldemVO; +import com.bb.util.RandomRolling; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RequiredArgsConstructor +@Service +public class AsyncBetService { + + private final BetDao betDao; + + private final CashDao cashDao; + + private final CommonDao commonDao; + + @Async + public void rollingProc(String LOG_PREFIX, HashMap betData) { + try { + log.info(LOG_PREFIX+ "ROLLING::betInfo::"+betData.toString()); + String betId = betData.get("betId").toString(); + HashMap preBetData = betDao.getPreBetData(betData); + + if(preBetData == null) { + String gameCategory = betData.get("gameCategory").toString(); + String vendorCode = betData.get("vendorCode").toString(); + int betAmt = Integer.parseInt(betData.get("betAmt").toString()); + + HashMap rollingInfo = betDao.getRollingInfo(betData); + log.info(LOG_PREFIX+ "ROLLING::rollingInfo::"+rollingInfo.toString()); + int bsCasinoRate = Integer.parseInt(rollingInfo.get("blankSpinCasinoRate").toString()); + int bsSlotRate = Integer.parseInt(rollingInfo.get("blankSpinSlotRate").toString()); + String blankSpinSetType = rollingInfo.get("blankSpinSetType").toString(); + + int betCnt = 0; + long sumWinAmt = 0; + HashMap totalInfo = betDao.getBetTodayTotalInfoNew(betData); + if(totalInfo != null) { + betCnt = Integer.parseInt(totalInfo.get("betCnt").toString()); + sumWinAmt = Long.parseLong(totalInfo.get("sumWinAmt").toString()); + log.info(LOG_PREFIX+ "ROLLING::totalInfo::"+totalInfo.toString()); + } + + int rate = 0; + if( blankSpinSetType.equals("B") && ( betCnt < 20 || betAmt >= sumWinAmt ) ) { + rate = 0; + } else { + if(gameCategory.equals("casino")) { + rate = bsCasinoRate; + } else if(gameCategory.equals("slot")) { + rate = bsSlotRate; + } else { + rate = 0; + } + } + + // isBlankSpin = true (롤링공회전), isBlankSpin = false (롤링진행) + boolean isBlankSpin = RandomRolling.isBlankSpin(rate); + if(isBlankSpin) { + betData.put("isBlankSpinYn", "Y"); + log.info(LOG_PREFIX+ "ROLLING::insertBetRolling isBlankSpin"); + } else { + betData.put("isBlankSpinYn", "N"); + int rollingResult = betDao.insertBetRolling(betData); + log.info(LOG_PREFIX+ "ROLLING::insertBetRolling Result::"+rollingResult); + + try { + //int losingResult = betDao.insertBetLosing(betData); + //log.info(LOG_PREFIX+ "LOSING::insertBetLosing Result::"+losingResult); + + int losingResult = betDao.insertBetLosingNew(betData); + log.info(LOG_PREFIX+ "LOSING::insertBetLosingNew Result::"+losingResult); + } catch(Exception e1) { + log.error(LOG_PREFIX+ "LOSING::insertBetLosing::Exception::"+e1.getMessage()); + } + } + } else { + String isBlankSpinYn = preBetData.get("isBlankSpinYn").toString(); + if(isBlankSpinYn.equals("Y")) { + betData.put("isBlankSpinYn", "Y"); + log.info(LOG_PREFIX+ "ROLLING::insertBetRolling isBlankSpin"); + } else { + betData.put("isBlankSpinYn", "N"); + int rollingResult = betDao.insertBetRolling(betData); + log.info(LOG_PREFIX+ "ROLLING::insertBetRolling Result::"+rollingResult); + + try { + //int losingResult = betDao.insertBetLosing(betData); + //log.info(LOG_PREFIX+ "LOSING::insertBetLosing Result::"+losingResult); + + int losingResult = betDao.insertBetLosingNew(betData); + log.info(LOG_PREFIX+ "LOSING::insertBetLosingNew Result::"+losingResult); + } catch(Exception e1) { + log.error(LOG_PREFIX+ "LOSING::insertBetLosing::Exception::"+e1.getMessage()); + } + } + } + + betData.put("pointRegYn", "Y"); + int updReasult = betDao.updateRollingYn(betData); + log.info(LOG_PREFIX+ "ROLLING::updateRollingYn Reasult::"+updReasult); + + HashMap logParam = new HashMap(); + logParam.put("siteId", betData.get("siteId").toString()); + logParam.put("memId", betData.get("memId").toString()); + logParam.put("actionType", 3); + commonDao.updateAcctionLog(logParam); + } catch (Exception e) { + log.error(LOG_PREFIX+ "ROLLING::rollingProc::Exception::"+e.getMessage()); + } + } + + @Async + public void rollingTieProc(String LOG_PREFIX, String betId) { + try { + HashMap betData = betDao.getReferenceData1(betId); + String isBlankSpinYn = betData.get("isBlankSpinYn").toString(); + int betAmt = Integer.parseInt(betData.get("betAmt").toString()); + int betWinAmt = Integer.parseInt(betData.get("betWinAmt").toString()); + if( isBlankSpinYn.equals("N") && ((Math.abs(betAmt) == Math.abs(betWinAmt)) || (Math.abs(betAmt*12) < Math.abs(betWinAmt))) ) { + log.info(LOG_PREFIX+ "ROLLING_TIE::betInfo::"+betData.toString()); + List list = betDao.getCancelPointAmtList(betId); + if(list != null) { + for(HashMap item : list) { + String pointAmt = item.get("pointAmt").toString(); + log.info(LOG_PREFIX+ "ROLLING_TIE::getCancelPointAmt::"+pointAmt); + int updResult = betDao.updateCancelPoint(item); + log.info(LOG_PREFIX+ "ROLLING_TIE::updateCancelPoint Reasult::"+updResult); + } + int cancelResult1 = betDao.deleteRollingCancel(betId); + log.info(LOG_PREFIX+ "ROLLING_TIE::deleteRollingCancel Reasult::"+cancelResult1); + + int cancelResult2 = betDao.deleteLosingCancel(betId); + log.info(LOG_PREFIX+ "ROLLING_TIE::deleteLosingCancel Reasult::"+cancelResult2); + } + } + } catch (Exception e) { + log.error(LOG_PREFIX+ "ROLLING_TIE::rollingProc::Exception::"+e.getMessage()); + } + } + + @Async + public void rollingCancelProc(String LOG_PREFIX, int betAmt, HashMap betData) { + try { + log.info(LOG_PREFIX+ "ROLLING_CANCEL::betInfo::"+betData.toString()); + int cancelAmt = Integer.parseInt(betData.get("betWinAmt").toString()); + + log.info(LOG_PREFIX+ "betAmt : "+betAmt); + log.info(LOG_PREFIX+ "cancelAmt : "+cancelAmt); + + if(betAmt == cancelAmt) { + // 전체취소 + int cancelResult1 = betDao.cancelBetNew(betData); + log.info(LOG_PREFIX+ "cancelBet result : "+cancelResult1); + + String betId = betData.get("betId").toString(); + List list = betDao.getCancelPointAmtList(betId); + if(list != null) { + for(HashMap item : list) { + String pointAmt = item.get("pointAmt").toString(); + log.info(LOG_PREFIX+ "ROLLING_CANCEL::getCancelPointAmt::"+pointAmt); + int updResult = betDao.updateCancelPoint(item); + log.info(LOG_PREFIX+ "ROLLING_CANCEL::updateCancelPoint Reasult::"+updResult); + } + int cancelResult2 = betDao.deleteRollingCancel(betId); + log.info(LOG_PREFIX+ "ROLLING_CANCEL::deleteRollingCancel Reasult::"+cancelResult2); + + int cancelResult3 = betDao.deleteLosingCancel(betId); + log.info(LOG_PREFIX+ "ROLLING_TIE::deleteLosingCancel Reasult::"+cancelResult3); + } + } else { + Long betIdx = betDao.getCancelTargetIdx(betData); + if(betIdx != null && 0 != betIdx.longValue()) { + // 부분취소 + int cancelResult = betDao.cancelBetNew2(betIdx.longValue()); + log.info(LOG_PREFIX+ "cancelBet result : "+cancelResult); + + List list = betDao.getCancelPointAmtList2(betIdx); + if(list != null) { + for(HashMap item : list) { + String pointAmt = item.get("pointAmt").toString(); + log.info(LOG_PREFIX+ "ROLLING_CANCEL::getCancelPointAmt::"+pointAmt); + int updResult = betDao.updateCancelPoint(item); + log.info(LOG_PREFIX+ "ROLLING_CANCEL::updateCancelPoint Reasult::"+updResult); + } + int cancelResult2 = betDao.deleteRollingCancel2(betIdx); + log.info(LOG_PREFIX+ "ROLLING_CANCEL::deleteRollingCancel Reasult::"+cancelResult2); + + int cancelResult3 = betDao.deleteLosingCancel2(betIdx); + log.info(LOG_PREFIX+ "ROLLING_TIE::deleteLosingCancel Reasult::"+cancelResult3); + } + + String betId = betData.get("betId").toString(); + HashMap betData2 = betDao.getReferenceData1(betId); + String isBlankSpinYn = betData2.get("isBlankSpinYn").toString(); + int newBetAmt = Integer.parseInt(betData2.get("betAmt").toString()); + int newBetWinAmt = Integer.parseInt(betData2.get("betWinAmt").toString()); + if( isBlankSpinYn.equals("N") && ((Math.abs(newBetAmt) == Math.abs(newBetWinAmt)) || (Math.abs(newBetAmt*12) < Math.abs(newBetWinAmt)) )) { + log.info(LOG_PREFIX+ "ROLLING_CANCEL_TIE::betInfo::"+betData2.toString()); + List list2 = betDao.getCancelPointAmtList(betId); + if(list != null) { + for(HashMap item : list2) { + String pointAmt = item.get("pointAmt").toString(); + log.info(LOG_PREFIX+ "ROLLING_CANCEL_TIE::getCancelPointAmt::"+pointAmt); + int updResult = betDao.updateCancelPoint(item); + log.info(LOG_PREFIX+ "ROLLING_CANCEL_TIE::updateCancelPoint Reasult::"+updResult); + } + int cancelResult3 = betDao.deleteRollingCancel(betId); + log.info(LOG_PREFIX+ "ROLLING_CANCEL_TIE::deleteRollingCancel Reasult::"+cancelResult3); + + int cancelResult4 = betDao.deleteLosingCancel(betId); + log.info(LOG_PREFIX+ "ROLLING_TIE::deleteLosingCancel Reasult::"+cancelResult4); + } + } + + } else { + log.error(LOG_PREFIX+ "ROLLING_CANCEL::부분취소 실패... 동일금액의 베팅건을 찾을 수 없습니다."); + } + } + + } catch (Exception e) { + log.error(LOG_PREFIX+ "ROLLING_CANCEL::rollingProc::Exception::"+e.getMessage()); + } + } + + @Async + public void cashProc(String LOG_PREFIX, RvHoldemVO rvParam) { + CashDetail paramCash = new CashDetail(); + paramCash.setSiteId(rvParam.getSiteId()); + paramCash.setMemId(rvParam.getMemId()); + if(rvParam.getCallbackType().equals("buyin")) { + paramCash.setCashType("RVH-BYI"); + paramCash.setCashDesc("RV-HOLDEM 바이인"); + } else if(rvParam.getCallbackType().equals("rebuyin")) { + paramCash.setCashType("RVH-RBI"); + paramCash.setCashDesc("RV-HOLDEM 리바인"); + } else if(rvParam.getCallbackType().equals("win")) { + paramCash.setCashType("RVH-WIN"); + paramCash.setCashDesc("RV-HOLDEM 우승"); + } else { + paramCash.setCashType("RVH-LVE"); + paramCash.setCashDesc("RV-HOLDEM 캐시아웃"); + } + paramCash.setCashAmt(rvParam.getAmount()); + paramCash.setBetIdx(Long.toString(rvParam.getCbIdx())); + paramCash.setDelYn("N"); + paramCash.setCashStatus("1"); + paramCash.setMemo(""); + paramCash.setRegId(rvParam.getMemId()); + paramCash.setAdminId(""); + paramCash.setPreCashAmt(Integer.toString(rvParam.getBfBalance())); + long resultCash = cashDao.insertCash(paramCash); + log.info(LOG_PREFIX+ "cashProc::insertCash Reasult::"+resultCash); + } + + @Async + public void losingResultProc(String LOG_PREFIX, HashMap betData) { + try { + log.info(LOG_PREFIX+ "LOSING_R::betInfo::"+betData.toString()); + String betId = betData.get("betId").toString(); + HashMap preBetData = betDao.getPreBetData(betData); + + if(preBetData == null) { + log.error(LOG_PREFIX+ "LOSING_R::Not found preBetData"); + } else { + String isBlankSpinYn = preBetData.get("isBlankSpinYn").toString(); + if(isBlankSpinYn.equals("Y")) { + log.info(LOG_PREFIX+ "LOSING_R::insertBetLosing is BlankSpin"); + } else { + // TODO: Losing insert + //int losingResult = betDao.insertBetLosing(betData); + //log.info(LOG_PREFIX+ "LOSING_R::insertBetLosing Result::"+losingResult); + + int losingResult = betDao.insertWinLosing(betData); + log.info(LOG_PREFIX+ "LOSING_R::insertWinLosing Result::"+losingResult); + } + } + } catch (Exception e) { + log.error(LOG_PREFIX+ "LOSING_R::Exception::"+e.getMessage()); + } + } + +} diff --git a/src/main/java/com/bb/service/AsyncExcoinOtcService.java b/src/main/java/com/bb/service/AsyncExcoinOtcService.java new file mode 100644 index 0000000..1d4a48d --- /dev/null +++ b/src/main/java/com/bb/service/AsyncExcoinOtcService.java @@ -0,0 +1,224 @@ +package com.bb.service; + +import java.net.SocketTimeoutException; +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.HashMap; + +import org.apache.http.conn.ConnectTimeoutException; +import org.codehaus.jettison.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.ResourceAccessException; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.util.UriComponentsBuilder; + +import lombok.extern.slf4j.Slf4j; +import reactor.core.publisher.Mono; + +@Slf4j +@Service +public class AsyncExcoinOtcService { + + @Autowired + WebClient webClient; + + private HttpHeaders getHeader(String LOG_PREFIX) { + LOG_PREFIX = LOG_PREFIX + "::getHeader::"; + HttpHeaders headers = new HttpHeaders(); + //headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + headers.set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); + headers.set("User-Agent", "PostmanRuntime/7.28.4"); + headers.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8"))); + + return headers; + } + + public int createUser(String LOG_PREFIX, HashMap exCoinInfo) { + int resultCode = 0; + LOG_PREFIX = LOG_PREFIX + "EXCOIN_OTC::createUser::"; + + try { + String bypassUrl = exCoinInfo.get("bypassUrl").toString(); + bypassUrl = "http://localhost:8080/api"; + HttpHeaders headers = getHeader(LOG_PREFIX); + UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(bypassUrl+"/bypass"); + + String targetUrl = exCoinInfo.get("apiBaseUrl").toString()+"/bt.user.joinUserInfo.dp/proc.go"; + String targetMethod = "GET"; + String targetParameter = "userEmail="+exCoinInfo.get("userEmail").toString()+"&userMobile="+exCoinInfo.get("userMobile").toString()+"&userNm="+exCoinInfo.get("userNm").toString(); + String parameterType = "FORM"; + + MultiValueMap params = new LinkedMultiValueMap<>(); + params.add("targetUrl", targetUrl); + params.add("targetMethod", targetMethod); + params.add("targetParameter", targetParameter); + params.add("parameterType", parameterType); + log.info(LOG_PREFIX+ "API_URL::" + uriBuilder.toUriString()); + log.info(LOG_PREFIX+ "API_BODY::" + params.toString()); + + Mono resMono = webClient.post() + .uri(uriBuilder.toUriString()) + .contentType(MediaType.APPLICATION_FORM_URLENCODED) + .headers(httpHeaders -> httpHeaders.addAll(headers)) + .bodyValue(params) + .retrieve() + .bodyToMono(String.class); + String responseStr = resMono.block(); + + if(responseStr != null) { + log.info(LOG_PREFIX+ "response : " + responseStr); + JSONObject responseObj = new JSONObject(responseStr); + resultCode = responseObj.getInt("resultCode"); + } + + } catch (ResourceAccessException rae) { + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error(LOG_PREFIX+ "ConnectTimeoutException::"+rae.getMessage()); + } + + if(rae.getCause() instanceof SocketTimeoutException) { + log.error(LOG_PREFIX+ "SocketTimeoutException::"+rae.getMessage()); + } + + if(rae.getCause() instanceof InterruptedException) { + log.error(LOG_PREFIX+ "InterruptedException::"+rae.getMessage()); + } + } catch(HttpClientErrorException hee) { + String str = hee.getResponseBodyAsString(); + log.error(LOG_PREFIX+ "HttpClientErrorException::"+str); + } catch (Exception e) { + log.error(LOG_PREFIX+ "Exception::"+e.getMessage()); + e.printStackTrace(); + } + + return resultCode; + } + + public int updateUser(String LOG_PREFIX, HashMap exCoinInfo) { + int resultCode = 0; + LOG_PREFIX = LOG_PREFIX + "EXCOIN_OTC::updateUser::"; + + try { + String bypassUrl = exCoinInfo.get("bypassUrl").toString(); + bypassUrl = "http://localhost:8080/api"; + HttpHeaders headers = getHeader(LOG_PREFIX); + UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(bypassUrl+"/bypass"); + + String targetUrl = exCoinInfo.get("apiBaseUrl").toString()+"/bt.user.uptUserInfo.dp/proc.go"; + String targetMethod = "GET"; + String targetParameter = "userEmail="+exCoinInfo.get("userEmail").toString()+"&userMobile="+exCoinInfo.get("userMobile").toString()+"&userNm="+exCoinInfo.get("userNm").toString(); + String parameterType = "FORM"; + + MultiValueMap params = new LinkedMultiValueMap<>(); + params.add("targetUrl", targetUrl); + params.add("targetMethod", targetMethod); + params.add("targetParameter", targetParameter); + params.add("parameterType", parameterType); + log.info(LOG_PREFIX+ "API_URL::" + uriBuilder.toUriString()); + log.info(LOG_PREFIX+ "API_BODY::" + params.toString()); + + Mono resMono = webClient.post() + .uri(uriBuilder.toUriString()) + .contentType(MediaType.APPLICATION_FORM_URLENCODED) + .headers(httpHeaders -> httpHeaders.addAll(headers)) + .bodyValue(params) + .retrieve() + .bodyToMono(String.class); + String responseStr = resMono.block(); + + if(responseStr != null) { + JSONObject responseObj = new JSONObject(responseStr); + log.info(LOG_PREFIX+ "response : " + responseObj); + resultCode = responseObj.getInt("resultCode"); + } + + } catch (ResourceAccessException rae) { + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error(LOG_PREFIX+ "ConnectTimeoutException::"+rae.getMessage()); + } + + if(rae.getCause() instanceof SocketTimeoutException) { + log.error(LOG_PREFIX+ "SocketTimeoutException::"+rae.getMessage()); + } + + if(rae.getCause() instanceof InterruptedException) { + log.error(LOG_PREFIX+ "InterruptedException::"+rae.getMessage()); + } + } catch(HttpClientErrorException hee) { + String str = hee.getResponseBodyAsString(); + log.error(LOG_PREFIX+ "HttpClientErrorException::"+str); + } catch (Exception e) { + log.error(LOG_PREFIX+ "Exception::"+e.getMessage()); + e.printStackTrace(); + } + + return resultCode; + } + + @Async + public void requestTrade(String LOG_PREFIX, HashMap exCoinInfo) { + LOG_PREFIX = LOG_PREFIX + "EXCOIN_OTC::requestTrade::"; + + try { + String bypassUrl = exCoinInfo.get("bypassUrl").toString(); + bypassUrl = "http://localhost:8080/api"; + HttpHeaders headers = getHeader(LOG_PREFIX); + UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(bypassUrl+"/bypass"); + + String targetUrl = exCoinInfo.get("apiBaseUrl").toString()+"/bt.user.setOtcTradeRnl.dp/proc.go"; + String targetMethod = "GET"; + String targetParameter = "userEmail="+exCoinInfo.get("userEmail").toString()+"&otcCode="+exCoinInfo.get("apiKey").toString()+"&cnAmt="+exCoinInfo.get("cashAmt").toString(); + String parameterType = "FORM"; + + MultiValueMap params = new LinkedMultiValueMap<>(); + params.add("targetUrl", targetUrl); + params.add("targetMethod", targetMethod); + params.add("targetParameter", targetParameter); + params.add("parameterType", parameterType); + log.info(LOG_PREFIX+ "API_URL::" + uriBuilder.toUriString()); + log.info(LOG_PREFIX+ "API_BODY::" + params.toString()); + + Mono resMono = webClient.post() + .uri(uriBuilder.toUriString()) + .contentType(MediaType.APPLICATION_FORM_URLENCODED) + .headers(httpHeaders -> httpHeaders.addAll(headers)) + .bodyValue(params) + .retrieve() + .bodyToMono(String.class); + String responseStr = resMono.block(); + + if(responseStr != null) { + JSONObject responseObj = new JSONObject(responseStr); + log.info(LOG_PREFIX+ "response : " + responseObj); + } + + } catch (ResourceAccessException rae) { + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error(LOG_PREFIX+ "ConnectTimeoutException::"+rae.getMessage()); + } + + if(rae.getCause() instanceof SocketTimeoutException) { + log.error(LOG_PREFIX+ "SocketTimeoutException::"+rae.getMessage()); + } + + if(rae.getCause() instanceof InterruptedException) { + log.error(LOG_PREFIX+ "InterruptedException::"+rae.getMessage()); + } + } catch(HttpClientErrorException hee) { + String str = hee.getResponseBodyAsString(); + log.error(LOG_PREFIX+ "HttpClientErrorException::"+str); + } catch (Exception e) { + log.error(LOG_PREFIX+ "Exception::"+e.getMessage()); + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/com/bb/service/AsyncTripleDService.java b/src/main/java/com/bb/service/AsyncTripleDService.java new file mode 100644 index 0000000..b4b3ebe --- /dev/null +++ b/src/main/java/com/bb/service/AsyncTripleDService.java @@ -0,0 +1,1157 @@ +package com.bb.service; + +import java.util.HashMap; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient; + +import com.bb.dao.BetDao; +import com.bb.dao.CommonDao; +import com.bb.dao.UserDao; +import com.bb.model.CodeSearch; +import com.bb.model.TripleDVO; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +@Slf4j +@RequiredArgsConstructor +@Service +public class AsyncTripleDService { + + private final BetDao betDao; + + private final UserDao userDao; + + private final CommonDao commonDao; + + @Autowired + WebClient webClient; + + + @Async + public void insertDSportBetDebit(TripleDVO tripleVO) { + long startTime = System.currentTimeMillis(); + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::#-Async::insertSportBetDebit::::"; + + try { + // 최초 배팅 건 + double amount = Math.abs(tripleVO.getDebit()); + + HashMap param = new HashMap(); + param.put("betIdx", 0); + param.put("siteId", tripleVO.getSiteId()); + param.put("memId", tripleVO.getMemId()); + param.put("betType", "triple"); + param.put("gameCategory", "sport"); + param.put("vendorCode", "splus"); + param.put("vendor", tripleVO.getVendor()); + param.put("betId", tripleVO.getBetId()); + + if(tripleVO.getDetail() != null) { + JSONObject detail = tripleVO.getDetail(); + Object betTypeNameName = findFirstValueByKey(detail, "BetTypeName"); + + param.put("gameName", betTypeNameName); + } else { + param.put("gameName", tripleVO.getGameKey()); + } + + param.put("betAmt", Double.toString(amount)); + param.put("betRate", "0"); + param.put("betWinAmt", "0"); + double bfMoney = tripleVO.getBeforeCash(); + param.put("bfMoney", Double.toString(bfMoney)); + double afMoney = tripleVO.getAfterCash(); + param.put("afMoney", Double.toString(afMoney)); + param.put("betBonus", "0"); + param.put("betCnt", "1"); + param.put("regId", tripleVO.getMemId()); + param.put("updId", tripleVO.getMemId()); + param.put("delYn","N"); + param.put("updDate", ""); + param.put("regDate", ""); + + String biPushYn = "N"; + param.put("biPushYn", biPushYn); + int betResult = betDao.insertBet(param); + log.info(LOG_PREFIX+ "::insertBet::SUCC"); + Long betIdx = (Long) param.get("betIdx"); + + if(tripleVO.getDetail() != null) { + HashMap mapParam = new HashMap(); + mapParam.put("betIdx", betIdx.longValue()); + mapParam.put("mapId", "sport"); + mapParam.put("rateTypeCode", "splus"); + mapParam.put("betName", ""); + mapParam.put("betAmt", Double.toString(amount)); + mapParam.put("betRate", "0"); + mapParam.put("betWinAmt", "0"); + mapParam.put("debitDetailStr", tripleVO.getDetail().toString()); + log.info(LOG_PREFIX+ "::mapParam::" + mapParam.toString()); + int betMapResult = betDao.insertBetMap(mapParam); + + if(betMapResult > 0) { + int sportsResult = sportsDDebitProc(betIdx.longValue(), tripleVO); + log.info(LOG_PREFIX+ "::sportsDebitProc::result::" + sportsResult); + } + + // 스포츠 정산 배팅금 처리 + double betWinAmt = tripleVO.getCredit(); + HashMap repParam = new HashMap(); + repParam.put("betIdx", betIdx.longValue()); + repParam.put("betAmt", amount); + log.info(LOG_PREFIX+ "::updateSportReportDebit::repParam::" + repParam.toString()); + int repResult = betDao.updateSportReportDebit(repParam); + log.info(LOG_PREFIX+ "::updateSportReportDebit::repResult::" + repResult); + } + + HashMap logParam = new HashMap(); + logParam.put("siteId", tripleVO.getSiteId()); + logParam.put("memId", tripleVO.getMemId()); + logParam.put("actionType", 3); + commonDao.updateAcctionLog(logParam); + + } catch (Exception e) { + log.error(LOG_PREFIX+ "::Exception"); + log.error(LOG_PREFIX+ "::ERROR::" + e.getMessage()); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -2.0) log.error(LOG_PREFIX+ "::diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + + @Async + public void updateDBetDebit(TripleDVO tripleVO, Long betIdx) { + long startTime = System.currentTimeMillis(); + final String LOG_PREFIX = "#-callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::#-Async::updateBetDebit::::"; + + try { + double amount = Math.abs(tripleVO.getDebit()); + + HashMap betUpdParam = new HashMap(); + betUpdParam.put("betIdx", betIdx); + betUpdParam.put("betAmt", Double.toString(amount)); + int betResult = betDao.updateBetInfo(betUpdParam); + int mapResult = betDao.updateBetInfoMap(betUpdParam); + + HashMap cashUpdParam = new HashMap(); + cashUpdParam.put("betIdx", betIdx); + cashUpdParam.put("cashType", "-9"); + cashUpdParam.put("memId", tripleVO.getMemId()); + cashUpdParam.put("siteid", tripleVO.getSiteId()); + double cashAmt = amount * -1; + cashUpdParam.put("cashAmt", Double.toString(cashAmt)); + int cashResult = betDao.updateCashInfo(cashUpdParam); + log.info(LOG_PREFIX+ "["+betIdx+"] - updateCashInfo : " + cashResult); + + if(tripleVO.getVendorIdx() == 83 || tripleVO.getVendorIdx() == 83) { + // 스포츠 정산 배팅금 처리 + double betWinAmt = tripleVO.getCredit(); + HashMap repParam = new HashMap(); + repParam.put("betIdx", betIdx.longValue()); + repParam.put("betAmt", amount); + log.info(LOG_PREFIX+ "::updateSportReportDebit::repParam::" + repParam.toString()); + int repResult = betDao.updateSportReportDebit(repParam); + log.info(LOG_PREFIX+ "::updateSportReportDebit::repResult::" + repResult); + } + + } catch (Exception e) { + log.error(LOG_PREFIX+ "Exception {}", e); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -2.0) log.error(LOG_PREFIX+ "[diffTime : " + String.format("%.3f", diffTime) + "]"); + } + + @Async + public void updateDSportBetCredit(TripleDVO tripleVO, Long betIdx) { + long startTime = System.currentTimeMillis(); + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::#-Async::updateSportBetCredit::::"; + + try { + String category = ""; + String vendorCode = ""; + String rateOption = ""; + CodeSearch codeSrch = new CodeSearch(); + codeSrch.setSiteId(tripleVO.getSiteId()); + codeSrch.setMasterCode("kplay"); + codeSrch.setTripleCode(tripleVO.getVendorIdx()); + HashMap code = commonDao.getCodeBySite(codeSrch); + if(code != null) { + category = code.get("category").toString(); + vendorCode = code.get("vendorCode").toString(); + rateOption = code.get("rateOption").toString(); + } else { + category = "undefind"; + vendorCode = "undefind"; + rateOption = "0"; + } + + HashMap mapParam = new HashMap(); + mapParam.put("betIdx", betIdx); + double betWinAmt = tripleVO.getCredit(); + mapParam.put("betWinAmt", Double.toString(betWinAmt)); + double afMoney = tripleVO.getAfterCash(); + mapParam.put("afMoney", Double.toString(afMoney)); + mapParam.put("siteId", tripleVO.getSiteId()); + if(rateOption.equals("1") && betWinAmt != 0) { + mapParam.put("pointRegYn", "Y"); + } + log.info(LOG_PREFIX+ "::updateEnd::mapParam::" + mapParam.toString()); + int updResult = betDao.updateEnd(mapParam); + log.info(LOG_PREFIX+ "::updateEnd::SUCC::"+updResult); + + log.info(LOG_PREFIX+ "::updateEndOld::mapParam::" + mapParam.toString()); + int updOldResult = betDao.updateEndOld(mapParam); + log.info(LOG_PREFIX+ "::updateEndOld::SUCC::"+updOldResult); + + if(tripleVO.getDetail() != null) { + HashMap mapUpdParam = new HashMap(); + mapUpdParam.put("betIdx", betIdx.longValue()); + mapUpdParam.put("mapId", "sport"); + mapUpdParam.put("betWinAmt", Double.toString(betWinAmt)); + mapUpdParam.put("creditDetailStr", tripleVO.getDetail().toString()); + log.info(LOG_PREFIX+ "::updateMapEnd::" + mapUpdParam.toString()); + int betMapResult = betDao.updateMapEnd(mapUpdParam); + log.info(LOG_PREFIX+ "::updateMapEnd::SUCC::"+betMapResult); + + log.info(LOG_PREFIX+ "::updateMapEndOld::" + mapUpdParam.toString()); + int betMapOldResult = betDao.updateMapEndOld(mapUpdParam); + log.info(LOG_PREFIX+ "::updateMapEndOld::SUCC::"+betMapOldResult); + + if(betMapResult > 0) { + int sportsResult = sportsDCreditProc(betIdx.longValue(), tripleVO); + log.info(LOG_PREFIX+ "::sportsCreditProc::result::" + sportsResult); + } + } + + // 스포츠 정산 당첨금 처리 + HashMap repParam = new HashMap(); + repParam.put("betIdx", betIdx.longValue()); + repParam.put("betWinAmt", betWinAmt); + log.info(LOG_PREFIX+ "::updateSportReportCredit::repParam::" + repParam.toString()); + int repResult = betDao.updateSportReportCredit(repParam); + log.info(LOG_PREFIX+ "::updateSportReportCredit::repResult::" + repResult); + + // 스포츠 롤링 처리 + log.info(LOG_PREFIX+ "::insertSportBetRolling::betIdx::" + betIdx.longValue()); + int rollResult1 = betDao.insertSportBetRolling(betIdx.longValue()); + log.info(LOG_PREFIX+ "::insertSportBetRolling::repResult::" + rollResult1); + + log.info(LOG_PREFIX+ "::updateSportRollingYn::betIdx::" + betIdx.longValue()); + int rollResult2 = betDao.updateSportRollingYn(betIdx.longValue()); + log.info(LOG_PREFIX+ "::updateSportRollingYn::repResult::" + rollResult2); + + // 스포츠 롤링 정산 처리 + log.info(LOG_PREFIX+ "::updateSportReportRolling::betIdx::" + betIdx.longValue()); + int rollResult3 = betDao.updateSportReportRolling(betIdx.longValue()); + log.info(LOG_PREFIX+ "::updateSportReportRolling::repResult::" + rollResult3); + + } catch (Exception e) { + log.error(LOG_PREFIX+ "::Exception"); + log.error(LOG_PREFIX+ "::ERROR::" + e.getMessage()); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -2.0) log.error(LOG_PREFIX+ "::diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + + @Async + public void updateDSportBetCancel(TripleDVO tripleVO, Long betIdx) { + long startTime = System.currentTimeMillis(); + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::#-Async::updateSportBetCancel::::"; + + try { + HashMap param = new HashMap<>(); + param.put("betIdx", betIdx); + int statusResult = betDao.updateSplusBetCancel(param); + log.info(LOG_PREFIX+ "::sportsCancelProc::result::" + statusResult); + + // 스포츠 정산 당첨금 처리 + double betWinAmt = tripleVO.getCredit(); + HashMap repParam = new HashMap(); + repParam.put("betIdx", betIdx.longValue()); + repParam.put("betWinAmt", betWinAmt); + log.info(LOG_PREFIX+ "::updateSportReportCancel::repParam::" + repParam.toString()); + int repResult = betDao.updateSportReportCancel(repParam); + log.info(LOG_PREFIX+ "::updateSportReportCancel::repResult::" + repResult); + + // 스포츠 롤링 정산 취소 처리 + log.info(LOG_PREFIX+ "::updateSportReportRollingCancel::betIdx::" + betIdx.longValue()); + int rollResult3 = betDao.updateSportReportRollingCancel(betIdx.longValue()); + log.info(LOG_PREFIX+ "::updateSportReportRollingCancel::repResult::" + rollResult3); + + String betId = tripleVO.getBetId(); + List list = betDao.getCancelPointAmtList(betId); + if(list != null) { + for(HashMap item : list) { + String pointAmt = item.get("pointAmt").toString(); + log.info(LOG_PREFIX+ "ROLLING_CANCEL::getCancelPointAmt::"+pointAmt); + int updResult = betDao.updateCancelPoint(item); + log.info(LOG_PREFIX+ "ROLLING_CANCEL::updateCancelPoint Reasult::"+updResult); + } + + // 스포츠 롤링 취소 처리 + log.info(LOG_PREFIX+ "::deleteSportRollingCancel::betIdx::" + betIdx.longValue()); + int rollResult1 = betDao.deleteSportRollingCancel(betIdx.longValue()); + log.info(LOG_PREFIX+ "::deleteSportRollingCancel::repResult::" + rollResult1); + } + + log.info(LOG_PREFIX+ "::updateSportRollingYn::betIdx::" + betIdx.longValue()); + int rollResult2 = betDao.updateSportRollingYn(betIdx.longValue()); + log.info(LOG_PREFIX+ "::updateSportRollingYn::repResult::" + rollResult2); + + } catch (Exception e) { + log.error(LOG_PREFIX+ "::Exception"); + log.error(LOG_PREFIX+ "::ERROR::" + e.getMessage()); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -2.0) log.error(LOG_PREFIX+ "::diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + + @Async + public void updateDSportBetReserve(TripleDVO tripleVO, Long betIdx) { + long startTime = System.currentTimeMillis(); + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::#-Async::updateSportBetReserve::::"; + + try { + double amount = Math.abs(tripleVO.getCredit()); + + HashMap betUpdParam = new HashMap(); + betUpdParam.put("betIdx", betIdx); + // 변동된 배팅금 차액만큼 기존에 기록된 배팅금(betinfo.betAmt)에서 빼준다. + betUpdParam.put("betAmt", Double.toString(amount * -1)); + int betResult = betDao.updateBetInfo(betUpdParam); + log.info(LOG_PREFIX+ "::updateBetInfo::result::" + betResult); + + int betResultOld = betDao.updateBetInfoOld(betUpdParam); + log.info(LOG_PREFIX+ "::updateBetInfoOld::result::" + betResultOld); + + HashMap cashInsertParam = new HashMap(); + cashInsertParam.put("siteId", tripleVO.getSiteId()); + cashInsertParam.put("memId", tripleVO.getMemId()); + cashInsertParam.put("cashType", "19"); + cashInsertParam.put("cashDesc", "지급"); + // 변동된 배팅금 차액만큼 지급한 금액 내역을 cash_info에 남긴다. + cashInsertParam.put("cashAmt", Double.toString(amount)); + cashInsertParam.put("betIdx", betIdx); + cashInsertParam.put("regId", tripleVO.getMemId()); + cashInsertParam.put("adminId", tripleVO.getSiteId()); + cashInsertParam.put("memo", "#-COMMIT_RESERVE::차액반영"); + cashInsertParam.put("preCashAmt", Double.toString(tripleVO.getBeforeCash())); + int cashResult = betDao.insertCashInfoByReserve(cashInsertParam); + log.info(LOG_PREFIX+ "::insertCashInfoByReserve::result::" + cashResult); + + // 스포츠 정산 배팅금 처리 + double betWinAmt = tripleVO.getCredit(); + HashMap repParam = new HashMap(); + repParam.put("betIdx", betIdx.longValue()); + repParam.put("betAmt", (amount * -1)); + log.info(LOG_PREFIX+ "::updateSportReportDebit::repParam::" + repParam.toString()); + int repResult = betDao.updateSportReportDebit(repParam); + log.info(LOG_PREFIX+ "::updateSportReportDebit::repResult::" + repResult); + + } catch (Exception e) { + log.error(LOG_PREFIX+ "::Exception"); + log.error(LOG_PREFIX+ "::ERROR::" + e.getMessage()); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -2.0) log.error(LOG_PREFIX+ "::diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + + @Async + public void insertDSportBetIssue(TripleDVO tripleVO) { + long startTime = System.currentTimeMillis(); + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::#-Async::insertSportBetIssue::::"; + + try { + // 최초 배팅 건 + double amount = Math.abs(tripleVO.getDebit()); + + HashMap param = new HashMap(); + param.put("betIdx", 0); + param.put("siteId", tripleVO.getSiteId()); + param.put("memId", tripleVO.getMemId()); + param.put("betType", "triple"); + param.put("gameCategory", "sport"); + param.put("vendorCode", "splus"); + param.put("vendor", tripleVO.getVendor()); + param.put("betId", tripleVO.getBetId()); + + if(tripleVO.getDetail() != null) { + JSONObject detail = tripleVO.getDetail(); + JSONObject credit = detail.getJSONObject("Credit"); + JSONObject purchases = credit.getJSONObject("Purchases"); + JSONObject purchase = purchases.getJSONObject("Purchase"); + JSONObject selections = purchase.getJSONObject("Selections"); + + int lineCnt = purchase.getInt("NumberOfLines"); + + boolean isArr = false; + Object selectionObj = selections.get("Selection"); + if (selectionObj instanceof JSONArray) { + isArr = true; + } else if (selectionObj instanceof JSONObject) { + isArr = false; + } + log.info(LOG_PREFIX+ "::lineCnt::" + lineCnt + "::isArr::" + isArr); + + if(lineCnt==1 || !isArr) { + // SINGLE + JSONObject selection = selections.getJSONObject("Selection"); + JSONObject changes = selection.getJSONObject("Changes"); + JSONObject change = changes.getJSONObject("Change"); + JSONObject bets = change.getJSONObject("Bets"); + JSONObject bet = bets.getJSONObject("Bet"); + } else { + // COMBO + JSONArray selectionArr = selections.getJSONArray("Selection"); + JSONObject selection = selectionArr.getJSONObject(0); + JSONObject changes = selection.getJSONObject("Changes"); + JSONObject change = changes.getJSONObject("Change"); + JSONObject bets = change.getJSONObject("Bets"); + JSONObject bet = bets.getJSONObject("Bet"); + } + + JSONObject selection = selections.getJSONObject("Selection"); + JSONObject changes = selection.getJSONObject("Changes"); + JSONObject change = changes.getJSONObject("Change"); + JSONObject bets = change.getJSONObject("Bets"); + JSONObject bet = bets.getJSONObject("Bet"); + + String betTypeName = bet.getString("BetType"); + param.put("gameName", betTypeName); + } else { + param.put("gameName", tripleVO.getGameKey()); + } + + param.put("betAmt", Double.toString(amount)); + param.put("betRate", "0"); + param.put("betWinAmt", "0"); + double bfMoney = tripleVO.getBeforeCash(); + param.put("bfMoney", Double.toString(bfMoney)); + double afMoney = tripleVO.getAfterCash(); + param.put("afMoney", Double.toString(afMoney)); + param.put("betBonus", "-1"); + param.put("betCnt", "1"); + param.put("betResults", "FAIL"); + param.put("betStatus", "ISSUEEND"); + param.put("regId", tripleVO.getMemId()); + param.put("updId", tripleVO.getMemId()); + param.put("updDate", ""); + param.put("regDate", ""); + param.put("biPushYn", "N"); + int betResult = betDao.insertBetBonus(param); + log.info(LOG_PREFIX+ "::insertBetIssue::SUCC"); + Long betIdx = (Long) param.get("betIdx"); + + if(tripleVO.getDetail() != null) { + HashMap mapParam = new HashMap(); + mapParam.put("betIdx", betIdx.longValue()); + mapParam.put("mapId", "sport"); + mapParam.put("rateTypeCode", "splus"); + mapParam.put("betName", ""); + mapParam.put("betAmt", Double.toString(amount)); + mapParam.put("betRate", "0"); + mapParam.put("betWinAmt", "0"); + mapParam.put("debitDetailStr", tripleVO.getDetail().toString()); + log.info(LOG_PREFIX+ "::mapParam::" + mapParam.toString()); + int betMapResult = betDao.insertBetMap(mapParam); + + if(betMapResult > 0) { + int sportsResult = sportsDBetIssueProc(betIdx.longValue(), tripleVO); + log.info(LOG_PREFIX+ "::sportsDebitProc::result::" + sportsResult); + } + + // 스포츠 정산 배팅금 처리 + double betWinAmt = tripleVO.getCredit(); + HashMap repParam = new HashMap(); + repParam.put("betIdx", betIdx.longValue()); + repParam.put("betAmt", amount); + log.info(LOG_PREFIX+ "::updateSportReportDebit::repParam::" + repParam.toString()); + int repResult = betDao.updateSportReportDebit(repParam); + log.info(LOG_PREFIX+ "::updateSportReportDebit::repResult::" + repResult); + } + + } catch (Exception e) { + log.error(LOG_PREFIX+ "::Exception"); + log.error(LOG_PREFIX+ "::ERROR::" + e.getMessage()); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -2.0) log.error(LOG_PREFIX+ "::diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + + @Async + public void updateDBetIssue(TripleDVO tripleVO, Long betIdx) { + long startTime = System.currentTimeMillis(); + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::#-Async::updateBetIssue::::"; + + try { + double amount = Math.abs(tripleVO.getDebit()); + + HashMap betUpdParam = new HashMap(); + betUpdParam.put("betIdx", betIdx); + betUpdParam.put("betAmt", Double.toString(amount)); + int betResult = betDao.updateBetInfo(betUpdParam); + log.info(LOG_PREFIX+ "::updateBetInfo::result::" + betResult); + + int betResultOld = betDao.updateBetInfoOld(betUpdParam); + log.info(LOG_PREFIX+ "::updateBetInfoOld::result::" + betResultOld); + + HashMap cashUpdParam = new HashMap(); + cashUpdParam.put("betIdx", betIdx); + cashUpdParam.put("cashType", "-19"); + cashUpdParam.put("memId", tripleVO.getMemId()); + cashUpdParam.put("siteid", tripleVO.getSiteId()); + double cashAmt = amount * -1; + cashUpdParam.put("cashAmt", Double.toString(cashAmt)); + int cashResult = betDao.updateCashInfo(cashUpdParam); + log.info(LOG_PREFIX+ "::updateCashInfo::result::" + cashResult); + + // 스포츠 정산 배팅금 처리 + double betWinAmt = tripleVO.getCredit(); + HashMap repParam = new HashMap(); + repParam.put("betIdx", betIdx.longValue()); + repParam.put("betAmt", amount); + log.info(LOG_PREFIX+ "::updateSportReportDebit::repParam::" + repParam.toString()); + int repResult = betDao.updateSportReportDebit(repParam); + log.info(LOG_PREFIX+ "::updateSportReportDebit::repResult::" + repResult); + + } catch (Exception e) { + log.error(LOG_PREFIX+ "::Exception"); + log.error(LOG_PREFIX+ "::ERROR::" + e.getMessage()); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -2.0) log.error(LOG_PREFIX+ "::diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + + private int sportsDDebitProc(long betIdx, TripleDVO tripleVO) { + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::#-Async::sportsDebitProc::::"; + int sportResult = 0; + + try { + JSONObject detail = tripleVO.getDetail(); + JSONObject bets = detail.getJSONObject("Bets"); + Object betObj = bets.get("Bet"); + + if(betObj instanceof net.sf.json.JSONObject) { + // SINGLE + JSONObject bet = bets.getJSONObject("Bet"); + + int lineCnt = bet.getInt("ComboBetNumersLines"); + if(lineCnt == 0) { + // SINGLE + HashMap param = new HashMap<>(); + param.put("betIdx", betIdx); + param.put("BetIdFK", tripleVO.getBetId()); + param.put("tranType", "debit"); + param.put("customerID", bets.getLong("cust_id")); + param.put("reserveID", bets.getLong("reserve_id")); + param.put("purchaseID", bet.getLong("PurchaseBetID")); + param.put("amount", bets.getInt("amount")); + param.put("odds", bet.getDouble("OddsDec")); + param.put("gain", bet.getDouble("Gain")); + + param.put("lineTypeID", bet.getInt("LineTypeID")); + param.put("lineTypeName", bet.getString("LineTypeName")); + // param.put("lineID", bet.getLong("LineID")); + param.put("newLineID", bet.getString("NewLineID")); + param.put("lineOdds", bet.getDouble("OddsDec")); + param.put("eventTypeID", bet.getInt("EventTypeID")); + param.put("eventTypeName", bet.getString("EventTypeName")); + // param.put("masterEventID", bet.getLong("MasterEventID")); + param.put("newMasterEventID", bet.getLong("NewMasterEventID")); + // param.put("eventID", bet.getLong("EventID")); + param.put("newEventID", bet.getLong("NewEventID")); + param.put("eventName", bet.getString("EventName")); + param.put("eventDate", bet.getString("EventDate")); + param.put("betTypeID", bet.getInt("BetTypeID")); + param.put("betTypeName", bet.getString("BetTypeName")); + param.put("betID", bet.getLong("BetID")); + param.put("creationDate", bet.getString("CreationDate")); + param.put("status", bet.getString("Status")); + if(bet.has("BranchID")) { + param.put("branchID", bet.getInt("BranchID")); + } else { + param.put("branchID", bet.getInt("BranchId")); + } + param.put("branchName", bet.getString("BranchName")); + // param.put("leagueID", bet.getLong("LeagueID")); + param.put("newLeagueID", bet.getLong("NewLeagueID")); + param.put("leagueName", bet.getString("LeagueName")); + param.put("homeTeam", bet.getString("HomeTeam")); + param.put("awayTeam", bet.getString("AwayTeam")); + param.put("yourBet", bet.getString("YourBet")); + param.put("score", bet.getString("Score")); + + param.put("isFreeBet", bet.getInt("IsFreeBet")); + param.put("isLive", bet.getInt("IsLive")); + + log.info(LOG_PREFIX+ "::param::" + param.toString()); + sportResult = betDao.insertBetSplusInfo(param); + log.info(LOG_PREFIX+ "::sportResult::" + sportResult); + } else { + // COMBO + int result = 0; + JSONArray lines = bet.getJSONArray("Lines"); + for(int j=0; j(); + param.put("betIdx", betIdx); + param.put("BetIdFK", tripleVO.getBetId()); + param.put("tranType", "debit"); + param.put("customerID", bets.getLong("cust_id")); + param.put("reserveID", bets.getLong("reserve_id")); + param.put("purchaseID", bet.getLong("PurchaseBetID")); + param.put("amount", bets.getDouble("amount")); + param.put("odds", bet.getDouble("OddsDec")); + param.put("gain", bet.getDouble("Gain")); + + param.put("lineTypeID", line.getInt("LineTypeID")); + param.put("lineTypeName", line.getString("LineTypeName")); + // param.put("lineID", line.getLong("LineID")); + param.put("newLineID", line.getString("NewLineID")); + param.put("lineOdds", line.getDouble("OddsDec")); + param.put("eventTypeID", line.getInt("EventTypeID")); + param.put("eventTypeName", line.getString("EventTypeName")); + // param.put("masterEventID", line.getLong("MasterEventID")); + param.put("newMasterEventID", line.getLong("NewMasterEventID")); + // param.put("eventID", line.getLong("EventID")); + param.put("newEventID", line.getLong("NewEventID")); + param.put("eventName", line.getString("EventName")); + param.put("eventDate", line.getString("EventDate")); + param.put("betTypeID", line.getInt("BetTypeID")); + param.put("betTypeName", line.getString("BetTypeName")); + param.put("betID", line.getLong("BetID")); + param.put("creationDate", line.getString("CreationDate")); + param.put("status", line.getString("Status")); + if(line.has("BranchID")) { + param.put("branchID", line.getInt("BranchID")); + } else { + param.put("branchID", line.getInt("BranchId")); + } + param.put("branchName", line.getString("BranchName")); + // param.put("leagueID", line.getLong("LeagueID")); + param.put("newLeagueID", line.getLong("NewLeagueID")); + param.put("leagueName", line.getString("LeagueName")); + param.put("homeTeam", line.getString("HomeTeam")); + param.put("awayTeam", line.getString("AwayTeam")); + param.put("yourBet", line.getString("YourBet")); + param.put("score", line.getString("Score")); + + param.put("isFreeBet", bet.getInt("IsFreeBet")); + param.put("isLive", bet.getInt("IsLive")); + + log.info(LOG_PREFIX+ "::param::" + param.toString()); + result = betDao.insertBetSplusInfo(param); + sportResult = sportResult + result; + log.info(LOG_PREFIX+ "::sportResult::" + sportResult); + } + } + + } else if(betObj instanceof net.sf.json.JSONArray) { + // COMBO + JSONArray betArr = bets.getJSONArray("Bet"); + for(int j=0; j(); + param.put("betIdx", betIdx); + param.put("BetIdFK", tripleVO.getBetId()); + param.put("tranType", "debit"); + param.put("customerID", bets.getLong("cust_id")); + param.put("reserveID", bets.getLong("reserve_id")); + param.put("purchaseID", bet.getLong("PurchaseBetID")); + param.put("amount", bets.getInt("amount")); + param.put("odds", bet.getDouble("OddsDec")); + param.put("gain", bet.getDouble("Gain")); + + param.put("lineTypeID", bet.getInt("LineTypeID")); + param.put("lineTypeName", bet.getString("LineTypeName")); + // param.put("lineID", bet.getLong("LineID")); + param.put("newLineID", bet.getString("NewLineID")); + param.put("lineOdds", bet.getDouble("OddsDec")); + param.put("eventTypeID", bet.getInt("EventTypeID")); + param.put("eventTypeName", bet.getString("EventTypeName")); + // param.put("masterEventID", bet.getLong("MasterEventID")); + param.put("newMasterEventID", bet.getLong("NewMasterEventID")); + // param.put("eventID", bet.getLong("EventID")); + param.put("newEventID", bet.getLong("NewEventID")); + param.put("eventName", bet.getString("EventName")); + param.put("eventDate", bet.getString("EventDate")); + param.put("betTypeID", bet.getInt("BetTypeID")); + param.put("betTypeName", bet.getString("BetTypeName")); + param.put("betID", bet.getLong("BetID")); + param.put("creationDate", bet.getString("CreationDate")); + param.put("status", bet.getString("Status")); + if(bet.has("BranchID")) { + param.put("branchID", bet.getInt("BranchID")); + } else { + param.put("branchID", bet.getInt("BranchId")); + } + param.put("branchName", bet.getString("BranchName")); + // param.put("leagueID", bet.getLong("LeagueID")); + param.put("newLeagueID", bet.getLong("NewLeagueID")); + param.put("leagueName", bet.getString("LeagueName")); + param.put("homeTeam", bet.getString("HomeTeam")); + param.put("awayTeam", bet.getString("AwayTeam")); + param.put("yourBet", bet.getString("YourBet")); + param.put("score", bet.getString("Score")); + + param.put("isFreeBet", bet.getInt("IsFreeBet")); + param.put("isLive", bet.getInt("IsLive")); + + log.info(LOG_PREFIX+ "::param::" + param.toString()); + sportResult = betDao.insertBetSplusInfo(param); + log.info(LOG_PREFIX+ "::sportResult::" + sportResult); + } else { + // COMBO + int result = 0; + JSONArray lines = bet.getJSONArray("Lines"); + for(int k=0; k(); + param.put("betIdx", betIdx); + param.put("BetIdFK", tripleVO.getBetId()); + param.put("tranType", "debit"); + param.put("customerID", bets.getLong("cust_id")); + param.put("reserveID", bets.getLong("reserve_id")); + param.put("purchaseID", bet.getLong("PurchaseBetID")); + param.put("amount", bets.getDouble("amount")); + param.put("odds", bet.getDouble("OddsDec")); + param.put("gain", bet.getDouble("Gain")); + + param.put("lineTypeID", line.getInt("LineTypeID")); + param.put("lineTypeName", line.getString("LineTypeName")); + // param.put("lineID", line.getLong("LineID")); + param.put("newLineID", line.getString("NewLineID")); + param.put("lineOdds", line.getDouble("OddsDec")); + param.put("eventTypeID", line.getInt("EventTypeID")); + param.put("eventTypeName", line.getString("EventTypeName")); + // param.put("masterEventID", line.getLong("MasterEventID")); + param.put("newMasterEventID", line.getLong("NewMasterEventID")); + // param.put("eventID", line.getLong("EventID")); + param.put("newEventID", line.getLong("NewEventID")); + param.put("eventName", line.getString("EventName")); + param.put("eventDate", line.getString("EventDate")); + param.put("betTypeID", line.getInt("BetTypeID")); + param.put("betTypeName", line.getString("BetTypeName")); + param.put("betID", line.getLong("BetID")); + param.put("creationDate", line.getString("CreationDate")); + param.put("status", line.getString("Status")); + if(line.has("BranchID")) { + param.put("branchID", line.getInt("BranchID")); + } else { + param.put("branchID", line.getInt("BranchId")); + } + param.put("branchName", line.getString("BranchName")); + // param.put("leagueID", line.getLong("LeagueID")); + param.put("newLeagueID", line.getLong("NewLeagueID")); + param.put("leagueName", line.getString("LeagueName")); + param.put("homeTeam", line.getString("HomeTeam")); + param.put("awayTeam", line.getString("AwayTeam")); + param.put("yourBet", line.getString("YourBet")); + param.put("score", line.getString("Score")); + + param.put("isFreeBet", bet.getInt("IsFreeBet")); + param.put("isLive", bet.getInt("IsLive")); + + log.info(LOG_PREFIX+ "::param::" + param.toString()); + result = betDao.insertBetSplusInfo(param); + sportResult = sportResult + result; + log.info(LOG_PREFIX+ "::sportResult::" + sportResult); + } + } + } + } else if (betObj == null) { + log.info(LOG_PREFIX+ "::Bet는 값이 없습니다."); + } else { + log.info(LOG_PREFIX+ "::Bet는 다른 타입입니다: " + bets.getClass()); + } + + } catch(Exception e) { + log.error(LOG_PREFIX+ "ERROR:: " + e.getMessage()); + e.printStackTrace(); + } + + return sportResult; + } + + private int sportsDCreditProc(long betIdx, TripleDVO tripleVO) { + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::#-Async::sportsCreditProc::::"; + int sportResult = 0; + + try { + JSONObject detail = tripleVO.getDetail(); + JSONObject credit = detail.getJSONObject("Credit"); + JSONObject purchases = credit.getJSONObject("Purchases"); + JSONObject purchase = purchases.getJSONObject("Purchase"); + JSONObject selections = purchase.getJSONObject("Selections"); + + int lineCnt = purchase.getInt("NumberOfLines"); + + boolean isArr = false; + Object selectionObj = selections.get("Selection"); + if (selectionObj instanceof JSONArray) { + isArr = true; + } else if (selectionObj instanceof JSONObject) { + isArr = false; + } + + log.info(LOG_PREFIX+ "::lineCnt::" + lineCnt + "::isArr::" + isArr); + + if(lineCnt==1 || !isArr) { + // SINGLE + JSONObject selection = selections.getJSONObject("Selection"); + JSONObject changes = selection.getJSONObject("Changes"); + JSONObject change = changes.getJSONObject("Change"); + JSONObject bets = change.getJSONObject("Bets"); + JSONObject bet = bets.getJSONObject("Bet"); + + HashMap param = new HashMap<>(); + param.put("betIdx", betIdx); + param.put("BetIdFK", tripleVO.getBetId()); + param.put("tranType", "credit"); + param.put("customerID", credit.getLong("CustomerID")); + param.put("reserveID", purchase.getLong("ReserveID")); + param.put("purchaseID", purchase.getLong("PurchaseID")); + param.put("amount", credit.getDouble("Amount")); + param.put("odds", selection.getDouble("DecimalOdds")); + param.put("gain", 0.0); + + param.put("lineTypeID", selection.getInt("LineTypeID")); + param.put("lineTypeName", selection.getString("LineTypeName")); + // param.put("lineID", selection.getLong("LineID")); + param.put("newLineID", selection.getString("NewLineID")); + param.put("lineOdds", selection.getDouble("DecimalOdds")); + param.put("eventTypeID", selection.getInt("EventTypeID")); + param.put("eventTypeName", selection.getString("EventTypeName")); + // param.put("masterEventID", selection.getLong("MasterEventID")); + param.put("newMasterEventID", selection.getLong("NewMasterEventID")); + // param.put("eventID", selection.getLong("EventID")); + param.put("newEventID", selection.getLong("NewEventID")); + param.put("eventName", selection.getString("EventName")); + param.put("eventDate", selection.getString("EventDateUTC")); + param.put("betTypeID", bet.getInt("BetTypeID")); + param.put("betTypeName", bet.getString("BetType")); + param.put("betID", bet.getLong("ID")); + param.put("creationDate", bet.getString("BetSettledDate")); + param.put("status", change.getString("NewStatus")); + param.put("branchID", selection.getInt("BranchID")); + if(selection.has("BranchID")) { + param.put("branchID", selection.getInt("BranchID")); + } else { + param.put("branchID", selection.getInt("BranchId")); + } + param.put("branchName", selection.getString("BranchName")); + // param.put("leagueID", selection.getLong("LeagueID")); + param.put("newLeagueID", selection.getLong("NewLeagueID")); + param.put("leagueName", selection.getString("LeagueName")); + param.put("homeTeam", selection.getString("HomeTeam")); + param.put("awayTeam", selection.getString("AwayTeam")); + param.put("leagueNameKO", ""); + param.put("homeTeamKO", ""); + param.put("awayTeamKO", ""); + param.put("yourBet", selection.getString("YourBet")); + param.put("score", change.getString("TriggeredResult")); + param.put("isFreeBet", bet.getInt("IsFreeBet")); + param.put("isLive", bet.getInt("IsLive")); + + log.info(LOG_PREFIX+ "::param::" + param.toString()); + sportResult = betDao.insertBetSplusInfo(param); + int statusResult = betDao.updateSplusStatus(param); + log.info(LOG_PREFIX+ "::sportResult::" + sportResult); + log.info(LOG_PREFIX+ "::statusResult::" + statusResult); + } else { + // COMBO + int result = 0; + JSONArray selectionArr = selections.getJSONArray("Selection"); + for(int j=0; j(); + param.put("betIdx", betIdx); + param.put("BetIdFK", tripleVO.getBetId()); + param.put("tranType", "credit"); + param.put("customerID", credit.getLong("CustomerID")); + param.put("reserveID", purchase.getLong("ReserveID")); + param.put("purchaseID", purchase.getLong("PurchaseID")); + param.put("amount", credit.getDouble("Amount")); + param.put("odds", selection.getDouble("DecimalOdds")); + param.put("gain", 0.0); + + param.put("lineTypeID", selection.getInt("LineTypeID")); + param.put("lineTypeName", selection.getString("LineTypeName")); + // param.put("lineID", selection.getLong("LineID")); + param.put("newLineID", selection.getString("NewLineID")); + param.put("lineOdds", selection.getDouble("DecimalOdds")); + param.put("eventTypeID", selection.getInt("EventTypeID")); + param.put("eventTypeName", selection.getString("EventTypeName")); + // param.put("masterEventID", selection.getLong("MasterEventID")); + param.put("newMasterEventID", selection.getLong("NewMasterEventID")); + // param.put("eventID", selection.getLong("EventID")); + param.put("newEventID", selection.getLong("NewEventID")); + param.put("eventName", selection.getString("EventName")); + param.put("eventDate", selection.getString("EventDateUTC")); + param.put("betTypeID", bet.getInt("BetTypeID")); + param.put("betTypeName", bet.getString("BetType")); + param.put("betID", bet.getLong("ID")); + param.put("creationDate", bet.getString("BetSettledDate")); + param.put("status", bet.getString("NewStatus")); + if(selection.has("BranchID")) { + param.put("branchID", selection.getInt("BranchID")); + } else { + param.put("branchID", selection.getInt("BranchId")); + } + param.put("branchName", selection.getString("BranchName")); + // param.put("leagueID", selection.getLong("LeagueID")); + param.put("newLeagueID", selection.getLong("NewLeagueID")); + param.put("leagueName", selection.getString("LeagueName")); + param.put("homeTeam", selection.getString("HomeTeam")); + param.put("awayTeam", selection.getString("AwayTeam")); + param.put("yourBet", selection.getString("YourBet")); + param.put("score", selection.getString("Score")); + param.put("isFreeBet", bet.getInt("IsFreeBet")); + param.put("isLive", bet.getInt("IsLive")); + + log.info(LOG_PREFIX+ "::param::" + param.toString()); + result = betDao.insertBetSplusInfo(param); + sportResult = sportResult + result; + int statusResult = betDao.updateSplusStatus(param); + log.info(LOG_PREFIX+ "::sportResult::" + sportResult); + log.info(LOG_PREFIX+ "::statusResult::" + statusResult); + } + } + + } catch(Exception e) { + log.error(LOG_PREFIX+ "ERROR:: " + e.getMessage()); + e.printStackTrace(); + } + + return sportResult; + } + + private int sportsDBetIssueProc(long betIdx, TripleDVO tripleVO) { + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::#-Async::sportsBetIssueProc::::"; + int sportResult = 0; + + try { + JSONObject detail = tripleVO.getDetail(); + JSONObject credit = detail.getJSONObject("Credit"); + JSONObject purchases = credit.getJSONObject("Purchases"); + JSONObject purchase = purchases.getJSONObject("Purchase"); + JSONObject selections = purchase.getJSONObject("Selections"); + + int lineCnt = purchase.getInt("NumberOfLines"); + + boolean isArr = false; + Object selectionObj = selections.get("Selection"); + if (selectionObj instanceof JSONArray) { + isArr = true; + } else if (selectionObj instanceof JSONObject) { + isArr = false; + } + + log.info(LOG_PREFIX+ "::lineCnt::" + lineCnt + "::isArr::" + isArr); + + if(lineCnt==1 || !isArr) { + // SINGLE + JSONObject selection = selections.getJSONObject("Selection"); + JSONObject changes = selection.getJSONObject("Changes"); + JSONObject change = changes.getJSONObject("Change"); + JSONObject bets = change.getJSONObject("Bets"); + JSONObject bet = bets.getJSONObject("Bet"); + + HashMap param = new HashMap<>(); + param.put("betIdx", betIdx); + param.put("BetIdFK", tripleVO.getBetId()); + param.put("tranType", "issue"); + param.put("customerID", credit.getLong("CustomerID")); + param.put("reserveID", purchase.getLong("ReserveID")); + param.put("purchaseID", purchase.getLong("PurchaseID")); + param.put("amount", credit.getDouble("Amount")); + param.put("odds", selection.getDouble("DecimalOdds")); + param.put("gain", 0.0); + + param.put("lineTypeID", selection.getInt("LineTypeID")); + param.put("lineTypeName", selection.getString("LineTypeName")); + // param.put("lineID", selection.getLong("LineID")); + param.put("newLineID", selection.getString("NewLineID")); + param.put("lineOdds", selection.getDouble("DecimalOdds")); + param.put("eventTypeID", selection.getInt("EventTypeID")); + param.put("eventTypeName", selection.getString("EventTypeName")); + // param.put("masterEventID", selection.getLong("MasterEventID")); + param.put("newMasterEventID", selection.getLong("NewMasterEventID")); + // param.put("eventID", selection.getLong("EventID")); + param.put("newEventID", selection.getLong("NewEventID")); + param.put("eventName", selection.getString("EventName")); + param.put("eventDate", selection.getString("EventDateUTC")); + param.put("betTypeID", bet.getInt("BetTypeID")); + param.put("betTypeName", bet.getString("BetType")); + param.put("betID", bet.getLong("ID")); + param.put("creationDate", bet.getString("BetSettledDate")); + param.put("status", change.getString("NewStatus")); + param.put("branchID", selection.getInt("BranchID")); + if(selection.has("BranchID")) { + param.put("branchID", selection.getInt("BranchID")); + } else { + param.put("branchID", selection.getInt("BranchId")); + } + param.put("branchName", selection.getString("BranchName")); + // param.put("leagueID", selection.getLong("LeagueID")); + param.put("newLeagueID", selection.getLong("NewLeagueID")); + param.put("leagueName", selection.getString("LeagueName")); + param.put("homeTeam", selection.getString("HomeTeam")); + param.put("awayTeam", selection.getString("AwayTeam")); + param.put("leagueNameKO", ""); + param.put("homeTeamKO", ""); + param.put("awayTeamKO", ""); + param.put("yourBet", selection.getString("YourBet")); + param.put("score", change.getString("TriggeredResult")); + param.put("isFreeBet", bet.getInt("IsFreeBet")); + param.put("isLive", bet.getInt("IsLive")); + + log.info(LOG_PREFIX+ "::param::" + param.toString()); + sportResult = betDao.insertBetSplusInfo(param); + int statusResult = betDao.updateSplusStatus(param); + log.info(LOG_PREFIX+ "::sportResult::" + sportResult); + log.info(LOG_PREFIX+ "::statusResult::" + statusResult); + } else { + // COMBO + int result = 0; + JSONArray selectionArr = selections.getJSONArray("Selection"); + for(int j=0; j(); + param.put("betIdx", betIdx); + param.put("BetIdFK", tripleVO.getBetId()); + param.put("tranType", "credit"); + param.put("customerID", credit.getLong("CustomerID")); + param.put("reserveID", purchase.getLong("ReserveID")); + param.put("purchaseID", purchase.getLong("PurchaseID")); + param.put("amount", credit.getDouble("Amount")); + param.put("odds", selection.getDouble("DecimalOdds")); + param.put("gain", 0.0); + + param.put("lineTypeID", selection.getInt("LineTypeID")); + param.put("lineTypeName", selection.getString("LineTypeName")); + // param.put("lineID", selection.getLong("LineID")); + param.put("newLineID", selection.getString("NewLineID")); + param.put("lineOdds", selection.getDouble("DecimalOdds")); + param.put("eventTypeID", selection.getInt("EventTypeID")); + param.put("eventTypeName", selection.getString("EventTypeName")); + // param.put("masterEventID", selection.getLong("MasterEventID")); + param.put("newMasterEventID", selection.getLong("NewMasterEventID")); + // param.put("eventID", selection.getLong("EventID")); + param.put("newEventID", selection.getLong("NewEventID")); + param.put("eventName", selection.getString("EventName")); + param.put("eventDate", selection.getString("EventDateUTC")); + param.put("betTypeID", bet.getInt("BetTypeID")); + param.put("betTypeName", bet.getString("BetType")); + param.put("betID", bet.getLong("ID")); + param.put("creationDate", bet.getString("BetSettledDate")); + param.put("status", bet.getString("NewStatus")); + if(selection.has("BranchID")) { + param.put("branchID", selection.getInt("BranchID")); + } else { + param.put("branchID", selection.getInt("BranchId")); + } + param.put("branchName", selection.getString("BranchName")); + // param.put("leagueID", selection.getLong("LeagueID")); + param.put("newLeagueID", selection.getLong("NewLeagueID")); + param.put("leagueName", selection.getString("LeagueName")); + param.put("homeTeam", selection.getString("HomeTeam")); + param.put("awayTeam", selection.getString("AwayTeam")); + param.put("yourBet", selection.getString("YourBet")); + param.put("score", selection.getString("Score")); + param.put("isFreeBet", bet.getInt("IsFreeBet")); + param.put("isLive", bet.getInt("IsLive")); + + log.info(LOG_PREFIX+ "::param::" + param.toString()); + result = betDao.insertBetSplusInfo(param); + sportResult = sportResult + result; + int statusResult = betDao.updateSplusStatus(param); + log.info(LOG_PREFIX+ "::sportResult::" + sportResult); + log.info(LOG_PREFIX+ "::statusResult::" + statusResult); + } + } + + } catch(Exception e) { + log.error(LOG_PREFIX+ "ERROR:: " + e.getMessage()); + e.printStackTrace(); + } + + return sportResult; + } + + public static Object findFirstValueByKey(Object json, String key) { + return searchFirst(json, key); + } + + private static Object searchFirst(Object json, String key) { + + // JSONObject인 경우 + if (json instanceof JSONObject) { + JSONObject obj = (JSONObject) json; + + for (Object k : obj.keySet()) { + Object value = obj.get(k); + + // 키가 일치하는 순간 바로 반환! + if (key.equals(k)) { + return value; + } + + // 내부 탐색 + Object found = searchFirst(value, key); + if (found != null) { + return found; + } + } + } + + // JSONArray인 경우 + else if (json instanceof JSONArray) { + JSONArray arr = (JSONArray) json; + + for (Object element : arr) { + Object found = searchFirst(element, key); + if (found != null) { + return found; + } + } + } + + return null; // 못 찾았을 경우 + } + +} diff --git a/src/main/java/com/bb/service/AsyncTripleService.java b/src/main/java/com/bb/service/AsyncTripleService.java new file mode 100644 index 0000000..c872ff8 --- /dev/null +++ b/src/main/java/com/bb/service/AsyncTripleService.java @@ -0,0 +1,1396 @@ +package com.bb.service; + +import java.nio.charset.Charset; +import java.time.Duration; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.util.UriComponentsBuilder; + +import com.bb.dao.BetDao; +import com.bb.dao.CashDao; +import com.bb.dao.CommonDao; +import com.bb.dao.UserDao; +import com.bb.model.ApiVendorCompInfo; +import com.bb.model.CodeSearch; +import com.bb.model.TripleAuthInfo; +import com.bb.model.TripleDetailVO; +import com.bb.model.TripleVO; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; +import reactor.core.publisher.Mono; + +@Slf4j +@RequiredArgsConstructor +@Service +public class AsyncTripleService { + + private final BetDao betDao; + + private final UserDao userDao; + + private final CashDao cashDao; + + private final CommonDao commonDao; + + //@Autowired + //RestTemplate restTemplate; + + @Autowired + WebClient webClient; + + @Async + public void insertBetDebit(TripleVO tripleVO) { + long startTime = System.currentTimeMillis(); + final String LOG_PREFIX = "#-callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::#-Async::insertBetDebit::::"; + + try { + // 최초 배팅 건 + int amount = Math.abs(tripleVO.getDebit()); + + HashMap param = new HashMap(); + param.put("betIdx", 0); + param.put("siteId", tripleVO.getSiteId()); + param.put("memId", tripleVO.getMemId()); + param.put("betType", "triple"); + + String category = ""; + String vendorCode = ""; + CodeSearch codeSrch = new CodeSearch(); + codeSrch.setMasterCode("kplay"); + codeSrch.setTripleCode(tripleVO.getVendorIdx()); + HashMap code = commonDao.getCode(codeSrch); + if(code != null) { + category = code.get("groupCode").toString(); + param.put("gameCategory", category); + + vendorCode = code.get("code").toString(); + param.put("vendorCode", vendorCode); + } else { + category = "undefind"; + param.put("gameCategory", category); + + vendorCode = "undefind"; + param.put("vendorCode", vendorCode); + } + + param.put("vendor", tripleVO.getVendor()); + param.put("betId", tripleVO.getBetId()); + param.put("gameName", tripleVO.getGameKey()); + param.put("betAmt", Integer.toString(amount)); + param.put("betRate", "0"); + param.put("betWinAmt", "0"); + int bfMoney = tripleVO.getBeforeCash().intValue(); + param.put("bfMoney", Integer.toString(bfMoney)); + int afMoney = tripleVO.getAfterCash().intValue(); + param.put("afMoney", Integer.toString(afMoney)); + param.put("betBonus", "0"); + param.put("betCnt", "1"); + param.put("regId", tripleVO.getMemId()); + param.put("updId", tripleVO.getMemId()); + param.put("delYn","N"); + if(tripleVO.getRequestAt() != null && !tripleVO.getRequestAt().equals("")) { + param.put("updDate", tripleVO.getRequestAt()); + param.put("regDate", tripleVO.getRequestAt()); + } else { + param.put("updDate", ""); + param.put("regDate", ""); + } + + + String biPushYn = "N"; + param.put("biPushYn", biPushYn); + + if(vendorCode.equals("powerball")) { + param.put("biProcYn", "Y"); + } else { + param.put("biProcYn", "N"); + } + + try { + int betResult = betDao.insertBet(param); + Long betIdx = (Long) param.get("betIdx"); + List betDetails = tripleVO.getBetDetails(); + if(betDetails != null) { + for(TripleDetailVO betMap : betDetails) { + HashMap mapParam = new HashMap(); + mapParam.put("betIdx", betIdx.longValue()); + mapParam.put("mapId", betMap.getDetailId()); + mapParam.put("rateTypeCode", betMap.getDetailType()); + mapParam.put("betName", betMap.getDetailName()); + mapParam.put("betAmt", Integer.toString(betMap.getBetAmt())); + mapParam.put("betRate", "0"); + mapParam.put("betWinAmt", Integer.toString(betMap.getBetWinAmt())); + mapParam.put("debitDetailStr", null); + log.info(LOG_PREFIX+ "mapParam: " + mapParam.toString()); + int betMapResult = betDao.insertBetMap(mapParam); + } + } + + HashMap logParam = new HashMap(); + logParam.put("siteId", tripleVO.getSiteId()); + logParam.put("memId", tripleVO.getMemId()); + logParam.put("actionType", 3); + commonDao.updateAcctionLog(logParam); + + } catch(DataIntegrityViolationException de) { + log.error(LOG_PREFIX+ "Duplicate tranId: " + tripleVO.getTranId()); + } + + } catch (Exception e) { + log.error("AsyncTripleService::insertBetDebit::Exception {}", e); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -2.0) log.error(LOG_PREFIX+ "[diffTime : " + String.format("%.3f", diffTime) + "]"); + } + + @Async + public void insertSportBetDebit(TripleVO tripleVO) { + long startTime = System.currentTimeMillis(); + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::#-Async::insertSportBetDebit::::"; + + try { + // 최초 배팅 건 + int amount = Math.abs(tripleVO.getDebit()); + + HashMap param = new HashMap(); + param.put("betIdx", 0); + param.put("siteId", tripleVO.getSiteId()); + param.put("memId", tripleVO.getMemId()); + param.put("betType", "triple"); + param.put("gameCategory", "sport"); + param.put("vendorCode", "splus"); + param.put("vendor", tripleVO.getVendor()); + param.put("betId", tripleVO.getBetId()); + + if(tripleVO.getDetail() != null) { + JSONObject detail = tripleVO.getDetail(); + JSONObject bets = detail.getJSONObject("Bets"); + JSONObject bet = bets.getJSONObject("Bet"); + String betTypeName = bet.getString("BetTypeName"); + param.put("gameName", betTypeName); + } else { + param.put("gameName", tripleVO.getGameKey()); + } + + param.put("betAmt", Integer.toString(amount)); + param.put("betRate", "0"); + param.put("betWinAmt", "0"); + int bfMoney = tripleVO.getBeforeCash().intValue(); + param.put("bfMoney", Integer.toString(bfMoney)); + int afMoney = tripleVO.getAfterCash().intValue(); + param.put("afMoney", Integer.toString(afMoney)); + param.put("betBonus", "0"); + param.put("betCnt", "1"); + param.put("regId", tripleVO.getMemId()); + param.put("updId", tripleVO.getMemId()); + param.put("delYn","N"); + param.put("updDate", ""); + param.put("regDate", ""); + + String biPushYn = "N"; + param.put("biPushYn", biPushYn); + int betResult = betDao.insertBet(param); + log.info(LOG_PREFIX+ "::insertBet::SUCC"); + Long betIdx = (Long) param.get("betIdx"); + + if(tripleVO.getDetail() != null) { + HashMap mapParam = new HashMap(); + mapParam.put("betIdx", betIdx.longValue()); + mapParam.put("mapId", "sport"); + mapParam.put("rateTypeCode", "splus"); + mapParam.put("betName", ""); + mapParam.put("betAmt", Integer.toString(amount)); + mapParam.put("betRate", "0"); + mapParam.put("betWinAmt", "0"); + mapParam.put("debitDetailStr", tripleVO.getDetail().toString()); + log.info(LOG_PREFIX+ "::mapParam::" + mapParam.toString()); + int betMapResult = betDao.insertBetMap(mapParam); + + if(betMapResult > 0) { + int sportsResult = sportsDebitProc(betIdx.longValue(), tripleVO); + log.info(LOG_PREFIX+ "::sportsDebitProc::result::" + sportsResult); + } + + // 스포츠 정산 배팅금 처리 + int betWinAmt = (int) tripleVO.getCredit(); + HashMap repParam = new HashMap(); + repParam.put("betIdx", betIdx.longValue()); + repParam.put("betAmt", amount); + log.info(LOG_PREFIX+ "::updateSportReportDebit::repParam::" + repParam.toString()); + int repResult = betDao.updateSportReportDebit(repParam); + log.info(LOG_PREFIX+ "::updateSportReportDebit::repResult::" + repResult); + } + + HashMap logParam = new HashMap(); + logParam.put("siteId", tripleVO.getSiteId()); + logParam.put("memId", tripleVO.getMemId()); + logParam.put("actionType", 3); + commonDao.updateAcctionLog(logParam); + + } catch (Exception e) { + log.error(LOG_PREFIX+ "::Exception"); + log.error(LOG_PREFIX+ "::ERROR::" + e.getMessage()); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -2.0) log.error(LOG_PREFIX+ "::diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + + @Async + public void updateBetDebit(TripleVO tripleVO, Long betIdx) { + long startTime = System.currentTimeMillis(); + final String LOG_PREFIX = "#-callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::#-Async::updateBetDebit::::"; + + try { + int amount = Math.abs(tripleVO.getDebit()); + + HashMap betUpdParam = new HashMap(); + betUpdParam.put("betIdx", betIdx); + betUpdParam.put("betAmt", Integer.toString(amount)); + int betResult = betDao.updateBetInfo(betUpdParam); + int mapResult = betDao.updateBetInfoMap(betUpdParam); + + HashMap cashUpdParam = new HashMap(); + cashUpdParam.put("betIdx", betIdx); + cashUpdParam.put("cashType", "-9"); + cashUpdParam.put("memId", tripleVO.getMemId()); + cashUpdParam.put("siteid", tripleVO.getSiteId()); + int cashAmt = amount * -1; + cashUpdParam.put("cashAmt", Integer.toString(cashAmt)); + int cashResult = betDao.updateCashInfo(cashUpdParam); + log.info(LOG_PREFIX+ "["+betIdx+"] - updateCashInfo : " + cashResult); + + if(tripleVO.getVendorIdx() == 83 || tripleVO.getVendorIdx() == 83) { + // 스포츠 정산 배팅금 처리 + int betWinAmt = (int) tripleVO.getCredit(); + HashMap repParam = new HashMap(); + repParam.put("betIdx", betIdx.longValue()); + repParam.put("betAmt", amount); + log.info(LOG_PREFIX+ "::updateSportReportDebit::repParam::" + repParam.toString()); + int repResult = betDao.updateSportReportDebit(repParam); + log.info(LOG_PREFIX+ "::updateSportReportDebit::repResult::" + repResult); + } + + } catch (Exception e) { + log.error(LOG_PREFIX+ "Exception {}", e); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -2.0) log.error(LOG_PREFIX+ "[diffTime : " + String.format("%.3f", diffTime) + "]"); + } + + @Async + public void updateBetCredit(TripleVO tripleVO, Long betIdx) { + long startTime = System.currentTimeMillis(); + final String LOG_PREFIX = "#-callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::#-Async::updateBetCredit::::"; + + try { + String category = ""; + String vendorCode = ""; + String rateOption = ""; + CodeSearch codeSrch = new CodeSearch(); + codeSrch.setSiteId(tripleVO.getSiteId()); + codeSrch.setMasterCode("kplay"); + codeSrch.setTripleCode(tripleVO.getVendorIdx()); + HashMap code = commonDao.getCodeBySite(codeSrch); + if(code != null) { + category = code.get("category").toString(); + vendorCode = code.get("vendorCode").toString(); + rateOption = code.get("rateOption").toString(); + } else { + category = "undefind"; + vendorCode = "undefind"; + rateOption = "0"; + } + + HashMap mapParam = new HashMap(); + mapParam.put("betIdx", betIdx); + int betWinAmt = (int) tripleVO.getCredit(); + mapParam.put("betWinAmt", Integer.toString(betWinAmt)); + int afMoney = tripleVO.getAfterCash().intValue(); + mapParam.put("afMoney", Integer.toString(afMoney)); + mapParam.put("siteId", tripleVO.getSiteId()); + if(rateOption.equals("1") && betWinAmt != 0) { + mapParam.put("pointRegYn", "Y"); + } + if(vendorCode.equals("bomb")) { + mapParam.put("pointRegYn", "Y"); + } + if(vendorCode.equals("powerball")) { + mapParam.put("biProcYn", "Y"); + } else { + mapParam.put("biProcYn", "N"); + } + + betDao.updateEnd(mapParam); + if(tripleVO.getTranType().equals("adjust")) { + HashMap cashUpdParam = new HashMap(); + cashUpdParam.put("betIdx", betIdx); + cashUpdParam.put("cashType", "9"); + cashUpdParam.put("memId", tripleVO.getMemId()); + cashUpdParam.put("siteid", tripleVO.getSiteId()); + cashUpdParam.put("cashAmt", Integer.toString(betWinAmt)); + int cashResult = betDao.updateCashInfo(cashUpdParam); + log.info(LOG_PREFIX+ "["+betIdx+"] - updateCashInfo : " + cashResult); + } + + List betDetails = tripleVO.getBetDetails(); + if(betDetails != null) { + for(TripleDetailVO betMap : betDetails) { + HashMap mapUpdParam = new HashMap(); + mapUpdParam.put("betIdx", betIdx); + mapUpdParam.put("mapId", betMap.getDetailId()); + mapUpdParam.put("betWinAmt", Integer.toString(betMap.getBetWinAmt())); + if(betMap.getDetail() != null) { + mapUpdParam.put("creditDetailStr", betMap.getDetail().toString()); + } else { + mapUpdParam.put("creditDetailStr", null); + } + log.info(LOG_PREFIX+ "mapUpdParam: " + mapUpdParam.toString()); + betDao.updateMapEnd(mapUpdParam); + } + } + + } catch (Exception e) { + log.error(LOG_PREFIX+ "AsyncTripleService::updateBetCredit::Exception {}", e); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -2.0) log.error(LOG_PREFIX+ "[diffTime : " + String.format("%.3f", diffTime) + "]"); + } + + @Async + public void updateSportBetCredit(TripleVO tripleVO, Long betIdx) { + long startTime = System.currentTimeMillis(); + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::#-Async::updateSportBetCredit::::"; + + try { + String category = ""; + String vendorCode = ""; + String rateOption = ""; + CodeSearch codeSrch = new CodeSearch(); + codeSrch.setSiteId(tripleVO.getSiteId()); + codeSrch.setMasterCode("kplay"); + codeSrch.setTripleCode(tripleVO.getVendorIdx()); + HashMap code = commonDao.getCodeBySite(codeSrch); + if(code != null) { + category = code.get("category").toString(); + vendorCode = code.get("vendorCode").toString(); + rateOption = code.get("rateOption").toString(); + } else { + category = "undefind"; + vendorCode = "undefind"; + rateOption = "0"; + } + + HashMap mapParam = new HashMap(); + mapParam.put("betIdx", betIdx); + int betWinAmt = (int) tripleVO.getCredit(); + mapParam.put("betWinAmt", Integer.toString(betWinAmt)); + int afMoney = tripleVO.getAfterCash().intValue(); + mapParam.put("afMoney", Integer.toString(afMoney)); + mapParam.put("siteId", tripleVO.getSiteId()); + if(rateOption.equals("1") && betWinAmt != 0) { + mapParam.put("pointRegYn", "Y"); + } + log.info(LOG_PREFIX+ "::updateEnd::mapParam::" + mapParam.toString()); + int updResult = betDao.updateEnd(mapParam); + log.info(LOG_PREFIX+ "::updateEnd::SUCC::"+updResult); + + log.info(LOG_PREFIX+ "::updateEndOld::mapParam::" + mapParam.toString()); + int updOldResult = betDao.updateEndOld(mapParam); + log.info(LOG_PREFIX+ "::updateEndOld::SUCC::"+updOldResult); + + if(tripleVO.getDetail() != null) { + HashMap mapUpdParam = new HashMap(); + mapUpdParam.put("betIdx", betIdx.longValue()); + mapUpdParam.put("mapId", "sport"); + mapUpdParam.put("betWinAmt", Integer.toString(betWinAmt)); + mapUpdParam.put("creditDetailStr", tripleVO.getDetail().toString()); + log.info(LOG_PREFIX+ "::updateMapEnd::" + mapUpdParam.toString()); + int betMapResult = betDao.updateMapEnd(mapUpdParam); + log.info(LOG_PREFIX+ "::updateMapEnd::SUCC::"+betMapResult); + + log.info(LOG_PREFIX+ "::updateMapEndOld::" + mapUpdParam.toString()); + int betMapOldResult = betDao.updateMapEndOld(mapUpdParam); + log.info(LOG_PREFIX+ "::updateMapEndOld::SUCC::"+betMapOldResult); + + if(betMapResult > 0) { + int sportsResult = sportsCreditProc(betIdx.longValue(), tripleVO); + log.info(LOG_PREFIX+ "::sportsCreditProc::result::" + sportsResult); + } + } + + // 스포츠 정산 당첨금 처리 + HashMap repParam = new HashMap(); + repParam.put("betIdx", betIdx.longValue()); + repParam.put("betWinAmt", betWinAmt); + log.info(LOG_PREFIX+ "::updateSportReportCredit::repParam::" + repParam.toString()); + int repResult = betDao.updateSportReportCredit(repParam); + log.info(LOG_PREFIX+ "::updateSportReportCredit::repResult::" + repResult); + /* + HashMap repParam = new HashMap(); + repParam.put("siteId", tripleVO.getSiteId()); + repParam.put("memId", tripleVO.getMemId()); + repParam.put("betWinAmt", betWinAmt); + log.info(LOG_PREFIX+ "::updateSportReport::repParam::" + repParam.toString()); + int repResult = betDao.updateSportReport(repParam); + log.info(LOG_PREFIX+ "::updateSportReport::repResult::" + repResult); + */ + + // 스포츠 롤링 처리 + log.info(LOG_PREFIX+ "::insertSportBetRolling::betIdx::" + betIdx.longValue()); + int rollResult1 = betDao.insertSportBetRolling(betIdx.longValue()); + log.info(LOG_PREFIX+ "::insertSportBetRolling::repResult::" + rollResult1); + + log.info(LOG_PREFIX+ "::updateSportRollingYn::betIdx::" + betIdx.longValue()); + int rollResult2 = betDao.updateSportRollingYn(betIdx.longValue()); + log.info(LOG_PREFIX+ "::updateSportRollingYn::repResult::" + rollResult2); + + // 스포츠 롤링 정산 처리 + log.info(LOG_PREFIX+ "::updateSportReportRolling::betIdx::" + betIdx.longValue()); + int rollResult3 = betDao.updateSportReportRolling(betIdx.longValue()); + log.info(LOG_PREFIX+ "::updateSportReportRolling::repResult::" + rollResult3); + + } catch (Exception e) { + log.error(LOG_PREFIX+ "::Exception"); + log.error(LOG_PREFIX+ "::ERROR::" + e.getMessage()); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -2.0) log.error(LOG_PREFIX+ "::diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + + @Async + public void updateSportBetCancel(TripleVO tripleVO, Long betIdx) { + long startTime = System.currentTimeMillis(); + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::#-Async::updateSportBetCancel::::"; + + try { + HashMap param = new HashMap<>(); + param.put("betIdx", betIdx); + int statusResult = betDao.updateSplusBetCancel(param); + log.info(LOG_PREFIX+ "::sportsCancelProc::result::" + statusResult); + + // 스포츠 정산 당첨금 처리 + int betWinAmt = (int) tripleVO.getCredit(); + HashMap repParam = new HashMap(); + repParam.put("betIdx", betIdx.longValue()); + repParam.put("betWinAmt", betWinAmt); + log.info(LOG_PREFIX+ "::updateSportReportCancel::repParam::" + repParam.toString()); + int repResult = betDao.updateSportReportCancel(repParam); + log.info(LOG_PREFIX+ "::updateSportReportCancel::repResult::" + repResult); + /* + HashMap repParam = new HashMap(); + repParam.put("siteId", tripleVO.getSiteId()); + repParam.put("memId", tripleVO.getMemId()); + repParam.put("betWinAmt", betWinAmt); + log.info(LOG_PREFIX+ "::updateSportReport::repParam::" + repParam.toString()); + int repResult = betDao.updateSportReport(repParam); + log.info(LOG_PREFIX+ "::updateSportReport::repResult::" + repResult); + */ + + // 스포츠 롤링 정산 취소 처리 + log.info(LOG_PREFIX+ "::updateSportReportRollingCancel::betIdx::" + betIdx.longValue()); + int rollResult3 = betDao.updateSportReportRollingCancel(betIdx.longValue()); + log.info(LOG_PREFIX+ "::updateSportReportRollingCancel::repResult::" + rollResult3); + + String betId = tripleVO.getBetId(); + List list = betDao.getCancelPointAmtList(betId); + if(list != null) { + for(HashMap item : list) { + String pointAmt = item.get("pointAmt").toString(); + log.info(LOG_PREFIX+ "ROLLING_CANCEL::getCancelPointAmt::"+pointAmt); + int updResult = betDao.updateCancelPoint(item); + log.info(LOG_PREFIX+ "ROLLING_CANCEL::updateCancelPoint Reasult::"+updResult); + } + + // 스포츠 롤링 취소 처리 + log.info(LOG_PREFIX+ "::deleteSportRollingCancel::betIdx::" + betIdx.longValue()); + int rollResult1 = betDao.deleteSportRollingCancel(betIdx.longValue()); + log.info(LOG_PREFIX+ "::deleteSportRollingCancel::repResult::" + rollResult1); + } + + log.info(LOG_PREFIX+ "::updateSportRollingYn::betIdx::" + betIdx.longValue()); + int rollResult2 = betDao.updateSportRollingYn(betIdx.longValue()); + log.info(LOG_PREFIX+ "::updateSportRollingYn::repResult::" + rollResult2); + + } catch (Exception e) { + log.error(LOG_PREFIX+ "::Exception"); + log.error(LOG_PREFIX+ "::ERROR::" + e.getMessage()); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -2.0) log.error(LOG_PREFIX+ "::diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + + @Async + public void updateSportBetReserve(TripleVO tripleVO, Long betIdx) { + long startTime = System.currentTimeMillis(); + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::#-Async::updateSportBetReserve::::"; + + try { + int amount = Math.abs(tripleVO.getCredit()); + + HashMap betUpdParam = new HashMap(); + betUpdParam.put("betIdx", betIdx); + // 변동된 배팅금 차액만큼 기존에 기록된 배팅금(betinfo.betAmt)에서 빼준다. + betUpdParam.put("betAmt", Integer.toString(amount * -1)); + int betResult = betDao.updateBetInfo(betUpdParam); + log.info(LOG_PREFIX+ "::updateBetInfo::result::" + betResult); + + int betResultOld = betDao.updateBetInfoOld(betUpdParam); + log.info(LOG_PREFIX+ "::updateBetInfoOld::result::" + betResultOld); + + HashMap cashInsertParam = new HashMap(); + cashInsertParam.put("siteid", tripleVO.getSiteId()); + cashInsertParam.put("memId", tripleVO.getMemId()); + cashInsertParam.put("cashType", "19"); + cashInsertParam.put("cashDesc", "지급"); + // 변동된 배팅금 차액만큼 지급한 금액 내역을 cash_info에 남긴다. + cashInsertParam.put("cashAmt", Integer.toString(amount)); + cashInsertParam.put("betIdx", betIdx); + cashInsertParam.put("regId", tripleVO.getMemId()); + cashInsertParam.put("adminId", tripleVO.getSiteId()); + cashInsertParam.put("memo", "#-COMMIT_RESERVE::차액반영"); + cashInsertParam.put("preCashAmt", Long.toString(tripleVO.getBeforeCash())); + int cashResult = betDao.insertCashInfoByReserve(cashInsertParam); + log.info(LOG_PREFIX+ "::insertCashInfoByReserve::result::" + cashResult); + + // 스포츠 정산 배팅금 처리 + int betWinAmt = (int) tripleVO.getCredit(); + HashMap repParam = new HashMap(); + repParam.put("betIdx", betIdx.longValue()); + repParam.put("betAmt", (amount * -1)); + log.info(LOG_PREFIX+ "::updateSportReportDebit::repParam::" + repParam.toString()); + int repResult = betDao.updateSportReportDebit(repParam); + log.info(LOG_PREFIX+ "::updateSportReportDebit::repResult::" + repResult); + + } catch (Exception e) { + log.error(LOG_PREFIX+ "::Exception"); + log.error(LOG_PREFIX+ "::ERROR::" + e.getMessage()); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -2.0) log.error(LOG_PREFIX+ "::diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + + @Async + public void insertSportBetIssue(TripleVO tripleVO) { + long startTime = System.currentTimeMillis(); + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::#-Async::insertSportBetIssue::::"; + + try { + // 최초 배팅 건 + int amount = Math.abs(tripleVO.getDebit()); + + HashMap param = new HashMap(); + param.put("betIdx", 0); + param.put("siteId", tripleVO.getSiteId()); + param.put("memId", tripleVO.getMemId()); + param.put("betType", "triple"); + param.put("gameCategory", "sport"); + param.put("vendorCode", "splus"); + param.put("vendor", tripleVO.getVendor()); + param.put("betId", tripleVO.getBetId()); + + if(tripleVO.getDetail() != null) { + JSONObject detail = tripleVO.getDetail(); + JSONObject credit = detail.getJSONObject("Credit"); + JSONObject purchases = credit.getJSONObject("Purchases"); + JSONObject purchase = purchases.getJSONObject("Purchase"); + JSONObject selections = purchase.getJSONObject("Selections"); + + int lineCnt = purchase.getInt("NumberOfLines"); + + boolean isArr = false; + Object selectionObj = selections.get("Selection"); + if (selectionObj instanceof JSONArray) { + isArr = true; + } else if (selectionObj instanceof JSONObject) { + isArr = false; + } + log.info(LOG_PREFIX+ "::lineCnt::" + lineCnt + "::isArr::" + isArr); + + if(lineCnt==1 || !isArr) { + // SINGLE + JSONObject selection = selections.getJSONObject("Selection"); + JSONObject changes = selection.getJSONObject("Changes"); + JSONObject change = changes.getJSONObject("Change"); + JSONObject bets = change.getJSONObject("Bets"); + JSONObject bet = bets.getJSONObject("Bet"); + } else { + // COMBO + JSONArray selectionArr = selections.getJSONArray("Selection"); + JSONObject selection = selectionArr.getJSONObject(0); + JSONObject changes = selection.getJSONObject("Changes"); + JSONObject change = changes.getJSONObject("Change"); + JSONObject bets = change.getJSONObject("Bets"); + JSONObject bet = bets.getJSONObject("Bet"); + } + + JSONObject selection = selections.getJSONObject("Selection"); + JSONObject changes = selection.getJSONObject("Changes"); + JSONObject change = changes.getJSONObject("Change"); + JSONObject bets = change.getJSONObject("Bets"); + JSONObject bet = bets.getJSONObject("Bet"); + + String betTypeName = bet.getString("BetType"); + param.put("gameName", betTypeName); + } else { + param.put("gameName", tripleVO.getGameKey()); + } + + param.put("betAmt", Integer.toString(amount)); + param.put("betRate", "0"); + param.put("betWinAmt", "0"); + int bfMoney = tripleVO.getBeforeCash().intValue(); + param.put("bfMoney", Integer.toString(bfMoney)); + int afMoney = tripleVO.getAfterCash().intValue(); + param.put("afMoney", Integer.toString(afMoney)); + param.put("betBonus", "-1"); + param.put("betCnt", "1"); + param.put("betResults", "FAIL"); + param.put("betStatus", "ISSUEEND"); + param.put("regId", tripleVO.getMemId()); + param.put("updId", tripleVO.getMemId()); + param.put("updDate", ""); + param.put("regDate", ""); + param.put("biPushYn", "N"); + int betResult = betDao.insertBetBonus(param); + log.info(LOG_PREFIX+ "::insertBetIssue::SUCC"); + Long betIdx = (Long) param.get("betIdx"); + + if(tripleVO.getDetail() != null) { + HashMap mapParam = new HashMap(); + mapParam.put("betIdx", betIdx.longValue()); + mapParam.put("mapId", "sport"); + mapParam.put("rateTypeCode", "splus"); + mapParam.put("betName", ""); + mapParam.put("betAmt", Integer.toString(amount)); + mapParam.put("betRate", "0"); + mapParam.put("betWinAmt", "0"); + mapParam.put("debitDetailStr", tripleVO.getDetail().toString()); + log.info(LOG_PREFIX+ "::mapParam::" + mapParam.toString()); + int betMapResult = betDao.insertBetMap(mapParam); + + if(betMapResult > 0) { + int sportsResult = sportsBetIssueProc(betIdx.longValue(), tripleVO); + log.info(LOG_PREFIX+ "::sportsDebitProc::result::" + sportsResult); + } + + // 스포츠 정산 배팅금 처리 + int betWinAmt = (int) tripleVO.getCredit(); + HashMap repParam = new HashMap(); + repParam.put("betIdx", betIdx.longValue()); + repParam.put("betAmt", amount); + log.info(LOG_PREFIX+ "::updateSportReportDebit::repParam::" + repParam.toString()); + int repResult = betDao.updateSportReportDebit(repParam); + log.info(LOG_PREFIX+ "::updateSportReportDebit::repResult::" + repResult); + } + + } catch (Exception e) { + log.error(LOG_PREFIX+ "::Exception"); + log.error(LOG_PREFIX+ "::ERROR::" + e.getMessage()); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -2.0) log.error(LOG_PREFIX+ "::diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + + @Async + public void updateBetIssue(TripleVO tripleVO, Long betIdx) { + long startTime = System.currentTimeMillis(); + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::#-Async::updateBetIssue::::"; + + try { + int amount = Math.abs(tripleVO.getDebit()); + + HashMap betUpdParam = new HashMap(); + betUpdParam.put("betIdx", betIdx); + betUpdParam.put("betAmt", Integer.toString(amount)); + int betResult = betDao.updateBetInfo(betUpdParam); + log.info(LOG_PREFIX+ "::updateBetInfo::result::" + betResult); + + int betResultOld = betDao.updateBetInfoOld(betUpdParam); + log.info(LOG_PREFIX+ "::updateBetInfoOld::result::" + betResultOld); + + HashMap cashUpdParam = new HashMap(); + cashUpdParam.put("betIdx", betIdx); + cashUpdParam.put("cashType", "-19"); + cashUpdParam.put("memId", tripleVO.getMemId()); + cashUpdParam.put("siteid", tripleVO.getSiteId()); + int cashAmt = amount * -1; + cashUpdParam.put("cashAmt", Integer.toString(cashAmt)); + int cashResult = betDao.updateCashInfo(cashUpdParam); + log.info(LOG_PREFIX+ "::updateCashInfo::result::" + cashResult); + + // 스포츠 정산 배팅금 처리 + int betWinAmt = (int) tripleVO.getCredit(); + HashMap repParam = new HashMap(); + repParam.put("betIdx", betIdx.longValue()); + repParam.put("betAmt", amount); + log.info(LOG_PREFIX+ "::updateSportReportDebit::repParam::" + repParam.toString()); + int repResult = betDao.updateSportReportDebit(repParam); + log.info(LOG_PREFIX+ "::updateSportReportDebit::repResult::" + repResult); + + } catch (Exception e) { + log.error(LOG_PREFIX+ "::Exception"); + log.error(LOG_PREFIX+ "::ERROR::" + e.getMessage()); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -2.0) log.error(LOG_PREFIX+ "::diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + + private int sportsDebitProc(long betIdx, TripleVO tripleVO) { + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::#-Async::sportsDebitProc::::"; + int sportResult = 0; + + try { + JSONObject detail = tripleVO.getDetail(); + JSONObject bets = detail.getJSONObject("Bets"); + JSONObject bet = bets.getJSONObject("Bet"); + + int lineCnt = bet.getInt("ComboBetNumersLines"); + if(lineCnt == 0) { + // SINGLE + HashMap param = new HashMap<>(); + param.put("betIdx", betIdx); + param.put("BetIdFK", tripleVO.getBetId()); + param.put("tranType", "debit"); + param.put("customerID", bets.getLong("cust_id")); + param.put("reserveID", bets.getLong("reserve_id")); + param.put("purchaseID", bet.getLong("PurchaseBetID")); + param.put("amount", bets.getInt("amount")); + param.put("odds", bet.getDouble("OddsDec")); + param.put("gain", bet.getDouble("Gain")); + + param.put("lineTypeID", bet.getInt("LineTypeID")); + param.put("lineTypeName", bet.getString("LineTypeName")); + // param.put("lineID", bet.getLong("LineID")); + param.put("newLineID", bet.getString("NewLineID")); + param.put("lineOdds", bet.getDouble("OddsDec")); + param.put("eventTypeID", bet.getInt("EventTypeID")); + param.put("eventTypeName", bet.getString("EventTypeName")); + // param.put("masterEventID", bet.getLong("MasterEventID")); + param.put("newMasterEventID", bet.getLong("NewMasterEventID")); + // param.put("eventID", bet.getLong("EventID")); + param.put("newEventID", bet.getLong("NewEventID")); + param.put("eventName", bet.getString("EventName")); + param.put("eventDate", bet.getString("EventDate")); + param.put("betTypeID", bet.getInt("BetTypeID")); + param.put("betTypeName", bet.getString("BetTypeName")); + param.put("betID", bet.getLong("BetID")); + param.put("creationDate", bet.getString("CreationDate")); + param.put("status", bet.getString("Status")); + if(bet.has("BranchID")) { + param.put("branchID", bet.getInt("BranchID")); + } else { + param.put("branchID", bet.getInt("BranchId")); + } + param.put("branchName", bet.getString("BranchName")); + // param.put("leagueID", bet.getLong("LeagueID")); + param.put("newLeagueID", bet.getLong("NewLeagueID")); + param.put("leagueName", bet.getString("LeagueName")); + param.put("homeTeam", bet.getString("HomeTeam")); + param.put("awayTeam", bet.getString("AwayTeam")); + param.put("yourBet", bet.getString("YourBet")); + param.put("score", bet.getString("Score")); + + param.put("isFreeBet", bet.getInt("IsFreeBet")); + param.put("isLive", bet.getInt("IsLive")); + + log.info(LOG_PREFIX+ "::param::" + param.toString()); + sportResult = betDao.insertBetSplusInfo(param); + log.info(LOG_PREFIX+ "::sportResult::" + sportResult); + } else { + // COMBO + int result = 0; + JSONArray lines = bet.getJSONArray("Lines"); + for(int j=0; j(); + param.put("betIdx", betIdx); + param.put("BetIdFK", tripleVO.getBetId()); + param.put("tranType", "debit"); + param.put("customerID", bets.getLong("cust_id")); + param.put("reserveID", bets.getLong("reserve_id")); + param.put("purchaseID", bet.getLong("PurchaseBetID")); + param.put("amount", bets.getInt("amount")); + param.put("odds", bet.getDouble("OddsDec")); + param.put("gain", bet.getDouble("Gain")); + + param.put("lineTypeID", line.getInt("LineTypeID")); + param.put("lineTypeName", line.getString("LineTypeName")); + // param.put("lineID", line.getLong("LineID")); + param.put("newLineID", line.getString("NewLineID")); + param.put("lineOdds", line.getDouble("OddsDec")); + param.put("eventTypeID", line.getInt("EventTypeID")); + param.put("eventTypeName", line.getString("EventTypeName")); + // param.put("masterEventID", line.getLong("MasterEventID")); + param.put("newMasterEventID", line.getLong("NewMasterEventID")); + // param.put("eventID", line.getLong("EventID")); + param.put("newEventID", line.getLong("NewEventID")); + param.put("eventName", line.getString("EventName")); + param.put("eventDate", line.getString("EventDate")); + param.put("betTypeID", line.getInt("BetTypeID")); + param.put("betTypeName", line.getString("BetTypeName")); + param.put("betID", line.getLong("BetID")); + param.put("creationDate", line.getString("CreationDate")); + param.put("status", line.getString("Status")); + if(line.has("BranchID")) { + param.put("branchID", line.getInt("BranchID")); + } else { + param.put("branchID", line.getInt("BranchId")); + } + param.put("branchName", line.getString("BranchName")); + // param.put("leagueID", line.getLong("LeagueID")); + param.put("newLeagueID", line.getLong("NewLeagueID")); + param.put("leagueName", line.getString("LeagueName")); + param.put("homeTeam", line.getString("HomeTeam")); + param.put("awayTeam", line.getString("AwayTeam")); + param.put("leagueNameKO", line.getString("LeagueNameKor")); + param.put("homeTeamKO", line.getString("HomeTeamKor")); + param.put("awayTeamKO", line.getString("AwayTeamKor")); + param.put("yourBet", line.getString("YourBet")); + param.put("score", line.getString("Score")); + + param.put("isFreeBet", bet.getInt("IsFreeBet")); + param.put("isLive", bet.getInt("IsLive")); + + log.info(LOG_PREFIX+ "::param::" + param.toString()); + result = betDao.insertBetSplusInfo(param); + sportResult = sportResult + result; + log.info(LOG_PREFIX+ "::sportResult::" + sportResult); + } + } + + } catch(Exception e) { + log.error(LOG_PREFIX+ "ERROR:: " + e.getMessage()); + e.printStackTrace(); + } + + return sportResult; + } + + private int sportsCreditProc(long betIdx, TripleVO tripleVO) { + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::#-Async::sportsCreditProc::::"; + int sportResult = 0; + + try { + JSONObject detail = tripleVO.getDetail(); + JSONObject credit = detail.getJSONObject("Credit"); + JSONObject purchases = credit.getJSONObject("Purchases"); + JSONObject purchase = purchases.getJSONObject("Purchase"); + JSONObject selections = purchase.getJSONObject("Selections"); + + int lineCnt = purchase.getInt("NumberOfLines"); + + boolean isArr = false; + Object selectionObj = selections.get("Selection"); + if (selectionObj instanceof JSONArray) { + isArr = true; + } else if (selectionObj instanceof JSONObject) { + isArr = false; + } + + log.info(LOG_PREFIX+ "::lineCnt::" + lineCnt + "::isArr::" + isArr); + + if(lineCnt==1 || !isArr) { + // SINGLE + JSONObject selection = selections.getJSONObject("Selection"); + JSONObject changes = selection.getJSONObject("Changes"); + JSONObject change = changes.getJSONObject("Change"); + JSONObject bets = change.getJSONObject("Bets"); + JSONObject bet = bets.getJSONObject("Bet"); + + HashMap param = new HashMap<>(); + param.put("betIdx", betIdx); + param.put("BetIdFK", tripleVO.getBetId()); + param.put("tranType", "credit"); + param.put("customerID", credit.getLong("CustomerID")); + param.put("reserveID", purchase.getLong("ReserveID")); + param.put("purchaseID", purchase.getLong("PurchaseID")); + param.put("amount", credit.getInt("Amount")); + param.put("odds", selection.getDouble("DecimalOdds")); + param.put("gain", 0.0); + + param.put("lineTypeID", selection.getInt("LineTypeID")); + param.put("lineTypeName", selection.getString("LineTypeName")); + // param.put("lineID", selection.getLong("LineID")); + param.put("newLineID", selection.getString("NewLineID")); + param.put("lineOdds", selection.getDouble("DecimalOdds")); + param.put("eventTypeID", selection.getInt("EventTypeID")); + param.put("eventTypeName", selection.getString("EventTypeName")); + // param.put("masterEventID", selection.getLong("MasterEventID")); + param.put("newMasterEventID", selection.getLong("NewMasterEventID")); + // param.put("eventID", selection.getLong("EventID")); + param.put("newEventID", selection.getLong("NewEventID")); + param.put("eventName", selection.getString("EventName")); + param.put("eventDate", selection.getString("EventDateUTC")); + param.put("betTypeID", bet.getInt("BetTypeID")); + param.put("betTypeName", bet.getString("BetType")); + param.put("betID", bet.getLong("ID")); + param.put("creationDate", bet.getString("BetSettledDate")); + param.put("status", change.getString("NewStatus")); + param.put("branchID", selection.getInt("BranchID")); + if(selection.has("BranchID")) { + param.put("branchID", selection.getInt("BranchID")); + } else { + param.put("branchID", selection.getInt("BranchId")); + } + param.put("branchName", selection.getString("BranchName")); + // param.put("leagueID", selection.getLong("LeagueID")); + param.put("newLeagueID", selection.getLong("NewLeagueID")); + param.put("leagueName", selection.getString("LeagueName")); + param.put("homeTeam", selection.getString("HomeTeam")); + param.put("awayTeam", selection.getString("AwayTeam")); + param.put("leagueNameKO", selection.getString("LeagueNameKor")); + param.put("homeTeamKO", selection.getString("HomeTeamKor")); + param.put("awayTeamKO", selection.getString("AwayTeamKor")); + param.put("yourBet", selection.getString("YourBet")); + param.put("score", change.getString("TriggeredResult")); + param.put("isFreeBet", bet.getInt("IsFreeBet")); + param.put("isLive", bet.getInt("IsLive")); + + log.info(LOG_PREFIX+ "::param::" + param.toString()); + sportResult = betDao.insertBetSplusInfo(param); + int statusResult = betDao.updateSplusStatus(param); + log.info(LOG_PREFIX+ "::sportResult::" + sportResult); + log.info(LOG_PREFIX+ "::statusResult::" + statusResult); + } else { + // COMBO + int result = 0; + JSONArray selectionArr = selections.getJSONArray("Selection"); + for(int j=0; j(); + param.put("betIdx", betIdx); + param.put("BetIdFK", tripleVO.getBetId()); + param.put("tranType", "credit"); + param.put("customerID", credit.getLong("CustomerID")); + param.put("reserveID", purchase.getLong("ReserveID")); + param.put("purchaseID", purchase.getLong("PurchaseID")); + param.put("amount", credit.getInt("Amount")); + param.put("odds", selection.getDouble("DecimalOdds")); + param.put("gain", 0.0); + + param.put("lineTypeID", selection.getInt("LineTypeID")); + param.put("lineTypeName", selection.getString("LineTypeName")); + // param.put("lineID", selection.getLong("LineID")); + param.put("newLineID", selection.getString("NewLineID")); + param.put("lineOdds", selection.getDouble("DecimalOdds")); + param.put("eventTypeID", selection.getInt("EventTypeID")); + param.put("eventTypeName", selection.getString("EventTypeName")); + // param.put("masterEventID", selection.getLong("MasterEventID")); + param.put("newMasterEventID", selection.getLong("NewMasterEventID")); + // param.put("eventID", selection.getLong("EventID")); + param.put("newEventID", selection.getLong("NewEventID")); + param.put("eventName", selection.getString("EventName")); + param.put("eventDate", selection.getString("EventDateUTC")); + param.put("betTypeID", bet.getInt("BetTypeID")); + param.put("betTypeName", bet.getString("BetType")); + param.put("betID", bet.getLong("ID")); + param.put("creationDate", bet.getString("BetSettledDate")); + param.put("status", bet.getString("NewStatus")); + if(selection.has("BranchID")) { + param.put("branchID", selection.getInt("BranchID")); + } else { + param.put("branchID", selection.getInt("BranchId")); + } + param.put("branchName", selection.getString("BranchName")); + // param.put("leagueID", selection.getLong("LeagueID")); + param.put("newLeagueID", selection.getLong("NewLeagueID")); + param.put("leagueName", selection.getString("LeagueName")); + param.put("homeTeam", selection.getString("HomeTeam")); + param.put("awayTeam", selection.getString("AwayTeam")); + param.put("yourBet", selection.getString("YourBet")); + param.put("score", selection.getString("Score")); + param.put("isFreeBet", bet.getInt("IsFreeBet")); + param.put("isLive", bet.getInt("IsLive")); + + log.info(LOG_PREFIX+ "::param::" + param.toString()); + result = betDao.insertBetSplusInfo(param); + sportResult = sportResult + result; + int statusResult = betDao.updateSplusStatus(param); + log.info(LOG_PREFIX+ "::sportResult::" + sportResult); + log.info(LOG_PREFIX+ "::statusResult::" + statusResult); + } + } + + } catch(Exception e) { + log.error(LOG_PREFIX+ "ERROR:: " + e.getMessage()); + e.printStackTrace(); + } + + return sportResult; + } + + private int sportsBetIssueProc(long betIdx, TripleVO tripleVO) { + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::#-Async::sportsBetIssueProc::::"; + int sportResult = 0; + + try { + JSONObject detail = tripleVO.getDetail(); + JSONObject credit = detail.getJSONObject("Credit"); + JSONObject purchases = credit.getJSONObject("Purchases"); + JSONObject purchase = purchases.getJSONObject("Purchase"); + JSONObject selections = purchase.getJSONObject("Selections"); + + int lineCnt = purchase.getInt("NumberOfLines"); + + boolean isArr = false; + Object selectionObj = selections.get("Selection"); + if (selectionObj instanceof JSONArray) { + isArr = true; + } else if (selectionObj instanceof JSONObject) { + isArr = false; + } + + log.info(LOG_PREFIX+ "::lineCnt::" + lineCnt + "::isArr::" + isArr); + + if(lineCnt==1 || !isArr) { + // SINGLE + JSONObject selection = selections.getJSONObject("Selection"); + JSONObject changes = selection.getJSONObject("Changes"); + JSONObject change = changes.getJSONObject("Change"); + JSONObject bets = change.getJSONObject("Bets"); + JSONObject bet = bets.getJSONObject("Bet"); + + HashMap param = new HashMap<>(); + param.put("betIdx", betIdx); + param.put("BetIdFK", tripleVO.getBetId()); + param.put("tranType", "issue"); + param.put("customerID", credit.getLong("CustomerID")); + param.put("reserveID", purchase.getLong("ReserveID")); + param.put("purchaseID", purchase.getLong("PurchaseID")); + param.put("amount", credit.getInt("Amount")); + param.put("odds", selection.getDouble("DecimalOdds")); + param.put("gain", 0.0); + + param.put("lineTypeID", selection.getInt("LineTypeID")); + param.put("lineTypeName", selection.getString("LineTypeName")); + // param.put("lineID", selection.getLong("LineID")); + param.put("newLineID", selection.getString("NewLineID")); + param.put("lineOdds", selection.getDouble("DecimalOdds")); + param.put("eventTypeID", selection.getInt("EventTypeID")); + param.put("eventTypeName", selection.getString("EventTypeName")); + // param.put("masterEventID", selection.getLong("MasterEventID")); + param.put("newMasterEventID", selection.getLong("NewMasterEventID")); + // param.put("eventID", selection.getLong("EventID")); + param.put("newEventID", selection.getLong("NewEventID")); + param.put("eventName", selection.getString("EventName")); + param.put("eventDate", selection.getString("EventDateUTC")); + param.put("betTypeID", bet.getInt("BetTypeID")); + param.put("betTypeName", bet.getString("BetType")); + param.put("betID", bet.getLong("ID")); + param.put("creationDate", bet.getString("BetSettledDate")); + param.put("status", change.getString("NewStatus")); + param.put("branchID", selection.getInt("BranchID")); + if(selection.has("BranchID")) { + param.put("branchID", selection.getInt("BranchID")); + } else { + param.put("branchID", selection.getInt("BranchId")); + } + param.put("branchName", selection.getString("BranchName")); + // param.put("leagueID", selection.getLong("LeagueID")); + param.put("newLeagueID", selection.getLong("NewLeagueID")); + param.put("leagueName", selection.getString("LeagueName")); + param.put("homeTeam", selection.getString("HomeTeam")); + param.put("awayTeam", selection.getString("AwayTeam")); + param.put("leagueNameKO", selection.getString("LeagueNameKor")); + param.put("homeTeamKO", selection.getString("HomeTeamKor")); + param.put("awayTeamKO", selection.getString("AwayTeamKor")); + param.put("yourBet", selection.getString("YourBet")); + param.put("score", change.getString("TriggeredResult")); + param.put("isFreeBet", bet.getInt("IsFreeBet")); + param.put("isLive", bet.getInt("IsLive")); + + log.info(LOG_PREFIX+ "::param::" + param.toString()); + sportResult = betDao.insertBetSplusInfo(param); + int statusResult = betDao.updateSplusStatus(param); + log.info(LOG_PREFIX+ "::sportResult::" + sportResult); + log.info(LOG_PREFIX+ "::statusResult::" + statusResult); + } else { + // COMBO + int result = 0; + JSONArray selectionArr = selections.getJSONArray("Selection"); + for(int j=0; j(); + param.put("betIdx", betIdx); + param.put("BetIdFK", tripleVO.getBetId()); + param.put("tranType", "credit"); + param.put("customerID", credit.getLong("CustomerID")); + param.put("reserveID", purchase.getLong("ReserveID")); + param.put("purchaseID", purchase.getLong("PurchaseID")); + param.put("amount", credit.getInt("Amount")); + param.put("odds", selection.getDouble("DecimalOdds")); + param.put("gain", 0.0); + + param.put("lineTypeID", selection.getInt("LineTypeID")); + param.put("lineTypeName", selection.getString("LineTypeName")); + // param.put("lineID", selection.getLong("LineID")); + param.put("newLineID", selection.getString("NewLineID")); + param.put("lineOdds", selection.getDouble("DecimalOdds")); + param.put("eventTypeID", selection.getInt("EventTypeID")); + param.put("eventTypeName", selection.getString("EventTypeName")); + // param.put("masterEventID", selection.getLong("MasterEventID")); + param.put("newMasterEventID", selection.getLong("NewMasterEventID")); + // param.put("eventID", selection.getLong("EventID")); + param.put("newEventID", selection.getLong("NewEventID")); + param.put("eventName", selection.getString("EventName")); + param.put("eventDate", selection.getString("EventDateUTC")); + param.put("betTypeID", bet.getInt("BetTypeID")); + param.put("betTypeName", bet.getString("BetType")); + param.put("betID", bet.getLong("ID")); + param.put("creationDate", bet.getString("BetSettledDate")); + param.put("status", bet.getString("NewStatus")); + if(selection.has("BranchID")) { + param.put("branchID", selection.getInt("BranchID")); + } else { + param.put("branchID", selection.getInt("BranchId")); + } + param.put("branchName", selection.getString("BranchName")); + // param.put("leagueID", selection.getLong("LeagueID")); + param.put("newLeagueID", selection.getLong("NewLeagueID")); + param.put("leagueName", selection.getString("LeagueName")); + param.put("homeTeam", selection.getString("HomeTeam")); + param.put("awayTeam", selection.getString("AwayTeam")); + param.put("yourBet", selection.getString("YourBet")); + param.put("score", selection.getString("Score")); + param.put("isFreeBet", bet.getInt("IsFreeBet")); + param.put("isLive", bet.getInt("IsLive")); + + log.info(LOG_PREFIX+ "::param::" + param.toString()); + result = betDao.insertBetSplusInfo(param); + sportResult = sportResult + result; + int statusResult = betDao.updateSplusStatus(param); + log.info(LOG_PREFIX+ "::sportResult::" + sportResult); + log.info(LOG_PREFIX+ "::statusResult::" + statusResult); + } + } + + } catch(Exception e) { + log.error(LOG_PREFIX+ "ERROR:: " + e.getMessage()); + e.printStackTrace(); + } + + return sportResult; + } + + @Async + public void withdrawBalanceAsync(TripleVO tripleVO) { + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::withdrawBalanceAsync::::"; + try { + HashMap tripleParam = new HashMap<>(); + tripleParam.put("siteId", tripleVO.getSiteId()); + tripleParam.put("apiVendorCode", "triple"); + ApiVendorCompInfo apiVendor = userDao.getApiVendorCompInfo(tripleParam); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + headers.set("User-Agent", "PostmanRuntime/7.28.4"); + headers.set("Authorization", apiVendor.getClientSecretKey()); + headers.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8"))); + + UriComponentsBuilder withdrawBuilder = UriComponentsBuilder.fromHttpUrl(apiVendor.getApiUrl() + "/withdraw"); + HashMap withdrawParams = new HashMap(); + withdrawParams.put("username", tripleVO.getUserId()); + withdrawParams.put("vendor", ""); + withdrawParams.put("requestKey", String.valueOf(System.currentTimeMillis())); + //HttpEntity> withdrawEntity = new HttpEntity<>(withdrawParams, headers); + + + // ResponseEntity withdrawRes = restTemplate.postForEntity(withdrawBuilder.toUriString(), withdrawEntity, String.class); + //paramMap + Mono withdrawResMono = webClient.post() + .uri(withdrawBuilder.toUriString()) + .headers(httpHeaders -> httpHeaders.addAll(headers)) + .bodyValue(withdrawParams) + .retrieve() + .bodyToMono(String.class) + .flatMap(response -> { + try { + + + return Mono.just(response); + + } catch (Exception e) { + return Mono.error(e); + } + }).timeout(Duration.ofMillis(3000)); + + String withdrawRes = withdrawResMono.block(); + + org.codehaus.jettison.json.JSONObject withdrawJson = new org.codehaus.jettison.json.JSONObject(withdrawRes); + log.debug(LOG_PREFIX+"withdrawJson: " + withdrawJson.toString()); + } catch(Exception e) { + log.error(LOG_PREFIX+"Exception::" + e.getMessage()); + } + } + + @Async + public void withdrawBalanceAsync2(String LOG_PREFIX, TripleAuthInfo tripleMember) { + LOG_PREFIX = LOG_PREFIX+"::withdrawBalanceAsync::::"; + try { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + headers.set("User-Agent", "PostmanRuntime/7.28.4"); + headers.set("Authorization", tripleMember.getClientSecretKey()); + headers.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8"))); + + UriComponentsBuilder withdrawBuilder = UriComponentsBuilder.fromHttpUrl(tripleMember.getApiUrl() + "/withdraw"); + HashMap withdrawParams = new HashMap(); + withdrawParams.put("username", tripleMember.getUsername()); + withdrawParams.put("vendor", ""); + withdrawParams.put("requestKey", String.valueOf(System.currentTimeMillis())); + + Mono withdrawResMono = webClient.post() + .uri(withdrawBuilder.toUriString()) + .headers(httpHeaders -> httpHeaders.addAll(headers)) + .bodyValue(withdrawParams) + .retrieve() + .bodyToMono(String.class); + + String withdrawRes = withdrawResMono.block(); // Blocking to get the response synchronously + + org.codehaus.jettison.json.JSONObject withdrawJson = new org.codehaus.jettison.json.JSONObject(withdrawRes); + log.debug(LOG_PREFIX+"withdrawJson: " + withdrawJson.toString()); + } catch(Exception e) { + log.error(LOG_PREFIX+"Exception::" + e.getMessage()); + } + } + + @Async + public void depositBalanceAsync(TripleVO tripleVO) { + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::depositBalanceAsync::::"; + try { + HashMap tripleParam = new HashMap<>(); + tripleParam.put("siteId", tripleVO.getSiteId()); + tripleParam.put("apiVendorCode", "triple"); + ApiVendorCompInfo apiVendor = userDao.getApiVendorCompInfo(tripleParam); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + headers.set("User-Agent", "PostmanRuntime/7.28.4"); + headers.set("Authorization", apiVendor.getClientSecretKey()); + headers.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8"))); + + UriComponentsBuilder depositBuilder = UriComponentsBuilder.fromHttpUrl(apiVendor.getApiUrl() + "/deposit"); + HashMap depositParams = new HashMap(); + depositParams.put("username", tripleVO.getUserId()); + depositParams.put("vendor", ""); + int amount = Math.abs(tripleVO.getCredit()); + depositParams.put("amount", Integer.toString(amount)); + depositParams.put("requestKey", String.valueOf(System.currentTimeMillis())); + Mono depositResMono = webClient.post() + .uri(depositBuilder.toUriString()) + .headers(httpHeaders -> httpHeaders.addAll(headers)) + .bodyValue(depositParams) + .retrieve() + .bodyToMono(String.class); + + String depositRes = depositResMono.block(); // Blocking to get the response synchronously + org.codehaus.jettison.json.JSONObject depositJson = new org.codehaus.jettison.json.JSONObject(depositRes); + log.debug(LOG_PREFIX+"depositJson: " + depositJson.toString()); + } catch(Exception e) { + log.error(LOG_PREFIX+"Exception::" + e.getMessage()); + } + } + + @Async + public void insertSlotTranInfo(final String LOG_PREFIX, TripleVO tripleVO) { + long startTime = System.currentTimeMillis(); + + int amount = 0; + if(tripleVO.getTranType().equals("debit")) { + amount = Math.abs(tripleVO.getDebit()); + } else { + amount = Math.abs(tripleVO.getCredit()); + } + + HashMap param = new HashMap(); + param.put("betId", tripleVO.getBetId()); + param.put("tranId", tripleVO.getTranId()); + param.put("siteId", tripleVO.getSiteId()); + param.put("memId", tripleVO.getMemId()); + param.put("apiType", "triple"); + String tranType = ""; + if(tripleVO.getTranType().equals("debit") && tripleVO.getIsCancel() == 0) { + tranType = "BET"; + } else if(tripleVO.getTranType().equals("credit") && tripleVO.getIsCancel() == 0 && tripleVO.getIsBonus() == 0) { + // Credit OK + if(amount > 0) { + tranType = "WIN"; + } else { + tranType = "LOSE"; + } + } else if(tripleVO.getTranType().equals("credit") && tripleVO.getIsCancel() == 1 && tripleVO.getIsBonus() == 0) { + tranType = "CANCEL"; + } else { + tranType = "BONUS"; + } + param.put("tranType", tranType); + param.put("bfBalance", tripleVO.getBeforeCash().intValue()); + param.put("amount", amount); + param.put("afBalance", tripleVO.getAfterCash().intValue()); + param.put("vendor", tripleVO.getVendor()); + param.put("vendorIdx", tripleVO.getVendorIdx()); + param.put("vendorKey", tripleVO.getVendorKey()); + param.put("gameName", tripleVO.getGameKey()); + param.put("betDateTime", tripleVO.getRequestAt()); + + try { + int betResult = betDao.insertSlotTranInfo(param); + log.info(LOG_PREFIX+ "::insertSlotTranInfo::" + betResult); + } catch(DataIntegrityViolationException de) { + log.error(LOG_PREFIX+ "insertSlotTranInfo::Duplicate tranId: " + tripleVO.getTranId()); + } catch (Exception e) { + log.error(LOG_PREFIX+ "insertSlotTranInfo::Exception {}", e); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + log.info(LOG_PREFIX+ "insertSlotTranInfo::[diffTime : " + String.format("%.3f", diffTime) + "]"); + + } + +} diff --git a/src/main/java/com/bb/service/AsyncWowOtcService.java b/src/main/java/com/bb/service/AsyncWowOtcService.java new file mode 100644 index 0000000..f789f1a --- /dev/null +++ b/src/main/java/com/bb/service/AsyncWowOtcService.java @@ -0,0 +1,299 @@ +package com.bb.service; + +import java.net.SocketTimeoutException; +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.HashMap; + +import org.apache.http.conn.ConnectTimeoutException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.ResourceAccessException; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.util.UriComponentsBuilder; + +import com.bb.dao.BetDao; +import com.bb.dao.BoardDao; +import com.bb.dao.CashDao; +import com.bb.dao.CommonDao; +import com.bb.dao.UserDao; +import com.bb.model.Message; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import reactor.core.publisher.Mono; + +@Slf4j +@RequiredArgsConstructor +@Service +public class AsyncWowOtcService { + + private final CommonDao commonDao; + + private final BoardDao boardDao; + + @Autowired + WebClient webClient; + + + private HttpHeaders getHeader(String LOG_PREFIX) { + LOG_PREFIX = LOG_PREFIX + "::getHeader::"; + HttpHeaders headers = new HttpHeaders(); + //headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + headers.set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); + headers.set("User-Agent", "PostmanRuntime/7.28.4"); + headers.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8"))); + + return headers; + } + + public String createUser(String LOG_PREFIX, HashMap wowOtcInfo) { + String responseStr = null; + LOG_PREFIX = LOG_PREFIX + "WOTC::createUser::"; + + try { + String apiBaseUrl = wowOtcInfo.get("apiBaseUrl").toString(); + String reCommand = wowOtcInfo.get("reCommand").toString(); + HttpHeaders headers = getHeader(LOG_PREFIX); + UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(apiBaseUrl); + + MultiValueMap params = new LinkedMultiValueMap<>(); + params.add("Command", "100500"); + params.add("reCommand", reCommand); + params.add("userID", wowOtcInfo.get("userID").toString()); + params.add("userPass", wowOtcInfo.get("userPass").toString()); + params.add("userName", wowOtcInfo.get("userName").toString()); + params.add("userTel", wowOtcInfo.get("userTel").toString()); + params.add("userBank", wowOtcInfo.get("userBank").toString()); + log.info(LOG_PREFIX+ "API_URL::" + apiBaseUrl); + log.info(LOG_PREFIX+ "API_BODY::" + params.toString()); + + Mono resMono = webClient.post() + .uri(uriBuilder.toUriString()) + .headers(httpHeaders -> httpHeaders.addAll(headers)) + .bodyValue(BodyInserters.fromFormData(params)) + .retrieve() + .bodyToMono(String.class); + responseStr = resMono.block(); + + if(responseStr != null && responseStr.equals("OK")) { + log.info(LOG_PREFIX+ "response : " + responseStr); + } + + } catch (ResourceAccessException rae) { + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error(LOG_PREFIX+ "ConnectTimeoutException::"+rae.getMessage()); + } + + if(rae.getCause() instanceof SocketTimeoutException) { + log.error(LOG_PREFIX+ "SocketTimeoutException::"+rae.getMessage()); + } + + if(rae.getCause() instanceof InterruptedException) { + log.error(LOG_PREFIX+ "InterruptedException::"+rae.getMessage()); + } + } catch(HttpClientErrorException hee) { + String str = hee.getResponseBodyAsString(); + log.error(LOG_PREFIX+ "HttpClientErrorException::"+str); + } catch (Exception e) { + log.error(LOG_PREFIX+ "Exception::"+e.getMessage()); + e.printStackTrace(); + } + + return responseStr; + } + + public String updateUser(String LOG_PREFIX, HashMap wowOtcInfo) { + String responseStr = null; + LOG_PREFIX = LOG_PREFIX + "WOTC::updateUser::"; + + try { + String apiBaseUrl = wowOtcInfo.get("apiBaseUrl").toString(); + String reCommand = wowOtcInfo.get("reCommand").toString(); + HttpHeaders headers = getHeader(LOG_PREFIX); + UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(apiBaseUrl); + + MultiValueMap params = new LinkedMultiValueMap<>(); + params.add("Command", "100600"); + params.add("reCommand", reCommand); + params.add("userID", wowOtcInfo.get("userID").toString()); + params.add("userPass", wowOtcInfo.get("userPass").toString()); + params.add("userName", wowOtcInfo.get("userName").toString()); + params.add("userTel", wowOtcInfo.get("userTel").toString()); + params.add("userBank", wowOtcInfo.get("userBank").toString()); + log.info(LOG_PREFIX+ "API_URL::" + apiBaseUrl); + log.info(LOG_PREFIX+ "API_BODY::" + params.toString()); + + Mono resMono = webClient.post() + .uri(uriBuilder.toUriString()) + .headers(httpHeaders -> httpHeaders.addAll(headers)) + .bodyValue(BodyInserters.fromFormData(params)) + .retrieve() + .bodyToMono(String.class); + responseStr = resMono.block(); + + if(responseStr != null && responseStr.equals("OK")) { + log.info(LOG_PREFIX+ "response : " + responseStr); + } + + } catch (ResourceAccessException rae) { + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error(LOG_PREFIX+ "ConnectTimeoutException::"+rae.getMessage()); + } + + if(rae.getCause() instanceof SocketTimeoutException) { + log.error(LOG_PREFIX+ "SocketTimeoutException::"+rae.getMessage()); + } + + if(rae.getCause() instanceof InterruptedException) { + log.error(LOG_PREFIX+ "InterruptedException::"+rae.getMessage()); + } + } catch(HttpClientErrorException hee) { + String str = hee.getResponseBodyAsString(); + log.error(LOG_PREFIX+ "HttpClientErrorException::"+str); + } catch (Exception e) { + log.error(LOG_PREFIX+ "Exception::"+e.getMessage()); + e.printStackTrace(); + } + + return responseStr; + } + + @Async + public void requestPurchase(String LOG_PREFIX, HashMap wowOtcInfo) { + String responseStr = null; + LOG_PREFIX = LOG_PREFIX + "WOTC::requestPurchase::"; + + try { + String apiBaseUrl = wowOtcInfo.get("apiBaseUrl").toString(); + String reCommand = wowOtcInfo.get("reCommand").toString(); + HttpHeaders headers = getHeader(LOG_PREFIX); + UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(apiBaseUrl); + + MultiValueMap params = new LinkedMultiValueMap<>(); + params.add("Command", "100300"); + params.add("reCommand", reCommand); + params.add("userID", wowOtcInfo.get("userID").toString()); + params.add("coinChoice", wowOtcInfo.get("coinChoice").toString()); + params.add("Money", wowOtcInfo.get("Money").toString()); + log.info(LOG_PREFIX+ "API_URL::" + apiBaseUrl); + log.info(LOG_PREFIX+ "API_BODY::" + params.toString()); + + Mono resMono = webClient.post() + .uri(uriBuilder.toUriString()) + .headers(httpHeaders -> httpHeaders.addAll(headers)) + .bodyValue(BodyInserters.fromFormData(params)) + .retrieve() + .bodyToMono(String.class); + responseStr = resMono.block(); + + if(responseStr != null) { + log.info(LOG_PREFIX+ "response : " + responseStr); + /* + if(responseStr.equals("ErrorNo=106")) { + // 승인되지 않은 충전 이력 발견 - 자동 취소 시도 + cancelPurchase(LOG_PREFIX, wowOtcInfo); + log.error(LOG_PREFIX+ "승인되지 않은 충전 이력 발견 - 자동 취소 시도"); + } + */ + + if(responseStr.startsWith("OK")) { + Message message = new Message(); + message.setSiteId(wowOtcInfo.get("siteId").toString()); + message.setRegId(wowOtcInfo.get("siteId").toString()); + message.setMsgType("msg"); + message.setRecieveId(wowOtcInfo.get("memId").toString()); + message.setMsgTitle("[입금 계좌 정보]"); + String arr[] = responseStr.split("="); + message.setMsgDesc(arr[1]); + message.setHiddenYn("N"); + message.setTargetType("member"); + log.info(LOG_PREFIX+ "msgSend : " + message.toString()); + boardDao.msgSend(message); + } + } + + } catch (ResourceAccessException rae) { + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error(LOG_PREFIX+ "ConnectTimeoutException::"+rae.getMessage()); + } + + if(rae.getCause() instanceof SocketTimeoutException) { + log.error(LOG_PREFIX+ "SocketTimeoutException::"+rae.getMessage()); + } + + if(rae.getCause() instanceof InterruptedException) { + log.error(LOG_PREFIX+ "InterruptedException::"+rae.getMessage()); + } + } catch(HttpClientErrorException hee) { + String str = hee.getResponseBodyAsString(); + log.error(LOG_PREFIX+ "HttpClientErrorException::"+str); + } catch (Exception e) { + log.error(LOG_PREFIX+ "Exception::"+e.getMessage()); + e.printStackTrace(); + } + } + + @Async + public void cancelPurchase(String LOG_PREFIX, HashMap wowOtcInfo) { + String responseStr = null; + LOG_PREFIX = LOG_PREFIX + "WOTC::cancelPurchase::"; + + try { + String apiBaseUrl = wowOtcInfo.get("apiBaseUrl").toString(); + String reCommand = wowOtcInfo.get("reCommand").toString(); + HttpHeaders headers = getHeader(LOG_PREFIX); + UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(apiBaseUrl); + + MultiValueMap params = new LinkedMultiValueMap<>(); + params.add("Command", "100400"); + params.add("reCommand", reCommand); + params.add("userID", wowOtcInfo.get("userID").toString()); + params.add("coinChoice", wowOtcInfo.get("coinChoice").toString()); + params.add("Money", wowOtcInfo.get("Money").toString()); + log.info(LOG_PREFIX+ "API_URL::" + apiBaseUrl); + log.info(LOG_PREFIX+ "API_BODY::" + params.toString()); + + Mono resMono = webClient.post() + .uri(uriBuilder.toUriString()) + .headers(httpHeaders -> httpHeaders.addAll(headers)) + .bodyValue(BodyInserters.fromFormData(params)) + .retrieve() + .bodyToMono(String.class); + responseStr = resMono.block(); + + if(responseStr != null) { + log.info(LOG_PREFIX+ "response : " + responseStr); + } + + } catch (ResourceAccessException rae) { + if(rae.getCause() instanceof ConnectTimeoutException) { + log.error(LOG_PREFIX+ "ConnectTimeoutException::"+rae.getMessage()); + } + + if(rae.getCause() instanceof SocketTimeoutException) { + log.error(LOG_PREFIX+ "SocketTimeoutException::"+rae.getMessage()); + } + + if(rae.getCause() instanceof InterruptedException) { + log.error(LOG_PREFIX+ "InterruptedException::"+rae.getMessage()); + } + } catch(HttpClientErrorException hee) { + String str = hee.getResponseBodyAsString(); + log.error(LOG_PREFIX+ "HttpClientErrorException::"+str); + } catch (Exception e) { + log.error(LOG_PREFIX+ "Exception::"+e.getMessage()); + e.printStackTrace(); + } + + } +} diff --git a/src/main/java/com/bb/service/BetService.java b/src/main/java/com/bb/service/BetService.java new file mode 100644 index 0000000..9b406eb --- /dev/null +++ b/src/main/java/com/bb/service/BetService.java @@ -0,0 +1,78 @@ +package com.bb.service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import jakarta.validation.Valid; + +import com.bb.model.AdminBetSearch; +import com.bb.model.BetData; +import com.bb.model.BetDetail; +import com.bb.model.BetSearch; +import com.bb.model.BetSplusSearch; +import com.bb.model.Member; +import com.bb.model.RetailBetSearch; +import com.bb.model.RvHoldemVO; +import com.bb.model.TripleVO; +import com.bb.model.TrxSearchVO; + +public interface BetService { + + int getBetListCnt(BetSearch search); + List getBetList(BetSearch search); + int getFastBetIdListCnt(AdminBetSearch search); + List> getFastBetIdList(AdminBetSearch search); + HashMap getFastBetItem(HashMap item); + int getBetListNewCnt(AdminBetSearch search); + List getBetListNew(AdminBetSearch search); + int getPowerballResultListCnt(BetSearch search); + List getPowerballResultList(BetSearch search); + HashMap getGameRataMiniGame(@Valid BetData betData); + List getWaitBetlist(Map pParam); + void powerballEndProc(HashMap betInfo); + int getTripleTxnCheck(String tranId); + int getTripleDebitCheckByBetId(String betid); + int getTripleDebitCheckByTranId(String tranid); + int getTripleCreditCheckByBetId(String betid); + int getTripleCreditCheckByTranId(String tranid); + int getTripleIsCancelCheck(String betId); + int getTripleIsBonusCheck(String betid); + int insertTripleTxnData(TripleVO tripleVO); + int getUserBetListCnt(BetSearch search); + List getUserBetList(BetSearch search); + int getUserBetListNewCnt(BetSearch search); + List getUserBetListNew(BetSearch search); + int updateUserCashByAmount(HashMap memCashUpdParam); + int updateUserCashByBalance(HashMap memCashUpdParam); + int getBottomBetListCnt(RetailBetSearch search); + List getBottomBetList(RetailBetSearch search); + List getTripleBetWaitListByCasino(); + List getTripleBetWaitListBySlot(); + void updateEnd(HashMap mapParam); + void updateEndAutoLose(HashMap mapParam); + int betCancelTriple(HashMap param); + List getTripleBetWaitList2(); + List getBetPointList(); + List getBetPointListBySite(String siteId); + int getTrxListCnt(TrxSearchVO searchVO); + List> getTrxList(TrxSearchVO searchVO); + int getSportBetListCnt(BetSplusSearch search); + List getSportBetList(BetSplusSearch search); + int getSportEventListCnt(BetSplusSearch search); + List getSportEventList(BetSplusSearch search); + int getSportEventDetailListCnt(BetSplusSearch search); + List getSportEventDetailList(BetSplusSearch search); + int getSportBottomBetListCnt(BetSplusSearch search); + List getSportBottomBetList(BetSplusSearch search); + String getBetType(String betId); + HashMap getBetTodayTotalInfo(HashMap betItem); + int getCurBalance(Member memInfo); + HashMap getSiteVendorInfo(HashMap vParam); + int insertBetNew(HashMap betData); + HashMap getReferenceData1(String betId); + HashMap getReferenceData2(String betId); + int bonusBetNew(HashMap betData); + int updateUserCashByAmountNew(HashMap balanceParam); + int insertRvhCallbackLog(RvHoldemVO rvParam); +} diff --git a/src/main/java/com/bb/service/BetServiceImpl.java b/src/main/java/com/bb/service/BetServiceImpl.java new file mode 100644 index 0000000..eaf1b24 --- /dev/null +++ b/src/main/java/com/bb/service/BetServiceImpl.java @@ -0,0 +1,392 @@ +package com.bb.service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import jakarta.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.bb.dao.BetDao; +import com.bb.dao.BoardDao; +import com.bb.dao.CashDao; +import com.bb.dao.CommonDao; +import com.bb.model.AdminBetSearch; +import com.bb.model.BetData; +import com.bb.model.BetDetail; +import com.bb.model.BetSearch; +import com.bb.model.BetSplusSearch; +import com.bb.model.CashDetail; +import com.bb.model.Member; +import com.bb.model.RetailBetSearch; +import com.bb.model.RvHoldemVO; +import com.bb.model.TripleVO; +import com.bb.model.TrxSearchVO; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RequiredArgsConstructor +@Service +public class BetServiceImpl implements BetService { + + + private final BetDao betDao; + + private final CashDao cashDao; + + private final CommonDao commonDao; + + + @Override + public int getBetListCnt(BetSearch search) { + // TODO Auto-generated method stub + return betDao.getBetListCnt(search); + } + + @Override + public List getBetList(BetSearch search) { + // TODO Auto-generated method stub + return betDao.getBetList(search); + } + + @Override + public int getFastBetIdListCnt(AdminBetSearch search) { + // TODO Auto-generated method stub + return betDao.getFastBetIdListCnt(search); + } + + @Override + public List> getFastBetIdList(AdminBetSearch search) { + // TODO Auto-generated method stub + return betDao.getFastBetIdList(search); + } + + @Override + public HashMap getFastBetItem(HashMap item) { + // TODO Auto-generated method stub + return betDao.getFastBetItem(item); + } + + @Override + public int getBetListNewCnt(AdminBetSearch search) { + // TODO Auto-generated method stub + return betDao.getBetListNewCnt(search); + } + + @Override + public List getBetListNew(AdminBetSearch search) { + // TODO Auto-generated method stub + return betDao.getBetListNew(search); + } + + @Override + public int getPowerballResultListCnt(BetSearch search) { + // TODO Auto-generated method stub + return betDao.getPowerballResultListCnt(search); + } + + @Override + public List getPowerballResultList(BetSearch search) { + // TODO Auto-generated method stub + return betDao.getPowerballResultList(search); + } + + @Override + public HashMap getGameRataMiniGame(@Valid BetData betData) { + // TODO Auto-generated method stub + return betDao.getGameRataMiniGame(betData); + } + + @Override + public List getWaitBetlist(Map pParam) { + // TODO Auto-generated method stub + return betDao.getWaitBetlist(pParam); + } + + @Override + public void powerballEndProc(HashMap betInfo) { + // TODO Auto-generated method stub + + betDao.updateBetInfoMapByPowerball(betInfo); + betDao.updateBetInfoMapResultByPowerball(betInfo); + betDao.insertCashByPowerball(betInfo); + betDao.updateBetInfoByPowerball(betInfo); + betDao.insertPointByPowerball(betInfo); + betDao.updatePointRegYnByPowerball(betInfo); + + } + + @Override + public int getTripleTxnCheck(String tranId) { + // TODO Auto-generated method stub + return betDao.getTripleTxnCheck(tranId); + } + + @Override + public int getTripleDebitCheckByBetId(String betid) { + // TODO Auto-generated method stub + return betDao.getTripleDebitCheckByBetId(betid); + } + + @Override + public int getTripleDebitCheckByTranId(String tranid) { + // TODO Auto-generated method stub + return betDao.getTripleDebitCheckByTranId(tranid); + } + + @Override + public int getTripleCreditCheckByBetId(String betid) { + // TODO Auto-generated method stub + return betDao.getTripleCreditCheckByBetId(betid); + } + + @Override + public int getTripleCreditCheckByTranId(String tranid) { + // TODO Auto-generated method stub + return betDao.getTripleCreditCheckByTranId(tranid); + } + + @Override + public int getTripleIsCancelCheck(String betId) { + // TODO Auto-generated method stub + return betDao.getTripleIsCancelCheck(betId); + } + + @Override + public int getTripleIsBonusCheck(String betid) { + // TODO Auto-generated method stub + return betDao.getTripleIsBonusCheck(betid); + } + + @Override + public int insertTripleTxnData(TripleVO tripleVO) { + // TODO Auto-generated method stub + if(tripleVO.getDetail() != null) { + tripleVO.setDetailStr(tripleVO.getDetail().toString()); + } else { + tripleVO.setDetailStr("{}"); + } + + return betDao.insertTripleTxnData(tripleVO); + } + + @Override + public int getUserBetListCnt(BetSearch search) { + // TODO Auto-generated method stub + return betDao.getUserBetListCnt(search); + } + + @Override + public List getUserBetList(BetSearch search) { + // TODO Auto-generated method stub + return betDao.getUserBetList(search); + } + + @Override + public int getUserBetListNewCnt(BetSearch search) { + // TODO Auto-generated method stub + return betDao.getUserBetListNewCnt(search); + } + + @Override + public List getUserBetListNew(BetSearch search) { + // TODO Auto-generated method stub + return betDao.getUserBetListNew(search); + } + + @Override + public int updateUserCashByAmount(HashMap memCashUpdParam) { + // TODO Auto-generated method stub + return betDao.updateUserCashByAmount(memCashUpdParam); + } + + @Override + public int updateUserCashByBalance(HashMap memCashUpdParam) { + // TODO Auto-generated method stub + return betDao.updateUserCashByBalance(memCashUpdParam); + } + + @Override + public int getBottomBetListCnt(RetailBetSearch search) { + // TODO Auto-generated method stub + return betDao.getBottomBetListCnt(search); + } + + @Override + public List getBottomBetList(RetailBetSearch search) { + // TODO Auto-generated method stub + return betDao.getBottomBetList(search); + } + + @Override + public List getTripleBetWaitListByCasino() { + // TODO Auto-generated method stub + return betDao.getTripleBetWaitListByCasino(); + } + + @Override + public List getTripleBetWaitListBySlot() { + // TODO Auto-generated method stub + return betDao.getTripleBetWaitListBySlot(); + } + + @Override + public void updateEnd(HashMap mapParam) { + // TODO Auto-generated method stub + betDao.updateEnd(mapParam); + } + + @Override + public void updateEndAutoLose(HashMap mapParam) { + // TODO Auto-generated method stub + betDao.updateEndAutoLose(mapParam); + } + + @Override + public int betCancelTriple(HashMap param) { + // TODO Auto-generated method stub + return betDao.betCancelTriple(param); + } + + @Override + public List getTripleBetWaitList2() { + // TODO Auto-generated method stub + return betDao.getTripleBetWaitList2(); + } + + @Override + public List getBetPointList() { + // TODO Auto-generated method stub + return betDao.getBetPointList(); + } + + @Override + public List getBetPointListBySite(String siteId) { + // TODO Auto-generated method stub + return betDao.getBetPointListBySite(siteId); + } + + @Override + public int getTrxListCnt(TrxSearchVO searchVO) { + // TODO Auto-generated method stub + return betDao.getTrxListCnt(searchVO); + } + + @Override + public List> getTrxList(TrxSearchVO searchVO) { + // TODO Auto-generated method stub + return betDao.getTrxList(searchVO); + } + + @Override + public int getSportBetListCnt(BetSplusSearch search) { + // TODO Auto-generated method stub + return betDao.getSportBetListCnt(search); + } + + @Override + public List getSportBetList(BetSplusSearch search) { + // TODO Auto-generated method stub + return betDao.getSportBetList(search); + } + + @Override + public int getSportEventListCnt(BetSplusSearch search) { + // TODO Auto-generated method stub + return betDao.getSportEventListCnt(search); + } + + @Override + public List getSportEventList(BetSplusSearch search) { + // TODO Auto-generated method stub + return betDao.getSportEventList(search); + } + + @Override + public int getSportEventDetailListCnt(BetSplusSearch search) { + // TODO Auto-generated method stub + return betDao.getSportEventDetailListCnt(search); + } + + @Override + public List getSportEventDetailList(BetSplusSearch search) { + // TODO Auto-generated method stub + return betDao.getSportEventDetailList(search); + } + + @Override + public int getSportBottomBetListCnt(BetSplusSearch search) { + // TODO Auto-generated method stub + return betDao.getSportBottomBetListCnt(search); + } + + @Override + public List getSportBottomBetList(BetSplusSearch search) { + // TODO Auto-generated method stub + return betDao.getSportBottomBetList(search); + } + + @Override + public String getBetType(String betId) { + // TODO Auto-generated method stub + return betDao.getBetType(betId); + } + + @Override + public HashMap getBetTodayTotalInfo(HashMap betItem) { + // TODO Auto-generated method stub + return betDao.getBetTodayTotalInfo(betItem); + } + + @Override + public int getCurBalance(Member memInfo) { + // TODO Auto-generated method stub + return betDao.getCurBalance(memInfo); + } + + @Override + public HashMap getSiteVendorInfo(HashMap vParam) { + // TODO Auto-generated method stub + return betDao.getSiteVendorInfo(vParam); + } + + @Override + public int insertBetNew(HashMap betData) { + // TODO Auto-generated method stub + return betDao.insertBetNew(betData); + } + + @Override + public HashMap getReferenceData1(String betId) { + // TODO Auto-generated method stub + return betDao.getReferenceData1(betId); + } + + @Override + public HashMap getReferenceData2(String betId) { + // TODO Auto-generated method stub + return betDao.getReferenceData2(betId); + } + + @Override + public int bonusBetNew(HashMap betData) { + // TODO Auto-generated method stub + return betDao.bonusBetNew(betData); + } + + @Override + public int updateUserCashByAmountNew(HashMap balanceParam) { + // TODO Auto-generated method stub + return betDao.updateUserCashByAmountNew(balanceParam); + } + + @Override + public int insertRvhCallbackLog(RvHoldemVO rvParam) { + // TODO Auto-generated method stub + return betDao.insertRvhCallbackLog(rvParam); + } +} diff --git a/src/main/java/com/bb/service/BoardService.java b/src/main/java/com/bb/service/BoardService.java new file mode 100644 index 0000000..fe57575 --- /dev/null +++ b/src/main/java/com/bb/service/BoardService.java @@ -0,0 +1,83 @@ +package com.bb.service; + +import java.util.HashMap; +import java.util.List; + +import jakarta.validation.Valid; + +import com.bb.model.AnswerVo; +import com.bb.model.Board; +import com.bb.model.BoardListSearch; +import com.bb.model.Comment; +import com.bb.model.Message; +import com.bb.model.MessageListSearch; + +public interface BoardService { + + int getBoardListCnt(@Valid BoardListSearch search); + + List getBoardList(@Valid BoardListSearch search); + + List getBoardIdxList(@Valid BoardListSearch search); + + int saveBoard(@Valid Board board); + + int saveCmt(@Valid Comment comment); + + Board getBoard(@Valid Board board); + + Comment getComment(@Valid Comment comment); + + void viewAdd(Board boardetail); + + void adminRead(Board boardetail); + + void msgSend(@Valid Message message); + + void msgRead(@Valid Message message); + + void msgUpdate(@Valid Message message); + + int getMsgListCnt(@Valid MessageListSearch search); + + List getMsgList(@Valid MessageListSearch search); + + void allRead(@Valid Message message); + + void msgDel(@Valid Message message); + + List getAnswerList(AnswerVo search); + + int saveAnswer(AnswerVo answer); + + int updateAnswer(AnswerVo answer); + + int deleteAnswer(AnswerVo answer); + + List> getMainBoardList(BoardListSearch search); + + List> getMainBoardList2(BoardListSearch search); + + void msgDelList(@Valid Message message); + + int getUserMsgListCnt(@Valid MessageListSearch search); + + List getUserMsgList(@Valid MessageListSearch search); + + void userAnswerCmtRead(Board boardetail); + + void partnerMsgSend(@Valid Message message); + + Message getJoinMessage(String siteId); + + Board getSiteFlowBoard(BoardListSearch search); + + int deleteBoard(int boardIdx); + + void levelMsgSend(@Valid Message message); + + int setBoardViewYn(Board board); + + int deleteYBoard(int boardIdx); + +} diff --git a/src/main/java/com/bb/service/BoardServiceImpl.java b/src/main/java/com/bb/service/BoardServiceImpl.java new file mode 100644 index 0000000..0048e45 --- /dev/null +++ b/src/main/java/com/bb/service/BoardServiceImpl.java @@ -0,0 +1,294 @@ +package com.bb.service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.stereotype.Service; + +import com.bb.dao.BoardDao; +import com.bb.dao.UserDao; +import com.bb.model.AnswerVo; +import com.bb.model.Board; +import com.bb.model.BoardListSearch; +import com.bb.model.Comment; +import com.bb.model.Member; +import com.bb.model.Message; +import com.bb.model.MessageListSearch; + +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Service +public class BoardServiceImpl implements BoardService { + + private final BoardDao boardDao; + + private final UserDao userDao; + + @Override + public int getBoardListCnt(@Valid BoardListSearch search) { + // TODO Auto-generated method stub + return boardDao.getBoardListCnt(search); + } + + @Override + public List getBoardList(@Valid BoardListSearch search) { + // TODO Auto-generated method stub + + List boardList = boardDao.getBoardList(search); + for(Board board:boardList) { + Map param = new HashMap(); + param.put("cmtType", "B"); + param.put("boardIdx", board.getBoardIdx()); + param.put("siteId", board.getSiteId()); + + if("faq".equals(board.getBoardType()) || "bbs".equals(board.getBoardType())) { + List boardComments = boardDao.getCmtList(param); + board.setComment(boardDao.getCmtList(param)); + + if("faq".equals(board.getBoardType()) && boardComments.size() > 0) { + board.setStatus("ANSWER"); + } + + if("bbs".equals(board.getBoardType()) && boardComments.size() > 0) { + for( HashMap cmts:board.getComment()) { + Map cparam = new HashMap(); + cparam.put("cmtType", "C"); + cparam.put("boardIdx", (long)cmts.get("cmtIdx")); + cmts.put("comment" , boardDao.getCmtList(cparam)); + } + } + } + + Member search2 = new Member(); + search2.setMemId(board.getRegId().toString()); + search2.setSiteId(search.getSiteId()); + board.setTopUserList(userDao.getTopUserList2(search2)); + + } + + return boardList; + } + + @Override + public List getBoardIdxList(@Valid BoardListSearch search) { + // TODO Auto-generated method stub + return boardDao.getBoardIdxList(search); + } + + @Override + public int saveBoard(@Valid Board board) { + // TODO Auto-generated method stub + return boardDao.saveBoard(board); + } + + @Override + public int saveCmt(@Valid Comment comment) { + // TODO Auto-generated method stub + int cmtResult = boardDao.saveCmt(comment); + if(cmtResult > 0 && "B".equals(comment.getCmtType())) { + int boardIdx = comment.getBoardIdx(); + boardDao.updateFaqStatus(boardIdx); + } + + return cmtResult; + } + + @Override + public Board getBoard(@Valid Board board) { + // TODO Auto-generated method stub + + Board boardDetail = boardDao.getBoard(board); + + if("faq".equals(boardDetail.getBoardType()) || "bbs".equals(boardDetail.getBoardType())) { + Map param = new HashMap(); + param.put("cmtType", "B"); + param.put("boardIdx", boardDetail.getBoardIdx()); + param.put("siteId", boardDetail.getSiteId()); + + List boardComments = boardDao.getCmtList(param); + boardDetail.setComment(boardDao.getCmtList(param)); + + if("faq".equals(boardDetail.getBoardType()) && boardComments.size() > 0 ) { + boardDetail.setStatus("ANSWER"); + } + + if("bbs".equals(boardDetail.getBoardType()) && boardComments.size() > 0 ) { + for( HashMap cmts:boardDetail.getComment()) { + Map cparam = new HashMap(); + cparam.put("cmtType", "C"); + cparam.put("boardIdx", (long)cmts.get("cmtIdx")); + cparam.put("siteId", boardDetail.getSiteId()); + cmts.put("comment" , boardDao.getCmtList(cparam)); + } + } + } + + return boardDetail; + } + + @Override + public Comment getComment(@Valid Comment comment) { + // TODO Auto-generated method stub + return boardDao.getComment(comment); + } + + @Override + public void viewAdd(Board boardetail) { + boardDao.viewAdd(boardetail); + + } + + @Override + public void adminRead(Board boardetail) { + // TODO Auto-generated method stub + boardDao.adminRead(boardetail); + } + + @Override + public void msgSend(@Valid Message message) { + // TODO Auto-generated method stub + boardDao.msgSend(message); + } + + @Override + public void msgRead(@Valid Message message) { + // TODO Auto-generated method stub + boardDao.msgRead(message); + } + + @Override + public void msgUpdate(@Valid Message message) { + // TODO Auto-generated method stub + boardDao.msgUpdate(message); + } + + @Override + public int getMsgListCnt(@Valid MessageListSearch search) { + // TODO Auto-generated method stub + return boardDao.getMsgListCnt(search); + } + + @Override + public List getMsgList(@Valid MessageListSearch search) { + // TODO Auto-generated method stub + return boardDao.getMsgList(search); + } + + @Override + public void allRead(@Valid Message message) { + // TODO Auto-generated method stub + boardDao.allRead(message); + } + + @Override + public void msgDel(@Valid Message message) { + // TODO Auto-generated method stub + boardDao.msgDel(message); + } + + @Override + public List getAnswerList(AnswerVo search) { + // TODO Auto-generated method stub + return boardDao.getAnswerList(search); + } + + @Override + public int saveAnswer(AnswerVo answer) { + // TODO Auto-generated method stub + return boardDao.saveAnswer(answer); + } + + @Override + public int updateAnswer(AnswerVo answer) { + // TODO Auto-generated method stub + return boardDao.updateAnswer(answer); + } + + @Override + public int deleteAnswer(AnswerVo answer) { + // TODO Auto-generated method stub + return boardDao.deleteAnswer(answer); + } + + @Override + public List> getMainBoardList(BoardListSearch search) { + // TODO Auto-generated method stub + return boardDao.getMainBoardList(search); + } + + @Override + public List> getMainBoardList2(BoardListSearch search) { + // TODO Auto-generated method stub + return boardDao.getMainBoardList2(search); + } + + @Override + public void msgDelList(@Valid Message message) { + // TODO Auto-generated method stub + boardDao.msgDelList(message); + } + + @Override + public int getUserMsgListCnt(@Valid MessageListSearch search) { + // TODO Auto-generated method stub + return boardDao.getUserMsgListCnt(search); + } + + @Override + public List getUserMsgList(@Valid MessageListSearch search) { + // TODO Auto-generated method stub + return boardDao.getUserMsgList(search); + } + + @Override + public void userAnswerCmtRead(Board boardetail) { + // TODO Auto-generated method stub + boardDao.userAnswerCmtRead(boardetail); + } + + @Override + public void partnerMsgSend(@Valid Message message) { + // TODO Auto-generated method stub + boardDao.partnerMsgSend(message); + } + + @Override + public Message getJoinMessage(String siteId) { + // TODO Auto-generated method stub + return boardDao.getJoinMessage(siteId); + } + + @Override + public Board getSiteFlowBoard(BoardListSearch search) { + // TODO Auto-generated method stub + return boardDao.getSiteFlowBoard(search); + } + + @Override + public int deleteBoard(int boardIdx) { + // TODO Auto-generated method stub + return boardDao.deleteBoard(boardIdx); + } + + @Override + public void levelMsgSend(@Valid Message message) { + // TODO Auto-generated method stub + boardDao.levelMsgSend(message); + } + + @Override + public int setBoardViewYn(Board board) { + // TODO Auto-generated method stub + return boardDao.setBoardViewYn(board); + } + + @Override + public int deleteYBoard(int boardIdx) { + // TODO Auto-generated method stub + return boardDao.deleteYBoard(boardIdx); + } +} + diff --git a/src/main/java/com/bb/service/CashService.java b/src/main/java/com/bb/service/CashService.java new file mode 100644 index 0000000..2cb7dc0 --- /dev/null +++ b/src/main/java/com/bb/service/CashService.java @@ -0,0 +1,146 @@ +package com.bb.service; + + +import java.util.HashMap; +import java.util.List; + +import com.bb.model.AdminCashSearch; +import com.bb.model.CashDetail; +import com.bb.model.CashQueVO; +import com.bb.model.CashSearch; +import com.bb.model.CashStatus; +import com.bb.model.CashTranLogSrch; +import com.bb.model.CouponSearch; +import com.bb.model.CouponVO; +import com.bb.model.Member; +import com.bb.model.Point; +import com.bb.model.PointSearch; +import com.bb.model.RetailCashSearch; + +public interface CashService { + + long insertCash(CashDetail cash); + + void insertCashManToMan(CashDetail cash); + + int getCashListCnt(CashSearch search); + + List getCashList(CashSearch search); + + HashMap getCashListSum(CashSearch search); + + int updateStatus(String LOG_PREFIX, CashStatus status); + + int getCashIOListCnt(CashSearch search); + + List getCashIOList(CashSearch search); + + HashMap getCashTotalListCnt(CashSearch search); + + List getCashTotalList(CashSearch search); + + int getPointListCnt(PointSearch search); + + List getPointList(PointSearch search); + + HashMap getPointSumInfo(PointSearch search); + + int getPointListNewCnt(PointSearch search); + + List getPointListNew(PointSearch search); + + List getPointSum(PointSearch search); + + HashMap getAccBankInfo(Member search); + + long pointInsert(Point point); + + void delCash(CashSearch search); + + void updateUserGameMoney(HashMap cashParam); + + String getCreditCheck(String siteId); + + int getCashSendListCnt(CashSearch search); + + List> getCashSendList(CashSearch search); + + int getAdminCashPointIOListCnt(AdminCashSearch search); + + List getAdminCashPointIOList(AdminCashSearch search); + + HashMap getAdminCashPointIOListSum(AdminCashSearch search); + + int cashTransLogCnt(CashTranLogSrch search); + + List cashTransLogList(CashTranLogSrch search); + + int cashTransLogCnt2(CashTranLogSrch search); + + List cashTransLogList2(CashTranLogSrch search); + + HashMap getCashInfo(CashStatus status); + + List> getMainCashList(CashSearch param); + + long getMemCash(CashDetail cash); + + int getCashInCnt(Member search); + + int getCashOutCnt(Member search); + + long insertCashTopUser(CashDetail paramCash); + + long insertCashBotUser(CashDetail paramCashBot); + + int getUserBalance(Member search); + + int insertBetPoint(String LOG_PREFIX, HashMap mapParam); + + int getBottomCashListCnt(RetailCashSearch search); + + List getBottomCashList(RetailCashSearch search); + + int getBottomCashListCnt2(RetailCashSearch search); + + List getBottomCashList2(RetailCashSearch search); + + HashMap getCashListCalculate(CashSearch search); + + Integer getFirstDailyCnt(HashMap pointParam); + + int getCashWaitTimeCheck(CashDetail paramCash); + + List getCashQueList(); + + long getBalance(CashQueVO item); + + int updateQueStatus(HashMap param); + + long cashInsertByCoupon(CashDetail cash); + + int couponCreate(CouponVO couponVO); + + int updateCouponItem(CouponVO couponVO); + + int checkCouponNumber(String couponNumber); + + CouponVO getCouponItem(String couponNumber); + + int getCouponListCnt(CouponSearch search); + + List> getCouponList(CouponSearch search); + + int getMyCouponListCnt(CouponSearch search); + + List> getMyCouponList(CouponSearch search); + + List> getUserRollingCalculate(CashSearch search); + + int insertCashBonus(HashMap data); + + HashMap getCashBonusInfo(long cashIdx); + + int updateCashBonus(HashMap data); + +} diff --git a/src/main/java/com/bb/service/CashServiceImpl.java b/src/main/java/com/bb/service/CashServiceImpl.java new file mode 100644 index 0000000..8d4d85e --- /dev/null +++ b/src/main/java/com/bb/service/CashServiceImpl.java @@ -0,0 +1,656 @@ +package com.bb.service; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.stereotype.Service; + +import com.bb.dao.CashDao; +import com.bb.dao.UserDao; +import com.bb.model.AdminCashSearch; +import com.bb.model.CashDetail; +import com.bb.model.CashQueVO; +import com.bb.model.CashSearch; +import com.bb.model.CashStatus; +import com.bb.model.CashTranLogSrch; +import com.bb.model.CouponSearch; +import com.bb.model.CouponVO; +import com.bb.model.Member; +import com.bb.model.Point; +import com.bb.model.PointSearch; +import com.bb.model.RetailCashSearch; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RequiredArgsConstructor +@Service +public class CashServiceImpl implements CashService { + + private final CashDao cashDao; + + private final UserDao userDao; + + @Override + public synchronized long insertCash(CashDetail cash) { + // TODO Auto-generated method stub + long cashidx = 0; + int cnt = cashDao.getCashinfoCnt(cash); + if(cnt == 0) { + cashDao.insertCash(cash); + cashidx = cash.getCashIdx(); + } else { + log.info("[##USER_CASH_INSERT##("+cash.getSiteId()+", "+cash.getMemId()+")] cnt: " + cnt); + } + return cashidx; + } + + @Override + public synchronized long insertCashTopUser(CashDetail paramCash) { + long cashAmt = cashDao.getMemCash(paramCash); + paramCash.setPreCashAmt(""+cashAmt); + + long cashidx = 0; + int cnt = cashDao.getCashinfoCnt(paramCash); + int cntRetail = cashDao.getCashinfoRetailCnt(paramCash); + if(cnt == 0 && cntRetail == 0) { + cashDao.insertCash(paramCash); + cashidx = paramCash.getCashIdx(); + if(paramCash.getCashStatus().equals("1")) { + cashDao.updateMyCash(paramCash); + } + } + + return cashidx; + } + + @Override + public synchronized long insertCashBotUser(CashDetail paramCashBot) { + long cashAmt = cashDao.getMemCash(paramCashBot); + paramCashBot.setPreCashAmt(""+cashAmt); + + long cashidx = 0; + int cnt = cashDao.getCashinfoCnt(paramCashBot); + int cntRetail = cashDao.getCashinfoRetailCnt(paramCashBot); + if(cnt == 0 && cntRetail == 0) { + cashDao.insertCash(paramCashBot); + cashidx = paramCashBot.getCashIdx(); + if(paramCashBot.getCashStatus().equals("1")) { + cashDao.updateMyCash(paramCashBot); + } + } + + return cashidx; + } + + @Override + public int getCashListCnt(CashSearch search) { + // TODO Auto-generated method stub + return cashDao.getCashListCnt(search); + } + + @Override + public List getCashList(CashSearch search) { + // TODO Auto-generated method stub + + List cashList = cashDao.getCashList(search); + + for(CashDetail cashDetail : cashList) { + Member search2 = new Member(); + search2.setSiteId(search.getSiteId()); + search2.setMemId(cashDetail.getMemId().toString()); + cashDetail.setTopUserList(userDao.getTopUserList2(search2)); + } + + return cashList; + } + + @Override + public HashMap getCashListSum(CashSearch search) { + // TODO Auto-generated method stub + return cashDao.getCashListSum(search); + } + + @Override + public synchronized int updateStatus(String LOG_PREFIX, CashStatus status) { + // TODO Auto-generated method stub + int result = 0; + HashMap bfCashinfo = cashDao.getCashInfo(status); + if(bfCashinfo.get("cashStatus").toString().equals(status.getCashStatus())) { + log.error(LOG_PREFIX+ "CashStatus 상태 이전과 이후가 동일합니다."); + result = -1; + } else { + int updResult = cashDao.updateStatus(status); + log.info(LOG_PREFIX+ "updateStatus result::" + updResult); + + HashMap afCashinfo = cashDao.getCashInfo(status); + log.info(LOG_PREFIX+ "After Cashinfo" + afCashinfo); + if("1".equals(afCashinfo.get("cashType").toString()) && "1".equals(afCashinfo.get("cashStatus").toString())) { + // 입금 + Map param = new HashMap(); + param.put("siteId", afCashinfo.get("siteId").toString()); + param.put("memId", afCashinfo.get("memId").toString()); + param.put("amt", afCashinfo.get("cashAmt").toString()); + updResult = cashDao.updateCiAmt(param); + log.info(LOG_PREFIX+ "updateCiAmt result" + updResult); + } + if("-1".equals(afCashinfo.get("cashType").toString()) && "1".equals(afCashinfo.get("cashStatus").toString())) { + // 출금 + Map param = new HashMap(); + param.put("siteId", afCashinfo.get("siteId").toString()); + param.put("memId", afCashinfo.get("memId").toString()); + param.put("amt", afCashinfo.get("cashAmt").toString().replaceAll("-", "")); + updResult = cashDao.updateCoAmt(param); + log.info(LOG_PREFIX+ "updateCoAmt result::" + updResult); + } + result = 0; + } + + return result; + } + + @Override + public int getCashIOListCnt(CashSearch search) { + return cashDao.getCashIOListCnt(search); + } + + @Override + public List getCashIOList(CashSearch search) { + return cashDao.getCashIOList(search); + } + + @Override + public HashMap getCashTotalListCnt(CashSearch search) { + // TODO Auto-generated method stub + return cashDao.getCashTotalListCnt(search); + } + + @Override + public List getCashTotalList(CashSearch search) { + // TODO Auto-generated method stub + return cashDao.getCashTotalList(search); + } + + @Override + public int getPointListCnt(PointSearch search) { + // TODO Auto-generated method stub + return cashDao.getPointListCnt(search); + } + + @Override + public List getPointList(PointSearch search) { + // TODO Auto-generated method stub + return cashDao.getPointList(search); + } + + @Override + public HashMap getPointSumInfo(PointSearch search) { + // TODO Auto-generated method stub + return cashDao.getPointSumInfo(search); + } + + @Override + public int getPointListNewCnt(PointSearch search) { + // TODO Auto-generated method stub + return cashDao.getPointListNewCnt(search); + } + + @Override + public List getPointListNew(PointSearch search) { + // TODO Auto-generated method stub + return cashDao.getPointListNew(search); + } + + @Override + public List getPointSum(PointSearch search) { + // TODO Auto-generated method stub + return cashDao.getPointSum(search); + } + + @Override + public HashMap getAccBankInfo(Member search) { + // TODO Auto-generated method stub + return cashDao.getAccBankInfo(search); + } + + @Override + public synchronized long pointInsert(Point point) { + // TODO Auto-generated method stub +// return cashDao.pointInsert(point); + + long pointidx = 0; + int cnt = 0; + if(point.getPointType().equals("-4") || point.getPointType().equals("-44") || point.getPointType().equals("-2") || point.getPointType().equals("2")) { + cnt = cashDao.getPointinfoCnt(point); + log.info("[##USER_CHG_POINT##("+point.getSiteId()+", "+point.getMemId()+")] cnt: " + cnt); + } + + if(cnt == 0) { + log.info("[##USER_CHG_POINT##("+point.getSiteId()+", "+point.getMemId()+")] pointInsert start"); + cashDao.pointInsert(point); + log.info("[##USER_CHG_POINT##("+point.getSiteId()+", "+point.getMemId()+")] pointInsert end"); + pointidx = point.getPointIdx(); + log.info("[##USER_CHG_POINT##("+point.getSiteId()+", "+point.getMemId()+")] pointidx:" + pointidx); + } + return pointidx; + } + + @Override + public void delCash(CashSearch search) { + // TODO Auto-generated method stub + cashDao.delCash(search); + } + + @Override + public void updateUserGameMoney(HashMap cashParam) { + // TODO Auto-generated method stub + cashDao.updateUserGameMoney(cashParam); + } + + @Override + public String getCreditCheck(String siteId) { + // TODO Auto-generated method stub + return cashDao.getCreditCheck(siteId); + } + + @Override + public int getCashSendListCnt(CashSearch search) { + // TODO Auto-generated method stub + return cashDao.getCashSendListCnt(search); + + } + + @Override + public List> getCashSendList(CashSearch search) { + // TODO Auto-generated method stub + + List> memList = cashDao.getCashSendList(search); + for(HashMap mvo:memList) { + Member searchTop = new Member(); + searchTop.setSiteId(search.getSiteId()); + searchTop.setMemId(mvo.get("topMemId").toString()); + mvo.put("topMemTopUserList", userDao.getTopUserList2(searchTop)); + + Member searchBot = new Member(); + searchBot.setSiteId(search.getSiteId()); + searchBot.setMemId(mvo.get("botMemId").toString()); + mvo.put("botMemTopUserList", userDao.getTopUserList2(searchBot)); + } + + return memList; + } + + @Override + public int getAdminCashPointIOListCnt(AdminCashSearch search) { + // TODO Auto-generated method stub + if("cash".equals(search.getSearchType())) { + return cashDao.getAdminCashIOListCnt(search); + } else { + return cashDao.getAdminPointIOListCnt(search); + } + + } + + @Override + public List getAdminCashPointIOList(AdminCashSearch search) { + // TODO Auto-generated method stub + List memList = null; + if("cash".equals(search.getSearchType())) { + memList = cashDao.getAdminCashIOList(search); + } else { + memList = cashDao.getAdminPointIOList(search); + } + + for(HashMap mvo : memList) { + Member search2 = new Member(); + search2.setSiteId(search.getSiteId()); + search2.setMemId(mvo.get("memId").toString()); + mvo.put("topUserList", userDao.getTopUserList2(search2)); + } + + return memList; + } + + @Override + public HashMap getAdminCashPointIOListSum(AdminCashSearch search) { + // TODO Auto-generated method stub + if("cash".equals(search.getSearchType())) { + return cashDao.getAdminCashIOListSum(search); + } else { + return cashDao.getAdminPointIOListSum(search); + } + } + + @Override + public int cashTransLogCnt(CashTranLogSrch search) { + // TODO Auto-generated method stub + return cashDao.cashTransLogCnt(search); + } + + @Override + public List cashTransLogList(CashTranLogSrch search) { + // TODO Auto-generated method stub + return cashDao.cashTransLogList(search); + } + + @Override + public int cashTransLogCnt2(CashTranLogSrch search) { + // TODO Auto-generated method stub + return cashDao.cashTransLogCnt2(search); + } + + @Override + public List cashTransLogList2(CashTranLogSrch search) { + // TODO Auto-generated method stub + return cashDao.cashTransLogList2(search); + } + + @Override + public HashMap getCashInfo(CashStatus status) { + // TODO Auto-generated method stub + return cashDao.getCashInfo(status); + } + + @Override + public List> getMainCashList(CashSearch param) { + // TODO Auto-generated method stub + return cashDao.getMainCashList(param); + } + + @Override + public long getMemCash(CashDetail cash) { + // TODO Auto-generated method stub + return cashDao.getMemCash(cash); + } + + @Override + public int getCashInCnt(Member search) { + // TODO Auto-generated method stub + return cashDao.getCashInCnt(search); + } + + @Override + public int getCashOutCnt(Member search) { + // TODO Auto-generated method stub + return cashDao.getCashOutCnt(search); + } + + @Override + public void insertCashManToMan(CashDetail cash) { + // TODO Auto-generated method stub + long cashAmt = cashDao.getMemCash(cash); + cash.setPreCashAmt(""+cashAmt); + // 하위 유저 mem_cash 값은 DB 트리거를 통해 자동 반영 + cashDao.insertCash(cash); + // 내 mem_cash 테이블 값 반영은 직접 update 해준다. +// cashDao.updateMyCash(cash); + } + + @Override + public int getUserBalance(Member search) { + // TODO Auto-generated method stub + return cashDao.getUserBalance(search); + } + + @Override + public int insertBetPoint(String LOG_PREFIX, HashMap mapParam) { + // TODO Auto-generated method stub + return cashDao.insertBetPoint(LOG_PREFIX, mapParam); + } + + + @Override + public int getBottomCashListCnt(RetailCashSearch search) { + // TODO Auto-generated method stub + return cashDao.getBottomCashListCnt(search); + } + + @Override + public List getBottomCashList(RetailCashSearch search) { + + List cashList = cashDao.getBottomCashList(search); + + for(HashMap cashDetail : cashList) { + Member search2 = new Member(); + search2.setSiteId(search.getSiteId()); + search2.setMemId(cashDetail.get("memId").toString()); + cashDetail.put("topUserList", userDao.getTopUserList2(search2)); + } + + return cashList; + } + + @Override + public int getBottomCashListCnt2(RetailCashSearch search) { + // TODO Auto-generated method stub + return cashDao.getBottomCashListCnt2(search); + } + + @Override + public List getBottomCashList2(RetailCashSearch search) { + + List cashList = cashDao.getBottomCashList2(search); + + for(HashMap cashDetail : cashList) { + Member search2 = new Member(); + search2.setSiteId(search.getSiteId()); + search2.setMemId(cashDetail.get("memId").toString()); + cashDetail.put("topUserList", userDao.getTopUserList2(search2)); + } + + return cashList; + } + + @Override + public HashMap getCashListCalculate(CashSearch search) { + // TODO Auto-generated method stub + HashMap calculate = new HashMap<>(); + String cashType = ""; + Long cashInAmt = 0L; + String lastCashInDate = ""; + String bonusPointYn = "N"; + Long betSumAmt = 0L; + long rate = 0L; + + HashMap lastCasnIn = cashDao.getLastCashIn(search); + if(lastCasnIn == null) { + calculate.put("cashType", cashType); + calculate.put("cashInAmt", cashInAmt); + calculate.put("lastCashInDate", lastCashInDate); + calculate.put("bonusPointYn", bonusPointYn); + calculate.put("betSumAmt", betSumAmt); + calculate.put("rate", rate); + } else { + cashType = lastCasnIn.get("cashType").toString(); + cashInAmt = Long.parseLong(lastCasnIn.get("cashAmt").toString()); + lastCashInDate = lastCasnIn.get("updDate").toString(); + + HashMap bonusPoint = cashDao.getLastCashInToBonusPoint(lastCasnIn); + if(bonusPoint != null) { + int bonusPointCnt = Integer.parseInt(bonusPoint.get("bonusPointCnt").toString()); + if(bonusPointCnt > 0) { + bonusPointYn = "Y"; + } + } + + HashMap betSum = cashDao.getLastCashInToBetSum(lastCasnIn); + if(betSum != null) { + betSumAmt = Long.parseLong(betSum.get("betAmt").toString()); + } + + double rateD = 0.0; + if(cashInAmt == 0 || cashType.equals("-1")) { + rateD = 0.00; + } else { + rateD = ((double)betSumAmt / (double)cashInAmt) * 100.00; + } + + rate = (long) rateD; + calculate.put("cashType", cashType); + calculate.put("cashInAmt", cashInAmt); + calculate.put("lastCashInDate", lastCashInDate); + calculate.put("bonusPointYn", bonusPointYn); + calculate.put("betSumAmt", betSumAmt); + calculate.put("rate", rate); + } + + return calculate; + } + + @Override + public Integer getFirstDailyCnt(HashMap pointParam) { + // TODO Auto-generated method stub + return cashDao.getFirstDailyCnt(pointParam); + } + + @Override + public int getCashWaitTimeCheck(CashDetail paramCash) { + // TODO Auto-generated method stub + return cashDao.getCashWaitTimeCheck(paramCash); + } + + @Override + public List getCashQueList() { + // TODO Auto-generated method stub + return cashDao.getCashQueList(); + } + + @Override + public long getBalance(CashQueVO item) { + // TODO Auto-generated method stub + return cashDao.getBalance(item); + } + + @Override + public int updateQueStatus(HashMap param) { + // TODO Auto-generated method stub + return cashDao.updateQueStatus(param); + } + + @Override + public long cashInsertByCoupon(CashDetail cash) { + // TODO Auto-generated method stub + return cashDao.cashInsertByCoupon(cash); + } + + @Override + public int couponCreate(CouponVO couponVO) { + // TODO Auto-generated method stub + return cashDao.couponCreate(couponVO); + } + + @Override + public int updateCouponItem(CouponVO couponVO) { + // TODO Auto-generated method stub + return cashDao.updateCouponItem(couponVO); + } + + @Override + public int checkCouponNumber(String couponNumber) { + // TODO Auto-generated method stub + return cashDao.checkCouponNumber(couponNumber); + } + + @Override + public CouponVO getCouponItem(String couponNumber) { + // TODO Auto-generated method stub + return cashDao.getCouponItem(couponNumber); + } + + @Override + public int getCouponListCnt(CouponSearch search) { + // TODO Auto-generated method stub + return cashDao.getCouponListCnt(search); + } + + @Override + public List> getCouponList(CouponSearch search) { + // TODO Auto-generated method stub + return cashDao.getCouponList(search); + } + + @Override + public int getMyCouponListCnt(CouponSearch search) { + // TODO Auto-generated method stub + return cashDao.getMyCouponListCnt(search); + } + + @Override + public List> getMyCouponList(CouponSearch search) { + // TODO Auto-generated method stub + return cashDao.getMyCouponList(search); + } + + @Override + public List> getUserRollingCalculate(CashSearch search) { + List> list = new ArrayList<>(); + + HashMap lastCasnIn = cashDao.getLastCashInBy24H(search); + if(lastCasnIn == null || "-1".equals(lastCasnIn.get("cashType").toString())) { + HashMap item = new HashMap<>(); + item.put("category", "casino"); + item.put("betSumAmt", "0"); + item.put("rate", "0.0"); + list.add(item); + item = new HashMap<>(); + item.put("category", "slot"); + item.put("betSumAmt", "0"); + item.put("rate", "0.0"); + list.add(item); + item = new HashMap<>(); + item.put("category", "minigame"); + item.put("betSumAmt", "0"); + item.put("rate", "0.0"); + list.add(item); + item = new HashMap<>(); + item.put("category", "sport"); + item.put("betSumAmt", "0"); + item.put("rate", "0.0"); + list.add(item); + } else { + BigDecimal cashInAmt = new BigDecimal(lastCasnIn.get("cashAmt").toString()); + String lastCashInDate = lastCasnIn.get("updDate").toString(); + + List> betSumlist = cashDao.getLastCashInToBetSumBy24H(lastCasnIn); + for(HashMap item : betSumlist) { + BigDecimal betSumAmt = new BigDecimal(item.get("betSumAmt").toString()); + + double rateD = 0.0; + if(cashInAmt.longValue() != 0L) { + BigDecimal result = betSumAmt.divide(cashInAmt, 2, RoundingMode.HALF_UP); + BigDecimal p100 = new BigDecimal("100.00"); + BigDecimal rateB = result.multiply(p100); + rateD = rateB.doubleValue(); + } + item.put("rate", Double.toString(rateD)); + list.add(item); + } + } + + return list; + } + + @Override + public int insertCashBonus(HashMap data) { + // TODO Auto-generated method stub + return cashDao.insertCashBonus(data); + } + + @Override + public HashMap getCashBonusInfo(long cashIdx) { + // TODO Auto-generated method stub + return cashDao.getCashBonusInfo(cashIdx); + } + + @Override + public int updateCashBonus(HashMap data) { + // TODO Auto-generated method stub + return cashDao.updateCashBonus(data); + } + +} diff --git a/src/main/java/com/bb/service/CommonService.java b/src/main/java/com/bb/service/CommonService.java new file mode 100644 index 0000000..716fc17 --- /dev/null +++ b/src/main/java/com/bb/service/CommonService.java @@ -0,0 +1,241 @@ +package com.bb.service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.bb.model.Admin; +import com.bb.model.AdminIp; +import com.bb.model.AdminLogSearch; +import com.bb.model.AdminSearch; +import com.bb.model.Bank; +import com.bb.model.Banner; +import com.bb.model.Block; +import com.bb.model.BlockSearch; +import com.bb.model.ChargingPointSettingVO; +import com.bb.model.Code; +import com.bb.model.CodeSearch; +import com.bb.model.CronServerInfo; +import com.bb.model.DomainPartnerVO; +import com.bb.model.GameCodeSearchVO; +import com.bb.model.GameCodeVO; +import com.bb.model.GameSetting; +import com.bb.model.GameSettingItem; +import com.bb.model.LevelBank; +import com.bb.model.LevelBetLimit; +import com.bb.model.LevelDomain; +import com.bb.model.LevelFailPoint; +import com.bb.model.LevelOutPwd; +import com.bb.model.Member; +import com.bb.model.MenuVO; +import com.bb.model.NotiBgmVo; +import com.bb.model.SiteCashBonusSettingVO; +import com.bb.model.SiteCheckReq; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; + +import jakarta.validation.Valid; + + + + +public interface CommonService { + + List getCodeList(CodeSearch codesSearch); + + HashMap getCode(CodeSearch codesSearch); + + void batchReport(); + + void batchAutoLevelUp(); + + void batchReportYday1(); + + void batchReportYday2(); + + HashMap getSiteOption(String siteId); + + void insertlog(Map logParam); + + List getlastLoginToken(); + + void updatelog(Map logParam); + + int optionSave(SiteOption option); + + SiteOption getSiteSetting(SiteSearch search); + + HashMap getSiteAccoucnt(SiteSearch search); + + void bankSave(Bank bank); + + List getAdminBankList(SiteSearch search); + + List getBankList(SiteSearch search); + + void bannerSave(Banner banner); + + List getBannerList(SiteSearch search); + + void insertCode(@Valid Code code); + + List getLbList(SiteSearch search); + + void accountSave(LevelBank levelBank); + + List getLbetLimitList(SiteSearch search); + + void setLbetLimitList(LevelBetLimit betLimit); + + List getFailPointList(SiteSearch search); + + void failPointSave(LevelFailPoint failPoint); + + List getDomainList(SiteSearch search); + + void domainSave(LevelDomain domain); + + List getOutPwdList(SiteSearch search); + + void outPwdSave(LevelOutPwd outPwd); + + int getAdminLogListCnt(@Valid AdminLogSearch search); + + List getAdminLogList(@Valid AdminLogSearch search); + + void insertAdminlog(Map logParam); + + int getSiteBlockListCnt(@Valid BlockSearch search); + + List getSiteBlockList(@Valid BlockSearch search); + + void blockSave(@Valid Block block); + + + int getSiteAdminListCnt(@Valid AdminSearch search); + + List getSiteAdminList(@Valid AdminSearch search); + + void adminSave(Admin admin); + + void adminDelete(Admin admin); + + int getSiteAdminIpListCnt(@Valid AdminSearch search); + + List getSiteAdminIpList(@Valid AdminSearch search); + + void adminIpSave(AdminIp adminIp); + + void adminIpDelete(AdminIp adminIp); + + void updateIpInfo(Map ipParam); + + List getLoginSite(); + + int gameSettingSave(List settingList); + + List gameSettingList(GameSetting searchSetting); + + int siteCheckSave(SiteCheckReq param); + + List isSiteCheck(); + + void changeSiteCheckOff(SiteCheckReq param); + + void changeSiteSettingCheckYn(SiteCheckReq param); + + List siteCheckList(SiteCheckReq param); + + HashMap siteCheckDetail(SiteCheckReq param); + + HashMap siteCheckInfo(SiteCheckReq param); + + List> getGameCodeTabList(GameCodeSearchVO searchVO); + + List> getGameCodeColList(GameCodeSearchVO searchVO); + + List> getGameCodeList(GameCodeSearchVO searchVO); + + int gameCodeRegist(GameCodeVO gameCodeVO); + + int gameCodeUpdate(GameCodeVO gameCodeVO); + + List getPopupList(SiteSearch search); + + List getBannerInfoList(SiteSearch search); + + List getLoginPopupList(SiteSearch paramSite); + + List getGameCodes(CodeSearch codesSearch); + + List getGameGroupCodes(String siteId); + + String getApiVendor(CodeSearch codeSearch); + + List getMenuList(HashMap param); + + List getVendorList(); + + List getGameCodesForSuper(CodeSearch codesSearch); + + List getGameGroupCodesForSuper(String siteId); + + CronServerInfo getServerCronStatus(CronServerInfo cronStatus); + + List> getDomainPartnerList(DomainPartnerVO domainPartnerVO); + + int domainPartnerSave(DomainPartnerVO domainPartnerVO); + + int domainPartnerDelete(DomainPartnerVO domainPartnerVO); + + String getJoinRecommanderId(SiteSearch paramSite); + + HashMap getSessionTransactionIsolation(); + + List getChargingPointSettingList(int siteIdx); + + ChargingPointSettingVO getChargingPointSetting(ChargingPointSettingVO param); + + int setChargingPointSettingSave(ChargingPointSettingVO settingVO); + + String getJackpot(HashMap param); + + HashMap getCodeBySite(CodeSearch codeSrch); + + int getSiteLogoutTimeLimit(String siteId); + + List getRateCategory(String siteId); + + HashMap getUserInfoByToken(String token); + + HashMap getAdminInfoByToken(String token); + + List getMenuBookmarkList(HashMap param); + + int updateBookmarkMenu(MenuVO param); + + HashMap getSiteMemo(String siteId); + + int updateSiteMemo(HashMap param); + + int getSiteCheckCount(SiteCheckReq siteCheckReq); + + void updateMemLogin(Map logParam); + + void updateDayCashInDate(HashMap dailyParam); + + void updateAcctionLog(Map logParam); + + HashMap getVassApiInfo(Member search); + + List getNotiBgmList(SiteSearch search); + + int setNotiBgmSave(NotiBgmVo notiBgmVo); + + List getSiteCashBonusSettingList(Integer siteIdx); + + int setSiteCashBonusSettingSave(SiteCashBonusSettingVO settingVO); + + int bankDelete(Bank bank); + +} diff --git a/src/main/java/com/bb/service/CommonServiceImpl.java b/src/main/java/com/bb/service/CommonServiceImpl.java new file mode 100644 index 0000000..c0796ca --- /dev/null +++ b/src/main/java/com/bb/service/CommonServiceImpl.java @@ -0,0 +1,918 @@ +package com.bb.service; + +import java.net.InetAddress; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import com.bb.dao.CommonDao; +import com.bb.model.Admin; +import com.bb.model.AdminIp; +import com.bb.model.AdminLogSearch; +import com.bb.model.AdminSearch; +import com.bb.model.Bank; +import com.bb.model.Banner; +import com.bb.model.Block; +import com.bb.model.BlockSearch; +import com.bb.model.ChargingPointSettingVO; +import com.bb.model.Code; +import com.bb.model.CodeSearch; +import com.bb.model.CronServerInfo; +import com.bb.model.DomainPartnerVO; +import com.bb.model.GameCodeSearchVO; +import com.bb.model.GameCodeVO; +import com.bb.model.GameSetting; +import com.bb.model.GameSettingItem; +import com.bb.model.LevelBank; +import com.bb.model.LevelBetLimit; +import com.bb.model.LevelDomain; +import com.bb.model.LevelFailPoint; +import com.bb.model.LevelOutPwd; +import com.bb.model.Member; +import com.bb.model.MenuVO; +import com.bb.model.NotiBgmVo; +import com.bb.model.SiteCashBonusSettingVO; +import com.bb.model.SiteCheckReq; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; + +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RequiredArgsConstructor +@Service +@EnableScheduling +public class CommonServiceImpl implements CommonService { + + + private final CommonDao commonDao; + + @Override + public List getCodeList(CodeSearch codesSearch) { + + return commonDao.getCodeList(codesSearch); + } + + + + @Override + public HashMap getCode(CodeSearch codesSearch) { + // TODO Auto-generated method stub + return commonDao.getCode(codesSearch); + } + + @Override + @Scheduled(fixedDelay = 300000L) + public void batchReport() { + try { + CronServerInfo cronStatus = new CronServerInfo(); + cronStatus.setHostName(InetAddress.getLocalHost().getHostName()); + cronStatus.setIpAddress(InetAddress.getLocalHost().getHostAddress()); + cronStatus.setCronType("DAY"); + log.info("##- [OMS BATCH_REALTIME_REPORT STATUS] This HostName: " + InetAddress.getLocalHost().getHostName() + ", This HostAddress: " + InetAddress.getLocalHost().getHostAddress()); + log.info("##- [OMS BATCH_REALTIME_REPORT STATUS] HostName: " + cronStatus.getHostName() + ", HostAddress: " + cronStatus.getIpAddress()); + cronStatus = commonDao.getServerCronStatus(cronStatus); + log.info("##- [OMS BATCH_REALTIME_REPORT STATUS] cronStatus: " + cronStatus); + + if(cronStatus != null && cronStatus.getRunYn().equals("Y")) { + int dupDayCheck = commonDao.getDupRepotCheck(); + log.info("##-[BATCH_REALTIME_REPORT]-## Daily Scheduled Report dupDayCheck: " + dupDayCheck); + + if(dupDayCheck > 0 ) { + log.info("##-[BATCH_REALTIME_REPORT]-## Daily Scheduled getDailyList(UPDATE) Start"); + List dailyList = commonDao.getDailyList("UPDATE"); + log.info("##-[BATCH_REALTIME_REPORT]-## Daily Scheduled getDailyList(UPDATE) End, Size: " + dailyList.size()); + + log.info("##-[BATCH_REALTIME_REPORT]-## Daily Scheduled Report Update Start"); + for(HashMap report : dailyList) { +// log.info("##-[BATCH_REALTIME_REPORT]-## UPDATE report : " + report.toString()); + int result = commonDao.updateReport(report); +// log.info("##-[BATCH_REALTIME_REPORT]-## UPDATE result["+report.get("days").toString()+":"+report.get("siteId").toString()+":"+report.get("memId").toString()+"] : " + result); + } + int result = commonDao.updateReport2(); + log.info("##-[BATCH_REALTIME_REPORT]-## Daily Scheduled updateReport2, Size: " + result); + log.info("##-[BATCH_REALTIME_REPORT]-## Daily Scheduled Report Update End"); + } else { + log.info("##-[BATCH_REALTIME_REPORT]-## Daily Scheduled getDailyList(INSERT) Start"); + int result1 = commonDao.insertReport2(); + log.info("##-[BATCH_REALTIME_REPORT]-## Daily Scheduled getDailyList(INSERT) End, result1: " + result1); + + log.info("##-[BATCH_REALTIME_REPORT]-## Daily Scheduled getDailyList(UPDATE) Start"); + List dailyList = commonDao.getDailyList("UPDATE"); + log.info("##-[BATCH_REALTIME_REPORT]-## Daily Scheduled getDailyList(UPDATE) End, Size: " + dailyList.size()); + + log.info("##-[BATCH_REALTIME_REPORT]-## Daily Scheduled Report Update Start"); + for(HashMap report : dailyList) { +// log.info("##-[BATCH_REALTIME_REPORT]-## UPDATE report : " + report.toString()); + int result2 = commonDao.updateReport(report); +// log.info("##-[BATCH_REALTIME_REPORT]-## UPDATE result["+report.get("days").toString()+":"+report.get("siteId").toString()+":"+report.get("memId").toString()+"] : " + result); + } + int result3 = commonDao.updateReport2(); + log.info("##-[BATCH_REALTIME_REPORT]-## Daily Scheduled updateReport3, Size: " + result3); + log.info("##-[BATCH_REALTIME_REPORT]-## Daily Scheduled Report Update End"); + + /* + log.info("##-[BATCH_REALTIME_REPORT]-## Daily Scheduled getDailyList(INSERT) Start"); + List dailyList = commonDao.getDailyList("INSERT"); + log.info("##-[BATCH_REALTIME_REPORT]-## Daily Scheduled getDailyList(INSERT) End, Size: " + dailyList.size()); + + log.info("##-[BATCH_REALTIME_REPORT]-## Daily Scheduled Report Insert Start"); + for(HashMap report : dailyList) { + log.info("##-[BATCH_REALTIME_REPORT]-## INSERT report : " + report.toString()); + int result = commonDao.insertReport(report); + log.info("##-[BATCH_REALTIME_REPORT]-## INSERT result["+report.get("days").toString()+":"+report.get("siteId").toString()+":"+report.get("memId").toString()+"] : " + result); + } + log.info("##-[BATCH_REALTIME_REPORT]-## Daily Scheduled Report Insert End"); + */ + } + + List monthList = commonDao.getMonthList(); + log.info("##-[BATCH_REALTIME_REPORT]-## Daily Scheduled getMonthList() End, Size: " + monthList.size()); + for(HashMap report : monthList) { + //log.info("##-[BATCH_REALTIME_REPORT]-## Daily Scheduled INSERT month report : " + report.toString()); + int result = commonDao.insertMonthReport(report); + //log.info("##-[BATCH_REALTIME_REPORT]-## Daily Scheduled INSERT month result["+report.get("monthDate").toString()+":"+report.get("siteId").toString()+"] : " + result); + } + + List rollingList = commonDao.getRollingList("0Day"); + log.info("##-[BATCH_REALTIME_REPORT]-## Daily Scheduled rollingList() End, Size: " + rollingList.size()); + for(HashMap report : rollingList) { + //log.info("##-[BATCH_REALTIME_REPORT]-## Daily Scheduled INSERT rolling report : " + report.toString()); + int result = commonDao.insertRollingReport(report); + //log.info("##-[BATCH_REALTIME_REPORT]-## Daily Scheduled INSERT rolling result : " + result); + } + } + } catch(Exception e) { + log.error(e.toString()); + log.error("##- [OMS BATCH_REALTIME_REPORT STATUS] Exception: " + e.toString()); + e.printStackTrace(); + } + } + + /** + * 첫 번째 * 부터 + * 초(0-59) + * 분(0-59) + * 시간(0-23) + * 일(1-31) + * 월(1-12) + * 요일(0-6) (0: 일, 1: 월, 2:화, 3:수, 4:목, 5:금, 6:토) + * + * Cron 표현식 + * '*' : 모든 조건(매시, 매일, 매주처럼 사용)을 의미 + * '?' : 설정 값 없음 (날짜와 요일에서만 사용 가능) + * '-' : 범위를 지정할 때 + * ',' : 여러 값을 지정할 때 + * '/' : 증분값, 즉 초기값과 증가치 설정에 사용 + * 'L' : 마지막 - 지정할 수 있는 범위의 마지막 값 설정 시 사용 (날짜와 요일에서만 사용 가능) + * 'W' : 가장 가까운 평일(weekday)을 설정할 때 + * 예) 10W - 10일이 평일 일 때 : 10일에 실행 + * - 10일이 토요일 일 때 : 가장 가까운 평일인 금요일(9일)에 실행 + * - 10일이 일요일 일 때 : 가장 가까운 평일인 월요일(11일)에 실행 + * '#' : N번째 주 특정 요일을 설정할 때 (-요일에서만 사용 가능) + * 예) 4#2 - 목요일#2째주에 실행 + * + * zone : cron 표현식을 사용했을 때 사용할 time zone으로 따로 설정하지 않으면 기본적으로 Local의 time zone이다. + * + * @Scheduled(cron = "* * * * * *", zone = "Asia/Seoul") + */ + // 매일 밤 11시00분에 실행 + @Override + @Scheduled(cron = "0 0 23 * * *") + public void batchAutoLevelUp() { + try { + CronServerInfo cronStatus = new CronServerInfo(); + cronStatus.setHostName(InetAddress.getLocalHost().getHostName()); + cronStatus.setIpAddress(InetAddress.getLocalHost().getHostAddress()); + cronStatus.setCronType("AUTO_LVUP"); + log.info("##- [OMS BATCH_AUTO_LEVEL_UP STATUS] HostName: " + cronStatus.getHostName() + ", HostAddress: " + cronStatus.getIpAddress()); + cronStatus = commonDao.getServerCronStatus(cronStatus); + log.info("##- [OMS BATCH_AUTO_LEVEL_UP STATUS] cronStatus: " + cronStatus); + + if(cronStatus != null && cronStatus.getRunYn().equals("Y")) { + + log.info("##-[BATCH_AUTO_LEVEL_UP]-## Daily Scheduled getDailyAutoLevelUpList() Start"); + List autoList = commonDao.getDailyAutoLevelUpList(); + log.info("##-[BATCH_AUTO_LEVEL_UP]-## Daily Scheduled getDailyAutoLevelUpList() End, Size: " + autoList.size()); + + log.info("##-[BATCH_AUTO_LEVEL_UP]-## Daily Scheduled Report Update Start"); + int cnt = 0; + for(HashMap user : autoList) { + int result1 = commonDao.updateAutoLevelUp(user); + log.debug("##-[BATCH_AUTO_LEVEL_UP]-## UPDATE result1 : " + result1); + cnt++; + } + log.info("##-[BATCH_AUTO_LEVEL_UP]-## UPDATE result1 cnt: " + cnt); + + } + } catch(Exception e) { + log.error("##- [OMS BATCH_AUTO_LEVEL_UP STATUS] Exception: " + e.toString()); + e.printStackTrace(); + } + } + + // 매일 오전 12시30분에 실행 + @Override + @Scheduled(cron = "0 30 0 * * *") + public void batchReportYday1() { + try { + CronServerInfo cronStatus = new CronServerInfo(); + cronStatus.setHostName(InetAddress.getLocalHost().getHostName()); + cronStatus.setIpAddress(InetAddress.getLocalHost().getHostAddress()); + cronStatus.setCronType("DAY"); + log.info("##- [OMS BATCH_REPORT_YDAY_1 STATUS] HostName: " + cronStatus.getHostName() + ", HostAddress: " + cronStatus.getIpAddress()); + cronStatus = commonDao.getServerCronStatus(cronStatus); + log.info("##- [OMS BATCH_REPORT_YDAY_1 STATUS] cronStatus: " + cronStatus); + + if(cronStatus != null && cronStatus.getRunYn().equals("Y")) { + + log.info("##-[BATCH_REPORT_YDAY_1]-## Daily Scheduled getDailyListYday() Start"); + List dailyList = commonDao.getDailyListYday(); + log.info("##-[BATCH_REPORT_YDAY_1]-## Daily Scheduled getDailyListYday() End, Size: " + dailyList.size()); + + log.info("##-[BATCH_REPORT_YDAY_1]-## Daily Scheduled Report Update Start"); + int cnt = 0; + for(HashMap report : dailyList) { + int result1 = commonDao.updateReportYday1(report); + log.debug("##-[BATCH_REPORT_YDAY_1]-## UPDATE result1 : " + result1); + cnt++; + } + log.info("##-[BATCH_REPORT_YDAY_1]-## UPDATE result1 cnt: " + cnt); + + int result2 = commonDao.updateReportYday2(); + log.info("##-[BATCH_REPORT_YDAY_1]-## UPDATE result2: " + result2); + log.info("##-[BATCH_REPORT_YDAY_1]-## Daily Scheduled Report Update End"); + + List rollingList = commonDao.getRollingList("-1Day"); + log.info("##-[BATCH_REPORT_YDAY_1]-## Daily Scheduled rollingList() End, Size: " + rollingList.size()); + for(HashMap report : rollingList) { + //log.info("##-[BATCH_REPORT_YDAY_1]-## Daily Scheduled INSERT rolling report : " + report.toString()); + int result = commonDao.insertRollingReport(report); + //log.info("##-[BATCH_REPORT_YDAY_1]-## Daily Scheduled INSERT rolling result : " + result); + } + + + } + } catch(Exception e) { + log.error("##- [OMS BATCH_REPORT_YDAY_1 STATUS] Exception: " + e.toString()); + e.printStackTrace(); + } + } + + // 매일 오전 6시에 실행 + @Override + @Scheduled(cron = "0 0 6 * * *") + public void batchReportYday2() { + try { + CronServerInfo cronStatus = new CronServerInfo(); + cronStatus.setHostName(InetAddress.getLocalHost().getHostName()); + cronStatus.setIpAddress(InetAddress.getLocalHost().getHostAddress()); + cronStatus.setCronType("DAY"); + log.info("##- [OMS BATCH_REPORT_YDAY_2 STATUS] HostName: " + cronStatus.getHostName() + ", HostAddress: " + cronStatus.getIpAddress()); + cronStatus = commonDao.getServerCronStatus(cronStatus); + log.info("##- [OMS BATCH_REPORT_YDAY_2 STATUS] cronStatus: " + cronStatus); + + if(cronStatus != null && cronStatus.getRunYn().equals("Y")) { + + log.info("##-[BATCH_REPORT_YDAY_2]-## Daily Scheduled getDailyListYday() Start"); + List dailyList = commonDao.getDailyListYday(); + log.info("##-[BATCH_REPORT_YDAY_2]-## Daily Scheduled getDailyListYday() End, Size: " + dailyList.size()); + + log.info("##-[BATCH_REPORT_YDAY_2]-## Daily Scheduled Report Update Start"); + int cnt = 0; + for(HashMap report : dailyList) { + int result1 = commonDao.updateReportYday1(report); + log.debug("##-[BATCH_REPORT_YDAY_2]-## UPDATE result1 : " + result1); + cnt++; + } + log.info("##-[BATCH_REPORT_YDAY_2]-## UPDATE result1 cnt: " + cnt); + + int result3 = commonDao.updateReportYday3(); + log.info("##-[BATCH_REPORT_YDAY_2]-## UPDATE result3: " + result3); + log.info("##-[BATCH_REPORT_YDAY_2]-## Daily Scheduled Report Update End"); + + List rollingList = commonDao.getRollingList("-1Day"); + log.info("##-[BATCH_REPORT_YDAY_2]-## Daily Scheduled rollingList() End, Size: " + rollingList.size()); + for(HashMap report : rollingList) { + //log.info("##-[BATCH_REPORT_YDAY_2]-## Daily Scheduled INSERT rolling report : " + report.toString()); + int result = commonDao.insertRollingReport(report); + //log.info("##-[BATCH_REPORT_YDAY_2]-## Daily Scheduled INSERT rolling result : " + result); + } + } + } catch(Exception e) { + log.error("##- [OMS BATCH_REPORT_YDAY_2 STATUS] Exception: " + e.toString()); + e.printStackTrace(); + } + } + + + @Override + public HashMap getSiteOption(String siteId) { + // TODO Auto-generated method stub + return commonDao.getSiteOption(siteId); + } + + @Override + public void insertlog(Map logParam) { + commonDao.insertlog(logParam); + } + + @Override + public List getlastLoginToken() { + // TODO Auto-generated method stub + return commonDao.getlastLoginToken(); + } + + @Override + public void updatelog(Map logParam) { + // TODO Auto-generated method stub + commonDao.updatelog(logParam); + } + + @Override + public int optionSave(SiteOption option) { + // TODO Auto-generated method stub + return commonDao.optionSave(option); + } + + @Override + public SiteOption getSiteSetting(SiteSearch search) { + // TODO Auto-generated method stub + return commonDao.getSiteSetting(search); + } + + @Override + public HashMap getSiteAccoucnt(SiteSearch search) { + // TODO Auto-generated method stub + return commonDao.getSiteAccoucnt(search); + } + + @Override + public void bankSave(Bank bank) { + // TODO Auto-generated method stub + commonDao.bankSave(bank); + } + + @Override + public List getAdminBankList(SiteSearch search) { + // TODO Auto-generated method stub + return commonDao.getAdminBankList(search); + } + + @Override + public List getBankList(SiteSearch search) { + // TODO Auto-generated method stub + return commonDao.getBankList(search); + } + + @Override + public void bannerSave(Banner banner) { + // TODO Auto-generated method stub + commonDao.bannerSave(banner); + } + + @Override + public List getBannerList(SiteSearch search) { + // TODO Auto-generated method stub + return commonDao.getBannerList(search); + } + + @Override + public void insertCode(@Valid Code code) { + // TODO Auto-generated method stub + commonDao.insertCode(code); + } + + @Override + public List getLbList(SiteSearch search) { + // TODO Auto-generated method stub + return commonDao.getLbList(search); + } + + @Override + public void accountSave(LevelBank levelBank) { + // TODO Auto-generated method stub + commonDao.accountSave(levelBank); + } + + @Override + public List getLbetLimitList(SiteSearch search) { + // TODO Auto-generated method stub + return commonDao.getLbetLimitList(search); + } + + @Override + public void setLbetLimitList(LevelBetLimit betLimit) { + // TODO Auto-generated method stub + commonDao.setLbetLimitList(betLimit); + } + + @Override + public List getFailPointList(SiteSearch search) { + // TODO Auto-generated method stub + return commonDao.getFailPointList(search); + } + + @Override + public void failPointSave(LevelFailPoint failPoint) { + // TODO Auto-generated method stub + commonDao.failPointSave(failPoint); + } + + @Override + public List getDomainList(SiteSearch search) { + // TODO Auto-generated method stub + return commonDao.getDomainList(search); + } + + + @Override + public void domainSave(LevelDomain domain) { + // TODO Auto-generated method stub + commonDao.domainSave(domain); + } + + @Override + public List getOutPwdList(SiteSearch search) { + // TODO Auto-generated method stub + return commonDao.getOutPwdList(search); + } + + @Override + public void outPwdSave(LevelOutPwd outPwd) { + // TODO Auto-generated method stub + commonDao.outPwdSave(outPwd); + } + + @Override + public int getAdminLogListCnt(@Valid AdminLogSearch search) { + // TODO Auto-generated method stub + return commonDao.getAdminLogListCnt(search); + } + + @Override + public List getAdminLogList(@Valid AdminLogSearch search) { + // TODO Auto-generated method stub + return commonDao.getAdminLogList(search); + } + + @Override + public void insertAdminlog(Map logParam) { + // TODO Auto-generated method stub + commonDao.insertAdminlog(logParam); + } + + @Override + public int getSiteBlockListCnt(@Valid BlockSearch search) { + // TODO Auto-generated method stub + return commonDao.getSiteBlockListCnt(search); + } + + @Override + public List getSiteBlockList(@Valid BlockSearch search) { + // TODO Auto-generated method stub + return commonDao.getSiteBlockList(search); + } + + @Override + public void blockSave(@Valid Block block) { + // TODO Auto-generated method stub + commonDao.blockSave(block); + } + + @Override + public int getSiteAdminListCnt(@Valid AdminSearch search) { + // TODO Auto-generated method stub + return commonDao.getSiteAdminListCnt(search); + } + + @Override + public List getSiteAdminList(@Valid AdminSearch search) { + // TODO Auto-generated method stub + return commonDao.getSiteAdminList(search); + } + + @Override + public void adminSave(Admin admin) { + // TODO Auto-generated method stub + commonDao.adminSave(admin); + } + + @Override + public void adminDelete(Admin admin) { + // TODO Auto-generated method stub + commonDao.adminDelete(admin); + } + + @Override + public int getSiteAdminIpListCnt(@Valid AdminSearch search) { + // TODO Auto-generated method stub + return commonDao.getSiteAdminIpListCnt(search); + } + + @Override + public List getSiteAdminIpList(@Valid AdminSearch search) { + // TODO Auto-generated method stub + return commonDao.getSiteAdminIpList(search); + } + + @Override + public void adminIpSave(AdminIp adminIp) { + // TODO Auto-generated method stub + commonDao.adminIpSave(adminIp); + } + + @Override + public void adminIpDelete(AdminIp adminIp) { + // TODO Auto-generated method stub + commonDao.adminIpDelete(adminIp); + } + + @Override + public void updateIpInfo(Map ipParam) { + // TODO Auto-generated method stub + commonDao.updateIpInfo(ipParam); + } + + @Override + public List getLoginSite() { + // TODO Auto-generated method stub + return commonDao.getLoginSite(); + } + + @Override + public int gameSettingSave(List settingList) { + // TODO Auto-generated method stub + return commonDao.gameSettingSave(settingList); + } + + @Override + public List gameSettingList(GameSetting searchSetting) { + // TODO Auto-generated method stub + return commonDao.gameSettingList(searchSetting); + } + + @Override + public int siteCheckSave(SiteCheckReq param) { + // TODO Auto-generated method stub + int result = commonDao.siteCheckSave(param); + + return result; + } + + @Override + public List isSiteCheck() { + // TODO Auto-generated method stub + return commonDao.isSiteCheck(); + } + + @Override + public void changeSiteCheckOff(SiteCheckReq param) { + // TODO Auto-generated method stub + commonDao.changeSiteCheckOff(param); + } + + @Override + public void changeSiteSettingCheckYn(SiteCheckReq param) { + // TODO Auto-generated method stub + commonDao.changeSiteSettingCheckYn(param); + } + + @Override + public List siteCheckList(SiteCheckReq param) { + // TODO Auto-generated method stub + return commonDao.siteCheckList(param); + } + + @Override + public HashMap siteCheckDetail(SiteCheckReq param) { + // TODO Auto-generated method stub + return commonDao.siteCheckDetail(param); + } + + @Override + public HashMap siteCheckInfo(SiteCheckReq param) { + // TODO Auto-generated method stub + return commonDao.siteCheckInfo(param); + } + + @Override + public List> getGameCodeTabList(GameCodeSearchVO searchVO) { + // TODO Auto-generated method stub + return commonDao.getGameCodeTabList(searchVO); + } + + @Override + public List> getGameCodeColList(GameCodeSearchVO searchVO) { + // TODO Auto-generated method stub + return commonDao.getGameCodeColList(searchVO); + } + + @Override + public List> getGameCodeList(GameCodeSearchVO searchVO) { + // TODO Auto-generated method stub + return commonDao.getGameCodeList(searchVO); + } + + @Override + public int gameCodeRegist(GameCodeVO gameCodeVO) { + // TODO Auto-generated method stub + int result = 0; + int codeResult = commonDao.gameCodeRegist(gameCodeVO); + if(codeResult > 0) { + int result1 = commonDao.gameCodeAddMemRate(gameCodeVO); + int result2 = commonDao.gameCodeAddSiteGameSetting(gameCodeVO); + if(result1 > 0 && result2 > 0) { + result = 1; + } + } + + return result; + } + + @Override + public int gameCodeUpdate(GameCodeVO gameCodeVO) { + // TODO Auto-generated method stub + return commonDao.gameCodeUpdate(gameCodeVO); + } + + @Override + public List getPopupList(SiteSearch search) { + // TODO Auto-generated method stub + return commonDao.getPopupList(search); + } + + @Override + public List getBannerInfoList(SiteSearch search) { + // TODO Auto-generated method stub + return commonDao.getBannerInfoList(search); + } + + @Override + public List getLoginPopupList(SiteSearch paramSite) { + // TODO Auto-generated method stub + return commonDao.getLoginPopupList(paramSite); + } + + @Override + public List getGameCodes(CodeSearch codesSearch) { + // TODO Auto-generated method stub + return commonDao.getGameCodes(codesSearch); + } + + @Override + public List getGameGroupCodes(String siteId) { + // TODO Auto-generated method stub + return commonDao.getGameGroupCodes(siteId); + } + + @Override + public String getApiVendor(CodeSearch codeSearch) { + // TODO Auto-generated method stub + return commonDao.getApiVendor(codeSearch); + } + + @Override + public List getMenuList(HashMap param) { + // TODO Auto-generated method stub + return commonDao.getMenuList(param); + } + + @Override + public List getVendorList() { + // TODO Auto-generated method stub + return commonDao.getVendorList(); + } + + @Override + public List getGameCodesForSuper(CodeSearch codesSearch) { + // TODO Auto-generated method stub + return commonDao.getGameCodesForSuper(codesSearch); + } + + @Override + public List getGameGroupCodesForSuper(String siteId) { + // TODO Auto-generated method stub + return commonDao.getGameGroupCodesForSuper(siteId); + } + + + + @Override + public CronServerInfo getServerCronStatus(CronServerInfo cronStatus) { + // TODO Auto-generated method stub + return commonDao.getServerCronStatus(cronStatus); + } + + + + @Override + public List> getDomainPartnerList(DomainPartnerVO domainPartnerVO) { + // TODO Auto-generated method stub + return commonDao.getDomainPartnerList(domainPartnerVO); + } + + + + @Override + public int domainPartnerSave(DomainPartnerVO domainPartnerVO) { + // TODO Auto-generated method stub + return commonDao.domainPartnerSave(domainPartnerVO); + } + + + + @Override + public int domainPartnerDelete(DomainPartnerVO domainPartnerVO) { + // TODO Auto-generated method stub + return commonDao.domainPartnerDelete(domainPartnerVO); + } + + + + @Override + public String getJoinRecommanderId(SiteSearch paramSite) { + // TODO Auto-generated method stub + return commonDao.getJoinRecommanderId(paramSite); + } + + + + @Override + public HashMap getSessionTransactionIsolation() { + // TODO Auto-generated method stub + return commonDao.getSessionTransactionIsolation(); + } + + + + @Override + public List getChargingPointSettingList(int siteIdx) { + // TODO Auto-generated method stub + return commonDao.getChargingPointSettingList(siteIdx); + } + + + @Override + public ChargingPointSettingVO getChargingPointSetting(ChargingPointSettingVO param) { + // TODO Auto-generated method stub + return commonDao.getChargingPointSetting(param); + } + + + @Override + public int setChargingPointSettingSave(ChargingPointSettingVO settingVO) { + // TODO Auto-generated method stub + int result1 = commonDao.memChargingPointSettingSave(settingVO); + int result2 = commonDao.siteChargingPointSettingSave(settingVO); + return result1+result2; + } + + @Override + public String getJackpot(HashMap param) { + String jackpot = commonDao.getJackpot(param); + return jackpot; + } + + + + @Override + public HashMap getCodeBySite(CodeSearch codeSrch) { + // TODO Auto-generated method stub + return commonDao.getCodeBySite(codeSrch); + } + + + + @Override + public int getSiteLogoutTimeLimit(String siteId) { + // TODO Auto-generated method stub + return commonDao.getSiteLogoutTimeLimit(siteId); + } + + + + @Override + public List getRateCategory(String siteId) { + // TODO Auto-generated method stub + return commonDao.getRateCategory(siteId); + } + + + + @Override + public HashMap getUserInfoByToken(String token) { + // TODO Auto-generated method stub + return commonDao.getUserInfoByToken(token); + } + + + + @Override + public HashMap getAdminInfoByToken(String token) { + // TODO Auto-generated method stub + return commonDao.getAdminInfoByToken(token); + } + + + + @Override + public List getMenuBookmarkList(HashMap param) { + // TODO Auto-generated method stub + return commonDao.getMenuBookmarkList(param); + } + + @Override + public int updateBookmarkMenu(MenuVO param) { + // TODO Auto-generated method stub + return commonDao.updateBookmarkMenu(param); + } + + @Override + public HashMap getSiteMemo(String siteId) { + // TODO Auto-generated method stub + return commonDao.getSiteMemo(siteId); + } + + @Override + public int updateSiteMemo(HashMap param) { + // TODO Auto-generated method stub + return commonDao.updateSiteMemo(param); + } + + @Override + public int getSiteCheckCount(SiteCheckReq siteCheckReq) { + // TODO Auto-generated method stub + return commonDao.getSiteCheckCount(siteCheckReq); + } + + @Override + public void updateMemLogin(Map logParam) { + // TODO Auto-generated method stub + commonDao.updateMemLogin(logParam); + } + + @Override + public void updateDayCashInDate(HashMap dailyParam) { + // TODO Auto-generated method stub + commonDao.updateDayCashInDate(dailyParam); + } + + @Override + public void updateAcctionLog(Map logParam) { + // TODO Auto-generated method stub + commonDao.updateAcctionLog(logParam); + } + + + @Override + public HashMap getVassApiInfo(Member search) { + // TODO Auto-generated method stub + return commonDao.getVassApiInfo(search); + } + + + @Override + public List getNotiBgmList(SiteSearch search) { + // TODO Auto-generated method stub + return commonDao.getNotiBgmList(search); + } + + + @Override + public int setNotiBgmSave(NotiBgmVo notiBgmVo) { + // TODO Auto-generated method stub + return commonDao.setNotiBgmSave(notiBgmVo); + } + + + + @Override + public List getSiteCashBonusSettingList(Integer siteIdx) { + // TODO Auto-generated method stub + return commonDao.getSiteCashBonusSettingList(siteIdx); + } + + + + @Override + public int setSiteCashBonusSettingSave(SiteCashBonusSettingVO settingVO) { + // TODO Auto-generated method stub + return commonDao.setSiteCashBonusSettingSave(settingVO); + } + + + + @Override + public int bankDelete(Bank bank) { + // TODO Auto-generated method stub + return commonDao.bankDelete(bank); + } + +} diff --git a/src/main/java/com/bb/service/CompService.java b/src/main/java/com/bb/service/CompService.java new file mode 100644 index 0000000..a74c53e --- /dev/null +++ b/src/main/java/com/bb/service/CompService.java @@ -0,0 +1,115 @@ +package com.bb.service; + +import java.util.HashMap; +import java.util.List; + +import jakarta.validation.Valid; + +import com.bb.model.CompDetail; +import com.bb.model.CompResetInfo; +import com.bb.model.CompSearch; +import com.bb.model.Member; +import com.bb.model.MemberListSearch; +import com.bb.model.MemberRate; +import com.bb.model.MenuVO; +import com.bb.model.OTPInfo; +import com.bb.model.PartnerCompInfo; +import com.bb.model.Site; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; +import com.bb.model.TripleGameRate; + +public interface CompService { + + int getPartnerCompListCnt(@Valid MemberListSearch search); + + List getPartnerCompList(@Valid MemberListSearch search); + + CompDetail getPartnerComp(Site search); + + HashMap getPartnerCompDetail(Member search); + + int modifySiteGameSetting(PartnerCompInfo compInfo); + + int modifyCreditSettings(PartnerCompInfo compInfo); + + int modifyCreditRates(Member search, @Valid MemberRate memberRate); + + int modifyCompCreditRates(PartnerCompInfo compInfo); + + int modifySiteSettings(PartnerCompInfo compInfo); + + int getCheckTopComp(PartnerCompInfo compInfo); + + int modifyCompInfo(PartnerCompInfo compInfo); + + HashMap getCompInfoForDetail(SiteSearch search); + + HashMap getSettingInfoForDetail(SiteSearch search); + + HashMap getCompStatsForDetail(SiteSearch search); + + List getTopCompListForDetail(SiteSearch search); + + List getBotCompListForDetail(SiteSearch search); + + int modifySiteGameSettingForSuper(PartnerCompInfo compInfo); + + int modifyMenuSettings(PartnerCompInfo compInfo); + + List getCompanyRate(Member search); + + List> getGameRateCompList(TripleGameRate gameRateVO); + + int updateCompGameRate(HashMap compGameRateInfo); + + HashMap getTripleParam(CompSearch search); + + List> getTripleGameRate(HashMap tripleParam); + + int insertTripleRateList(CompSearch search, List> tripleRateList); + + List> getOmsRateListByTripleGame(CompSearch search); + + int updateOmsRateList(CompSearch search); + + int resetComp(CompResetInfo compResetInfo); + + int updateApiSetting(PartnerCompInfo compInfo); + + List> getCompIdList(SiteSearch search); + + List getSiteGameInfo(SiteSearch search); + + List getSiteMenuInfo(SiteSearch search); + + int updateCompVictoryPassYn(SiteOption option); + + + String getAdminOtpUseYN(String adminId); + int registAdminOtp(OTPInfo otpParam); + int registSuperOtp(OTPInfo otpParam); + OTPInfo getOtpInfo(String adminId); + int updateAdminOtpUseYN(OTPInfo otpParam); + int updateSuperOtpUseYN(OTPInfo otpParam); + String getAdminType(String adminId); + + List> getAdminOtpInfoList(String siteId); + + HashMap getTripleCreditInfo(String siteId); + + void updateTripleSiteCredit(HashMap tripleCreditInfo); + + int updateVendoMinMax(HashMap param); + + String getLastMaxWinAmt(HashMap param); + + String getLastMaxWinAmtCnt(HashMap param); + + HashMap getTripleTargetSiteInfo(HashMap tripleCreditInfo); + + int insertTripleCreditInfo(String LOG_PREFIX, HashMap creditParam); + + String getSiteIdByAdminId(String adminId); + +} diff --git a/src/main/java/com/bb/service/CompServiceImpl.java b/src/main/java/com/bb/service/CompServiceImpl.java new file mode 100644 index 0000000..ef58784 --- /dev/null +++ b/src/main/java/com/bb/service/CompServiceImpl.java @@ -0,0 +1,482 @@ +package com.bb.service; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +import jakarta.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.stereotype.Service; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.DefaultTransactionDefinition; + +import com.bb.dao.CashDao; +import com.bb.dao.CompDao; +import com.bb.dao.UserDao; +import com.bb.model.BiSubPointRateVo; +import com.bb.model.CompDetail; +import com.bb.model.CompResetInfo; +import com.bb.model.CompSearch; +import com.bb.model.GameSettingInfo; +import com.bb.model.Member; +import com.bb.model.MemberListSearch; +import com.bb.model.MemberRate; +import com.bb.model.MemberRateVo; +import com.bb.model.MenuVO; +import com.bb.model.OTPInfo; +import com.bb.model.PartnerCompInfo; +import com.bb.model.Site; +import com.bb.model.SiteOption; +import com.bb.model.SiteSearch; +import com.bb.model.TripleGameRate; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RequiredArgsConstructor +@Service +public class CompServiceImpl implements CompService { + + private final CompDao compDao; + + @Override + public int getPartnerCompListCnt(@Valid MemberListSearch search) { + // TODO Auto-generated method stub + return compDao.getPartnerCompListCnt(search); + } + + @Override + public List getPartnerCompList(@Valid MemberListSearch search) { + // TODO Auto-generated method stub + return compDao.getPartnerCompList(search); + } + + @Override + public CompDetail getPartnerComp(Site search) { + // TODO Auto-generated method stub + return compDao.getPartnerComp(search); + } + + @Override + public HashMap getPartnerCompDetail(Member search) { + // TODO Auto-generated method stub + return compDao.getPartnerCompDetail(search); + } + + @Override + public int modifySiteGameSetting(PartnerCompInfo compInfo) { + // TODO Auto-generated method stub + int resultCnt = 0; + int result = 0; + List biRateList = compInfo.getBiRateList(); + for(BiSubPointRateVo item : biRateList) { + item.setSiteId(compInfo.getSiteId()); + item.setTopCompId(compInfo.getTopCompId()); + resultCnt += compDao.modifySiteGameSetting(item); + } + log.info("resultCnt:" + resultCnt); + if(resultCnt > 0) { + result = 1; + } + return result; + } + + @Override + public int modifyCreditSettings(PartnerCompInfo compInfo) { + // TODO Auto-generated method stub + return compDao.modifyCreditSettings(compInfo); + } + + @Override + public int modifyCreditRates(Member search, @Valid MemberRate memberRate) { + // TODO Auto-generated method stub + int result = 0; + int resultCnt = 0; + for(MemberRateVo item : memberRate.getRateList()) { + HashMap param = new HashMap(); + param.put("siteId", search.getSiteId()); + param.put("memId", search.getSiteId()); + param.put("gameType", item.getGameType()); + param.put("pointRate", item.getPointRate()); + resultCnt += compDao.modifyCreditRates(param); + } + log.info("resultCnt:" + resultCnt); + if(resultCnt == memberRate.getRateList().size()) { + result = 1; + } + return result; + } + + @Override + public int modifyCompCreditRates(PartnerCompInfo compInfo) { + // TODO Auto-generated method stub + int result = 0; + int resultCnt = 0; + + for(GameSettingInfo item : compInfo.getGameSettingInfoList()) { + HashMap param = new HashMap(); + param.put("siteId", compInfo.getSiteId()); + param.put("memId", compInfo.getSiteId()); + param.put("gameType", item.getCode()); + param.put("pointRate", item.getPointRate()); + resultCnt += compDao.modifyCreditRates(param); + } + if(resultCnt == compInfo.getGameSettingInfoList().size()) { + result = 1; + } + log.info("### gameSettingList Count: " + compInfo.getGameSettingInfoList().size()); + log.info("### gameSettingList Result: " + resultCnt); + return result; + } + + @Override + public int modifySiteSettings(PartnerCompInfo compInfo) { + // TODO Auto-generated method stub + SiteOption siteOption = compInfo.getSiteOption(); + siteOption.setSiteId(compInfo.getSiteId()); + return compDao.modifySiteSettings(siteOption); + } + + @Override + public int getCheckTopComp(PartnerCompInfo compInfo) { + // TODO Auto-generated method stub + return compDao.getCheckTopComp(compInfo); + } + + @Override + public int modifyCompInfo(PartnerCompInfo compInfo) { + // TODO Auto-generated method stub + String siteDomains = compInfo.getSiteDomain(); + String[] siteDomainsArr = siteDomains.split(","); + compInfo.setSiteDomain(siteDomainsArr[0]); + compInfo.setSiteDomains(siteDomains); + + int modiResult = compDao.modifyCompInfo(compInfo); + return modiResult; + } + + @Override + public HashMap getCompInfoForDetail(SiteSearch search) { + // TODO Auto-generated method stub + return compDao.getCompInfoForDetail(search); + } + + @Override + public HashMap getSettingInfoForDetail(SiteSearch search) { + // TODO Auto-generated method stub + return compDao.getSettingInfoForDetail(search); + } + + @Override + public HashMap getCompStatsForDetail(SiteSearch search) { + // TODO Auto-generated method stub + return compDao.getCompStatsForDetail(search); + } + + @Override + public List getTopCompListForDetail(SiteSearch search) { + // TODO Auto-generated method stub + return compDao.getTopCompListForDetail(search); + } + + @Override + public List getBotCompListForDetail(SiteSearch search) { + // TODO Auto-generated method stub + return compDao.getBotCompListForDetail(search); + } + + @Override + public int modifySiteGameSettingForSuper(PartnerCompInfo compInfo) { + // TODO Auto-generated method stub + int result = 0; + List gameSettingList = compInfo.getGameSettingInfoList(); + for(GameSettingInfo item : gameSettingList) { + item.setSiteId(compInfo.getSiteId()); + item.setTopCompId(compInfo.getTopCompId()); + result += compDao.modifySiteGameSettingForSuper(item); + } + log.info("### gameSettingList Count: " + gameSettingList.size()); + log.info("### gameSettingList Result: " + result); + return result; + } + + @Override + public int modifyMenuSettings(PartnerCompInfo compInfo) { + // TODO Auto-generated method stub + int result = 0; + List menuSettingList = compInfo.getMenuSettingList(); + for(MenuVO item : menuSettingList) { + item.setSiteId(compInfo.getSiteId()); + String menuCode = item.getMenuCode(); + String menuCodePrefix = ""; + + /* + if(item.getMenuGroupCode().equals("level_01")) { + menuCodePrefix = menuCode.replace("0000", ""); + } else if(item.getMenuGroupCode().equals("level_02")) { + menuCodePrefix = menuCode.replace("00", ""); + } else { + menuCodePrefix = menuCode; + } + item.setMenuCodePrefix(menuCodePrefix); + */ + result += compDao.modifyMenuSettings(item); + } + log.info("### gameSettingList Count: " + menuSettingList.size()); + log.info("### gameSettingList Result: " + result); + return result; + } + + @Override + public List getCompanyRate(Member search) { + // TODO Auto-generated method stub + return compDao.getCompanyRate(search); + } + + @Override + public List> getGameRateCompList(TripleGameRate gameRateVO) { + // TODO Auto-generated method stub + return compDao.getGameRateCompList(gameRateVO); + } + + @Override + public int updateCompGameRate(HashMap compGameRateInfo) { + // TODO Auto-generated method stub + return compDao.updateCompGameRate(compGameRateInfo); + } + + @Override + public HashMap getTripleParam(CompSearch search) { + // TODO Auto-generated method stub + return compDao.getTripleParam(search); + } + + @Override + public List> getTripleGameRate(HashMap tripleParam) { + // TODO Auto-generated method stub + return compDao.getTripleGameRate(tripleParam); + } + + @Override + public int insertTripleRateList(CompSearch search, List> tripleRateList) { + // TODO Auto-generated method stub + int result = 0; + compDao.deleteTripleRate(search); + + for(HashMap tripleRate : tripleRateList) { + result += compDao.insertTripleRate(tripleRate); + } + return result; + } + + @Override + public List> getOmsRateListByTripleGame(CompSearch search) { + // TODO Auto-generated method stub + return compDao.getOmsRateListByTripleGame(search); + } + + @Override + public int updateOmsRateList(CompSearch search) { + // TODO Auto-generated method stub + return compDao.updateOmsRateList(search); + } + + @Override + public int resetComp(CompResetInfo compResetInfo) { + // TODO Auto-generated method stub + int res = 0; + String siteId = compResetInfo.getSiteId(); + try { + List memIdList = Arrays.asList(compResetInfo.getMemIds().split(",")); + compResetInfo.setMemIdList(memIdList); + if(memIdList.size() > 0) { + int cnt = compDao.getResetMemIdCount(compResetInfo); + log.info("[SUPER_ADMIN reset("+siteId+")] memIdList.size(): " + memIdList.size()); + log.info("[SUPER_ADMIN reset("+siteId+")] cnt: " + cnt); + if(cnt != memIdList.size()) { + log.error("[SUPER_ADMIN reset("+siteId+")] memIdList ERROR: " + compResetInfo); + return -1; + } + } + + log.info("[SUPER_ADMIN reset("+siteId+")] " + compResetInfo); + int delRes = compDao.resetDelete(compResetInfo); + log.info("[SUPER_ADMIN reset("+siteId+")] delRes: " + delRes); + int updRes = compDao.resetUpdate(compResetInfo); + log.info("[SUPER_ADMIN reset("+siteId+")] updRes: " + updRes); + } catch(Exception e) { + log.error("[SUPER_ADMIN reset("+siteId+")] ERROR: " + compResetInfo); + log.error(e.toString()); + e.printStackTrace(); + res = -1; + } + + return res; + } + + @Override + public int updateApiSetting(PartnerCompInfo compInfo) { + // TODO Auto-generated method stub + return compDao.updateApiSetting(compInfo); + } + + @Override + public List> getCompIdList(SiteSearch search) { + // TODO Auto-generated method stub + return compDao.getCompIdList(search); + } + + @Override + public List getSiteGameInfo(SiteSearch search) { + // TODO Auto-generated method stub + return compDao.getSiteGameInfo(search); + } + + @Override + public List getSiteMenuInfo(SiteSearch search) { + // TODO Auto-generated method stub + return compDao.getSiteMenuInfo(search); + } + + @Override + public int updateCompVictoryPassYn(SiteOption option) { + // TODO Auto-generated method stub + return compDao.updateCompVictoryPassYn(option); + } + + @Override + public String getAdminOtpUseYN(String adminId) { + // TODO Auto-generated method stub + return compDao.getAdminOtpUseYN(adminId); + } + + @Override + public int registAdminOtp(OTPInfo otpParam) { + // TODO Auto-generated method stub + int result = 0; + int reg = compDao.registOtpInfo(otpParam); + if(reg > 0) { + if(otpParam.getUseYn().equals("Y")) { + int upd = compDao.updateAdminOtpUseYN(otpParam); + if(upd > 0) { + result = 1; + } + } else { + result = 1; + } + + } + return result; + } + + @Override + public int registSuperOtp(OTPInfo otpParam) { + // TODO Auto-generated method stub + int result = 0; + int reg = compDao.registOtpInfo(otpParam); + if(reg > 0) { + if(otpParam.getUseYn().equals("Y")) { + int upd = compDao.updateSuperOtpUseYN(otpParam); + if(upd > 0) { + result = 1; + } + } else { + result = 1; + } + + } + return result; + } + + @Override + public OTPInfo getOtpInfo(String adminId) { + // TODO Auto-generated method stub + return compDao.getOtpInfo(adminId); + } + + @Override + public int updateAdminOtpUseYN(OTPInfo otpParam) { + // TODO Auto-generated method stub + return compDao.updateAdminOtpUseYN(otpParam); + } + + @Override + public int updateSuperOtpUseYN(OTPInfo otpParam) { + // TODO Auto-generated method stub + return compDao.updateSuperOtpUseYN(otpParam); + } + + @Override + public String getAdminType(String adminId) { + // TODO Auto-generated method stub + return compDao.getAdminType(adminId); + } + + @Override + public List> getAdminOtpInfoList(String siteId) { + // TODO Auto-generated method stub + return compDao.getAdminOtpInfoList(siteId); + } + + @Override + public HashMap getTripleCreditInfo(String siteId) { + // TODO Auto-generated method stub + return compDao.getTripleCreditInfo(siteId); + } + + @Override + public void updateTripleSiteCredit(HashMap tripleCreditInfo) { + // TODO Auto-generated method stub + compDao.updateTripleSiteCredit(tripleCreditInfo); + } + + @Override + public int updateVendoMinMax(HashMap param) { + // TODO Auto-generated method stub + return compDao.updateVendoMinMax(param); + } + + @Override + public String getLastMaxWinAmt(HashMap param) { + // TODO Auto-generated method stub + return compDao.getLastMaxWinAmt(param); + } + + @Override + public String getLastMaxWinAmtCnt(HashMap param) { + // TODO Auto-generated method stub + return compDao.getLastMaxWinAmtCnt(param); + } + + @Override + public HashMap getTripleTargetSiteInfo(HashMap tripleCreditInfo) { + // TODO Auto-generated method stub + return compDao.getTripleTargetSiteInfo(tripleCreditInfo); + } + + @Override + public int insertTripleCreditInfo(String LOG_PREFIX, HashMap creditParam) { + int res = 0; + + try { + compDao.insertTripleCredit(creditParam); + compDao.insertTripleCreditAiAo(creditParam); + res = 0; + } catch(Exception e) { + log.error(LOG_PREFIX + "Exception::"+e.getMessage()); + log.error(LOG_PREFIX + "Exception::"+e.toString()); + res =-1; + } finally { + return res; + } + } + + @Override + public String getSiteIdByAdminId(String adminId) { + // TODO Auto-generated method stub + return compDao.getSiteIdByAdminId(adminId); + } +} diff --git a/src/main/java/com/bb/service/MainService.java b/src/main/java/com/bb/service/MainService.java new file mode 100644 index 0000000..ebdcba6 --- /dev/null +++ b/src/main/java/com/bb/service/MainService.java @@ -0,0 +1,17 @@ +package com.bb.service; + +import java.util.HashMap; + +public interface MainService { + + HashMap getMainTopInfo(HashMap param); + + HashMap getMainStatistics(HashMap param); + + HashMap getMainCashReport(HashMap param); + + HashMap getMyCashReport(HashMap param); + + HashMap getMainNewPayLog(HashMap param); + +} diff --git a/src/main/java/com/bb/service/MainServiceImpl.java b/src/main/java/com/bb/service/MainServiceImpl.java new file mode 100644 index 0000000..2a8d30f --- /dev/null +++ b/src/main/java/com/bb/service/MainServiceImpl.java @@ -0,0 +1,61 @@ +package com.bb.service; + +import java.util.HashMap; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.bb.dao.CashDao; +import com.bb.dao.MainDao; +import com.bb.dao.UserDao; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RequiredArgsConstructor +@Service +public class MainServiceImpl implements MainService { + + private final MainDao mainDao; + + @Override + public HashMap getMainTopInfo(HashMap param) { + // TODO Auto-generated method stub + return mainDao.getMainTopInfo(param); + } + + @Override + public HashMap getMainStatistics(HashMap param) { + // TODO Auto-generated method stub + return mainDao.getMainStatistics(param); + } + + @Override + public HashMap getMainCashReport(HashMap param) { + // TODO Auto-generated method stub + return mainDao.getMainCashReport(param); + } + + @Override + public HashMap getMyCashReport(HashMap param) { + // TODO Auto-generated method stub + return mainDao.getMyCashReport(param); + } + + @Override + public HashMap getMainNewPayLog(HashMap param) { + HashMap mainNewPayLog = new HashMap<>(); + + param.put("payType", "-3"); + List> newPaymentList = mainDao.getMainNewPayLog(param); + mainNewPayLog.put("newPaymentList", newPaymentList); + + param.put("payType", "3"); + List> newPaybackList = mainDao.getMainNewPayLog(param); + mainNewPayLog.put("newPaybackList", newPaybackList); + + return mainNewPayLog; + } +} diff --git a/src/main/java/com/bb/service/MinigameService.java b/src/main/java/com/bb/service/MinigameService.java new file mode 100644 index 0000000..8f31baf --- /dev/null +++ b/src/main/java/com/bb/service/MinigameService.java @@ -0,0 +1,23 @@ +package com.bb.service; + +import java.util.HashMap; +import java.util.List; + +import jakarta.validation.Valid; + +import com.bb.model.MiniGameSearch; +import com.bb.model.MinigameBetRate; +import com.bb.model.MinigameSet; + +public interface MinigameService { + + void setSave(@Valid MinigameSet mgs); + + void betRateSave(@Valid MinigameBetRate mbr); + + List getSetList(MiniGameSearch search); + + List getBetRateList(MiniGameSearch search); + + +} diff --git a/src/main/java/com/bb/service/MinigameServiceImpl.java b/src/main/java/com/bb/service/MinigameServiceImpl.java new file mode 100644 index 0000000..a2bb18d --- /dev/null +++ b/src/main/java/com/bb/service/MinigameServiceImpl.java @@ -0,0 +1,49 @@ +package com.bb.service; + +import java.util.HashMap; +import java.util.List; + +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.bb.dao.CashDao; +import com.bb.dao.MinigameDao; +import com.bb.dao.ReportDao; +import com.bb.dao.UserDao; +import com.bb.model.MiniGameSearch; +import com.bb.model.MinigameBetRate; +import com.bb.model.MinigameSet; +@RequiredArgsConstructor +@Service +public class MinigameServiceImpl implements MinigameService { + + + private final MinigameDao minigameDao; + + @Override + public void setSave(@Valid MinigameSet mgs) { + // TODO Auto-generated method stub + minigameDao.setSave(mgs); + } + + @Override + public void betRateSave(@Valid MinigameBetRate mbr) { + // TODO Auto-generated method stub + minigameDao.betRateSave(mbr); + } + + @Override + public List getSetList(MiniGameSearch search) { + // TODO Auto-generated method stub + return minigameDao.getSetList(search); + } + + @Override + public List getBetRateList(MiniGameSearch search) { + // TODO Auto-generated method stub + return minigameDao.getBetRateList(search); + } +} diff --git a/src/main/java/com/bb/service/PassimService.java b/src/main/java/com/bb/service/PassimService.java new file mode 100644 index 0000000..98930bb --- /dev/null +++ b/src/main/java/com/bb/service/PassimService.java @@ -0,0 +1,10 @@ +package com.bb.service; + +import com.bb.model.PassimAddrReq; +import com.bb.model.PassimAddrRes; + +public interface PassimService { + + PassimAddrRes createAddress(String LOG_PREFIX, PassimAddrReq req); + +} diff --git a/src/main/java/com/bb/service/PassimServiceImpl.java b/src/main/java/com/bb/service/PassimServiceImpl.java new file mode 100644 index 0000000..5b91633 --- /dev/null +++ b/src/main/java/com/bb/service/PassimServiceImpl.java @@ -0,0 +1,107 @@ +package com.bb.service; + +import java.nio.charset.Charset; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.Collections; +import java.util.UUID; + +import org.codehaus.jettison.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient; + +import com.bb.dao.PassimDao; +import com.bb.model.PassimAddrReq; +import com.bb.model.PassimAddrRes; +import com.bb.util.PassimpaySignatureUtil; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import reactor.core.publisher.Mono; + +@Slf4j +@RequiredArgsConstructor +@Service +public class PassimServiceImpl implements PassimService { + + @Autowired + private WebClient webClient; + + private final String API_BASE_URL = "https://api.passimpay.io"; + private final String API_KEY = ""; + private final int PLATFORM_ID = 0; + + private final PassimDao passimDao; + + @Override + public PassimAddrRes createAddress(String LOG_PREFIX, PassimAddrReq req) { + PassimAddrRes res = null; + + try { + String orderId = createOrderId(req.getMemIdx(), req.getPaymentId()); + + JSONObject params = new JSONObject(); + params.put("platformId", PLATFORM_ID); + params.put("paymentId", req.getPaymentId().intValue()); + params.put("orderId", orderId); + + String signature = PassimpaySignatureUtil.generateSignature(Integer.toString(PLATFORM_ID), params.toString(), API_KEY); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(org.springframework.http.MediaType.APPLICATION_JSON); + headers.setAccept(Collections.singletonList(org.springframework.http.MediaType.APPLICATION_JSON)); + headers.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8"))); + headers.set("x-signature", signature); + + String apiUrl = API_BASE_URL + "/v2/address"; + Mono responseMono = webClient.post() + .uri(apiUrl) + .headers(httpHeaders -> httpHeaders.addAll(headers)) + .bodyValue(params.toString()) + .retrieve() + .bodyToMono(String.class); + + String responseBody = responseMono.block(); + log.info(LOG_PREFIX+ "response : " + responseBody); + JSONObject resObj = new JSONObject(responseBody); + int result = resObj.getInt("result"); + if(result == 1) { + res = new PassimAddrRes(); + res.setAddress(resObj.getString("")); + if(resObj.has("destinationTag")) { + res.setTag(resObj.getInt("destinationTag")); + } + } + + } catch (Exception e) { + log.error(LOG_PREFIX+ "Exception: " + e.toString()); + } + + return res; + } + + private static String createOrderId(Long userPk, Integer paymentId) { + if (paymentId == null) { + throw new IllegalArgumentException("paymentId must not be null"); + } + + String timestamp = LocalDateTime.now() + .format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")); + + String random = UUID.randomUUID() + .toString() + .substring(0, 8) + .toUpperCase(); + + return String.format( + "PP-%s-%d-%d-%s", + timestamp, + userPk, + paymentId, + random + ); + } +} diff --git a/src/main/java/com/bb/service/PointService.java b/src/main/java/com/bb/service/PointService.java new file mode 100644 index 0000000..1d9896a --- /dev/null +++ b/src/main/java/com/bb/service/PointService.java @@ -0,0 +1,25 @@ +package com.bb.service; + +import java.util.HashMap; +import java.util.List; + +import com.bb.model.Point; +import com.bb.model.PointSearchAdm; + +public interface PointService { + + int getAdminPointListCnt(PointSearchAdm search); + + List> getAdminPointList(PointSearchAdm search); + + int getAdminPointListNewCnt(PointSearchAdm search); + + List> getAdminPointListNew(PointSearchAdm search); + + List> getPointBotRateList(PointSearchAdm search); + + List> getPointBotMultiRateList(PointSearchAdm search); + + long pointInsert(Point point); + +} diff --git a/src/main/java/com/bb/service/PointServiceImpl.java b/src/main/java/com/bb/service/PointServiceImpl.java new file mode 100644 index 0000000..8e76b15 --- /dev/null +++ b/src/main/java/com/bb/service/PointServiceImpl.java @@ -0,0 +1,64 @@ +package com.bb.service; + +import java.util.HashMap; +import java.util.List; + +import org.springframework.stereotype.Service; + +import com.bb.dao.PointDao; +import com.bb.model.Point; +import com.bb.model.PointSearchAdm; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RequiredArgsConstructor +@Service +public class PointServiceImpl implements PointService { + + private final PointDao pointDao; + + @Override + public int getAdminPointListCnt(PointSearchAdm search) { + // TODO Auto-generated method stub + return pointDao.getAdminPointListCnt(search); + } + + @Override + public List> getAdminPointList(PointSearchAdm search) { + // TODO Auto-generated method stub + return pointDao.getAdminPointList(search); + } + + @Override + public int getAdminPointListNewCnt(PointSearchAdm search) { + // TODO Auto-generated method stub + return pointDao.getAdminPointListNewCnt(search); + } + + @Override + public List> getAdminPointListNew(PointSearchAdm search) { + // TODO Auto-generated method stub + return pointDao.getAdminPointListNew(search); + } + + @Override + public List> getPointBotRateList(PointSearchAdm search) { + // TODO Auto-generated method stub + return pointDao.getPointBotRateList(search); + } + + @Override + public List> getPointBotMultiRateList(PointSearchAdm search) { + // TODO Auto-generated method stub + return pointDao.getPointBotMultiRateList(search); + } + + @Override + public long pointInsert(Point point) { + // TODO Auto-generated method stub + return pointDao.pointInsert(point); + } + +} diff --git a/src/main/java/com/bb/service/RateService.java b/src/main/java/com/bb/service/RateService.java new file mode 100644 index 0000000..18b619b --- /dev/null +++ b/src/main/java/com/bb/service/RateService.java @@ -0,0 +1,24 @@ +package com.bb.service; + +import java.util.HashMap; +import java.util.List; + +import com.bb.model.Member; +import com.bb.model.MemberSearch; +import com.bb.model.RateInfo; +import com.bb.model.RateVO; + +public interface RateService { + + List> getMemRollingInfo(Member search); + + void rateInfoUpdate(RateInfo rateInfo); + + List getTopRate(MemberSearch search); + + int myRateInfoUpdate(RateVO rateVO); + + int topMinRateInfoUpdate(RateVO rateVO); + + int botMaxRateInfoUpdate(RateVO rateVO); +} diff --git a/src/main/java/com/bb/service/RateServiceImpl.java b/src/main/java/com/bb/service/RateServiceImpl.java new file mode 100644 index 0000000..936449b --- /dev/null +++ b/src/main/java/com/bb/service/RateServiceImpl.java @@ -0,0 +1,72 @@ +package com.bb.service; + +import java.util.HashMap; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.bb.dao.CashDao; +import com.bb.dao.RateDao; +import com.bb.dao.UserDao; +import com.bb.model.Member; +import com.bb.model.MemberSearch; +import com.bb.model.RateInfo; +import com.bb.model.RateVO; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RequiredArgsConstructor +@Service +public class RateServiceImpl implements RateService { + + private final RateDao rateDao; + + @Override + public List> getMemRollingInfo(Member search) { + return rateDao.getMemRollingInfo(search); + } + + @Override + public void rateInfoUpdate(RateInfo rateInfo) { + for(RateVO rateVO : rateInfo.getRateList()) { + log.info("#-rateInfoUpdate::myRateInfoUpdate::"+rateInfo.getSiteId()+"::"+rateInfo.getMemId()+"::rateVO::"+rateVO.toString()); + int myUpdateResult = rateDao.myRateInfoUpdate(rateVO); + log.info("#-rateInfoUpdate::myRateInfoUpdate::"+rateInfo.getSiteId()+"::"+rateInfo.getMemId()+"::myUpdateResult::"+myUpdateResult); + + log.info("#-rateInfoUpdate::topMinRateInfoUpdate::"+rateInfo.getSiteId()+"::"+rateInfo.getMemId()+"::rateVO::"+rateVO.toString()); + int topMinUpdateResult = rateDao.topMinRateInfoUpdate(rateVO); + log.info("#-rateInfoUpdate::topMinRateInfoUpdate::"+rateInfo.getSiteId()+"::"+rateInfo.getMemId()+"::topMinUpdateResult::"+topMinUpdateResult); + + log.info("#-rateInfoUpdate::botMaxRateInfoUpdate::"+rateInfo.getSiteId()+"::"+rateInfo.getMemId()+"::rateVO::"+rateVO.toString()); + int botMaxUpdateResult = rateDao.botMaxRateInfoUpdate(rateVO); + log.info("#-rateInfoUpdate::botMaxRateInfoUpdate::"+rateInfo.getSiteId()+"::"+rateInfo.getMemId()+"::botMaxUpdateResult::"+botMaxUpdateResult); + } + } + + @Override + public List getTopRate(MemberSearch search) { + // TODO Auto-generated method stub + return rateDao.getTopRate(search); + } + + @Override + public int myRateInfoUpdate(RateVO rateVO) { + // TODO Auto-generated method stub + return rateDao.myRateInfoUpdate(rateVO); + } + + @Override + public int topMinRateInfoUpdate(RateVO rateVO) { + // TODO Auto-generated method stub + return rateDao.topMinRateInfoUpdate(rateVO); + } + + @Override + public int botMaxRateInfoUpdate(RateVO rateVO) { + // TODO Auto-generated method stub + return rateDao.botMaxRateInfoUpdate(rateVO); + } +} diff --git a/src/main/java/com/bb/service/ReportService.java b/src/main/java/com/bb/service/ReportService.java new file mode 100644 index 0000000..dd6c985 --- /dev/null +++ b/src/main/java/com/bb/service/ReportService.java @@ -0,0 +1,51 @@ +package com.bb.service; + +import java.util.HashMap; +import java.util.List; + +import jakarta.validation.Valid; + +import com.bb.model.As; +import com.bb.model.DailyReportSearch; +import com.bb.model.DayilPartnerReport; +import com.bb.model.DayilPeriodicReports; +import com.bb.model.ReportSearch; + +public interface ReportService { + + int getReportMemwlListCnt(@Valid ReportSearch search); + List getReportMemwlList(@Valid ReportSearch search); + HashMap getPeriodCash(@Valid ReportSearch search); + List getPeriodRollPoint(@Valid ReportSearch search); + List getPeriodWlAmt(@Valid ReportSearch search); + List getGameTypeList(@Valid ReportSearch search); + List> getDayList(ReportSearch search); + HashMap getDayTotal(ReportSearch search); + int getReportTradeListCnt(@Valid ReportSearch search); + List getReportTradeList(@Valid ReportSearch search); + int getReportPartnerListCnt(@Valid ReportSearch search); + List getReportPartnerList(@Valid ReportSearch search); + int getReportPayListCnt(@Valid ReportSearch search); + List getReportPayList(@Valid ReportSearch search); + + int getReportsListCntForAdmin(DailyReportSearch search); + List getReportsListForAdmin(DailyReportSearch search); + DayilPeriodicReports getReportsTotalForAdmin(DailyReportSearch search); + + int getReportsByUserListCntForAdmin(DailyReportSearch search); + List getReportsByUserListForAdmin(DailyReportSearch search); + DayilPeriodicReports getReportsByUserTotalForAdmin(DailyReportSearch search); + + + List getReportsListForPartner(DailyReportSearch search); + DayilPeriodicReports getReportsTotalForPartner(DailyReportSearch search); + + int getReportsByUserListCntForPartner(DailyReportSearch search); + List getReportsByUserListForPartner(DailyReportSearch search); + DayilPeriodicReports getReportsByUserTotalForPartner(DailyReportSearch search); + + HashMap getPartnerInfo(DailyReportSearch search); + List getDayilPartnerReport(DailyReportSearch search); + + List> getReportCateInfo(String siteId); +} diff --git a/src/main/java/com/bb/service/ReportServiceImpl.java b/src/main/java/com/bb/service/ReportServiceImpl.java new file mode 100644 index 0000000..4b35373 --- /dev/null +++ b/src/main/java/com/bb/service/ReportServiceImpl.java @@ -0,0 +1,237 @@ +package com.bb.service; + +import java.util.HashMap; +import java.util.List; + +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.bb.dao.CashDao; +import com.bb.dao.ReportDao; +import com.bb.dao.UserDao; +import com.bb.model.As; +import com.bb.model.DailyReportSearch; +import com.bb.model.DayilPartnerReport; +import com.bb.model.DayilPeriodicReports; +import com.bb.model.ReportSearch; +@RequiredArgsConstructor +@Service +public class ReportServiceImpl implements ReportService{ + + @Autowired + private ReportDao reportDao; + + @Override + public int getReportMemwlListCnt(@Valid ReportSearch search) { + // TODO Auto-generated method stub + return reportDao.getReportMemwlListCnt(search); + } + + @Override + public List getReportMemwlList(@Valid ReportSearch search) { + // TODO Auto-generated method stub + return reportDao.getReportMemwlList(search); + } + + @Override + public HashMap getPeriodCash(@Valid ReportSearch search) { + // TODO Auto-generated method stub + return reportDao.getPeriodCash(search); + } + + @Override + public List getPeriodRollPoint(@Valid ReportSearch search) { + // TODO Auto-generated method stub + return reportDao.getPeriodRollPoint(search); + } + + @Override + public List getPeriodWlAmt(@Valid ReportSearch search) { + // TODO Auto-generated method stub + return reportDao.getPeriodWlAmt(search); + } + + @Override + public List getGameTypeList(@Valid ReportSearch search) { + // TODO Auto-generated method stub + return reportDao.getGameTypeList(search); + } + + @Override + public List> getDayList(ReportSearch search) { + // TODO Auto-generated method stub + return reportDao.getDayList(search); + } + + @Override + public HashMap getDayTotal(ReportSearch search) { + // TODO Auto-generated method stub + return reportDao.getDayTotal(search); + } + + @Override + public int getReportTradeListCnt(@Valid ReportSearch search) { + // TODO Auto-generated method stub + return reportDao.getReportTradeListCnt(search); + } + + @Override + public List getReportTradeList(@Valid ReportSearch search) { + // TODO Auto-generated method stub + return reportDao.getReportTradeList(search); + } + + @Override + public int getReportPartnerListCnt(@Valid ReportSearch search) { + return reportDao.getReportPartnerListCnt(search); + } + + @Override + public List getReportPartnerList(@Valid ReportSearch search) { + // TODO Auto-generated method stub + List reportPartnerList = reportDao.getReportPartnerList(search); + for(HashMap partner :reportPartnerList) { + List reportPartnerGroupBet = reportDao.getReportPartnerGroupBet(partner); + partner.put("betList", reportPartnerGroupBet); + } + + return reportPartnerList; + } + + @Override + public int getReportPayListCnt(@Valid ReportSearch search) { + // TODO Auto-generated method stub + return reportDao.getReportPayListCnt(search); + } + + @Override + public List getReportPayList(@Valid ReportSearch search) { + // TODO Auto-generated method stub + List reportPayList = reportDao.getReportPayList(search); + for(HashMap pay :reportPayList) { + + List reportPartnerGroupBet = reportDao.getReportPayGroupGameType(pay); + pay.put("payList", reportPartnerGroupBet); + } + + return reportPayList; + } + + + + @Override + public int getReportsListCntForAdmin(DailyReportSearch search) { + // TODO Auto-generated method stub + int cnt = reportDao.getReportsListCntForAdmin(search); + + return cnt; + } + + @Override + public List getReportsListForAdmin(DailyReportSearch search) { + // TODO Auto-generated method stub + List list = reportDao.getReportsListForAdmin(search); + + return list; + } + + @Override + public DayilPeriodicReports getReportsTotalForAdmin(DailyReportSearch search) { + // TODO Auto-generated method stub + DayilPeriodicReports total = total = reportDao.getReportsTotalForAdmin(search); + if(search.getSearchType().equals("OUTER")) { + String cnt = reportDao.getReportsTotalCntForAdmin(search); + total.setCntBottom(cnt); + } + + return total; + } + + + + @Override + public int getReportsByUserListCntForAdmin(DailyReportSearch search) { + // TODO Auto-generated method stub + return reportDao.getReportsByUserListCntForAdmin(search); + } + + @Override + public List getReportsByUserListForAdmin(DailyReportSearch search) { + // TODO Auto-generated method stub + return reportDao.getReportsByUserListForAdmin(search); + } + + @Override + public DayilPeriodicReports getReportsByUserTotalForAdmin(DailyReportSearch search) { + // TODO Auto-generated method stub + return reportDao.getReportsByUserTotalForAdmin(search); + } + + + + + @Override + public List getReportsListForPartner(DailyReportSearch search) { + // TODO Auto-generated method stub + List list = reportDao.getReportsListForPartner(search); + + return list; + } + + @Override + public DayilPeriodicReports getReportsTotalForPartner(DailyReportSearch search) { + // TODO Auto-generated method stub + DayilPeriodicReports total = total = reportDao.getReportsTotalForPartner(search); + if(search.getSearchType().equals("OUTER")) { + String cnt = reportDao.getReportsTotalCntForPartner(search); + total.setCntBottom(cnt); + } + return total; + } + + + + @Override + public int getReportsByUserListCntForPartner(DailyReportSearch search) { + // TODO Auto-generated method stub + return reportDao.getReportsByUserListCntForPartner(search); + } + + @Override + public List getReportsByUserListForPartner(DailyReportSearch search) { + // TODO Auto-generated method stub + return reportDao.getReportsByUserListForPartner(search); + } + + @Override + public DayilPeriodicReports getReportsByUserTotalForPartner(DailyReportSearch search) { + // TODO Auto-generated method stub + return reportDao.getReportsByUserTotalForPartner(search); + } + + + + @Override + public HashMap getPartnerInfo(DailyReportSearch search) { + // TODO Auto-generated method stub + return reportDao.getPartnerInfo(search); + } + + @Override + public List getDayilPartnerReport(DailyReportSearch search) { + // TODO Auto-generated method stub + return reportDao.getDayilPartnerReport(search); + } + + + + @Override + public List> getReportCateInfo(String siteId) { + // TODO Auto-generated method stub + return reportDao.getReportCateInfo(siteId); + } + +} diff --git a/src/main/java/com/bb/service/RetailService.java b/src/main/java/com/bb/service/RetailService.java new file mode 100644 index 0000000..7e062fe --- /dev/null +++ b/src/main/java/com/bb/service/RetailService.java @@ -0,0 +1,169 @@ +package com.bb.service; + +import java.util.HashMap; +import java.util.List; + +import jakarta.validation.Valid; + +import com.bb.model.BotMemRateVo; +import com.bb.model.CategoryRateVo; +import com.bb.model.ChargingPointSettingVO; +import com.bb.model.LoginUserVO; +import com.bb.model.Member; +import com.bb.model.MemberListSearch; +import com.bb.model.MemberSearch; +import com.bb.model.NewMemRateItem; +import com.bb.model.PartnerListVO; +import com.bb.model.RetailListSearch; +import com.bb.model.RetailLowerSearch; +import com.bb.model.RetailPointSearch; +import com.bb.model.RetailSearch; +import com.bb.model.RetailSet; +import com.bb.model.UserDetailInfo; +import com.bb.model.UserListSearch; +import com.bb.model.UserSearch; + +public interface RetailService { + + int getRetailListCnt(@Valid RetailSearch search); + + List getRetailList(@Valid RetailSearch search); + + int getRetailListCnt2(@Valid RetailSearch search); + + List getRetailList2(@Valid RetailSearch search); + + void settingSave(@Valid RetailSet retailSet); + + int getRetailSettingListCnt(@Valid RetailSearch search); + + List getRetailSettingList(@Valid RetailSearch search); + + List getRetailBalanceList(@Valid RetailSearch search); + + int getRetailBalanceListCnt(@Valid RetailSearch search); + + + + int retailDetailListCnt(@Valid RetailSearch search); + + List retailDetailList(@Valid RetailSearch search); + + int retailSummryListCnt(@Valid RetailSearch search); + + List retailSummryList(@Valid RetailSearch search); + + List retailBalanceDetail(@Valid RetailSearch search); + + + List getMyBetPointInfo(@Valid RetailSearch search); + + HashMap getMySummary(RetailSearch search); + + HashMap getMySummaryNew(RetailSearch search); + + HashMap getMyCashInfo(@Valid RetailSearch search); + + List getMyLoginMem(@Valid RetailSearch search); + + void setPoint(@Valid RetailSearch search); + + List myMemIds(Member search); + + List getMyCategoryRateList(MemberSearch search); + + List getBotCategoryRateList(List myCategoryRateList, MemberSearch search); + + void updateRate(List rateVo); + + void updateRate(BotMemRateVo rateVo); + + void updateRateAdmin(BotMemRateVo rateVo); + + List getMyUnderPartnerLevels(Member search); + + int getMyMemListCnt(RetailSearch search); + + List getMyMemList(RetailSearch search); + + int getMyMemDirectListCnt(RetailSearch search); + + List getMyMemDirectList(RetailSearch search); + + int getMyPartnerListCnt(RetailSearch search); + + List getMyPartnerList(RetailSearch search); + + List getMyPartnerList2(RetailSearch search); + + List getMyPartnerDirectList(RetailSearch search); + + int partnerBonusSettingSave(ChargingPointSettingVO settingVO); + + int getRetailPointListCnt(RetailPointSearch search); + + List getRetailPointList(RetailPointSearch search); + + List getPartnerHierarchy(RetailSearch search); + + List> getBottomRateList(Member search); + + int userLockWithBottom(HashMap param); + + HashMap getBotCashInfo(RetailSearch search); + + List getListRateInfo(RetailSearch search); + + int getMyLoginMemListCnt(MemberListSearch search); + + List getMyLoginMemList(MemberListSearch search); + + HashMap getPartnerInfo(RetailSearch search); + + String getNextTargetLevel(RetailLowerSearch param); + + int getLowerPartnerListCnt(RetailLowerSearch search); + + List> getLowerPartnerList(RetailLowerSearch search); + + UserDetailInfo getUserDetailInfo(UserSearch search); + + int setUserDetailInfo(UserDetailInfo info); + + List> getDetailLoginLog(UserSearch search); + + int getDetailMsgLogCnt(UserListSearch search); + + List> getDetailMsgLog(UserListSearch search); + + int getDetailCashLogCnt(UserListSearch search); + + List> getDetailCashLog(UserListSearch search); + + int getDetailRollingLogCnt(UserListSearch search); + + List> getDetailRollingLog(UserListSearch search); + + List> getDetailRollingLogNew(UserListSearch search); + + List getPartnerHierarchy2(RetailSearch search); + + HashMap getMyBetStatData(UserSearch search); + + List> getBottomBetStatList(UserSearch search); + + HashMap getBottomBetStatSum(UserSearch search); + + List> getDailyBetList(UserSearch search); + + HashMap getDailyBetSum(UserSearch search); + + List> getDailyUserList(UserSearch search); + + HashMap getDailyUserSum(UserSearch search); + + List> getDailyPartnerList(UserSearch search); + + int getBotCnt(Member searchBot); + +} diff --git a/src/main/java/com/bb/service/RetailServiceImpl.java b/src/main/java/com/bb/service/RetailServiceImpl.java new file mode 100644 index 0000000..d9a0019 --- /dev/null +++ b/src/main/java/com/bb/service/RetailServiceImpl.java @@ -0,0 +1,910 @@ +package com.bb.service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import jakarta.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.bb.dao.CashDao; +import com.bb.dao.RateDao; +import com.bb.dao.RetailDao; +import com.bb.dao.UserDao; +import com.bb.model.BotMemRateVo; +import com.bb.model.CategoryRateVo; +import com.bb.model.ChargingPointSettingVO; +import com.bb.model.LoginUserVO; +import com.bb.model.Member; +import com.bb.model.MemberListSearch; +import com.bb.model.MemberSearch; +import com.bb.model.MultipleRate; +import com.bb.model.MultipleRateInfo; +import com.bb.model.NewMemRateItem; +import com.bb.model.PartnerListVO; +import com.bb.model.RetailLowerSearch; +import com.bb.model.RetailPointSearch; +import com.bb.model.RetailSearch; +import com.bb.model.RetailSet; +import com.bb.model.UserDetailInfo; +import com.bb.model.UserListSearch; +import com.bb.model.UserSearch; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RequiredArgsConstructor +@Service +public class RetailServiceImpl implements RetailService { + + + private final RetailDao retailDao; + + private final UserDao userDao; + + private final CashDao cashDao; + + private final RateDao rateDao; + + @Override + public int getRetailListCnt(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return retailDao.getRetailListCnt(search); + } + + @Override + public List getRetailList(@Valid RetailSearch search) { + + List retailList = retailDao.getRetailList(search); + for(HashMap user : retailList) { + Member param = new Member(); + param.setSiteId(user.get("siteId").toString()); + param.setMemId(user.get("memId").toString()); + System.out.println(user.get("memId")); + List> memRollingInfo = rateDao.getMemRollingInfo(param); + for(HashMap rateItem : memRollingInfo) { + MultipleRateInfo multipleRateInfo = null; + if(rateItem.get("detailSetYn").toString().equals("Y")) { + // 요율 세부설정 값 + multipleRateInfo = new MultipleRateInfo(); + multipleRateInfo.setSiteId(rateItem.get("siteId").toString()); + multipleRateInfo.setMemId(rateItem.get("memId").toString()); + multipleRateInfo.setVendorCode(rateItem.get("cateCode").toString()); + List multipleRate = userDao.getMultipleRateList(multipleRateInfo); + multipleRateInfo.setRateList(multipleRate); + rateItem.put("multipleRateInfo", multipleRateInfo); + } else { + rateItem.put("multipleRateInfo", multipleRateInfo); + } + } + + user.put("memRollingInfo", memRollingInfo); + } + + return retailList; + } + + @Override + public int getRetailListCnt2(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return retailDao.getRetailListCnt2(search); + } + + @Override + public List getRetailList2(@Valid RetailSearch search) { + + List retailList = retailDao.getRetailList2(search); + for(PartnerListVO user : retailList) { + Member param = new Member(); + param.setSiteId(user.getSiteId()); + param.setMemId(user.getMemId()); + user.setTopUserList(userDao.getTopUserList2(param)); + user.setTotalInfo(userDao.getTotalInfo(param)); + } + + return retailList; + } + + @Override + public void settingSave(@Valid RetailSet retailSet) { + // TODO Auto-generated method stub + retailDao.settingSave(retailSet); + } + + @Override + public int getRetailSettingListCnt(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return retailDao.getRetailSettingListCnt(search); + } + + + @Override + public List getRetailSettingList(@Valid RetailSearch search) { + + List retailSettingList = retailDao.getRetailSettingList(search); + + for(HashMap retail:retailSettingList) { + Member re = new Member(); + re.setMemId(retail.get("memId").toString()); + re.setSiteId(retail.get("siteId").toString()); + //MemberDetail loginMember= userService.getMember(search); + retail.put("rateList", userDao.getMemberRate(re)); + } + + return retailSettingList; + } + + @Override + public List getRetailBalanceList(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return retailDao.getRetailBalanceList(search); + } + + @Override + public int getRetailBalanceListCnt(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return retailDao.getRetailBalanceListCnt(search); + } + + @Override + public int retailDetailListCnt(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return retailDao.retailDetailListCnt(search); + } + + @Override + public List retailDetailList(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return retailDao.retailDetailList(search); + + + } + + @Override + public int retailSummryListCnt(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return retailDao.retailSummryListCnt(search); + } + + @Override + public List retailSummryList(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return retailDao.retailSummryList(search); + } + + @Override + public List retailBalanceDetail(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return retailDao.retailBalanceDetail(search); + } + + @Override + public List getMyBetPointInfo(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return retailDao.getMyBetPointInfo(search); + } + + @Override + public HashMap getMySummary(RetailSearch search) { + // TODO Auto-generated method stub + return retailDao.getMySummary(search); + } + + @Override + public HashMap getMySummaryNew(RetailSearch search) { + // TODO Auto-generated method stub + return retailDao.getMySummaryNew(search); + } + + @Override + public HashMap getMyCashInfo(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return retailDao.getMyCashInfo(search); + } + + @Override + public List getMyLoginMem(@Valid RetailSearch search) { + // TODO Auto-generated method stub + return retailDao.getMyLoginMem(search); + } + + @Override + public void setPoint(@Valid RetailSearch search) { + // TODO Auto-generated method stub + + long pointSum = retailDao.getRetailBalcePoint(search); + + System.out.println(pointSum); + + retailDao.updateRetailPointStatus(search); + + + Map param = new HashMap(); + param.put("siteId", search.getSiteId()); + param.put("memId", search.getMemId()); + param.put("pointAmt", pointSum); + cashDao.updateMemPoint(param); + } + + @Override + public List myMemIds(Member search) { + // TODO Auto-generated method stub + return retailDao.myMemIds(search); + } + + @Override + public List getMyCategoryRateList(MemberSearch search) { + // TODO Auto-generated method stub + return retailDao.getMyCategoryRateList(search); + } + + @Override + public List getBotCategoryRateList(List myCategoryRateList, MemberSearch search) { + // TODO Auto-generated method stub + List botCategoryRateList = retailDao.getBotCategoryRateList(search); + for(CategoryRateVo bot : botCategoryRateList) { + for(CategoryRateVo my : myCategoryRateList) { + if(my.getCategory().equals(bot.getCategory())) { + bot.setMaxPointRate(my.getPointRate()); + bot.setMaxLoseRate(my.getLoseRate()); + } + } + } + + return botCategoryRateList; + } + + @Override + public void updateRate(List rateVo) { + // TODO Auto-generated method stub + for(BotMemRateVo item : rateVo) { + if((item.getCasinoPR() != null && !item.getCasinoPR().equals("")) + || (item.getCasinoLR() != null && !item.getCasinoLR().equals(""))) { + int casinoResult = retailDao.updateCasinoRate(item); + + HashMap updParam = new HashMap<>(); + updParam.put("siteId", item.getSiteId()); + updParam.put("memId", item.getMemId()); + updParam.put("gameCategory", "casino"); + updParam.put("gameCategoryEn", "CASINO"); + updParam.put("pointRate", item.getCasinoPR()); + updParam.put("loseRate", item.getCasinoLR()); + int result2 = userDao.updateTopMinRate(updParam); + int result3 = userDao.updateBottomMaxRate(updParam); + log.info("#-retail::list::updateRate::"+item.getSiteId()+"::"+item.getMemId()+"::CASINO::pointRate::"+item.getCasinoPR()+"::loseRate::"+item.getCasinoLR()+"::result::"+casinoResult); + } + + if((item.getHcasinoPR() != null && !item.getHcasinoPR().equals("")) + || (item.getHcasinoLR() != null && !item.getHcasinoLR().equals(""))) { + int hcasinoResult = retailDao.updateHcasinoRate(item); + + HashMap updParam = new HashMap<>(); + updParam.put("siteId", item.getSiteId()); + updParam.put("memId", item.getMemId()); + updParam.put("gameCategory", "casino"); + updParam.put("gameCategoryEn", "HC-CASINO"); + updParam.put("pointRate", item.getHcasinoPR()); + updParam.put("loseRate", item.getHcasinoLR()); + int result2 = userDao.updateTopMinRate(updParam); + int result3 = userDao.updateBottomMaxRate(updParam); + log.info("#-retail::list::updateRate::"+item.getSiteId()+"::"+item.getMemId()+"::HCASINO::pointRate::"+item.getHcasinoPR()+"::loseRate::"+item.getHcasinoLR()+"::result::"+hcasinoResult); + } + + if((item.getSlotPR() != null && !item.getSlotPR().equals("")) + || (item.getSlotLR() != null && !item.getSlotLR().equals(""))) { + int slotResult = retailDao.updateSlotRate(item); + + HashMap updParam = new HashMap<>(); + updParam.put("siteId", item.getSiteId()); + updParam.put("memId", item.getMemId()); + updParam.put("gameCategory", "slot"); + updParam.put("gameCategoryEn", "SLOT"); + updParam.put("pointRate", item.getSlotPR()); + updParam.put("loseRate", item.getSlotLR()); + int result2 = userDao.updateTopMinRate(updParam); + int result3 = userDao.updateBottomMaxRate(updParam); + log.info("#-retail::list::updateRate::"+item.getSiteId()+"::"+item.getMemId()+"::SLOT::pointRate::"+item.getSlotPR()+"::loseRate::"+item.getSlotLR()+"::result::"+slotResult); + } + + if((item.getMiniPR() != null && !item.getMiniPR().equals("")) + || (item.getMiniLR() != null && !item.getMiniLR().equals(""))) { + int miniResult = retailDao.updateMiniRate(item); + + HashMap updParam = new HashMap<>(); + updParam.put("siteId", item.getSiteId()); + updParam.put("memId", item.getMemId()); + updParam.put("gameCategory", "minigame"); + updParam.put("gameCategoryEn", "MINI-GAME"); + updParam.put("pointRate", item.getMiniPR()); + updParam.put("loseRate", item.getMiniLR()); + int result2 = userDao.updateTopMinRate(updParam); + int result3 = userDao.updateBottomMaxRate(updParam); + log.info("#-retail::list::updateRate::"+item.getSiteId()+"::"+item.getMemId()+"::MINIGAME::pointRate::"+item.getMiniPR()+"::loseRate::"+item.getMiniLR()+"::result::"+miniResult); + } + + if((item.getSportPR() != null && !item.getSportPR().equals("")) + || (item.getSportLR() != null && !item.getSportLR().equals(""))) { + int sportResult = retailDao.updateSportRate(item); + + HashMap updParam = new HashMap<>(); + updParam.put("siteId", item.getSiteId()); + updParam.put("memId", item.getMemId()); + updParam.put("gameCategory", "sport"); + updParam.put("gameCategoryEn", "SPORTS"); + updParam.put("pointRate", item.getSportPR()); + updParam.put("loseRate", item.getSportLR()); + int result2 = userDao.updateTopMinRate(updParam); + int result3 = userDao.updateBottomMaxRate(updParam); + log.info("#-retail::list::updateRate::"+item.getSiteId()+"::"+item.getMemId()+"::SPORT::pointRate::"+item.getMiniPR()+"::loseRate::"+item.getMiniLR()+"::result::"+sportResult); + } + } + } + + @Override + public void updateRate(BotMemRateVo rateVo) { + // TODO Auto-generated method stub + if((rateVo.getCasinoPR() != null && !rateVo.getCasinoPR().equals("")) + || (rateVo.getCasinoLR() != null && !rateVo.getCasinoLR().equals(""))) { + int casinoResult = retailDao.updateCasinoRate(rateVo); + + HashMap updParam = new HashMap<>(); + updParam.put("siteId", rateVo.getSiteId()); + updParam.put("memId", rateVo.getMemId()); + updParam.put("gameCategory", "casino"); + updParam.put("gameCategoryEn", "CASINO"); + updParam.put("pointRate", rateVo.getCasinoPR()); + updParam.put("loseRate", rateVo.getCasinoLR()); + int result2 = userDao.updateTopMinRate(updParam); + int result3 = userDao.updateBottomMaxRate(updParam); + log.info("#-retail::updateRate::"+rateVo.getSiteId()+"::"+rateVo.getMemId()+"::CASINO::pointRate::"+rateVo.getCasinoPR()+"::loseRate::"+rateVo.getCasinoLR()+"::result::"+casinoResult); + } + + if((rateVo.getHcasinoPR() != null && !rateVo.getHcasinoPR().equals("")) + || (rateVo.getHcasinoLR() != null && !rateVo.getHcasinoLR().equals(""))) { + int hcasinoResult = retailDao.updateHcasinoRate(rateVo); + + HashMap updParam = new HashMap<>(); + updParam.put("siteId", rateVo.getSiteId()); + updParam.put("memId", rateVo.getMemId()); + updParam.put("gameCategory", "casino"); + updParam.put("gameCategoryEn", "HC-CASINO"); + updParam.put("pointRate", rateVo.getHcasinoPR()); + updParam.put("loseRate", rateVo.getHcasinoLR()); + int result2 = userDao.updateTopMinRate(updParam); + int result3 = userDao.updateBottomMaxRate(updParam); + log.info("#-retail::updateRate::"+rateVo.getSiteId()+"::"+rateVo.getMemId()+"::HCASINO::pointRate::"+rateVo.getHcasinoPR()+"::loseRate::"+rateVo.getHcasinoLR()+"::result::"+hcasinoResult); + } + + if((rateVo.getSlotPR() != null && !rateVo.getSlotPR().equals("")) + || (rateVo.getSlotLR() != null && !rateVo.getSlotLR().equals(""))) { + int slotResult = retailDao.updateSlotRate(rateVo); + + HashMap updParam = new HashMap<>(); + updParam.put("siteId", rateVo.getSiteId()); + updParam.put("memId", rateVo.getMemId()); + updParam.put("gameCategory", "slot"); + updParam.put("gameCategoryEn", "SLOT"); + updParam.put("pointRate", rateVo.getSlotPR()); + updParam.put("loseRate", rateVo.getSlotLR()); + int result2 = userDao.updateTopMinRate(updParam); + int result3 = userDao.updateBottomMaxRate(updParam); + log.info("#-retail::updateRate::"+rateVo.getSiteId()+"::"+rateVo.getMemId()+"::SLOT::pointRate::"+rateVo.getSlotPR()+"::loseRate::"+rateVo.getSlotLR()+"::result::"+slotResult); + } + + if((rateVo.getMiniPR() != null && !rateVo.getMiniPR().equals("")) + || (rateVo.getMiniLR() != null && !rateVo.getMiniLR().equals(""))) { + int miniResult = retailDao.updateMiniRate(rateVo); + + HashMap updParam = new HashMap<>(); + updParam.put("siteId", rateVo.getSiteId()); + updParam.put("memId", rateVo.getMemId()); + updParam.put("gameCategory", "minigame"); + updParam.put("gameCategoryEn", "MINI-GAME"); + updParam.put("pointRate", rateVo.getMiniPR()); + updParam.put("loseRate", rateVo.getMiniLR()); + int result2 = userDao.updateTopMinRate(updParam); + int result3 = userDao.updateBottomMaxRate(updParam); + log.info("#-retail::updateRate::"+rateVo.getSiteId()+"::"+rateVo.getMemId()+"::MINIGAME::pointRate::"+rateVo.getMiniPR()+"::loseRate::"+rateVo.getMiniLR()+"::result::"+miniResult); + } + + if((rateVo.getSportPR() != null && !rateVo.getSportPR().equals("")) + || (rateVo.getSportLR() != null && !rateVo.getSportLR().equals(""))) { + int sportResult = retailDao.updateSportRate(rateVo); + + HashMap updParam = new HashMap<>(); + updParam.put("siteId", rateVo.getSiteId()); + updParam.put("memId", rateVo.getMemId()); + updParam.put("gameCategory", "sport"); + updParam.put("gameCategoryEn", "SPORTS"); + updParam.put("pointRate", rateVo.getSportPR()); + updParam.put("loseRate", rateVo.getSportLR()); + int result2 = userDao.updateTopMinRate(updParam); + int result3 = userDao.updateBottomMaxRate(updParam); + log.info("#-retail::updateRate::"+rateVo.getSiteId()+"::"+rateVo.getMemId()+"::SPORT::pointRate::"+rateVo.getMiniPR()+"::loseRate::"+rateVo.getMiniLR()+"::result::"+sportResult); + } + } + + @Override + public void updateRateAdmin(BotMemRateVo rateVo) { + // TODO Auto-generated method stub + if((rateVo.getCasinoPR() != null && !rateVo.getCasinoPR().equals("")) + || (rateVo.getCasinoLR() != null && !rateVo.getCasinoLR().equals(""))) { + int casinoResult = retailDao.updateCasinoRate(rateVo); + + HashMap updParam = new HashMap<>(); + updParam.put("siteId", rateVo.getSiteId()); + updParam.put("memId", rateVo.getMemId()); + updParam.put("gameCategory", "casino"); + updParam.put("gameCategoryEn", "CASINO"); + updParam.put("pointRate", rateVo.getCasinoPR()); + updParam.put("loseRate", rateVo.getCasinoLR()); + int result2 = userDao.updateTopMinRate(updParam); + int result3 = userDao.updateBottomMaxRate(updParam); + log.info("#-retail::updateRateAdmin::"+rateVo.getSiteId()+"::"+rateVo.getMemId()+"::CASINO::pointRate::"+rateVo.getCasinoPR()+"::loseRate::"+rateVo.getCasinoLR()+"::result::"+casinoResult); + } + + if((rateVo.getHcasinoPR() != null && !rateVo.getHcasinoPR().equals("")) + || (rateVo.getHcasinoLR() != null && !rateVo.getHcasinoLR().equals(""))) { + int hcasinoResult = retailDao.updateHcasinoRate(rateVo); + + HashMap updParam = new HashMap<>(); + updParam.put("siteId", rateVo.getSiteId()); + updParam.put("memId", rateVo.getMemId()); + updParam.put("gameCategory", "casino"); + updParam.put("gameCategoryEn", "HC-CASINO"); + updParam.put("pointRate", rateVo.getHcasinoPR()); + updParam.put("loseRate", rateVo.getHcasinoLR()); + int result2 = userDao.updateTopMinRate(updParam); + int result3 = userDao.updateBottomMaxRate(updParam); + log.info("#-retail::updateRateAdmin::"+rateVo.getSiteId()+"::"+rateVo.getMemId()+"::HCASINO::pointRate::"+rateVo.getHcasinoPR()+"::loseRate::"+rateVo.getHcasinoLR()+"::result::"+hcasinoResult); + } + + if((rateVo.getSlotPR() != null && !rateVo.getSlotPR().equals("")) + || (rateVo.getSlotLR() != null && !rateVo.getSlotLR().equals(""))) { + int slotResult = retailDao.updateSlotRate(rateVo); + + HashMap updParam = new HashMap<>(); + updParam.put("siteId", rateVo.getSiteId()); + updParam.put("memId", rateVo.getMemId()); + updParam.put("gameCategory", "slot"); + updParam.put("gameCategoryEn", "SLOT"); + updParam.put("pointRate", rateVo.getSlotPR()); + updParam.put("loseRate", rateVo.getSlotLR()); + int result2 = userDao.updateTopMinRate(updParam); + int result3 = userDao.updateBottomMaxRate(updParam); + log.info("#-retail::updateRateAdmin::"+rateVo.getSiteId()+"::"+rateVo.getMemId()+"::SLOT::pointRate::"+rateVo.getSlotPR()+"::loseRate::"+rateVo.getSlotLR()+"::result::"+slotResult); + } + + if((rateVo.getMiniPR() != null && !rateVo.getMiniPR().equals("")) + || (rateVo.getMiniLR() != null && !rateVo.getMiniLR().equals(""))) { + int miniResult = retailDao.updateMiniRate(rateVo); + + HashMap updParam = new HashMap<>(); + updParam.put("siteId", rateVo.getSiteId()); + updParam.put("memId", rateVo.getMemId()); + updParam.put("gameCategory", "minigame"); + updParam.put("gameCategoryEn", "MINI-GAME"); + updParam.put("pointRate", rateVo.getMiniPR()); + updParam.put("loseRate", rateVo.getMiniLR()); + int result2 = userDao.updateTopMinRate(updParam); + int result3 = userDao.updateBottomMaxRate(updParam); + log.info("#-retail::updateRateAdmin::"+rateVo.getSiteId()+"::"+rateVo.getMemId()+"::MINIGAME::pointRate::"+rateVo.getMiniPR()+"::loseRate::"+rateVo.getMiniLR()+"::result::"+miniResult); + } + + if((rateVo.getSportPR() != null && !rateVo.getSportPR().equals("")) + || (rateVo.getSportLR() != null && !rateVo.getSportLR().equals(""))) { + int sportResult = retailDao.updateSportRate(rateVo); + + HashMap updParam = new HashMap<>(); + updParam.put("siteId", rateVo.getSiteId()); + updParam.put("memId", rateVo.getMemId()); + updParam.put("gameCategory", "sport"); + updParam.put("gameCategoryEn", "SPORTS"); + updParam.put("pointRate", rateVo.getSportPR()); + updParam.put("loseRate", rateVo.getSportLR()); + int result2 = userDao.updateTopMinRate(updParam); + int result3 = userDao.updateBottomMaxRate(updParam); + log.info("#-retail::updateRateAdmin::"+rateVo.getSiteId()+"::"+rateVo.getMemId()+"::SPORT::pointRate::"+rateVo.getMiniPR()+"::loseRate::"+rateVo.getMiniLR()+"::result::"+sportResult); + } + } + + @Override + public List getMyUnderPartnerLevels(Member search) { + // TODO Auto-generated method stub + return retailDao.getMyUnderPartnerLevels(search); + } + + @Override + public int getMyMemListCnt(RetailSearch search) { + // TODO Auto-generated method stub + return retailDao.getMyMemListCnt(search); + } + + @Override + public List getMyMemList(RetailSearch search) { + List memList = retailDao.getMyMemList(search); + + for(HashMap memDetail : memList) { + Member search2 = new Member(); + search2.setSiteId(search.getSiteId()); + search2.setMemId(memDetail.get("memId").toString()); + memDetail.put("topUserList", userDao.getTopUserList2(search2)); + } + + return memList; + } + + @Override + public int getMyMemDirectListCnt(RetailSearch search) { + // TODO Auto-generated method stub + return retailDao.getMyMemDirectListCnt(search); + } + + @Override + public List getMyMemDirectList(RetailSearch search) { + // TODO Auto-generated method stub + return retailDao.getMyMemDirectList(search); + } + + @Override + public int getMyPartnerListCnt(RetailSearch search) { + // TODO Auto-generated method stub + return retailDao.getMyPartnerListCnt(search); + } + + @Override + public List getMyPartnerList(RetailSearch search) { + List memList = retailDao.getMyPartnerList(search); + + for(HashMap memDetail : memList) { + Member search2 = new Member(); + search2.setSiteId(search.getSiteId()); + search2.setMemId(memDetail.get("memId").toString()); + memDetail.put("topUserList", userDao.getTopUserList2(search2)); + } + + return memList; + } + + @Override + public List getMyPartnerList2(RetailSearch search) { + List memList = retailDao.getMyPartnerList2(search); + + for(HashMap memDetail : memList) { + Member search2 = new Member(); + search2.setSiteId(search.getSiteId()); + search2.setMemId(memDetail.get("memId").toString()); + memDetail.put("topUserList", userDao.getTopUserList2(search2)); + } + + return memList; + } + + @Override + public List getMyPartnerDirectList(RetailSearch search) { + // TODO Auto-generated method stub + return retailDao.getMyPartnerDirectList(search); + } + + @Override + public int partnerBonusSettingSave(ChargingPointSettingVO settingVO) { + // TODO Auto-generated method stub + return retailDao.partnerBonusSettingSave(settingVO); + } + + @Override + public int getRetailPointListCnt(RetailPointSearch search) { + // TODO Auto-generated method stub + return retailDao.getRetailPointListCnt(search); + } + + @Override + public List getRetailPointList(RetailPointSearch search) { + // TODO Auto-generated method stub + return retailDao.getRetailPointList(search); + } + + @Override + public List getPartnerHierarchy(RetailSearch search) { + // TODO Auto-generated method stub + return retailDao.getPartnerHierarchy(search); + } + + @Override + public List> getBottomRateList(Member search) { + List> retailList = retailDao.getBottomRateList(search); + for(HashMap user : retailList) { + Member param = new Member(); + param.setSiteId(user.get("siteId").toString()); + param.setMemId(user.get("memId").toString()); + List> memRollingInfo = rateDao.getMemRollingInfo(param); + for(HashMap rateItem : memRollingInfo) { + MultipleRateInfo multipleRateInfo = null; + if(rateItem.get("detailSetYn").toString().equals("Y")) { + // 요율 세부설정 값 + multipleRateInfo = new MultipleRateInfo(); + multipleRateInfo.setSiteId(rateItem.get("siteId").toString()); + multipleRateInfo.setMemId(rateItem.get("memId").toString()); + multipleRateInfo.setVendorCode(rateItem.get("cateCode").toString()); + List multipleRate = userDao.getMultipleRateList(multipleRateInfo); + multipleRateInfo.setRateList(multipleRate); + rateItem.put("multipleRateInfo", multipleRateInfo); + } + } + + user.put("botRateInfo", memRollingInfo); + } + + return retailList; + } + + @Override + public int userLockWithBottom(HashMap param) { + // TODO Auto-generated method stub + return retailDao.userLockWithBottom(param); + } + + @Override + public HashMap getBotCashInfo(RetailSearch search) { + // TODO Auto-generated method stub + return retailDao.getBotCashInfo(search); + } + + @Override + public List getListRateInfo(RetailSearch search) { + List rateInfoList = new ArrayList<>(); + + Member param = new Member(); + param.setSiteId(search.getSiteId()); + param.setMemId(search.getMemId()); + List> memRollingInfo = rateDao.getMemRollingInfo(param); + for(HashMap rateItem : memRollingInfo) { + NewMemRateItem rateInfo = null; + + if(rateItem.get("detailSetYn").toString().equals("Y")) { + // 요율 세부설정 값 + MultipleRateInfo multipleRateInfo = new MultipleRateInfo(); + multipleRateInfo.setSiteId(rateItem.get("siteId").toString()); + multipleRateInfo.setMemId(rateItem.get("memId").toString()); + multipleRateInfo.setVendorCode(rateItem.get("cateCode").toString()); + List multipleRate = userDao.getMultipleRateList(multipleRateInfo); + for(MultipleRate item : multipleRate) { + rateInfo = new NewMemRateItem(); + rateInfo.setSiteId(multipleRateInfo.getSiteId()); + rateInfo.setMemId(multipleRateInfo.getMemId()); + rateInfo.setGameCategory(""); + rateInfo.setGameCategoryEn(""); + rateInfo.setGameCategoryName(rateItem.get("cateCodeName").toString()+"["+item.getRateTypeName()+"]"); + rateInfo.setVendorCode(multipleRateInfo.getVendorCode()); + rateInfo.setRateTypeCode(item.getRateType()); + rateInfo.setMaxPointRate(item.getMaxPointRate()); + rateInfo.setPointRate(item.getPointRate()); + rateInfo.setMinPointRate(item.getMinPointRate()); + rateInfo.setMaxLoseRate(item.getMaxLoseRate()); + rateInfo.setLoseRate(item.getLoseRate()); + rateInfo.setMinLoseRate(item.getMinLoseRate()); + + rateInfoList.add(rateInfo); + } + + } else { + rateInfo = new NewMemRateItem(); + rateInfo.setSiteId(rateItem.get("siteId").toString()); + rateInfo.setMemId(rateItem.get("memId").toString()); + rateInfo.setGameCategory(rateItem.get("category").toString()); + rateInfo.setGameCategoryEn(rateItem.get("cateCode").toString()); + rateInfo.setGameCategoryName(rateItem.get("cateCodeName").toString()); + rateInfo.setVendorCode(""); + rateInfo.setRateTypeCode(""); + rateInfo.setMaxPointRate(Double.parseDouble(rateItem.get("maxPointRate").toString())); + rateInfo.setPointRate(Double.parseDouble(rateItem.get("pointRate").toString())); + rateInfo.setMinPointRate(Double.parseDouble(rateItem.get("minPointRate").toString())); + rateInfo.setMaxLoseRate(Double.parseDouble(rateItem.get("maxLoseRate").toString())); + rateInfo.setLoseRate(Double.parseDouble(rateItem.get("loseRate").toString())); + rateInfo.setMinLoseRate(Double.parseDouble(rateItem.get("minLoseRate").toString())); + + rateInfoList.add(rateInfo); + } + } + + return rateInfoList; + } + + @Override + public int getMyLoginMemListCnt(MemberListSearch search) { + // TODO Auto-generated method stub + return retailDao.getMyLoginMemListCnt(search); + } + + @Override + public List getMyLoginMemList(MemberListSearch search) { + List userList = retailDao.getMyLoginMemList(search); + + for(LoginUserVO user : userList) { + search.setMemId(user.getMemId()); + if(user.getPartnerLevel().equals("NORMAL")) { + String betData = userDao.getLoginUserBetData(search); + if(betData != null) { + user.setBetData(betData); + } + } else { + user.setBetData(""); + } + + LoginUserVO data = userDao.getLoginUserReportData(search); + if(data != null) { + user.setCashIn(data.getCashIn()); + user.setCashOut(data.getCashOut()); + user.setBetAmt(data.getBetAmt()); + user.setWinAmt(data.getWinAmt()); + } + + Member search2 = new Member(); + search2.setSiteId(user.getSiteId()); + search2.setMemId(user.getMemId()); + List> topUserList = userDao.getTopUserList2(search2); + user.setTopUserList(topUserList); + } + + return userList; + } + + @Override + public HashMap getPartnerInfo(RetailSearch search) { + // TODO Auto-generated method stub + return retailDao.getPartnerInfo(search); + } + + @Override + public String getNextTargetLevel(RetailLowerSearch param) { + // TODO Auto-generated method stub + return retailDao.getNextTargetLevel(param); + } + + @Override + public int getLowerPartnerListCnt(RetailLowerSearch search) { + // TODO Auto-generated method stub + return retailDao.getLowerPartnerListCnt(search); + } + + @Override + public List> getLowerPartnerList(RetailLowerSearch search) { + List> list = retailDao.getLowerPartnerList(search); + + for(HashMap memDetail : list) { + Member search2 = new Member(); + search2.setSiteId(search.getSiteId()); + search2.setMemId(memDetail.get("memId").toString()); + memDetail.put("topUserList", userDao.getTopUserList2(search2)); + memDetail.put("totalBalance", userDao.getTotalBalance(search2)); + memDetail.put("countInfo", userDao.getCountInfo(search2)); + } + + return list; + } + + @Override + public UserDetailInfo getUserDetailInfo(UserSearch search) { + // TODO Auto-generated method stub + return retailDao.getUserDetailInfo(search); + } + + @Override + public int setUserDetailInfo(UserDetailInfo info) { + // TODO Auto-generated method stub + return retailDao.setUserDetailInfo(info); + } + + @Override + public List> getDetailLoginLog(UserSearch search) { + // TODO Auto-generated method stub + return retailDao.getDetailLoginLog(search); + } + + @Override + public int getDetailMsgLogCnt(UserListSearch search) { + // TODO Auto-generated method stub + return retailDao.getDetailMsgLogCnt(search); + } + + @Override + public List> getDetailMsgLog(UserListSearch search) { + // TODO Auto-generated method stub + return retailDao.getDetailMsgLog(search); + } + + @Override + public int getDetailCashLogCnt(UserListSearch search) { + // TODO Auto-generated method stub + return retailDao.getDetailCashLogCnt(search); + } + + @Override + public List> getDetailCashLog(UserListSearch search) { + // TODO Auto-generated method stub + return retailDao.getDetailCashLog(search); + } + + @Override + public int getDetailRollingLogCnt(UserListSearch search) { + // TODO Auto-generated method stub + return retailDao.getDetailRollingLogCnt(search); + } + + @Override + public List> getDetailRollingLog(UserListSearch search) { + // TODO Auto-generated method stub + return retailDao.getDetailRollingLog(search); + } + + @Override + public List> getDetailRollingLogNew(UserListSearch search) { + // TODO Auto-generated method stub + return retailDao.getDetailRollingLogNew(search); + } + + @Override + public List getPartnerHierarchy2(RetailSearch search) { + // TODO Auto-generated method stub + return retailDao.getPartnerHierarchy2(search); + } + + @Override + public HashMap getMyBetStatData(UserSearch search) { + // TODO Auto-generated method stub + return retailDao.getMyBetStatData(search); + } + + @Override + public List> getBottomBetStatList(UserSearch search) { + // TODO Auto-generated method stub + return retailDao.getBottomBetStatList(search); + } + + @Override + public HashMap getBottomBetStatSum(UserSearch search) { + // TODO Auto-generated method stub + return retailDao.getBottomBetStatSum(search); + } + + @Override + public List> getDailyBetList(UserSearch search) { + // TODO Auto-generated method stub + return retailDao.getDailyBetList(search); + } + + @Override + public HashMap getDailyBetSum(UserSearch search) { + // TODO Auto-generated method stub + return retailDao.getDailyBetSum(search); + } + + @Override + public List> getDailyUserList(UserSearch search) { + // TODO Auto-generated method stub + return retailDao.getDailyUserList(search); + } + + @Override + public HashMap getDailyUserSum(UserSearch search) { + // TODO Auto-generated method stub + return retailDao.getDailyUserSum(search); + } + + @Override + public List> getDailyPartnerList(UserSearch search) { + // TODO Auto-generated method stub + return retailDao.getDailyPartnerList(search); + } + + @Override + public int getBotCnt(Member searchBot) { + // TODO Auto-generated method stub + return retailDao.getBotCnt(searchBot); + } + +} diff --git a/src/main/java/com/bb/service/RvHoldemService.java b/src/main/java/com/bb/service/RvHoldemService.java new file mode 100644 index 0000000..4cee11e --- /dev/null +++ b/src/main/java/com/bb/service/RvHoldemService.java @@ -0,0 +1,15 @@ +package com.bb.service; + +import org.codehaus.jettison.json.JSONObject; + +import com.bb.model.ApiVendorCompInfo; + +public interface RvHoldemService { + + int createUser(String LOG_PREFIX, ApiVendorCompInfo apiVendor, JSONObject params); + + String gameLink(String LOG_PREFIX, ApiVendorCompInfo apiVendor, JSONObject params); + + long getAgentAgg(String LOG_PREFIX, ApiVendorCompInfo apiVendor, JSONObject params); + +} diff --git a/src/main/java/com/bb/service/RvHoldemServiceImpl.java b/src/main/java/com/bb/service/RvHoldemServiceImpl.java new file mode 100644 index 0000000..4226cdf --- /dev/null +++ b/src/main/java/com/bb/service/RvHoldemServiceImpl.java @@ -0,0 +1,177 @@ +package com.bb.service; + +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.Collections; + +import org.codehaus.jettison.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient; + +import com.bb.model.ApiVendorCompInfo; + +import lombok.extern.slf4j.Slf4j; +import reactor.core.publisher.Mono; + +@Slf4j +@Service +public class RvHoldemServiceImpl implements RvHoldemService { + + @Autowired + private WebClient webClient; + //@Qualifier("secureTls12WebClient") + //@Qualifier("webClientOpenSslFull") + //@Qualifier("insecureTrustAllWebClient") + //@Qualifier("insecureJdkTlsWebClient") + + private HttpHeaders getHeader(String LOG_PREFIX, String apikey) { + LOG_PREFIX = LOG_PREFIX + "::getHeader::"; + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(org.springframework.http.MediaType.APPLICATION_JSON); + headers.setAccept(Collections.singletonList(org.springframework.http.MediaType.APPLICATION_JSON)); + headers.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8"))); + headers.set("User-Agent", "PostmanRuntime/7.28.4"); + headers.set("apikey", apikey); + log.info(LOG_PREFIX+ "HttpHeaders::"+headers.toString()); + + return headers; + } + + @Override + public int createUser(String LOG_PREFIX, ApiVendorCompInfo apiVendor, JSONObject params) { + LOG_PREFIX = LOG_PREFIX + "createUser:::"; + HttpHeaders headers = getHeader(LOG_PREFIX, apiVendor.getClientSecretKey()); + String apiUrl = apiVendor.getApiUrl() + "/user/create"; + log.info(LOG_PREFIX+ "Url: " + apiUrl); + log.info(LOG_PREFIX+ "Params: " + params.toString()); + int userId = 0; + + try { + Mono responseMono = webClient.post() + .uri(apiUrl) + .headers(httpHeaders -> httpHeaders.addAll(headers)) + .bodyValue(params.toString()) + .retrieve() + .bodyToMono(String.class); + + String responseBody = responseMono.block(); + log.info(LOG_PREFIX+ "response : " + responseBody); + JSONObject resObj = new JSONObject(responseBody); + int code = resObj.getInt("code"); + if(code == 1) { + JSONObject payloadObj = resObj.getJSONObject("payload"); + userId = payloadObj.getInt("userId"); + } + + } catch (Exception e) { + log.error(LOG_PREFIX+ "Exception: " + e.toString()); + } + + return userId; + } + + @Override + public String gameLink(String LOG_PREFIX, ApiVendorCompInfo apiVendor, JSONObject params) { + LOG_PREFIX = LOG_PREFIX + "gameLink:::"; + HttpHeaders headers = getHeader(LOG_PREFIX, apiVendor.getClientSecretKey()); + String apiUrl = apiVendor.getApiUrl() + "/game/link"; + log.info(LOG_PREFIX+ "Url: " + apiUrl); + log.info(LOG_PREFIX+ "Params: " + params.toString()); + String gameLink = null; + /* + OkHttpClient client; + try { + client = UnsafeOkHttpClient.getTls12Client(); + //RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json"), params.toString()); + // JSON 요청 예제 + MediaType JSON = MediaType.parse("application/json; charset=utf-8"); + String jsonParams = params.toString(); + + Request request = new Request.Builder() + .url(apiUrl) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .addHeader("apikey", apiVendor.getClientSecretKey()) + .post(RequestBody.create(jsonParams, JSON)) + .build(); + + try (Response response = client.newCall(request).execute()) { + if (response.isSuccessful() && response.body() != null) { + String responseBody = response.body().string(); + log.info(LOG_PREFIX+ "response : " + responseBody); + JSONObject resObj = new JSONObject(responseBody); + int code = resObj.getInt("code"); + if(code == 1) { + gameLink = resObj.getString("payload"); + } + } else { + log.error(LOG_PREFIX+ "Request failed: " + response.code() + " - " + response.message()); + } + } catch (Exception e) { + log.error(LOG_PREFIX+ "Exception: " + e.toString()); + e.printStackTrace(); + } + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + */ + + try { + Mono responseMono = webClient.post() + .uri(apiUrl) + .headers(httpHeaders -> httpHeaders.addAll(headers)) + .bodyValue(params.toString()) + .retrieve() + .bodyToMono(String.class); + + String responseBody = responseMono.block(); + log.info(LOG_PREFIX+ "response : " + responseBody); + JSONObject resObj = new JSONObject(responseBody); + int code = resObj.getInt("code"); + if(code == 1) { + gameLink = resObj.getString("payload"); + } + + } catch (Exception e) { + log.error(LOG_PREFIX+ "Exception: " + e.toString()); + } + + + return gameLink; + } + + @Override + public long getAgentAgg(String LOG_PREFIX, ApiVendorCompInfo apiVendor, JSONObject params) { + LOG_PREFIX = LOG_PREFIX + "getAgentAgg:::"; + HttpHeaders headers = getHeader(LOG_PREFIX, apiVendor.getClientSecretKey()); + String apiUrl = apiVendor.getApiUrl() + "/agency/egg"; + log.info(LOG_PREFIX+ "Url: " + apiUrl); + log.info(LOG_PREFIX+ "Params: " + params.toString()); + long agentAgg = 0; + + try { + Mono responseMono = webClient.post() + .uri(apiUrl) + .headers(httpHeaders -> httpHeaders.addAll(headers)) + .bodyValue(params.toString()) + .retrieve() + .bodyToMono(String.class); + + String responseBody = responseMono.block(); + log.info(LOG_PREFIX+ "response : " + responseBody); + JSONObject resObj = new JSONObject(responseBody); + int code = resObj.getInt("code"); + if(code == 1) { + agentAgg = resObj.getLong("payload"); + } + + } catch (Exception e) { + log.error(LOG_PREFIX+ "Exception: " + e.toString()); + } + + return agentAgg; + } +} diff --git a/src/main/java/com/bb/service/SportDService.java b/src/main/java/com/bb/service/SportDService.java new file mode 100644 index 0000000..ed37131 --- /dev/null +++ b/src/main/java/com/bb/service/SportDService.java @@ -0,0 +1,12 @@ +package com.bb.service; + +import com.bb.model.Member; +import com.bb.model.TripleDVO; + +import net.sf.json.JSONObject; + +public interface SportDService { + + JSONObject betProc(Member search, TripleDVO tripleVO); + +} diff --git a/src/main/java/com/bb/service/SportDServiceImpl.java b/src/main/java/com/bb/service/SportDServiceImpl.java new file mode 100644 index 0000000..09440f7 --- /dev/null +++ b/src/main/java/com/bb/service/SportDServiceImpl.java @@ -0,0 +1,417 @@ +package com.bb.service; + +import java.math.BigDecimal; +import java.util.HashMap; + +import org.springframework.stereotype.Service; + +import com.bb.dao.BetDao; +import com.bb.dao.UserDao; +import com.bb.model.Member; +import com.bb.model.TripleDVO; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.sf.json.JSONObject; + +@Slf4j +@RequiredArgsConstructor +@Service +public class SportDServiceImpl implements SportDService { + + private final UserDao userDao; + + private final BetDao betDao; + + private final AsyncTripleDService asyncService; + + @Override + public JSONObject betProc(Member search, TripleDVO tripleVO) { + JSONObject responseObj = new JSONObject(); + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::"+tripleVO.getTranType()+"::betProc::::"; + + try { + HashMap memberVo = userDao.getMemberMap(search); + + double bfCash = Double.parseDouble(memberVo.get("cashAmtD").toString()); + int siteIdx = (int) memberVo.get("siteIdx"); + int memIdx = (int) memberVo.get("memIdx"); + tripleVO.setSiteIdx(siteIdx); + tripleVO.setMemIdx(memIdx); + tripleVO.setMemLevel(memberVo.get("memLevel").toString()); + tripleVO.setSiteId(memberVo.get("siteId").toString()); + tripleVO.setMemId(memberVo.get("memId").toString()); + tripleVO.setBetYn(memberVo.get("betYn").toString()); + tripleVO.setMemLockYn(memberVo.get("memLockYn").toString()); + tripleVO.setSymLock(memberVo.get("symLock").toString()); + tripleVO.setIsBiPushYn(memberVo.get("isBiPushYn").toString()); + + log.info(LOG_PREFIX+ "::status::" + tripleVO.getStatus()); + if(tripleVO.getTranType().equals("debit") && tripleVO.getStatus().equals("bet")) { + responseObj = callBet(bfCash, tripleVO); + } + + else if(tripleVO.getTranType().equals("debit") && tripleVO.getStatus().equals("debitCustomer")) { + log.error(LOG_PREFIX+ "::debitCustomer::" + tripleVO); + responseObj = callBetIssue(bfCash, tripleVO); + } + + else if(tripleVO.getTranType().equals("credit") && tripleVO.getStatus().equals("betCancel")) { + responseObj = callCancel(bfCash, tripleVO); + } + + else if(tripleVO.getTranType().equals("credit") && tripleVO.getStatus().equals("commitReserve")) { + responseObj = callReserve(bfCash, tripleVO); + } + + else if(tripleVO.getTranType().equals("credit") && tripleVO.getStatus().equals("end")) { + responseObj = callWin(bfCash, tripleVO); + } + + else { + responseObj.put("result_code", 2222); + responseObj.put("error_msg","NOT_FOUND_CASE"); + log.error(LOG_PREFIX+ "::NOT_FOUND_CASE"); + } + + } catch(Exception e) { + responseObj.put("result_code", 1111); + responseObj.put("error_msg","UNKNOWN_ERROR"); + log.error(LOG_PREFIX+ "::UNKNOWN_ERROR"); + log.error(LOG_PREFIX+ "::ERROR::" + e.getMessage()); + } + + return responseObj; + } + + private JSONObject callBet(double bfCash, TripleDVO tripleVO) { + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::"+tripleVO.getTranType()+"::callBet::::"; + + JSONObject responseObj = new JSONObject(); + log.info(LOG_PREFIX+ "::========== DEBIT_START =========="); + + if(tripleVO.getBetYn().equals("N") || tripleVO.getMemLockYn().equals("Y") || tripleVO.getSymLock().equals("Y")) { + if(tripleVO.getSymLock().equals("Y")) { + HashMap lockParam = new HashMap<>(); + lockParam.put("siteId", tripleVO.getSiteId()); + lockParam.put("memId", tripleVO.getMemId()); + int lockResult = userDao.setUserLock(lockParam); + log.error(LOG_PREFIX+ "::setUserLock::result::" + lockResult); + } + + responseObj.put("balance", bfCash); + responseObj.put("result_code", 1005); + responseObj.put("error_msg","THIS_USER_BETTING_LOCK"); + log.error(LOG_PREFIX+ "::THIS_USER_BETTING_LOCK"); + log.error(LOG_PREFIX+ "::========== DEBIT_END =========="); + return responseObj; + } + + int debitCnt = betDao.getTripleDebitCheckByTranId(tripleVO.getTranId()); + double amount = Math.abs(tripleVO.getDebit()); + if(debitCnt > 0) { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 98); + responseObj.put("error_msg","BET_ALREADY_SETTLED"); + log.error(LOG_PREFIX+ "::BET_ALREADY_SETTLED"); + log.error(LOG_PREFIX+ "::========== DEBIT_END =========="); + return responseObj; + } + + if(tripleVO.getMinusBalanceYn() == null || tripleVO.getMinusBalanceYn().equals("N")) { + if(bfCash == 0 || bfCash < amount) { + // 유저머니가 없는경우 code 80 msg : INSUFFICIENT_FUNDS + responseObj.put("balance", bfCash); + responseObj.put("result_code", 80); + responseObj.put("error_msg","INSUFFICIENT_FUNDS"); + log.error(LOG_PREFIX+ "::INSUFFICIENT_FUNDS"); + log.error(LOG_PREFIX+ "::========== DEBIT_END =========="); + return responseObj; + } + } + + // Bet Proc + BigDecimal bfCashB = new BigDecimal(""+bfCash); + tripleVO.setBeforeCash(bfCashB.doubleValue()); + + BigDecimal amountB = new BigDecimal(""+amount); + + BigDecimal afCashB = bfCashB.subtract(amountB); + tripleVO.setAfterCash(afCashB.doubleValue()); + + + HashMap memCashUpdParam = new HashMap(); + memCashUpdParam.put("siteId", tripleVO.getSiteId()); + memCashUpdParam.put("memId", tripleVO.getMemId()); + double cashAmt = amount * -1; + memCashUpdParam.put("cashAmt", Double.toString(cashAmt)); + memCashUpdParam.put("changeFlag", "N"); + long chs4 = System.currentTimeMillis(); + int memCashResult = betDao.updateUserCashByAmountD(memCashUpdParam); + + Long betIdx = betDao.getBetIdxByGameIdx(tripleVO.getBetId()); + if(betIdx != null) { + //이미 베팅한거에 추가 배팅 건 + asyncService.updateDBetDebit(tripleVO, betIdx); + + } else { + asyncService.insertDSportBetDebit(tripleVO); + } + + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash()); + log.info(LOG_PREFIX+ "::========== DEBIT_END =========="); + + return responseObj; + } + + private JSONObject callBetIssue(double bfCash, TripleDVO tripleVO) { + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::"+tripleVO.getTranType()+"::callBetIssue::::"; + + JSONObject responseObj = new JSONObject(); + log.info(LOG_PREFIX+ "::========== ISSUE_START =========="); + + int debitCnt = betDao.getTripleDebitCheckByTranId(tripleVO.getTranId()); + double amount = Math.abs(tripleVO.getDebit()); + if(debitCnt > 0) { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 98); + responseObj.put("error_msg","BET_ALREADY_SETTLED"); + log.error(LOG_PREFIX+ "::BET_ALREADY_SETTLED"); + log.error(LOG_PREFIX+ "::========== ISSUE_END =========="); + return responseObj; + } + + // Bet Proc + BigDecimal bfCashB = new BigDecimal(""+bfCash); + tripleVO.setBeforeCash(bfCashB.doubleValue()); + + BigDecimal amountB = new BigDecimal(""+amount); + + BigDecimal afCashB = bfCashB.subtract(amountB); + tripleVO.setAfterCash(afCashB.doubleValue()); + + log.info(LOG_PREFIX+ "::BF_BALANCE::" + bfCashB.doubleValue()); + log.info(LOG_PREFIX+ "::ISSUE_AMOUNT::" + amount); + log.info(LOG_PREFIX+ "::AF_BALANCE::" + afCashB.doubleValue()); + + tripleVO.setIsBonus(-1); + + HashMap memCashUpdParam = new HashMap(); + memCashUpdParam.put("siteId", tripleVO.getSiteId()); + memCashUpdParam.put("memId", tripleVO.getMemId()); + double cashAmt = amount * -1; + memCashUpdParam.put("cashAmt", Double.toString(cashAmt)); + memCashUpdParam.put("changeFlag", "N"); + long chs4 = System.currentTimeMillis(); + int memCashResult = betDao.updateUserCashByAmountD(memCashUpdParam); + + Long betIdx = betDao.getBetIdxByGameIdx(tripleVO.getBetId()); + if(betIdx != null) { + //이미 베팅한거에 추가 배팅 건 + asyncService.updateDBetIssue(tripleVO, betIdx); + } else { + asyncService.insertDSportBetIssue(tripleVO); + } + + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash()); + log.info(LOG_PREFIX+ "::========== ISSUE_END =========="); + + return responseObj; + } + + private JSONObject callReserve(double bfCash, TripleDVO tripleVO) { + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::"+tripleVO.getTranType()+"::callReserve::::"; + + JSONObject responseObj = new JSONObject(); + log.info(LOG_PREFIX+ "::========== RESERVE_START =========="); + + int debitCnt = betDao.getBetinfoCheckByBetId(tripleVO.getBetId()); + + if(debitCnt >= 1) { + double amount = Math.abs(tripleVO.getCredit()); + + BigDecimal bfCashB = new BigDecimal(""+bfCash); + tripleVO.setBeforeCash(bfCashB.doubleValue()); + + BigDecimal amountB = new BigDecimal(""+amount); + + BigDecimal afCashB = bfCashB.add(amountB); + tripleVO.setAfterCash(afCashB.doubleValue()); + + log.info(LOG_PREFIX+ "::BF_BALANCE::" + bfCashB.doubleValue()); + log.info(LOG_PREFIX+ "::RESERVE_AMOUNT::" + amount); + log.info(LOG_PREFIX+ "::AF_BALANCE::" + afCashB.doubleValue()); + + //asyncService.depositBalanceAsync(tripleVO); + //log.info(LOG_PREFIX+ "::depositBalanceAsync::Call"); + + if(amount != 0) { + HashMap memCashUpdParam = new HashMap(); + memCashUpdParam.put("siteId", tripleVO.getSiteId()); + memCashUpdParam.put("memId", tripleVO.getMemId()); + memCashUpdParam.put("cashAmt", Double.toString(amount)); + memCashUpdParam.put("changeFlag", "N"); + int memCashResult = betDao.updateUserCashByAmountD(memCashUpdParam); + } + + Long betIdx = betDao.getBetIdxByBetId(tripleVO.getBetId()); + if(betIdx != null) { + if(amount != 0) { + asyncService.updateDSportBetReserve(tripleVO, betIdx); + } + } + + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash()); + log.info(LOG_PREFIX+ "::========== RESERVE_END =========="); + + } else { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 99); + responseObj.put("error_msg","BET_DOES_NOT_EXIST"); + log.error(LOG_PREFIX+ "::BET_DOES_NOT_EXIST"); + log.error(LOG_PREFIX+ "::========== RESERVE_END =========="); + } + + return responseObj; + } + + private JSONObject callWin(double bfCash, TripleDVO tripleVO) { + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::"+tripleVO.getTranType()+"::callWin::::"; + + JSONObject responseObj = new JSONObject(); + log.info(LOG_PREFIX+ "::========== CREDIT_START =========="); + + int debitCnt = betDao.getBetinfoCheckByBetId(tripleVO.getBetId()); + int creditCnt = betDao.getTripleCreditCheckByTranId(tripleVO.getTranId()); + + double amount = Math.abs(tripleVO.getCredit()); + + if(creditCnt != 0) { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 98); + responseObj.put("error_msg","WIN_ALREADY_SETTLED"); + log.error(LOG_PREFIX+ "::WIN_ALREADY_SETTLED"); + log.error(LOG_PREFIX+ "::========== CREDIT_END =========="); + return responseObj; + } + + if(debitCnt >= 1) { + BigDecimal bfCashB = new BigDecimal(""+bfCash); + tripleVO.setBeforeCash(bfCashB.doubleValue()); + + BigDecimal amountB = new BigDecimal(""+amount); + + BigDecimal afCashB = bfCashB.add(amountB); + tripleVO.setAfterCash(afCashB.doubleValue()); + + // BetEnd Proc + double betWinAmt = tripleVO.getCredit(); + + if(betWinAmt > 0) { + HashMap memCashUpdParam = new HashMap(); + memCashUpdParam.put("siteId", tripleVO.getSiteId()); + memCashUpdParam.put("memId", tripleVO.getMemId()); + memCashUpdParam.put("cashAmt", Double.toString(betWinAmt)); + memCashUpdParam.put("changeFlag", "N"); + int memCashResult = betDao.updateUserCashByAmountD(memCashUpdParam); + } + + Long betIdx = betDao.getBetIdxByBetId(tripleVO.getBetId()); + if(betIdx != null) { + asyncService.updateDSportBetCredit(tripleVO, betIdx); + } + + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash()); + log.info(LOG_PREFIX+ "::========== CREDIT_END =========="); + + } else { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 99); + responseObj.put("error_msg","BET_DOES_NOT_EXIST"); + log.error(LOG_PREFIX+ "::BET_DOES_NOT_EXIST"); + log.error(LOG_PREFIX+ "::========== CREDIT_END =========="); + } + + return responseObj; + } + + private JSONObject callCancel(double bfCash, TripleDVO tripleVO) { + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::"+tripleVO.getTranType()+"::callCancel::::"; + + JSONObject responseObj = new JSONObject(); + log.info(LOG_PREFIX+ "::========== CANCEL_START =========="); + + int isCancleCnt = betDao.getTripleIsCancelCheck(tripleVO.getBetId()); + if(isCancleCnt != 0) { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 98); + responseObj.put("error_msg","CANCEL_ALREADY_SETTLED"); + log.error(LOG_PREFIX+ "::CANCEL_ALREADY_SETTLED"); + log.error(LOG_PREFIX+ "::========== CANCEL_END =========="); + return responseObj; + } + + double amount = Math.abs(tripleVO.getCredit()); + + int debitCnt = betDao.getBetinfoCheckByBetId(tripleVO.getBetId()); + + if(debitCnt != 0) { + BigDecimal bfCashB = new BigDecimal(""+bfCash); + tripleVO.setBeforeCash(bfCashB.doubleValue()); + + BigDecimal amountB = new BigDecimal(""+amount); + + BigDecimal afCashB = bfCashB.add(amountB); + tripleVO.setAfterCash(afCashB.doubleValue()); + + log.info(LOG_PREFIX+ "::BF_BALANCE::" + bfCashB.doubleValue()); + log.info(LOG_PREFIX+ "::RESERVE_AMOUNT::" + amount); + log.info(LOG_PREFIX+ "::AF_BALANCE::" + afCashB.doubleValue()); + + tripleVO.setIsCancel(1); + + Long betIdx = betDao.getBetIdxByBetId(tripleVO.getBetId()); + + if(betIdx != null) { + HashMap param = new HashMap(); + param.put("betIdx", betIdx); + param.put("betStatus", "CANCEL"); + param.put("betWinAmt", Double.toString(amount)); + int resultBet = betDao.betCancelTriple(param); + log.info(LOG_PREFIX+ "::betCancelTriple::result::" + resultBet); + + int resultBetOld = betDao.betCancelOldTriple(param); + log.info(LOG_PREFIX+ "::betCancelOldTriple::result::" + resultBetOld); + + if(resultBet > 0) { + HashMap memCashUpdParam = new HashMap(); + memCashUpdParam.put("siteId", tripleVO.getSiteId()); + memCashUpdParam.put("memId", tripleVO.getMemId()); + memCashUpdParam.put("cashAmt", Double.toString(amount)); + memCashUpdParam.put("changeFlag", "N"); + int memCashResult = betDao.updateUserCashByAmountD(memCashUpdParam); + + asyncService.updateDSportBetCancel(tripleVO, betIdx); + + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash()); + log.info(LOG_PREFIX+ "::========== CANCEL_END =========="); + } + } + + } else { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 99); + responseObj.put("error_msg","BET_DOES_NOT_EXIST"); + log.error(LOG_PREFIX+ "::BET_DOES_NOT_EXIST"); + log.error(LOG_PREFIX+ "::========== CANCEL_END =========="); + } + + return responseObj; + } + +} diff --git a/src/main/java/com/bb/service/SportService.java b/src/main/java/com/bb/service/SportService.java new file mode 100644 index 0000000..081e20e --- /dev/null +++ b/src/main/java/com/bb/service/SportService.java @@ -0,0 +1,15 @@ +package com.bb.service; + +import com.bb.model.Member; +import com.bb.model.TriplePurchaseId; +import com.bb.model.TripleVO; + +import net.sf.json.JSONObject; + +public interface SportService { + + JSONObject betProc(Member search, TripleVO tripleVO); + + int updatePurchaseId(TriplePurchaseId tripleVO); + +} diff --git a/src/main/java/com/bb/service/SportServiceImpl.java b/src/main/java/com/bb/service/SportServiceImpl.java new file mode 100644 index 0000000..baab69c --- /dev/null +++ b/src/main/java/com/bb/service/SportServiceImpl.java @@ -0,0 +1,547 @@ +package com.bb.service; + +import java.math.BigDecimal; +import java.util.HashMap; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.bb.dao.BetDao; +import com.bb.dao.CashDao; +import com.bb.dao.CommonDao; +import com.bb.dao.UserDao; +import com.bb.model.Member; +import com.bb.model.TriplePurchaseId; +import com.bb.model.TripleVO; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.sf.json.JSONObject; + +@Slf4j +@RequiredArgsConstructor +@Service +public class SportServiceImpl implements SportService { + + private final UserDao userDao; + + private final BetDao betDao; + + private final CashDao cashDao; + + private final CommonDao commonDao; + + private final AsyncTripleService asyncService; + + @Override + public JSONObject betProc(Member search, TripleVO tripleVO) { + JSONObject responseObj = new JSONObject(); + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::"+tripleVO.getTranType()+"::betProc::::"; + + try { + HashMap memberVo = userDao.getMemberMap(search); + int bfCash = Integer.parseInt(memberVo.get("cashAmt").toString()); + int siteIdx = (int) memberVo.get("siteIdx"); + int memIdx = (int) memberVo.get("memIdx"); + tripleVO.setSiteIdx(siteIdx); + tripleVO.setMemIdx(memIdx); + tripleVO.setMemLevel(memberVo.get("memLevel").toString()); + tripleVO.setSiteId(memberVo.get("siteId").toString()); + tripleVO.setMemId(memberVo.get("memId").toString()); + tripleVO.setBetYn(memberVo.get("betYn").toString()); + tripleVO.setMemLockYn(memberVo.get("memLockYn").toString()); + tripleVO.setSymLock(memberVo.get("symLock").toString()); + tripleVO.setIsBiPushYn(memberVo.get("isBiPushYn").toString()); + + log.info(LOG_PREFIX+ "::status::" + tripleVO.getStatus()); + if(tripleVO.getTranType().equals("debit") && tripleVO.getStatus().equals("bet")) { + responseObj = callBet(bfCash, tripleVO); + } + + else if(tripleVO.getTranType().equals("debit") && tripleVO.getStatus().equals("debitCustomer")) { + log.error(LOG_PREFIX+ "::debitCustomer::" + tripleVO); + responseObj = callBetIssue(bfCash, tripleVO); + } + + else if(tripleVO.getTranType().equals("credit") && tripleVO.getStatus().equals("betCancel")) { + responseObj = callCancel(bfCash, tripleVO); + } + + else if(tripleVO.getTranType().equals("credit") && tripleVO.getStatus().equals("commitReserve")) { + responseObj = callReserve(bfCash, tripleVO); + } + + else if(tripleVO.getTranType().equals("credit") && tripleVO.getStatus().equals("end")) { + responseObj = callWin(bfCash, tripleVO); + } + + else { + responseObj.put("result_code", 2222); + responseObj.put("error_msg","NOT_FOUND_CASE"); + log.error(LOG_PREFIX+ "::NOT_FOUND_CASE"); + } + + } catch(Exception e) { + responseObj.put("result_code", 1111); + responseObj.put("error_msg","UNKNOWN_ERROR"); + log.error(LOG_PREFIX+ "::UNKNOWN_ERROR"); + log.error(LOG_PREFIX+ "::ERROR::" + e.getMessage()); + } + + return responseObj; + } + + private JSONObject callBet(int bfCash, TripleVO tripleVO) { + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::"+tripleVO.getTranType()+"::callBet::::"; + + JSONObject responseObj = new JSONObject(); + log.info(LOG_PREFIX+ "::========== DEBIT_START =========="); + + if(tripleVO.getBetYn().equals("N") || tripleVO.getMemLockYn().equals("Y") || tripleVO.getSymLock().equals("Y")) { + if(tripleVO.getSymLock().equals("Y")) { + HashMap lockParam = new HashMap<>(); + lockParam.put("siteId", tripleVO.getSiteId()); + lockParam.put("memId", tripleVO.getMemId()); + int lockResult = userDao.setUserLock(lockParam); + log.error(LOG_PREFIX+ "::setUserLock::result::" + lockResult); + } + + responseObj.put("balance", bfCash); + responseObj.put("result_code", 1005); + responseObj.put("error_msg","THIS_USER_BETTING_LOCK"); + log.error(LOG_PREFIX+ "::THIS_USER_BETTING_LOCK"); + log.error(LOG_PREFIX+ "::========== DEBIT_END =========="); + return responseObj; + } + + int debitCnt = betDao.getTripleDebitCheckByTranId(tripleVO.getTranId()); + int amount = Math.abs(tripleVO.getDebit()); + if(debitCnt > 0) { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 98); + responseObj.put("error_msg","BET_ALREADY_SETTLED"); + log.error(LOG_PREFIX+ "::BET_ALREADY_SETTLED"); + log.error(LOG_PREFIX+ "::========== DEBIT_END =========="); + return responseObj; + } + + if(tripleVO.getMinusBalanceYn() == null || tripleVO.getMinusBalanceYn().equals("N")) { + if(bfCash == 0 || bfCash < amount) { + // 유저머니가 없는경우 code 80 msg : INSUFFICIENT_FUNDS + responseObj.put("balance", bfCash); + responseObj.put("result_code", 80); + responseObj.put("error_msg","INSUFFICIENT_FUNDS"); + log.error(LOG_PREFIX+ "::INSUFFICIENT_FUNDS"); + log.error(LOG_PREFIX+ "::========== DEBIT_END =========="); + return responseObj; + } + } + + HashMap betLimitInfo = betDao.getSiteBetLimitInfo(tripleVO); + int maxBetAmt = Integer.parseInt(betLimitInfo.get("betAmtMax").toString()); + if(amount > maxBetAmt) { + // 최대 배팅금액 초과시 에러 리턴 + responseObj.put("balance", bfCash); + responseObj.put("result_code", 3333); + responseObj.put("error_msg","MAX_BET_OVER"); + log.error(LOG_PREFIX+ "::MAX_BET_OVER"); + log.error(LOG_PREFIX+ "::========== DEBIT_END =========="); + return responseObj; + } + + // Bet Proc + BigDecimal bfCashB = null; + if(tripleVO.getBeforeCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + bfCashB = new BigDecimal(""+bfCash); + tripleVO.setBeforeCash(bfCashB.longValue()); + } else { + bfCashB = new BigDecimal(""+tripleVO.getBeforeCash()); + } + + BigDecimal amountB = new BigDecimal(""+amount); + + BigDecimal afCashB = null; + if(tripleVO.getAfterCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + afCashB = bfCashB.subtract(amountB); + tripleVO.setAfterCash(afCashB.longValue()); + } else { + afCashB = new BigDecimal(""+tripleVO.getAfterCash()); + } + + //asyncService.withdrawBalanceAsync(tripleVO); + int result = betDao.insertTripleTxnData(tripleVO); + log.info(LOG_PREFIX+ "::insertTripleTxnData::result::" + result); + + if(result > 0) { + HashMap memCashUpdParam = new HashMap(); + memCashUpdParam.put("siteId", tripleVO.getSiteId()); + memCashUpdParam.put("memId", tripleVO.getMemId()); + int cashAmt = amount * -1; + memCashUpdParam.put("cashAmt", Integer.toString(cashAmt)); + memCashUpdParam.put("changeFlag", "N"); + long chs4 = System.currentTimeMillis(); + int memCashResult = betDao.updateUserCashByAmount(memCashUpdParam); + + Long betIdx = betDao.getBetIdxByGameIdx(tripleVO.getBetId()); + if(betIdx != null) { + //이미 베팅한거에 추가 배팅 건 + asyncService.updateBetDebit(tripleVO, betIdx); + + } else { + asyncService.insertSportBetDebit(tripleVO); + } + + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash().intValue()); + log.info(LOG_PREFIX+ "::========== DEBIT_END =========="); + } else { + responseObj.put("result_code", 3333); + responseObj.put("error_msg","DEBIT_INSERT_ERROR"); + log.error(LOG_PREFIX+ "::DEBIT_INSERT_ERROR"); + log.error(LOG_PREFIX+ "::========== DEBIT_END =========="); + } + + return responseObj; + } + + private JSONObject callBetIssue(int bfCash, TripleVO tripleVO) { + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::"+tripleVO.getTranType()+"::callBetIssue::::"; + + JSONObject responseObj = new JSONObject(); + log.info(LOG_PREFIX+ "::========== ISSUE_START =========="); + + int debitCnt = betDao.getTripleDebitCheckByTranId(tripleVO.getTranId()); + int amount = Math.abs(tripleVO.getDebit()); + if(debitCnt > 0) { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 98); + responseObj.put("error_msg","BET_ALREADY_SETTLED"); + log.error(LOG_PREFIX+ "::BET_ALREADY_SETTLED"); + log.error(LOG_PREFIX+ "::========== ISSUE_END =========="); + return responseObj; + } + + // Bet Proc + BigDecimal bfCashB = null; + if(tripleVO.getBeforeCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + bfCashB = new BigDecimal(""+bfCash); + tripleVO.setBeforeCash(bfCashB.longValue()); + } else { + bfCashB = new BigDecimal(""+tripleVO.getBeforeCash()); + } + + BigDecimal amountB = new BigDecimal(""+amount); + + BigDecimal afCashB = null; + if(tripleVO.getAfterCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + afCashB = bfCashB.subtract(amountB); + tripleVO.setAfterCash(afCashB.longValue()); + } else { + afCashB = new BigDecimal(""+tripleVO.getAfterCash()); + } + + log.info(LOG_PREFIX+ "::BF_BALANCE::" + bfCashB.longValue()); + log.info(LOG_PREFIX+ "::ISSUE_AMOUNT::" + amount); + log.info(LOG_PREFIX+ "::AF_BALANCE::" + afCashB.longValue()); + + tripleVO.setIsBonus(-1); + int result = betDao.insertTripleTxnData(tripleVO); + log.info(LOG_PREFIX+ "::insertTripleTxnData::result::" + result); + + if(result > 0) { + HashMap memCashUpdParam = new HashMap(); + memCashUpdParam.put("siteId", tripleVO.getSiteId()); + memCashUpdParam.put("memId", tripleVO.getMemId()); + int cashAmt = amount * -1; + memCashUpdParam.put("cashAmt", Integer.toString(cashAmt)); + memCashUpdParam.put("changeFlag", "N"); + long chs4 = System.currentTimeMillis(); + int memCashResult = betDao.updateUserCashByAmount(memCashUpdParam); + + Long betIdx = betDao.getBetIdxByGameIdx(tripleVO.getBetId()); + if(betIdx != null) { + //이미 베팅한거에 추가 배팅 건 + asyncService.updateBetIssue(tripleVO, betIdx); + } else { + asyncService.insertSportBetIssue(tripleVO); + } + + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash().intValue()); + log.info(LOG_PREFIX+ "::========== ISSUE_END =========="); + } else { + responseObj.put("result_code", 3333); + responseObj.put("error_msg","DEBIT_INSERT_ERROR"); + log.error(LOG_PREFIX+ "::DEBIT_INSERT_ERROR"); + log.error(LOG_PREFIX+ "::========== ISSUE_END =========="); + } + + return responseObj; + } + + private JSONObject callReserve(int bfCash, TripleVO tripleVO) { + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::"+tripleVO.getTranType()+"::callReserve::::"; + + JSONObject responseObj = new JSONObject(); + log.info(LOG_PREFIX+ "::========== RESERVE_START =========="); + + int debitCnt = betDao.getBetinfoCheckByBetId(tripleVO.getBetId()); + + if(debitCnt >= 1) { + int amount = Math.abs(tripleVO.getCredit()); + + BigDecimal bfCashB = null; + if(tripleVO.getBeforeCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + bfCashB = new BigDecimal(""+bfCash); + tripleVO.setBeforeCash(bfCashB.longValue()); + } else { + bfCashB = new BigDecimal(""+tripleVO.getBeforeCash()); + } + + BigDecimal amountB = new BigDecimal(""+amount); + + BigDecimal afCashB = null; + if(tripleVO.getAfterCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + afCashB = bfCashB.add(amountB); + tripleVO.setAfterCash(afCashB.longValue()); + } else { + afCashB = new BigDecimal(""+tripleVO.getAfterCash()); + } + + log.info(LOG_PREFIX+ "::BF_BALANCE::" + bfCashB.longValue()); + log.info(LOG_PREFIX+ "::RESERVE_AMOUNT::" + amount); + log.info(LOG_PREFIX+ "::AF_BALANCE::" + afCashB.longValue()); + + //asyncService.depositBalanceAsync(tripleVO); + //log.info(LOG_PREFIX+ "::depositBalanceAsync::Call"); + + if(amount != 0) { + HashMap memCashUpdParam = new HashMap(); + memCashUpdParam.put("siteId", tripleVO.getSiteId()); + memCashUpdParam.put("memId", tripleVO.getMemId()); + memCashUpdParam.put("cashAmt", Integer.toString(amount)); + memCashUpdParam.put("changeFlag", "N"); + int memCashResult = betDao.updateUserCashByAmount(memCashUpdParam); + } + + Long betIdx = betDao.getBetIdxByBetId(tripleVO.getBetId()); + if(betIdx != null) { + if(amount != 0) { + asyncService.updateSportBetReserve(tripleVO, betIdx); + } + } + + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash().intValue()); + log.info(LOG_PREFIX+ "::========== RESERVE_END =========="); + + } else { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 99); + responseObj.put("error_msg","BET_DOES_NOT_EXIST"); + log.error(LOG_PREFIX+ "::BET_DOES_NOT_EXIST"); + log.error(LOG_PREFIX+ "::========== RESERVE_END =========="); + } + + return responseObj; + } + + private JSONObject callWin(int bfCash, TripleVO tripleVO) { + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::"+tripleVO.getTranType()+"::callWin::::"; + + JSONObject responseObj = new JSONObject(); + log.info(LOG_PREFIX+ "::========== CREDIT_START =========="); + + int debitCnt = betDao.getBetinfoCheckByBetId(tripleVO.getBetId()); + int creditCnt = betDao.getTripleCreditCheckByTranId(tripleVO.getTranId()); + + int amount = Math.abs(tripleVO.getCredit()); + + if(creditCnt != 0) { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 98); + responseObj.put("error_msg","WIN_ALREADY_SETTLED"); + log.error(LOG_PREFIX+ "::WIN_ALREADY_SETTLED"); + log.error(LOG_PREFIX+ "::========== CREDIT_END =========="); + return responseObj; + } + + if(debitCnt >= 1) { + BigDecimal bfCashB = null; + if(tripleVO.getBeforeCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + bfCashB = new BigDecimal(""+bfCash); + tripleVO.setBeforeCash(bfCashB.longValue()); + } else { + bfCashB = new BigDecimal(""+tripleVO.getBeforeCash()); + } + + BigDecimal amountB = new BigDecimal(""+amount); + + BigDecimal afCashB = null; + if(tripleVO.getAfterCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + afCashB = bfCashB.add(amountB); + tripleVO.setAfterCash(afCashB.longValue()); + } else { + afCashB = new BigDecimal(""+tripleVO.getAfterCash()); + } + + //asyncService.depositBalanceAsync(tripleVO); + //log.info(LOG_PREFIX+ "::depositBalanceAsync::Call"); + int result = betDao.insertTripleTxnData(tripleVO); + log.info(LOG_PREFIX+ "::insertTripleTxnData::result::" + result); + + // BetEnd Proc + if(result > 0) { + int betWinAmt = (int) tripleVO.getCredit(); + + if(betWinAmt > 0) { + HashMap memCashUpdParam = new HashMap(); + memCashUpdParam.put("siteId", tripleVO.getSiteId()); + memCashUpdParam.put("memId", tripleVO.getMemId()); + memCashUpdParam.put("cashAmt", Integer.toString(betWinAmt)); + memCashUpdParam.put("changeFlag", "N"); + int memCashResult = betDao.updateUserCashByAmount(memCashUpdParam); + } + + Long betIdx = betDao.getBetIdxByBetId(tripleVO.getBetId()); + if(betIdx != null) { + asyncService.updateSportBetCredit(tripleVO, betIdx); + } + + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash().intValue()); + log.info(LOG_PREFIX+ "::========== CREDIT_END =========="); + + } else { + responseObj.put("result_code", 4444); + responseObj.put("error_msg","CREDIT_INSERT_ERROR"); + log.error(LOG_PREFIX+ "::CREDIT_INSERT_ERROR"); + log.error(LOG_PREFIX+ "::========== CREDIT_END =========="); + } + + } else { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 99); + responseObj.put("error_msg","BET_DOES_NOT_EXIST"); + log.error(LOG_PREFIX+ "::BET_DOES_NOT_EXIST"); + log.error(LOG_PREFIX+ "::========== CREDIT_END =========="); + } + + return responseObj; + } + + private JSONObject callCancel(int bfCash, TripleVO tripleVO) { + final String LOG_PREFIX = "#-SPORT::callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::"+tripleVO.getTranType()+"::callCancel::::"; + + JSONObject responseObj = new JSONObject(); + log.info(LOG_PREFIX+ "::========== CANCEL_START =========="); + + int isCancleCnt = betDao.getTripleIsCancelCheck(tripleVO.getBetId()); + if(isCancleCnt != 0) { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 98); + responseObj.put("error_msg","CANCEL_ALREADY_SETTLED"); + log.error(LOG_PREFIX+ "::CANCEL_ALREADY_SETTLED"); + log.error(LOG_PREFIX+ "::========== CANCEL_END =========="); + return responseObj; + } + + int amount = Math.abs(tripleVO.getCredit()); + + int debitCnt = betDao.getBetinfoCheckByBetId(tripleVO.getBetId()); + + if(debitCnt != 0) { + BigDecimal bfCashB = null; + if(tripleVO.getBeforeCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + bfCashB = new BigDecimal(""+bfCash); + tripleVO.setBeforeCash(bfCashB.longValue()); + } else { + bfCashB = new BigDecimal(""+tripleVO.getBeforeCash()); + } + + BigDecimal amountB = new BigDecimal(""+amount); + + BigDecimal afCashB = null; + if(tripleVO.getAfterCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + afCashB = bfCashB.add(amountB); + tripleVO.setAfterCash(afCashB.longValue()); + } else { + afCashB = new BigDecimal(""+tripleVO.getAfterCash()); + } + + log.info(LOG_PREFIX+ "::BF_BALANCE::" + bfCashB.longValue()); + log.info(LOG_PREFIX+ "::RESERVE_AMOUNT::" + amount); + log.info(LOG_PREFIX+ "::AF_BALANCE::" + afCashB.longValue()); + + tripleVO.setIsCancel(1); + //asyncService.depositBalanceAsync(tripleVO); + //log.info(LOG_PREFIX+ "::depositBalanceAsync::Call"); + int result = betDao.insertTripleTxnData(tripleVO); + log.info(LOG_PREFIX+ "::insertTripleTxnData::result::" + result); + + if(result > 0) { + Long betIdx = betDao.getBetIdxByBetId(tripleVO.getBetId()); + + if(betIdx != null) { + HashMap param = new HashMap(); + param.put("betIdx", betIdx); + param.put("betStatus", "CANCEL"); + param.put("betWinAmt", Integer.toString(amount)); + int resultBet = betDao.betCancelTriple(param); + log.info(LOG_PREFIX+ "::betCancelTriple::result::" + resultBet); + + int resultBetOld = betDao.betCancelOldTriple(param); + log.info(LOG_PREFIX+ "::betCancelOldTriple::result::" + resultBetOld); + + if(resultBet > 0) { + HashMap memCashUpdParam = new HashMap(); + memCashUpdParam.put("siteId", tripleVO.getSiteId()); + memCashUpdParam.put("memId", tripleVO.getMemId()); + memCashUpdParam.put("cashAmt", Integer.toString(amount)); + memCashUpdParam.put("changeFlag", "N"); + int memCashResult = betDao.updateUserCashByAmount(memCashUpdParam); + + asyncService.updateSportBetCancel(tripleVO, betIdx); + + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash().intValue()); + log.info(LOG_PREFIX+ "::========== CANCEL_END =========="); + } + } + + } else { + responseObj.put("result_code", 5555); + responseObj.put("error_msg","CANCEL_INSERT_ERROR"); + log.error(LOG_PREFIX+ "::CANCEL_INSERT_ERROR"); + log.error(LOG_PREFIX+ "::========== CANCEL_END =========="); + } + + } else { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 99); + responseObj.put("error_msg","BET_DOES_NOT_EXIST"); + log.error(LOG_PREFIX+ "::BET_DOES_NOT_EXIST"); + log.error(LOG_PREFIX+ "::========== CANCEL_END =========="); + } + + return responseObj; + } + + @Override + public int updatePurchaseId(TriplePurchaseId tripleVO) { + int result = 0; + final String LOG_PREFIX = "#-SPORT::callPurchaseId::"+tripleVO.getBetId()+"::"+tripleVO.getPurchaseId()+"::"; + + try { + result = betDao.updatePurchaseId(tripleVO); + log.info(LOG_PREFIX+ "updatePurchaseId::result::"+result); + } catch(Exception e) { + result = -1; + log.error(LOG_PREFIX+ "UNKNOWN_ERROR"); + log.error(LOG_PREFIX+ "ERROR::" + e.getMessage()); + } + + return result; + } + +} diff --git a/src/main/java/com/bb/service/SuperService.java b/src/main/java/com/bb/service/SuperService.java new file mode 100644 index 0000000..e7e2390 --- /dev/null +++ b/src/main/java/com/bb/service/SuperService.java @@ -0,0 +1,18 @@ +package com.bb.service; + +import java.util.HashMap; +import java.util.List; + +import jakarta.validation.Valid; + +import com.bb.model.MemberDetail; +import com.bb.model.MemberListSearch; +import com.bb.model.SiteSearch; + +public interface SuperService { + + int getCompanyListCnt(@Valid MemberListSearch search); + + List getCompanyList(@Valid MemberListSearch search); + +} diff --git a/src/main/java/com/bb/service/SuperServiceImpl.java b/src/main/java/com/bb/service/SuperServiceImpl.java new file mode 100644 index 0000000..91532ad --- /dev/null +++ b/src/main/java/com/bb/service/SuperServiceImpl.java @@ -0,0 +1,36 @@ +package com.bb.service; + +import java.util.HashMap; +import java.util.List; + +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.bb.dao.CashDao; +import com.bb.dao.SuperDao; +import com.bb.dao.UserDao; +import com.bb.model.MemberDetail; +import com.bb.model.MemberListSearch; +import com.bb.model.SiteSearch; +@RequiredArgsConstructor +@Service +public class SuperServiceImpl implements SuperService { + + private final SuperDao superDao; + + @Override + public int getCompanyListCnt(@Valid MemberListSearch search) { + // TODO Auto-generated method stub + return superDao.getCompanyListCnt(search); + } + + @Override + public List getCompanyList(@Valid MemberListSearch search) { + // TODO Auto-generated method stub + return superDao.getCompanyList(search); + } + +} diff --git a/src/main/java/com/bb/service/TripleService.java b/src/main/java/com/bb/service/TripleService.java new file mode 100644 index 0000000..1ab18d1 --- /dev/null +++ b/src/main/java/com/bb/service/TripleService.java @@ -0,0 +1,33 @@ +package com.bb.service; + +import org.springframework.web.client.ResourceAccessException; + +import com.bb.model.ApiVendorCompInfo; +import com.bb.model.Member; +import com.bb.model.TripleAuthInfo; +import com.bb.model.TripleSbVO; +import com.bb.model.TripleVO; + +import net.sf.json.JSONObject; + +public interface TripleService { + + JSONObject betProc(Member search, TripleVO tripleVO); + + String getBetDetail(ApiVendorCompInfo tripleVendor, String betId) throws ResourceAccessException, Exception; + + String getBetDetailTest(ApiVendorCompInfo tripleVendor, String betId) throws ResourceAccessException, Exception; + + org.codehaus.jettison.json.JSONObject getBetDetail2(ApiVendorCompInfo tripleVendor, String betId) throws ResourceAccessException, Exception; + + org.codehaus.jettison.json.JSONObject getUserBalance(ApiVendorCompInfo apiVendor, String vendorKey, String tripleUsername) throws ResourceAccessException, Exception; + + org.codehaus.jettison.json.JSONObject depositBalance(ApiVendorCompInfo apiVendor, String vendor, TripleAuthInfo tripleMember, int amount) throws ResourceAccessException, Exception; + + org.codehaus.jettison.json.JSONObject withdrawBalance(ApiVendorCompInfo apiVendor, String vendor, TripleAuthInfo tripleMember) throws ResourceAccessException, Exception; + + JSONObject betProcSlot(final String LOG_PREFIX, Member search, TripleVO tripleVO); + + org.codehaus.jettison.json.JSONObject getTripleCreditInfo(ApiVendorCompInfo apiVendor) throws ResourceAccessException, Exception; + +} diff --git a/src/main/java/com/bb/service/TripleServiceImpl.java b/src/main/java/com/bb/service/TripleServiceImpl.java new file mode 100644 index 0000000..885520e --- /dev/null +++ b/src/main/java/com/bb/service/TripleServiceImpl.java @@ -0,0 +1,1762 @@ +package com.bb.service; + +import java.math.BigDecimal; +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.ResourceAccessException; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.util.UriComponentsBuilder; + +import com.bb.dao.BetDao; +import com.bb.dao.CashDao; +import com.bb.dao.CommonDao; +import com.bb.dao.UserDao; +import com.bb.model.ApiVendorCompInfo; +import com.bb.model.BetAutoLoseVO; +import com.bb.model.CodeSearch; +import com.bb.model.Member; +import com.bb.model.MemberSearch; +import com.bb.model.TripleAuthInfo; +import com.bb.model.TripleSbVO; +import com.bb.model.TripleVO; +import com.bb.util.RandomRolling; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; +import reactor.core.publisher.Mono; + +@Slf4j +@RequiredArgsConstructor +@Service +public class TripleServiceImpl implements TripleService { + + private final UserDao userDao; + + private final BetDao betDao; + + private final CashDao cashDao; + + private final CommonDao commonDao; + + private final AsyncTripleService asyncService; + + //@Autowired + //RestTemplate restTemplate; + + @Autowired + WebClient webClient; + + + @Override + public JSONObject betProc(Member search, TripleVO tripleVO) { + JSONObject responseObj = new JSONObject(); + final String LOG_PREFIX = "#-callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::"+tripleVO.getTranType()+"::betProc::::"; + + try { + long chs = System.currentTimeMillis(); + HashMap memberVo = userDao.getMemberMap(search); + long che = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff = (chs - che)/1000.0; //두 시간에 차 계산 + if(diff < -1.3) { + log.error(LOG_PREFIX+ "[### userDao.getMemberMap() : " + String.format("%.3f", diff) + " ###]"); + responseObj.put("result_code", 44); + responseObj.put("error_msg","TIMEOUT_ERROR"); + log.error(LOG_PREFIX+ "[### userDao.getMemberMap() TIMEOUT_ERROR ] "); + return responseObj; + } + int bfCash = Integer.parseInt(memberVo.get("cashAmt").toString()); + + int siteIdx = (int) memberVo.get("siteIdx"); + int memIdx = (int) memberVo.get("memIdx"); + tripleVO.setSiteIdx(siteIdx); + tripleVO.setMemIdx(memIdx); + + tripleVO.setSiteId(memberVo.get("siteId").toString()); + tripleVO.setMemId(memberVo.get("memId").toString()); + tripleVO.setMemLevel(memberVo.get("memLevel").toString()); + tripleVO.setBetYn(memberVo.get("betYn").toString()); + tripleVO.setMemLockYn(memberVo.get("memLockYn").toString()); + tripleVO.setSymLock(memberVo.get("symLock").toString()); + tripleVO.setIsBiPushYn(memberVo.get("isBiPushYn").toString()); + + if(tripleVO.getTranType().equals("debit") && tripleVO.getIsCancel() == 0) { + // Debit OK + long startTime = System.currentTimeMillis(); + + responseObj = callBet(bfCash, tripleVO); + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -1.5) { + log.error(LOG_PREFIX+ "[### callBet diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + } else if(tripleVO.getTranType().equals("debit") && tripleVO.getIsCancel() == 1) { + // Debit Cancel + long startTime = System.currentTimeMillis(); + + if(tripleVO.getVendorIdx() == 4) { + responseObj = callAutoCancel(bfCash, tripleVO); + } else if(tripleVO.getVendor().equals("cncp") || tripleVO.getVendor().equals("vinus")) { + responseObj = callCancelMega(bfCash, tripleVO); + } else { + responseObj = callCancel(bfCash, tripleVO); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -1.5) { + log.error(LOG_PREFIX+ "[### callCancel[Debit] diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + } else if(tripleVO.getTranType().equals("credit") && tripleVO.getIsCancel() == 0 && tripleVO.getIsBonus() == 0) { + // Credit OK + long startTime = System.currentTimeMillis(); + + responseObj = callWin(bfCash, tripleVO); + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -1.5) { + log.error(LOG_PREFIX+ "[### callWin diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + } else if(tripleVO.getTranType().equals("credit") && tripleVO.getIsCancel() == 1 && tripleVO.getIsBonus() == 0) { + // Credit Cancel + long startTime = System.currentTimeMillis(); + + if(tripleVO.getVendor().equals("cncp") || tripleVO.getVendor().equals("vinus")) { + responseObj = callCancelMega(bfCash, tripleVO); + } else { + responseObj = callCancel(bfCash, tripleVO); + } + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -1.5) { + log.error(LOG_PREFIX+ "[### callCancel[Credit] diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + } else if(tripleVO.getTranType().equals("adjust")) { + // Adjust OK + long startTime = System.currentTimeMillis(); + + responseObj = callWin(bfCash, tripleVO); + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -1.5) { + log.error(LOG_PREFIX+ "[### callWin diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + } else if(tripleVO.getTranType().equals("tip")) { + // Tip OK + long startTime = System.currentTimeMillis(); + + responseObj = callTip(bfCash, tripleVO); + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -1.5) { + log.error(LOG_PREFIX+ "[### callWin diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + } else if(tripleVO.getTranType().equals("credit_wait")) { + // credit_wait + long startTime = System.currentTimeMillis(); + + responseObj.put("result_code", 0); + responseObj.put("balance", bfCash); + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -1.5) { + log.error(LOG_PREFIX+ "[### credit_wait diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + } else if(tripleVO.getTranType().equals("other")) { + // Other + long startTime = System.currentTimeMillis(); + + responseObj = callOther(bfCash, tripleVO); + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -1.5) { + log.error(LOG_PREFIX+ "[### callBonus diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + } else { + // Bonus + long startTime = System.currentTimeMillis(); + + responseObj = callBonus(bfCash, tripleVO); + + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + if(diffTime < -1.5) { + log.error(LOG_PREFIX+ "[### callBonus diffTime : " + String.format("%.3f", diffTime) + " ###]"); + } + } + + } catch(Exception e) { + responseObj.put("result_code", 1111); + responseObj.put("error_msg","UNKNOWN_ERROR"); + log.error("#-betProc::" + e.getMessage()); + } + + return responseObj; + } + + + private JSONObject callBet(int bfCash, TripleVO tripleVO) throws Exception { + final String LOG_PREFIX = "#-callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::callBet::::"; + log.info(LOG_PREFIX+ "START"); + + JSONObject responseObj = new JSONObject(); + + if(tripleVO.getBetYn().equals("N") || tripleVO.getMemLockYn().equals("Y") || tripleVO.getSymLock().equals("Y")) { + if(tripleVO.getSymLock().equals("Y")) { + HashMap lockParam = new HashMap<>(); + lockParam.put("siteId", tripleVO.getSiteId()); + lockParam.put("memId", tripleVO.getMemId()); + int lockResult = userDao.setUserLock(lockParam); + log.error(LOG_PREFIX+ "setUserLock::result::" + lockResult); + } + + responseObj.put("result_code", 1005); + responseObj.put("balance", bfCash); + responseObj.put("error_msg","THIS_USER_BETTING_LOCK"); + log.error(LOG_PREFIX+ "[THIS_USER_BETTING_LOCK ERROR]"); + return responseObj; + } + + long chs1 = System.currentTimeMillis(); + int debitCnt = betDao.getTripleDebitCheckByTranId(tripleVO.getTranId()); + long che1 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff1 = (chs1 - che1)/1000.0; //두 시간에 차 계산 + log.info(LOG_PREFIX+ "[### betDao.getTripleDebitCheckByTranId() : " + String.format("%.3f", diff1) + " ###]"); + if(diff1 < -1.0){ + log.error(LOG_PREFIX+ "[### betDao.getTripleDebitCheckByTranId() : " + String.format("%.3f", diff1) + " ###]"); + responseObj.put("result_code", 44); + responseObj.put("balance", bfCash); + responseObj.put("error_msg","TIMEOUT_ERROR"); + log.error(LOG_PREFIX+ "[### betDao.getTripleDebitCheckByTranId() TIMEOUT_ERROR ]"); + return responseObj; + + } + int amount = Math.abs(tripleVO.getDebit()); + + if(debitCnt > 0) { + responseObj.put("result_code", 98); + responseObj.put("balance", bfCash); + responseObj.put("error_msg","BET_ALREADY_SETTLED"); + log.error(LOG_PREFIX+ "[BET_ALREADY_SETTLED ERROR]"); + return responseObj; + } + + /* + MemberSearch search = new MemberSearch(); + search.setSiteId(tripleVO.getSiteId()); + search.setMemId(tripleVO.getMemId()); + long startTime = System.currentTimeMillis(); + bfCash = cashDao.getMemCashForUpdate(search); + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + log.error("getMemCashForUpdate::["+tripleVO.getBetId()+"]::diffTime:" + String.format("%.3f", diffTime)); + */ + + if(bfCash == 0 || bfCash < amount) { + // 유저머니가 없는경우 code 80 msg : INSUFFICIENT_FUNDS + responseObj.put("result_code", 80); + responseObj.put("balance", bfCash); + responseObj.put("error_msg","INSUFFICIENT_FUNDS"); + log.error(LOG_PREFIX+ "[INSUFFICIENT_FUNDS ERROR]"); + return responseObj; + } + + + HashMap betLimitInfo = betDao.getSiteBetLimitInfo(tripleVO); + int maxBetAmt = Integer.parseInt(betLimitInfo.get("betAmtMax").toString()); + if(amount > maxBetAmt) { + // 최대 배팅금액 초과시 에러 리턴 + responseObj.put("result_code", 81); + responseObj.put("balance", bfCash); + responseObj.put("error_msg","MAX_BET_OVER"); + log.error(LOG_PREFIX+ "[MAX_BET_OVER ERROR]"); + return responseObj; + } + + + // Bet Proc + BigDecimal bfCashB = null; + if(tripleVO.getBeforeCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + bfCashB = new BigDecimal(""+bfCash); + tripleVO.setBeforeCash(bfCashB.longValue()); + } else { + bfCashB = new BigDecimal(""+tripleVO.getBeforeCash()); + } + + BigDecimal amountB = new BigDecimal(""+amount); + + BigDecimal afCashB = null; + if(tripleVO.getAfterCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + afCashB = bfCashB.subtract(amountB); + tripleVO.setAfterCash(afCashB.longValue()); + } else { + afCashB = new BigDecimal(""+tripleVO.getAfterCash()); + } + + //asyncService.withdrawBalanceAsync(tripleVO); + + long chs2 = System.currentTimeMillis(); + int result = betDao.insertTripleTxnData(tripleVO); + long che2 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff2 = (chs2 - che2)/1000.0; //두 시간에 차 계산 + log.info(LOG_PREFIX+ "[### betDao.insertTripleTxnData() : " + String.format("%.3f", diff2) + " ###]"); + if(diff2 < -1.0){ + log.error(LOG_PREFIX+ "[### betDao.insertTripleTxnData() : " + String.format("%.3f", diff2) + " ###]"); + responseObj.put("result_code", 44); + responseObj.put("error_msg","TIMEOUT_ERROR"); + log.error(LOG_PREFIX+ "[### betDao.insertTripleTxnData() TIMEOUT_ERROR ]"); + return responseObj; + } + + if(result > 0) { + HashMap memCashUpdParam = new HashMap(); + memCashUpdParam.put("siteId", tripleVO.getSiteId()); + memCashUpdParam.put("memId", tripleVO.getMemId()); + int betAmt = tripleVO.getDebit(); + int cashAmt = betAmt * -1; + memCashUpdParam.put("cashAmt", Integer.toString(cashAmt)); + memCashUpdParam.put("changeFlag", "N"); + long chs4 = System.currentTimeMillis(); + int memCashResult = betDao.updateUserCashByAmount(memCashUpdParam); + long che4 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff4 = (chs4 - che4)/1000.0; //두 시간에 차 계산 + log.info(LOG_PREFIX+ "[### betDao.updateUserCashTriple() : " + String.format("%.3f", diff4) + " ###]"); + if(diff4 < -1.0) log.error(LOG_PREFIX+ "[### betDao.updateUserCashTriple() : " + String.format("%.3f", diff4) + " ###]"); + + long chs3 = System.currentTimeMillis(); + Long betIdx = betDao.getBetIdxByGameIdx(tripleVO.getBetId()); + long che3 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff3 = (chs3 - che3)/1000.0; //두 시간에 차 계산 + log.info(LOG_PREFIX+ "[### betDao.getBetIdxByGameIdx() : " + String.format("%.3f", diff3) + " ###]"); + + if(betIdx != null) { + //이미 베팅한거에 추가 배팅 건 + asyncService.updateBetDebit(tripleVO, betIdx); + + } else { + asyncService.insertBetDebit(tripleVO); + } + + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash().intValue()); + log.info(LOG_PREFIX+ "SUCC!!!!"); + + } else { + responseObj.put("result_code", 3333); + responseObj.put("error_msg","DEBIT_ERROR"); + } + + return responseObj; + } + + + private JSONObject callWin(int bfCash, TripleVO tripleVO) throws Exception { + final String LOG_PREFIX = "#-callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::callWin::::"; + log.info(LOG_PREFIX+ "START"); + JSONObject responseObj = new JSONObject(); + + long chs1 = System.currentTimeMillis(); + int debitCnt = betDao.getTripleDebitCheckByBetId(tripleVO.getBetId()); + long che1 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff1 = (chs1 - che1)/1000.0; //두 시간에 차 계산 + if(diff1 < -1.0) log.error(LOG_PREFIX+ "[### betDao.getTripleDebitCheckByBetId() : " + String.format("%.3f", diff1) + " ###]"); + + long chs2 = System.currentTimeMillis(); + int creditCnt = betDao.getTripleCreditCheckByTranId(tripleVO.getTranId()); + long che2 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff2 = (chs2 - che2)/1000.0; //두 시간에 차 계산 + if(diff2 < -1.0) log.error(LOG_PREFIX+ "[### betDao.getTripleCreditCheckByTranId() : " + String.format("%.3f", diff2) + " ###]"); + + long chs3 = System.currentTimeMillis(); + int creditCntByBetId = betDao.getTripleCreditCheckByBetId(tripleVO.getBetId()); + long che3 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff3 = (chs3 - che3)/1000.0; //두 시간에 차 계산 + if(diff3 < -1.0) log.error(LOG_PREFIX+ "[### betDao.getTripleCreditCheckByBetId() : " + String.format("%.3f", diff3) + " ###]"); + + + int amount = tripleVO.getCredit(); + + if(debitCnt >= 1) { + if(creditCnt != 0) { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 98); + responseObj.put("error_msg","WIN_ALREADY_SETTLED"); + return responseObj; + } + + /* + MemberSearch search = new MemberSearch(); + search.setSiteId(tripleVO.getSiteId()); + search.setMemId(tripleVO.getMemId()); + long startTime = System.currentTimeMillis(); + bfCash = cashDao.getMemCashForUpdate(search); + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + log.error("getMemCashForUpdate::["+tripleVO.getBetId()+"]::diffTime:" + String.format("%.3f", diffTime)); + */ + + BigDecimal bfCashB = null; + if(tripleVO.getBeforeCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + bfCashB = new BigDecimal(""+bfCash); + tripleVO.setBeforeCash(bfCashB.longValue()); + } else { + bfCashB = new BigDecimal(""+tripleVO.getBeforeCash()); + } + + BigDecimal amountB = new BigDecimal(""+amount); + + BigDecimal afCashB = null; + if(tripleVO.getAfterCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + afCashB = bfCashB.add(amountB); + tripleVO.setAfterCash(afCashB.longValue()); + } else { + afCashB = new BigDecimal(""+tripleVO.getAfterCash()); + } + + long chs4 = System.currentTimeMillis(); + int result = betDao.insertTripleTxnData(tripleVO); + long che4 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff4 = (chs4 - che4)/1000.0; //두 시간에 차 계산 + if(diff4 < -1.0) log.error(LOG_PREFIX+ "[### betDao.insertTripleTxnData() : " + String.format("%.3f", diff4) + " ###]"); + + // BetEnd Proc + if(result > 0) { + int betWinAmt = (int) tripleVO.getCredit(); + + if(betWinAmt != 0) { + HashMap memCashUpdParam = new HashMap(); + memCashUpdParam.put("siteId", tripleVO.getSiteId()); + memCashUpdParam.put("memId", tripleVO.getMemId()); + memCashUpdParam.put("cashAmt", Integer.toString(betWinAmt)); + memCashUpdParam.put("changeFlag", "N"); + long chs6 = System.currentTimeMillis(); + int memCashResult = betDao.updateUserCashByAmount(memCashUpdParam); + long che6 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff6 = (chs6 - che6)/1000.0; //두 시간에 차 계산 + if(diff6 < -1.0) log.error(LOG_PREFIX+ "[### betDao.updateUserCashTriple() : " + String.format("%.3f", diff6) + " ###]"); + } + + long chs5 = System.currentTimeMillis(); + Long betIdx = betDao.getBetIdxByGameIdx(tripleVO.getBetId()); + long che5 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff5 = (chs5 - che5)/1000.0; //두 시간에 차 계산 + if(diff5 < -1.0) log.error(LOG_PREFIX+ "[### betDao.getBetIdxByGameIdx() : " + String.format("%.3f", diff5) + " ###]"); + + if(betIdx != null) { + if(creditCntByBetId == 0 || betWinAmt != 0) { + // 배팅결과가 있는데 #AUTOLOSE가 들어온 경우 거르기 + asyncService.updateBetCredit(tripleVO, betIdx); + } + } + + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash().intValue()); + log.info(LOG_PREFIX+ "SUCC!!!!"); + + } else { + responseObj.put("result_code", 4444); + responseObj.put("error_msg","CREDIT_ERROR"); + } + } else { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 99); + responseObj.put("error_msg","BET_DOES_NOT_EXIST"); + /* + if(creditCnt == 0) { + tripleVO.setBeforeCash((long) bfCash); + int result = betDao.insertTripleTxnData(tripleVO); + + int betWinAmt = (int) tripleVO.getCredit(); + if(betWinAmt != 0) { + HashMap memCashUpdParam = new HashMap(); + memCashUpdParam.put("siteId", tripleVO.getSiteId()); + memCashUpdParam.put("memId", tripleVO.getMemId()); + memCashUpdParam.put("cashAmt", Integer.toString(betWinAmt)); + memCashUpdParam.put("changeFlag", "N"); + int memCashResult = betDao.updateUserCashByAmount(memCashUpdParam); + } + + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash().intValue()); + log.info("### Triple API Controller ### - callWin() imsi Credit SUCC!!!!"); + } else { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 99); + responseObj.put("error_msg","BET_DOES_NOT_EXIST"); + } + */ + } + + return responseObj; + } + + + private JSONObject callCancel(int bfCash, TripleVO tripleVO) throws Exception { + final String LOG_PREFIX = "#-callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::callCancel::::"; + log.info(LOG_PREFIX+ "START"); + JSONObject responseObj = new JSONObject(); + + int debitCnt = 0; + // 배팅 취소 처리 + debitCnt = betDao.getTripleDebitCheckByBetId(tripleVO.getBetId()); + if(debitCnt != 0) { + int isCancleCnt = betDao.getTripleIsCancelCheck(tripleVO.getBetId()); + if(isCancleCnt == 0) { + int amount = 0; + if(tripleVO.getTranType().equals("debit")) { + amount = Math.abs(tripleVO.getDebit()); + } else { + amount = Math.abs(tripleVO.getCredit()); + } + /* + MemberSearch search = new MemberSearch(); + search.setSiteId(tripleVO.getSiteId()); + search.setMemId(tripleVO.getMemId()); + long startTime = System.currentTimeMillis(); + bfCash = cashDao.getMemCashForUpdate(search); + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + log.error("getMemCashForUpdate::["+tripleVO.getBetId()+"]::diffTime:" + String.format("%.3f", diffTime)); + */ + + BigDecimal bfCashB = null; + if(tripleVO.getBeforeCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + bfCashB = new BigDecimal(""+bfCash); + tripleVO.setBeforeCash(bfCashB.longValue()); + } else { + bfCashB = new BigDecimal(""+tripleVO.getBeforeCash()); + } + + BigDecimal amountB = new BigDecimal(""+amount); + + BigDecimal afCashB = null; + if(tripleVO.getAfterCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + afCashB = bfCashB.add(amountB); + tripleVO.setAfterCash(afCashB.longValue()); + } else { + afCashB = new BigDecimal(""+tripleVO.getAfterCash()); + } + + log.info(LOG_PREFIX+ "CANCEL bfCashB: " + bfCashB.intValue()); + log.info(LOG_PREFIX+ "CANCEL afCashB: " + afCashB.intValue()); + + int result = betDao.insertTripleTxnData(tripleVO); + if(result > 0) { + Long betIdx = betDao.getBetIdxByGameIdx(tripleVO.getBetId()); + if(tripleVO.getDetail() != null) { + tripleVO.setDetailStr(tripleVO.getDetail().toString()); + } + + if(betIdx != null) { + HashMap param = new HashMap(); + param.put("betIdx", betIdx); + param.put("betStatus", "CANCEL"); + param.put("betWinAmt", Integer.toString(amount)); + param.put("data", tripleVO.getDetailStr()); + + int resultBet = betDao.betCancelTriple(param); +// int resultBetMap = betDao.betMapCancelTriple(param); + if(resultBet > 0) { + HashMap memCashUpdParam = new HashMap(); + memCashUpdParam.put("siteId", tripleVO.getSiteId()); + memCashUpdParam.put("memId", tripleVO.getMemId()); + memCashUpdParam.put("cashAmt", Integer.toString(amount)); + memCashUpdParam.put("changeFlag", "N"); + int memCashResult = betDao.updateUserCashByAmount(memCashUpdParam); + + log.info(LOG_PREFIX+ "updateUserCashTriple() : " + memCashResult); + + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash().intValue()); + } else { + responseObj.put("result_code", 5555); + responseObj.put("error_msg","CANCEL_ERROR"); + } + } else { + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash().intValue()); + } + + } else { + responseObj.put("result_code", 5555); + responseObj.put("error_msg","CANCEL_ERROR"); + } + + } else { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 98); + responseObj.put("error_msg","CANCEL_ALREADY_SETTLED"); + } + } else { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 99); + responseObj.put("error_msg","BET_DOES_NOT_EXIST"); + /* + int isCancleCnt = betDao.getTripleIsCancelCheck(tripleVO.getBetId()); + if(isCancleCnt == 0) { + int amount = 0; + if(tripleVO.getTranType().equals("debit")) { + amount = Math.abs(tripleVO.getDebit()); + } else { + amount = Math.abs(tripleVO.getCredit()); + } + + BigDecimal bfCashB = null; + if(tripleVO.getBeforeCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + bfCashB = new BigDecimal(""+bfCash); + tripleVO.setBeforeCash(bfCashB.longValue()); + } else { + bfCashB = new BigDecimal(""+tripleVO.getBeforeCash()); + } + + BigDecimal amountB = new BigDecimal(""+amount); + + BigDecimal afCashB = null; + if(tripleVO.getAfterCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + afCashB = bfCashB.add(amountB); + tripleVO.setAfterCash(afCashB.longValue()); + } else { + afCashB = new BigDecimal(""+tripleVO.getAfterCash()); + } + + log.info(LOG_PREFIX+ "CANCEL bfCashB: " + bfCashB.intValue()); + log.info(LOG_PREFIX+ "CANCEL afCashB: " + afCashB.intValue()); + + int result = betDao.insertTripleTxnData(tripleVO); + + HashMap memCashUpdParam = new HashMap(); + memCashUpdParam.put("siteId", tripleVO.getSiteId()); + memCashUpdParam.put("memId", tripleVO.getMemId()); + memCashUpdParam.put("cashAmt", Integer.toString(amount)); + memCashUpdParam.put("changeFlag", "N"); + int memCashResult = betDao.updateUserCashByAmount(memCashUpdParam); + + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash().intValue()); + } else { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 99); + responseObj.put("error_msg","BET_DOES_NOT_EXIST"); + } + */ + } + + return responseObj; + } + + + private JSONObject callCancelMega(int bfCash, TripleVO tripleVO) { + final String LOG_PREFIX = "#-callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::callCancelMega::::"; + log.info(LOG_PREFIX+ "START"); + JSONObject responseObj = new JSONObject(); + + int debitCnt = 0; + // 배팅 취소 처리 + debitCnt = betDao.getTripleDebitCheckByBetId(tripleVO.getBetId()); + if(debitCnt != 0) { + int isCancleCnt = betDao.getTripleCreditCheckByTranId(tripleVO.getTranId()); + if(isCancleCnt == 0) { + int amount = 0; + BigDecimal bfCashB = null; + BigDecimal afCashB = null; + if(tripleVO.getTranType().equals("credit")) { + // 배팅 취소 > 유저 잔액 증가 + amount = Math.abs(tripleVO.getCredit()); + + bfCashB = new BigDecimal(""+bfCash); + tripleVO.setBeforeCash(bfCashB.longValue()); + BigDecimal amountB = new BigDecimal(""+amount); + + afCashB = bfCashB.add(amountB); + tripleVO.setAfterCash(afCashB.longValue()); + } else { + // 당첨 취소 > 유저 잔액 감소 + amount = Math.abs(tripleVO.getDebit()); + + bfCashB = new BigDecimal(""+bfCash); + tripleVO.setBeforeCash(bfCashB.longValue()); + BigDecimal amountB = new BigDecimal(""+amount); + + afCashB = bfCashB.subtract(amountB); + tripleVO.setAfterCash(afCashB.longValue()); + } + + log.info(LOG_PREFIX+ "CANCEL bfCashB: " + bfCashB.intValue()); + log.info(LOG_PREFIX+ "CANCEL afCashB: " + afCashB.intValue()); + + int result = betDao.insertTripleTxnData(tripleVO); + if(result > 0) { + Long betIdx = betDao.getBetIdxByGameIdx(tripleVO.getBetId()); + + if(betIdx != null) { + if(tripleVO.getTranType().equals("credit")) { + // 배팅 취소 + HashMap param = new HashMap(); + param.put("betIdx", betIdx); + param.put("betStatus", "CANCEL"); + int cancelBetAmt = amount * -1; + param.put("betAmt", Integer.toString(cancelBetAmt)); + param.put("betWinAmt", "0"); + param.put("afMoney", Long.toString(tripleVO.getAfterCash().longValue())); + + int resultBet = betDao.betCancelMega(param); + if(resultBet > 0) { + HashMap memCashUpdParam = new HashMap(); + memCashUpdParam.put("siteId", tripleVO.getSiteId()); + memCashUpdParam.put("memId", tripleVO.getMemId()); + memCashUpdParam.put("cashAmt", Integer.toString(amount)); + memCashUpdParam.put("changeFlag", "N"); + int memCashResult = betDao.updateUserCashByAmount(memCashUpdParam); + + log.info(LOG_PREFIX+ "updateUserCashTriple() : " + memCashResult); + + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash().intValue()); + } else { + responseObj.put("result_code", 5555); + responseObj.put("error_msg","CANCEL_ERROR"); + } + } else { + // 당첨 취소 + HashMap param = new HashMap(); + param.put("betIdx", betIdx); + param.put("betStatus", "CANCEL"); + param.put("betAmt", "0"); + int cancelWinAmt = amount * -1; + param.put("betWinAmt", Integer.toString(cancelWinAmt)); + param.put("afMoney", Long.toString(tripleVO.getAfterCash().longValue())); + + int resultBet = betDao.betCancelMega(param); + if(resultBet > 0) { + HashMap memCashUpdParam = new HashMap(); + memCashUpdParam.put("siteId", tripleVO.getSiteId()); + memCashUpdParam.put("memId", tripleVO.getMemId()); + amount = amount * -1; + memCashUpdParam.put("cashAmt", Integer.toString(amount)); + memCashUpdParam.put("changeFlag", "N"); + int memCashResult = betDao.updateUserCashByAmount(memCashUpdParam); + + log.info(LOG_PREFIX+ "updateUserCashTriple() : " + memCashResult); + + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash().intValue()); + } else { + responseObj.put("result_code", 5555); + responseObj.put("error_msg","CANCEL_ERROR"); + } + } + + } else { + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash().intValue()); + } + + } else { + responseObj.put("result_code", 5555); + responseObj.put("error_msg","CANCEL_ERROR"); + } + + } else { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 98); + responseObj.put("error_msg","CANCEL_ALREADY_SETTLED"); + } + } else { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 99); + responseObj.put("error_msg","BET_DOES_NOT_EXIST"); + /* + int isCancleCnt = betDao.getTripleIsCancelCheck(tripleVO.getBetId()); + if(isCancleCnt == 0) { + int amount = 0; + BigDecimal bfCashB = null; + BigDecimal afCashB = null; + if(tripleVO.getTranType().equals("debit")) { + amount = Math.abs(tripleVO.getDebit()); + + bfCashB = new BigDecimal(""+bfCash); + tripleVO.setBeforeCash(bfCashB.longValue()); + BigDecimal amountB = new BigDecimal(""+amount); + + afCashB = bfCashB.add(amountB); + tripleVO.setAfterCash(afCashB.longValue()); + } else { + amount = Math.abs(tripleVO.getCredit()); + + bfCashB = new BigDecimal(""+bfCash); + tripleVO.setBeforeCash(bfCashB.longValue()); + BigDecimal amountB = new BigDecimal(""+amount); + + afCashB = bfCashB.subtract(amountB); + tripleVO.setAfterCash(afCashB.longValue()); + } + + log.info(LOG_PREFIX+ "CANCEL bfCashB: " + bfCashB.intValue()); + log.info(LOG_PREFIX+ "CANCEL afCashB: " + afCashB.intValue()); + + int result = betDao.insertTripleTxnData(tripleVO); + + if(tripleVO.getTranType().equals("debit")) { + // 배팅 취소 + HashMap memCashUpdParam = new HashMap(); + memCashUpdParam.put("siteId", tripleVO.getSiteId()); + memCashUpdParam.put("memId", tripleVO.getMemId()); + memCashUpdParam.put("cashAmt", Integer.toString(amount)); + memCashUpdParam.put("changeFlag", "N"); + int memCashResult = betDao.updateUserCashByAmount(memCashUpdParam); + } else { + // 당첨 취소 + HashMap memCashUpdParam = new HashMap(); + memCashUpdParam.put("siteId", tripleVO.getSiteId()); + memCashUpdParam.put("memId", tripleVO.getMemId()); + amount = amount * -1; + memCashUpdParam.put("cashAmt", Integer.toString(amount)); + memCashUpdParam.put("changeFlag", "N"); + int memCashResult = betDao.updateUserCashByAmount(memCashUpdParam); + } + + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash().intValue()); + } else { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 99); + responseObj.put("error_msg","BET_DOES_NOT_EXIST"); + } + */ + } + + return responseObj; + } + + + private JSONObject callAutoCancel(int bfCash, TripleVO tripleVO) throws Exception { + final String LOG_PREFIX = "#-callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::callAutoCancel::::"; + log.info(LOG_PREFIX+ "START"); + JSONObject responseObj = new JSONObject(); + + int debitCnt = 0; + // 배팅 취소 처리 + debitCnt = betDao.getTripleDebitCheckByTranId(tripleVO.getTranId()); + if(debitCnt != 0) { + int isCancleCnt = betDao.getTripleAutoCancelCheck(tripleVO.getTranId()); + if(isCancleCnt == 0) { + int amount = Math.abs(tripleVO.getCredit()); + /* + MemberSearch search = new MemberSearch(); + search.setSiteId(tripleVO.getSiteId()); + search.setMemId(tripleVO.getMemId()); + long startTime = System.currentTimeMillis(); + bfCash = cashDao.getMemCashForUpdate(search); + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + log.error("getMemCashForUpdate::["+tripleVO.getBetId()+"]::diffTime:" + String.format("%.3f", diffTime)); + */ + + BigDecimal bfCashB = null; + if(tripleVO.getBeforeCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + bfCashB = new BigDecimal(""+bfCash); + tripleVO.setBeforeCash(bfCashB.longValue()); + } else { + bfCashB = new BigDecimal(""+tripleVO.getBeforeCash()); + } + + BigDecimal amountB = new BigDecimal(""+amount); + + BigDecimal afCashB = null; + if(tripleVO.getAfterCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + afCashB = bfCashB.add(amountB); + tripleVO.setAfterCash(afCashB.longValue()); + } else { + afCashB = new BigDecimal(""+tripleVO.getAfterCash()); + } + + log.info(LOG_PREFIX+ "AUTO_CANCEL bfCashB: " + bfCashB.intValue()); + log.info(LOG_PREFIX+ "AUTO_CANCEL afCashB: " + afCashB.intValue()); + + int result = betDao.updateTripleTxnData(tripleVO); + if(result > 0) { + Long betIdx = betDao.getBetIdxByGameIdx(tripleVO.getBetId()); + if(betIdx != null) { + HashMap param = new HashMap(); + param.put("betIdx", betIdx); + param.put("betAmt", amount); + + int resultBet = betDao.betAutoCancelTriple(param); + if(resultBet > 0) { + log.info("## Triple API ## callAutoCancel() ["+tripleVO.getBetId()+"]["+betIdx+"] - betAutoCancelTriple : " + resultBet); + + HashMap cashUpdParam = new HashMap(); + cashUpdParam.put("betIdx", betIdx); + cashUpdParam.put("cashType", "-9"); + cashUpdParam.put("memId", tripleVO.getMemId()); + cashUpdParam.put("siteid", tripleVO.getSiteId()); + int cashAmt = amount; + cashUpdParam.put("cashAmt", Integer.toString(cashAmt)); + int cashResult = betDao.updateCashInfo(cashUpdParam); + log.info("## Triple API ## callAutoCancel() ["+tripleVO.getBetId()+"]["+betIdx+"] - updateCashInfo : " + cashResult); + + HashMap memCashUpdParam = new HashMap(); + memCashUpdParam.put("siteId", tripleVO.getSiteId()); + memCashUpdParam.put("memId", tripleVO.getMemId()); + + memCashUpdParam.put("cashAmt", Integer.toString(amount)); + memCashUpdParam.put("changeFlag", "N"); + + int memCashResult = betDao.updateUserCashByAmount(memCashUpdParam); + log.info(LOG_PREFIX+ "updateUserCashTriple() : " + memCashResult); + + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash().intValue()); + } else { + responseObj.put("result_code", 5555); + responseObj.put("error_msg","CANCEL_ERROR"); + } + } else { + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash().intValue()); + } + + } else { + responseObj.put("result_code", 5555); + responseObj.put("error_msg","CANCEL_ERROR"); + } + + } else { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 98); + responseObj.put("error_msg","CANCEL_ALREADY_SETTLED"); + } + } else { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 99); + responseObj.put("error_msg","BET_DOES_NOT_EXIST"); + } + + return responseObj; + } + + + private JSONObject callOther(int bfCash, TripleVO tripleVO) throws Exception { + final String LOG_PREFIX = "#-callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::callOther::::"; + log.info(LOG_PREFIX+ "START"); + + JSONObject responseObj = new JSONObject(); + int isBonusCnt = betDao.getTripleDebitCheckByTranId(tripleVO.getTranId()); + if(isBonusCnt == 0) { + int amountD = tripleVO.getDebit(); + int amountC = tripleVO.getCredit(); + + int amount = 0; + if(amountD != 0) { + amount = amountD; + } else { + amount = amountC; + } + + BigDecimal bfCashB = null; + if(tripleVO.getBeforeCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + bfCashB = new BigDecimal(""+bfCash); + tripleVO.setBeforeCash(bfCashB.longValue()); + } else { + bfCashB = new BigDecimal(""+tripleVO.getBeforeCash()); + } + BigDecimal amountB = new BigDecimal(""+amount); + BigDecimal afCashB = null; + if(tripleVO.getAfterCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + afCashB = bfCashB.add(amountB); + tripleVO.setAfterCash(afCashB.longValue()); + } else { + afCashB = new BigDecimal(""+tripleVO.getAfterCash()); + } + log.info(LOG_PREFIX+ "BONUS bfCashB: " + bfCashB.intValue()); + log.info(LOG_PREFIX+ "BONUS afCashB: " + afCashB.intValue()); + + int result = betDao.insertTripleTxnData(tripleVO); + if(result > 0) { + HashMap param = new HashMap(); + param.put("betIdx", 0); + param.put("siteId", tripleVO.getSiteId()); + param.put("memId", tripleVO.getMemId()); + param.put("betType", "triple"); + + String category = ""; + String vendorCode = ""; + CodeSearch codeSrch = new CodeSearch(); + codeSrch.setMasterCode("kplay"); + codeSrch.setTripleCode(tripleVO.getVendorIdx()); + HashMap code = commonDao.getCode(codeSrch); + if(code != null) { + category = code.get("groupCode").toString(); + param.put("gameCategory", category); + + vendorCode = code.get("code").toString(); + param.put("vendorCode", vendorCode); + } else { + category = "undefind"; + param.put("gameCategory", category); + + vendorCode = "undefind"; + param.put("vendorCode", vendorCode); + } + param.put("betId", tripleVO.getBetId()); + param.put("gameName", tripleVO.getGameKey()); + param.put("betAmt", Integer.toString(Math.abs(amountD))); + param.put("betRate", "1"); + param.put("betWinAmt", Integer.toString(Math.abs(amountC))); + param.put("betBonus", "1"); + param.put("betCnt", "1"); + param.put("betResults", "PASS"); + param.put("betStatus", "BONUSEND"); + param.put("bfMoney", Long.toString(tripleVO.getBeforeCash())); + param.put("afMoney", Long.toString(tripleVO.getAfterCash())); + param.put("regId", tripleVO.getMemId()); + param.put("updId", tripleVO.getMemId()); + param.put("updDate", ""); + param.put("regDate", ""); + param.put("vendor", tripleVO.getVendor()); + String biPushYn = "N"; + param.put("biPushYn", biPushYn); + + log.info(LOG_PREFIX+ "Proc betinfo, betmap start"); + try { + betDao.insertBetBonus(param); + } catch(DataIntegrityViolationException de) { + log.error(LOG_PREFIX+ "Duplicate betId: " + tripleVO.getTranId()); + } + log.info(LOG_PREFIX+ "Proc betinfo end betIdx: " + param.get("betIdx")); + + if(amount > 0) { + HashMap memCashUpdParam = new HashMap(); + memCashUpdParam.put("siteId", tripleVO.getSiteId()); + memCashUpdParam.put("memId", tripleVO.getMemId()); + memCashUpdParam.put("cashAmt", Integer.toString(amount)); + memCashUpdParam.put("changeFlag", "N"); + int memCashResult = betDao.updateUserCashByAmount(memCashUpdParam); + log.info(LOG_PREFIX+ "updateUserCashTriple : " + memCashResult); + } + + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash().intValue()); + + } else { + responseObj.put("result_code", 6666); + responseObj.put("error_msg","OTHER_ERROR"); + } + + } else { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 70); + responseObj.put("error_msg","OTHER_ALREADY_SETTLED"); + } + + return responseObj; + } + + + private JSONObject callBonus(int bfCash, TripleVO tripleVO) throws Exception { + final String LOG_PREFIX = "#-callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::callBonus::::"; + log.info(LOG_PREFIX+ "START"); + + JSONObject responseObj = new JSONObject(); + int isBonusCnt = betDao.getTripleIsBonusCheck(tripleVO.getBetId()); + if(isBonusCnt == 0) { + int amount = 0; + if(tripleVO.getTranType().equals("debit")) { + amount = Math.abs(tripleVO.getDebit()); + } else { + amount = Math.abs(tripleVO.getCredit()); + } + /* + MemberSearch search = new MemberSearch(); + search.setSiteId(tripleVO.getSiteId()); + search.setMemId(tripleVO.getMemId()); + long startTime = System.currentTimeMillis(); + bfCash = cashDao.getMemCashForUpdate(search); + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + log.error("getMemCashForUpdate::["+tripleVO.getBetId()+"]::diffTime:" + String.format("%.3f", diffTime)); + */ + + BigDecimal bfCashB = null; + if(tripleVO.getBeforeCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + bfCashB = new BigDecimal(""+bfCash); + tripleVO.setBeforeCash(bfCashB.longValue()); + } else { + bfCashB = new BigDecimal(""+tripleVO.getBeforeCash()); + } + BigDecimal amountB = new BigDecimal(""+amount); + BigDecimal afCashB = null; + if(tripleVO.getAfterCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + afCashB = bfCashB.add(amountB); + tripleVO.setAfterCash(afCashB.longValue()); + } else { + afCashB = new BigDecimal(""+tripleVO.getAfterCash()); + } + log.info(LOG_PREFIX+ "BONUS bfCashB: " + bfCashB.intValue()); + log.info(LOG_PREFIX+ "BONUS afCashB: " + afCashB.intValue()); + + int result = betDao.insertTripleTxnData(tripleVO); + if(result > 0) { + HashMap param = new HashMap(); + param.put("betIdx", 0); + param.put("siteId", tripleVO.getSiteId()); + param.put("memId", tripleVO.getMemId()); + param.put("betType", "triple"); + + String category = ""; + String vendorCode = ""; + CodeSearch codeSrch = new CodeSearch(); + codeSrch.setMasterCode("kplay"); + codeSrch.setTripleCode(tripleVO.getVendorIdx()); + HashMap code = commonDao.getCode(codeSrch); + if(code != null) { + category = code.get("groupCode").toString(); + param.put("gameCategory", category); + + vendorCode = code.get("code").toString(); + param.put("vendorCode", vendorCode); + } else { + category = "undefind"; + param.put("gameCategory", category); + + vendorCode = "undefind"; + param.put("vendorCode", vendorCode); + } + param.put("betId", tripleVO.getBetId()); + param.put("gameName", tripleVO.getGameKey()); + param.put("betAmt", "0"); + param.put("betRate", "1"); + param.put("betWinAmt", Integer.toString(amount)); + param.put("betBonus", "1"); + param.put("betCnt", "1"); + param.put("betResults", "PASS"); + param.put("betStatus", "BONUSEND"); + param.put("bfMoney", Long.toString(tripleVO.getBeforeCash())); + param.put("afMoney", Long.toString(tripleVO.getAfterCash())); + param.put("regId", tripleVO.getMemId()); + param.put("updId", tripleVO.getMemId()); + param.put("updDate", ""); + param.put("regDate", ""); + param.put("vendor", tripleVO.getVendor()); + String biPushYn = "N"; + param.put("biPushYn", biPushYn); + + log.info(LOG_PREFIX+ "Proc betinfo, betmap start"); + try { + betDao.insertBetBonus(param); + } catch(DataIntegrityViolationException de) { + log.error(LOG_PREFIX+ "Duplicate betId: " + tripleVO.getTranId()); + } + log.info(LOG_PREFIX+ "Proc betinfo end betIdx: " + param.get("betIdx")); + + if(amount > 0) { + HashMap memCashUpdParam = new HashMap(); + memCashUpdParam.put("siteId", tripleVO.getSiteId()); + memCashUpdParam.put("memId", tripleVO.getMemId()); + memCashUpdParam.put("cashAmt", Integer.toString(amount)); + memCashUpdParam.put("changeFlag", "N"); + int memCashResult = betDao.updateUserCashByAmount(memCashUpdParam); + log.info(LOG_PREFIX+ "updateUserCashTriple : " + memCashResult); + } + + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash().intValue()); + + } else { + responseObj.put("result_code", 6666); + responseObj.put("error_msg","BONUS_ERROR"); + } + + } else { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 70); + responseObj.put("error_msg","PROMO_ALREADY_SETTLED"); + } + + return responseObj; + } + + + private JSONObject callTip(int bfCash, TripleVO tripleVO) throws Exception { + final String LOG_PREFIX = "#-callback::"+tripleVO.getUserId()+"::"+tripleVO.getBetId()+"::callTip::::"; + log.info(LOG_PREFIX+ "START"); + + JSONObject responseObj = new JSONObject(); + int isBonusCnt = betDao.getTripleIsBonusCheck(tripleVO.getBetId()); + if(isBonusCnt == 0) { + int amount = Math.abs(tripleVO.getDebit()); + + BigDecimal bfCashB = null; + if(tripleVO.getBeforeCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + bfCashB = new BigDecimal(""+bfCash); + tripleVO.setBeforeCash(bfCashB.longValue()); + } else { + bfCashB = new BigDecimal(""+tripleVO.getBeforeCash()); + } + BigDecimal amountB = new BigDecimal(""+amount); + BigDecimal afCashB = null; + if(tripleVO.getAfterCash() == null || tripleVO.getBeforeCash().intValue() == 0) { + afCashB = bfCashB.subtract(amountB); + tripleVO.setAfterCash(afCashB.longValue()); + } else { + afCashB = new BigDecimal(""+tripleVO.getAfterCash()); + } + log.info(LOG_PREFIX+ "TIP bfCashB: " + bfCashB.intValue()); + log.info(LOG_PREFIX+ "TIP afCashB: " + afCashB.intValue()); + + int result = betDao.insertTripleTxnData(tripleVO); + if(result > 0) { + HashMap param = new HashMap(); + param.put("betIdx", 0); + param.put("siteId", tripleVO.getSiteId()); + param.put("memId", tripleVO.getMemId()); + param.put("betType", "triple"); + + String category = ""; + String vendorCode = ""; + CodeSearch codeSrch = new CodeSearch(); + codeSrch.setMasterCode("kplay"); + codeSrch.setTripleCode(tripleVO.getVendorIdx()); + HashMap code = commonDao.getCode(codeSrch); + if(code != null) { + category = code.get("groupCode").toString(); + param.put("gameCategory", category); + + vendorCode = code.get("code").toString(); + param.put("vendorCode", vendorCode); + } else { + category = "undefind"; + param.put("gameCategory", category); + + vendorCode = "undefind"; + param.put("vendorCode", vendorCode); + } + param.put("betId", tripleVO.getBetId()); + param.put("gameName", tripleVO.getGameKey()); + param.put("betAmt", Integer.toString(amount)); + param.put("betRate", "0"); + param.put("betWinAmt", "0"); + param.put("betBonus", "-2"); + param.put("betCnt", "1"); + param.put("betResults", "PASS"); + param.put("betStatus", "TIPEND"); + param.put("bfMoney", Long.toString(tripleVO.getBeforeCash())); + param.put("afMoney", Long.toString(tripleVO.getAfterCash())); + param.put("regId", tripleVO.getMemId()); + param.put("updId", tripleVO.getMemId()); + param.put("updDate", ""); + param.put("regDate", ""); + param.put("vendor", tripleVO.getVendor()); + param.put("biPushYn", "N"); + + log.info(LOG_PREFIX+ "Proc betinfo, betmap start"); + try { + betDao.insertBetBonus(param); + } catch(DataIntegrityViolationException de) { + log.error(LOG_PREFIX+ "Duplicate betId: " + tripleVO.getTranId()); + } + log.info(LOG_PREFIX+ "Proc betinfo end betIdx: " + param.get("betIdx")); + + if(amount > 0) { + HashMap memCashUpdParam = new HashMap(); + memCashUpdParam.put("siteId", tripleVO.getSiteId()); + memCashUpdParam.put("memId", tripleVO.getMemId()); + int cashAmt = amount * -1; + memCashUpdParam.put("cashAmt", Integer.toString(cashAmt)); + memCashUpdParam.put("changeFlag", "N"); + int memCashResult = betDao.updateUserCashByAmount(memCashUpdParam); + log.info(LOG_PREFIX+ "updateUserCashTriple : " + memCashResult); + } + + responseObj.put("result_code", 0); + responseObj.put("balance", tripleVO.getAfterCash().intValue()); + + } else { + responseObj.put("result_code", 6666); + responseObj.put("error_msg","TIP_ERROR"); + } + + } else { + responseObj.put("balance", bfCash); + responseObj.put("result_code", 98); + responseObj.put("error_msg","TIP_ALREADY_SETTLED"); + } + + return responseObj; + } + + + @Override + public String getBetDetail(ApiVendorCompInfo tripleVendor, String betId) throws ResourceAccessException, Exception { + String detailJson = ""; + + log.info("### Triple API getBetDetail() 배팅상세 확인 Start -###"); + + // 헤더에 토큰 세팅 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + headers.set("User-Agent", "PostmanRuntime/7.28.4"); + headers.set("Authorization", tripleVendor.getClientSecretKey()); + headers.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8"))); + + // 배팅상세 API http://localhost/api/betInfo + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(tripleVendor.getApiUrl() + "/betInfo"); +// UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/api/betInfo"); + HashMap params = new HashMap(); + params.put("betId", betId); + //HttpEntity> entity = new HttpEntity<>(params, headers); + + Mono detailResMono = webClient.post() + .uri(builder.toUriString()) + .headers(httpHeaders -> httpHeaders.addAll(headers)) + .bodyValue(params) + .retrieve() + .bodyToMono(String.class); + + String detailRes = detailResMono.block(); // Blocking to get the response synchronously + + log.info("###- TRIPLE API getBetDetail() Request " + tripleVendor.getApiUrl() + "/betInfo" + " res : " + detailRes); + org.codehaus.jettison.json.JSONObject detailResult = new org.codehaus.jettison.json.JSONObject(detailRes); + String resultCode = detailResult.getString("resultCode"); + log.info("###- TRIPLE API getBetDetail() resultCode: " + resultCode); + if("0".equals(resultCode)) { + org.codehaus.jettison.json.JSONObject data = detailResult.getJSONObject("data"); + if(data.getString("detail").equals("betId is not exist")) { + detailJson = ""; + } else { + Object detail = data.get("detail"); + //Object detail = data; + detailJson = detail.toString(); + } + } + + return detailJson; + } + + + @Override + public String getBetDetailTest(ApiVendorCompInfo tripleVendor, String betId) throws ResourceAccessException, Exception { + String detailJson = ""; + + log.info("### Triple API getBetDetailTest() 배팅상세 확인 Start -###"); + + // 헤더에 토큰 세팅 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + headers.set("User-Agent", "PostmanRuntime/7.28.4"); + headers.set("Authorization", tripleVendor.getClientSecretKey()); + headers.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8"))); + + // 배팅상세 API http://localhost/api/betInfo + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(tripleVendor.getApiUrl() + "/betInfo"); +// UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/api/betInfo"); + HashMap params = new HashMap(); + params.put("betId", betId); + //HttpEntity> entity = new HttpEntity<>(params, headers); + + Mono detailResMono = webClient.post() + .uri(builder.toUriString()) + .headers(httpHeaders -> httpHeaders.addAll(headers)) + .bodyValue(params) + .retrieve() + .bodyToMono(String.class); + + String detailRes = detailResMono.block(); // Blocking to get the response synchronously + + log.info("###- TRIPLE API getBetDetailTest() Request " + tripleVendor.getApiUrl() + "/betInfo" + " res : " + detailRes); + org.codehaus.jettison.json.JSONObject detailResult = new org.codehaus.jettison.json.JSONObject(detailRes); + String resultCode = detailResult.getString("resultCode"); + log.info("###- TRIPLE API getBetDetailTest() resultCode: " + resultCode); + if("0".equals(resultCode)) { + org.codehaus.jettison.json.JSONObject data = detailResult.getJSONObject("data"); + if(data.getString("detail").equals("betId is not exist")) { + detailJson = ""; + } else { + //Object detail = data.get("detail"); + Object detail = data; + detailJson = detail.toString(); + } + } + + return detailJson; + } + + + @Override + public org.codehaus.jettison.json.JSONObject getBetDetail2(ApiVendorCompInfo tripleVendor, String betId) throws ResourceAccessException, Exception { + log.info("### Triple API getBetDetail2() 배팅상세 확인 Start -###"); + org.codehaus.jettison.json.JSONObject data = null; + + // 헤더에 토큰 세팅 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + headers.set("User-Agent", "PostmanRuntime/7.28.4"); + headers.set("Authorization", tripleVendor.getClientSecretKey()); + headers.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8"))); + + // 배팅상세 API http://localhost/api/betInfo + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(tripleVendor.getApiUrl() + "/betInfo"); +// UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/api/betInfo"); + HashMap params = new HashMap(); + params.put("betId", betId); + //HttpEntity> entity = new HttpEntity<>(params, headers); + + Mono detailResMono = webClient.post() + .uri(tripleVendor.getApiUrl() + "/betInfo") + .headers(httpHeaders -> httpHeaders.addAll(headers)) + .bodyValue(params) + .retrieve() + .bodyToMono(String.class); + + String detailRes = detailResMono.block(); // Blocking to get the response synchronously + log.info("###- TRIPLE API getBetDetail2() Request " + tripleVendor.getApiUrl() + "/betInfo" + " res : " + detailRes); + org.codehaus.jettison.json.JSONObject detailResult = new org.codehaus.jettison.json.JSONObject(detailRes); + + String resultCode = detailResult.getString("resultCode"); + log.info("###- TRIPLE API getBetDetail2() resultCode: " + resultCode); + if("0".equals(resultCode)) { + data = detailResult.getJSONObject("data"); + } else { + data = new org.codehaus.jettison.json.JSONObject(""); + } + + return data; + } + + + @Override + public org.codehaus.jettison.json.JSONObject getUserBalance(ApiVendorCompInfo apiVendor, String vendorKey, String tripleUsername) throws ResourceAccessException, Exception { + org.codehaus.jettison.json.JSONObject balanceJson = null; + final String LOG_PREFIX = "#-TRIPLE_API::"+tripleUsername+"::getUserBalance::::"; + + log.info(LOG_PREFIX+ "### 회원 잔액조회 Start -###"); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + headers.set("User-Agent", "PostmanRuntime/7.28.4"); + headers.set("Authorization", apiVendor.getClientSecretKey()); + headers.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8"))); + + UriComponentsBuilder balanceBuilder = UriComponentsBuilder.fromHttpUrl(apiVendor.getApiUrl() + "/balance"); +// UriComponentsBuilder balanceBuilder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/api" + "/balance"); + HashMap balanceParams = new HashMap(); + balanceParams.put("username", tripleUsername); + balanceParams.put("vendorKey", vendorKey); + balanceParams.put("requestKey", String.valueOf(System.currentTimeMillis())); + Mono balanceResMono = webClient.post() + .uri(balanceBuilder.toUriString()) + .headers(httpHeaders -> httpHeaders.addAll(headers)) + .bodyValue(balanceParams) + .retrieve() + .bodyToMono(String.class); + + String balanceRes = balanceResMono.block(); // Blocking to get the response synchronously + balanceJson = new org.codehaus.jettison.json.JSONObject(balanceRes); + log.info(LOG_PREFIX+ "### balanceJson: " + balanceJson.toString()); + + return balanceJson; + } + + + @Override + public org.codehaus.jettison.json.JSONObject depositBalance(ApiVendorCompInfo apiVendor, String vendor, TripleAuthInfo tripleMember, int amount) throws ResourceAccessException, Exception { + org.codehaus.jettison.json.JSONObject depositJson = null; + final String LOG_PREFIX = "#-TRIPLE_API::"+tripleMember.getUsername()+"::depositBalance::::"; + + log.info(LOG_PREFIX+ "### 회원 머니충전 Start -###"); + /* + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + headers.set("User-Agent", "PostmanRuntime/7.28.4"); + headers.set("Authorization", apiVendor.getClientSecretKey()); + headers.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8"))); + + UriComponentsBuilder depositBuilder = UriComponentsBuilder.fromHttpUrl(apiVendor.getApiUrl() + "/deposit"); + HashMap depositParams = new HashMap(); + depositParams.put("username", tripleMember.getUsername()); + depositParams.put("vendor", vendor); + depositParams.put("amount", Integer.toString(amount)); + depositParams.put("requestKey", String.valueOf(System.currentTimeMillis())); + HttpEntity> depositEntity = new HttpEntity<>(depositParams, headers); + + ResponseEntity depositRes = restTemplate.postForEntity(depositBuilder.toUriString(), depositEntity, String.class); + depositJson = new org.codehaus.jettison.json.JSONObject(depositRes.getBody()); + log.info(LOG_PREFIX+ "### depositJson: " + depositJson.toString()); + */ + depositJson = new org.codehaus.jettison.json.JSONObject(); + depositJson.put("resultCode", "0"); + + return depositJson; + } + + + @Override + public org.codehaus.jettison.json.JSONObject withdrawBalance(ApiVendorCompInfo apiVendor, String vendor, TripleAuthInfo tripleMember) throws ResourceAccessException, Exception { + org.codehaus.jettison.json.JSONObject withdrawJson = null; + final String LOG_PREFIX = "#-TRIPLE_API::"+tripleMember.getUsername()+"::withdrawBalance::::"; + + log.info(LOG_PREFIX+ "### 회원 머니환전 Start -###"); + /* + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + headers.set("User-Agent", "PostmanRuntime/7.28.4"); + headers.set("Authorization", apiVendor.getClientSecretKey()); + headers.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8"))); + + UriComponentsBuilder withdrawBuilder = UriComponentsBuilder.fromHttpUrl(apiVendor.getApiUrl() + "/withdraw"); + HashMap withdrawParams = new HashMap(); + withdrawParams.put("username", tripleMember.getUsername()); + withdrawParams.put("vendor", vendor); + withdrawParams.put("requestKey", String.valueOf(System.currentTimeMillis())); + HttpEntity> withdrawEntity = new HttpEntity<>(withdrawParams, headers); + + ResponseEntity withdrawRes = restTemplate.postForEntity(withdrawBuilder.toUriString(), withdrawEntity, String.class); + withdrawJson = new org.codehaus.jettison.json.JSONObject(withdrawRes.getBody()); + log.info(LOG_PREFIX+ "### withdrawJson: " + withdrawJson.toString()); + */ + withdrawJson = new org.codehaus.jettison.json.JSONObject(); + withdrawJson.put("resultCode", "0"); + + return withdrawJson; + } + + + @Override + public JSONObject betProcSlot(final String LOG_PREFIX, Member search, TripleVO tripleVO) { + JSONObject responseObj = new JSONObject(); + + try { + long chs1 = System.currentTimeMillis(); + HashMap memberVo = userDao.getMemberMap(search); + long che1 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff1 = (chs1 - che1)/1000.0; //두 시간에 차 계산 + if(diff1 < -0.5) log.error(LOG_PREFIX+ "betProcSlot::[### userDao.getMemberMap() : " + String.format("%.3f", diff1) + " ###]"); + + int amount = 0; + if(tripleVO.getTranType().equals("debit")) { + amount = Math.abs(tripleVO.getDebit()); + } else { + // 당첨금 조정 또는 제한이 걸린경우 마이너스(-) 금액이 들어올 수 있음. + // Nexus 계열 혹은 EXTR(구 아너링크, 신 익스트림) 계열 + amount = tripleVO.getCredit(); + } + int bfCash = Integer.parseInt(memberVo.get("cashAmt").toString()); + int siteIdx = (int) memberVo.get("siteIdx"); + int memIdx = (int) memberVo.get("memIdx"); + tripleVO.setSiteIdx(siteIdx); + tripleVO.setMemIdx(memIdx); + tripleVO.setSiteId(memberVo.get("siteId").toString()); + tripleVO.setMemId(memberVo.get("memId").toString()); + tripleVO.setBetYn(memberVo.get("betYn").toString()); + tripleVO.setMemLockYn(memberVo.get("memLockYn").toString()); + tripleVO.setSymLock(memberVo.get("symLock").toString()); + + if(tripleVO.getTranType().equals("debit")) { + if(bfCash == 0 || bfCash < amount) { + // 유저머니가 없는경우 code 80 msg : INSUFFICIENT_FUNDS + responseObj.put("balance", bfCash); + responseObj.put("result_code", 80); + responseObj.put("error_msg","INSUFFICIENT_FUNDS"); + log.error(LOG_PREFIX+ "betProcSlot::[INSUFFICIENT_FUNDS ERROR]"); + return responseObj; + } + long chs2 = System.currentTimeMillis(); + HashMap betLimitInfo = betDao.getSiteBetLimitInfo(tripleVO); + long che2 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff2 = (chs2 - che2)/1000.0; //두 시간에 차 계산 + if(diff2 < -0.5) log.error(LOG_PREFIX+ "betProcSlot::[### betDao.getSiteBetLimitInfo() : " + String.format("%.3f", diff2) + " ###]"); + int maxBetAmt = Integer.parseInt(betLimitInfo.get("betAmtMaxSlot").toString()); + if(amount > maxBetAmt) { + // 최대 배팅금액 초과시 에러 리턴 + responseObj.put("balance", bfCash); + responseObj.put("result_code", 81); + responseObj.put("error_msg","MAX_BET_OVER"); + log.error(LOG_PREFIX+ "betProcSlot::[MAX_BET_OVER ERROR]"); + return responseObj; + } + + if(tripleVO.getBetYn().equals("N") || tripleVO.getMemLockYn().equals("Y") || tripleVO.getSymLock().equals("Y")) { + if(tripleVO.getSymLock().equals("Y")) { + HashMap lockParam = new HashMap<>(); + lockParam.put("siteId", tripleVO.getSiteId()); + lockParam.put("memId", tripleVO.getMemId()); + int lockResult = userDao.setUserLock(lockParam); + log.error(LOG_PREFIX+ "betProcSlot::setUserLock::result::" + lockResult); + } + + responseObj.put("balance", bfCash); + responseObj.put("result_code", 1005); + responseObj.put("error_msg","THIS_USER_BETTING_LOCK"); + log.error(LOG_PREFIX+ "betProcSlot::[THIS_USER_BETTING_LOCK ERROR]"); + return responseObj; + } + } + + // Bet Proc + BigDecimal bfCashB = new BigDecimal(""+bfCash); + tripleVO.setBeforeCash(bfCashB.longValue()); + BigDecimal amountB = new BigDecimal(""+amount); + BigDecimal afCashB = null; + if(tripleVO.getTranType().equals("debit")) { + afCashB = bfCashB.subtract(amountB); + } else { + afCashB = bfCashB.add(amountB); + } + tripleVO.setAfterCash(afCashB.longValue()); + + /** + * insertSlotTranInfo Start + */ + long startTime = System.currentTimeMillis(); + HashMap param = new HashMap(); + param.put("betId", tripleVO.getBetId()); + param.put("tranId", tripleVO.getTranId()); + param.put("siteId", tripleVO.getSiteId()); + param.put("memId", tripleVO.getMemId()); + param.put("apiType", "triple"); + String tranType = ""; + if(tripleVO.getTranType().equals("debit") && tripleVO.getIsCancel() == 0) { + tranType = "BET"; + } else if(tripleVO.getTranType().equals("debit") && tripleVO.getIsCancel() == 1) { + // 슬롯 당첨 취소 처리 + tranType = "EXCEEDWIN"; + amount = amount * -1; + } else if(tripleVO.getTranType().equals("credit") && tripleVO.getIsCancel() == 0 && tripleVO.getIsBonus() == 0) { + // Credit OK + if(amount > 0) { + tranType = "WIN"; + } else if (amount < 0) { + tranType = "EXCEEDWIN"; + } else { + tranType = "LOSE"; + } + } else if(tripleVO.getTranType().equals("credit") && tripleVO.getIsCancel() == 1 && tripleVO.getIsBonus() == 0) { + tranType = "CANCEL"; + } else if(tripleVO.getTranType().equals("adjust")) { + tranType = "ADJUST"; + } else { + tranType = "BONUS"; + } + param.put("tranType", tranType); + param.put("bfBalance", tripleVO.getBeforeCash().intValue()); + param.put("amount", amount); + param.put("afBalance", tripleVO.getAfterCash().intValue()); + param.put("vendor", tripleVO.getVendor()); + param.put("vendorIdx", tripleVO.getVendorIdx()); + param.put("vendorKey", tripleVO.getVendorKey()); + param.put("gameName", tripleVO.getGameKey()); + param.put("betDateTime", tripleVO.getRequestAt()); + try { + int betResult = betDao.insertSlotTranInfo(param); + log.info(LOG_PREFIX+ "::insertSlotTranInfo::" + betResult); + + HashMap logParam = new HashMap(); + logParam.put("siteId", tripleVO.getSiteId()); + logParam.put("memId", tripleVO.getMemId()); + logParam.put("actionType", 3); + commonDao.updateAcctionLog(logParam); + } catch(DataIntegrityViolationException de) { + log.error(LOG_PREFIX+ "insertSlotTranInfo::Duplicate tranId: " + tripleVO.getTranId()); + responseObj.put("result_code", 0); + responseObj.put("balance", bfCash); + responseObj.put("error_msg", "Duplicate tranId"); + return responseObj; + } catch (Exception e) { + log.error(LOG_PREFIX+ "insertSlotTranInfo::Exception {}", e); + } + long endTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diffTime = (startTime - endTime)/1000.0; //두 시간에 차 계산 + log.info(LOG_PREFIX+ "insertSlotTranInfo::[diffTime : " + String.format("%.3f", diffTime) + "]"); + /** + * insertSlotTranInfo End + */ + + HashMap memCashUpdParam = new HashMap(); + memCashUpdParam.put("siteId", tripleVO.getSiteId()); + memCashUpdParam.put("memId", tripleVO.getMemId()); + int cashAmt = amount; + if(tripleVO.getTranType().equals("debit") && tripleVO.getIsCancel() == 0) { + cashAmt = cashAmt * -1; + } + memCashUpdParam.put("cashAmt", Integer.toString(cashAmt)); + memCashUpdParam.put("changeFlag", "N"); + long chs3 = System.currentTimeMillis(); + int memCashResult = betDao.updateUserCashByAmount(memCashUpdParam); + long che3 = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기 + double diff3 = (chs3 - che3)/1000.0; //두 시간에 차 계산 + if(diff3 < -0.5) log.error(LOG_PREFIX+ "betProcSlot::[### betDao.updateUserCashByAmount() : " + String.format("%.3f", diff3) + " ###]"); + + // Async slot_tran_info insert + // asyncService.insertSlotTranInfo(LOG_PREFIX, tripleVO); + // asyncService.withdrawBalanceAsync(tripleVO); + + responseObj.put("result_code", 0); + responseObj.put("balance", afCashB.intValue()); + log.info(LOG_PREFIX+ "betProcSlot::SUCC!!!!"); + + } catch(Exception e) { + responseObj.put("result_code", 1111); + responseObj.put("error_msg","UNKNOWN_ERROR"); + log.error(LOG_PREFIX+ "betProcSlot::Exception::"+e.getMessage()); + } + + return responseObj; + } + + + @Override + public org.codehaus.jettison.json.JSONObject getTripleCreditInfo(ApiVendorCompInfo apiVendor) throws ResourceAccessException, Exception { + org.codehaus.jettison.json.JSONObject balanceJson = null; + final String LOG_PREFIX = "#-TRIPLE_API::"+apiVendor.getSiteId()+"::getTripleCreditInfo::::"; + + log.info(LOG_PREFIX+ "### 알 잔액조회 Start -###"); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + headers.set("User-Agent", "PostmanRuntime/7.28.4"); + headers.set("Authorization", apiVendor.getClientSecretKey()); + headers.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8"))); + + UriComponentsBuilder balanceBuilder = UriComponentsBuilder.fromHttpUrl(apiVendor.getApiUrl() + "/creditInfo"); +// UriComponentsBuilder balanceBuilder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/api" + "/creditInfo"); + HashMap balanceParams = new HashMap(); + Mono balanceResMono = webClient.post() + .uri(apiVendor.getApiUrl() + "/creditInfo") + .headers(httpHeaders -> httpHeaders.addAll(headers)) + .bodyValue(balanceParams) + .retrieve() + .bodyToMono(String.class); + + String balanceRes = balanceResMono.block(); // Blocking to get the response synchronously + balanceJson = new org.codehaus.jettison.json.JSONObject(balanceRes); + log.info(LOG_PREFIX+ "### balanceJson: " + balanceJson); + log.info(LOG_PREFIX+ "### 알 잔액조회 End -###"); + + return balanceJson; + } + +} diff --git a/src/main/java/com/bb/service/UserService.java b/src/main/java/com/bb/service/UserService.java new file mode 100644 index 0000000..9110b24 --- /dev/null +++ b/src/main/java/com/bb/service/UserService.java @@ -0,0 +1,199 @@ +package com.bb.service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import jakarta.validation.Valid; + +import org.springframework.security.crypto.password.PasswordEncoder; + +import com.bb.model.AdminTokenInfo; +import com.bb.model.ApiVendorCompInfo; +import com.bb.model.BlankSpinRate; +import com.bb.model.ChargingPointSettingVO; +import com.bb.model.CodeSearch; +import com.bb.model.CompResetInfo; +import com.bb.model.DashInfo; +import com.bb.model.GameUseInfo; +import com.bb.model.GraphInfo; +import com.bb.model.IdListSearch; +import com.bb.model.LoginUserVO; +import com.bb.model.MemListSearchVO; +import com.bb.model.Member; +import com.bb.model.MemberDetail; +import com.bb.model.MemberHierarchyVo; +import com.bb.model.MemberInsert; +import com.bb.model.MemberInsert2; +import com.bb.model.MemberListSearch; +import com.bb.model.MemberRate; +import com.bb.model.MemberSearch; +import com.bb.model.MemberStatus; +import com.bb.model.MemberTokenInfo; +import com.bb.model.MemberUpdate; +import com.bb.model.Month10Info; +import com.bb.model.MultipleRate; +import com.bb.model.MultipleRateInfo; +import com.bb.model.NewMemRateItem; +import com.bb.model.Site; +import com.bb.model.SiteSearch; +import com.bb.model.Top15Info; +import com.bb.model.TreeListSearch; +import com.bb.model.TripleAuthInfo; +import com.bb.model.UserListSearch; +import com.bb.model.UserSearch; + + + +public interface UserService { + + Member login(MemberSearch search); + Site swaggerlogin(HashMap param); + Site getSiteInfoByKey(String reqKey); + HashMap adminLogin(SiteSearch search); + int frontSignUp(@Valid Member signupMember); + MemberDetail getMember(Member member); + void updateStatus(@Valid MemberStatus status); + List getMemberRate(Member search); + List getMemberRateByNormal(Member search); + List getMemTreeList(@Valid TreeListSearch search); + HashMap getHeadCashInfo(HashMap param); + void getMemberRateUpdate(Member search, @Valid MemberRate memberRate); + HashMap updateAllBottomRate(Member search, List myRateList, MemberRate bottomRate); + int idCheck(@Valid Member signupMember); + int idCheckByAdmin(@Valid Member signupMember); + int nameCheck(@Valid Member signupMember); + int phoneCheck(@Valid Member signupMember); + int accCheck(@Valid Member signupMember); + Site getSiteInfo(String siteId); + + HashMap getMemberDetail_1(Member search); + HashMap getMemberDetail_2(Member search); + HashMap getMemberDetail_3(Member search); + void updateMember(MemberUpdate signupMember); + void getMemberbetYnUpdate(Member search, MemberRate rateparam); + int adminJoin(@Valid MemberInsert signupMember); + int adminJoin2(MemberInsert2 signupMember); + HashMap getMemberListCnt(@Valid MemberListSearch search); + List getMemberList(@Valid MemberListSearch search); + int getMemStatusListCnt(@Valid MemberListSearch search); + List getMemStatusList(@Valid MemberListSearch search); + int getMemLogListCnt(@Valid MemberListSearch search); + List getMemLogList(@Valid MemberListSearch search); + int getMemLoginListCnt(MemberListSearch search); + List getMemLoginList(MemberListSearch search); + int getIpListCnt(@Valid MemberListSearch search); + List getIpList(@Valid MemberListSearch search); + void recUpdate(@Valid MemberListSearch signupMember); + void updateOutAmtYn(@Valid MemberStatus status); + List getMemInfo(HashMap ti); + void gameUseUpdate(@Valid GameUseInfo gui); + List gameUseList(@Valid GameUseInfo gui); + int adminSignUp(String LOG_PREFIX, @Valid MemberInsert signupMember, PasswordEncoder passwordEncoder); + void updatePwd(@Valid Site site); + int getDeniedIpCheck(HashMap param); + int getDeniedPhoneCheck(@Valid Member signupMember); + int getDeniedAccCheck(@Valid Member signupMember); + void updateAdminPwd(@Valid Site site); + List> getAdminIpList(Map ipParam); + List miniGameInfo(HashMap ti); + HashMap adminSuperLogin(SiteSearch search); + + List getMemberFlowList(HashMap memberDetail); + List getPartnerFlowList(HashMap memberDetail); + HashMap getSuperHeadCashInfo(); + + int getIdListCnt(IdListSearch search); + List getIdList(IdListSearch search); + + List getBISubPointRate(Member search); + MemberDetail getMemByTriple(Member search); + int insertTripleAuthInfo(TripleAuthInfo user); + int updateMemCash(MemberDetail memberVo); + int adminCheck(String adminId); + int updateMemListIcon(@Valid MemberUpdate memberVO); + int resetPassword(Member memberVO, PasswordEncoder passwordEncoder); + int resetPassword2(Member memberVO); + ApiVendorCompInfo getApiVendorCompInfo(HashMap param); + ApiVendorCompInfo getApiVendorCompInfoByCron(HashMap param); + String getBaseRecommenderId(Member search); + Long getUserTimeout(Member searchMem); + int updateUserTimeout(Member searchMem); + int getMemRollingListCnt(MemberListSearch search); + List getMemRollingList(MemberListSearch search); + List getPartnerMemIds(Member searchMem); + HashMap getPartnerMemId(Member searchMem); + List getPartnerLevels(CodeSearch codesSearch); + String getPartnerLevelByRecId(@Valid MemberInsert signupMember); + List getPartnerBotUserList(Member search); + List getPartnerRateList(MemberSearch search); + HashMap getPartnerMemberDetail(Member search); + void updateBlankSpinRate(@Valid BlankSpinRate rate); + void updateAllBlankSpinRate(@Valid BlankSpinRate rate); + Integer getCheckMemberToken(MemberTokenInfo param); + Integer getCheckAdminToken(AdminTokenInfo param); + HashMap getNewMsgInfo(Member member); + HashMap getUserGameInfo(HashMap param); + HashMap getLastGameInfo(Member searchMem); + HashMap getLastGameInfoNew(HashMap logParam); + HashMap getHeadTopInfo(HashMap param); + HashMap getLastGameInfoNoLimit(Member searchMem); + int setUserPartnerLevelUp(MemberDetail targetUser); + HashMap getUserCashAmt(MemberSearch param); + TripleAuthInfo getTripleAuthInfo(Member search); + int getLoginTryCount(MemberSearch search); + void setLoginLock(MemberSearch search); + HashMap getMemChargingPointInfo(HashMap pointParam); + void updateFstChrgByJoinFlag(HashMap param); + HashMap getMemberMap(Member search); + HashMap getMemberMap2(Member search); + HashMap getBonusSettingInfo(HashMap param); + int userChangeFlag(HashMap flagParam); + int bonusSettingSave(ChargingPointSettingVO settingVO); + int getNormalRetailCnt(Member user); + int userChangeSymLock(HashMap lockParam); + double getUserMinPR(HashMap minParam); + List> getUserHierarchyList(MemberHierarchyVo search); + int checkMyBottom(HashMap searchMap); + List getMultipleRateList(MultipleRateInfo param); + void updateMultipleRate(MultipleRateInfo param); + List getMemRateItemList(NewMemRateItem rateItem); + NewMemRateItem getMemRateItem(@Valid NewMemRateItem rateItem); + int updateMemRateItem(@Valid NewMemRateItem rateItem); + int updateCashOutFlag(HashMap flagParam); + List getDashInfoInfo(HashMap param); + List getGraphInfo(HashMap param); + int updLoginFailCnt(Member member); + int getMemberTreeListCnt(MemListSearchVO search); + List getMemberTreeList(MemListSearchVO search); + List getUserTreeHierarchy(MemListSearchVO search); + int settingCashInOut(HashMap param); + List getIpDetailList(MemberListSearch search); + int updateMemCashByAmount(HashMap cashParam); + HashMap getMemBankInfo(HashMap param); + int resetUserLock(HashMap lockParam); + List getTop15Info(HashMap paramMap); + Month10Info getMonth10Info(String siteId); + List> delCheckMemList(CompResetInfo compResetInfo); + int deleteUsers(String LOG_PREFIX, CompResetInfo compResetInfo); + int updMemPhone(HashMap param); + int getLowerUserListCnt(UserListSearch search); + List> getLowerUserList(UserListSearch search); + List> getLoginUserList(UserSearch search); + int getPlayGameListCnt(UserListSearch search); + List> getPlayGameList(UserListSearch search); + int getDetailBetListCnt(UserListSearch search); + List> getDetailBetList(UserListSearch search); + int getDetailBetListNewCnt(UserListSearch search); + List> getDetailBetListNew(UserListSearch search); + int getTotalChangePointAmt(Member search); + TripleAuthInfo getTripleAuthInfo2(Member user); + int getIsMyBottomCnt(Member search); + List> getPassAllResetList(String siteId); + HashMap getSiteCashBonusInfo(HashMap param); + List> getSiteCashBonusList(long siteIdx); + MemberDetail getMemByRvHoldem(Member searchMem); + int insertRvHoldemAuthInfo(HashMap userMap); + HashMap getRvHoldemCheckInfo(String uid); + +} diff --git a/src/main/java/com/bb/service/UserServiceImpl.java b/src/main/java/com/bb/service/UserServiceImpl.java new file mode 100644 index 0000000..b90ab1b --- /dev/null +++ b/src/main/java/com/bb/service/UserServiceImpl.java @@ -0,0 +1,1233 @@ +package com.bb.service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import jakarta.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +import com.bb.dao.CashDao; +import com.bb.dao.UserDao; +import com.bb.model.AdminTokenInfo; +import com.bb.model.ApiVendorCompInfo; +import com.bb.model.BlankSpinRate; +import com.bb.model.ChargingPointSettingVO; +import com.bb.model.CodeSearch; +import com.bb.model.CompResetInfo; +import com.bb.model.DashInfo; +import com.bb.model.GameUseInfo; +import com.bb.model.GraphInfo; +import com.bb.model.IdListSearch; +import com.bb.model.LoginUserVO; +import com.bb.model.MemListSearchVO; +import com.bb.model.Member; +import com.bb.model.MemberDetail; +import com.bb.model.MemberHierarchyVo; +import com.bb.model.MemberInsert; +import com.bb.model.MemberInsert2; +import com.bb.model.MemberListSearch; +import com.bb.model.MemberRate; +import com.bb.model.MemberRateVo; +import com.bb.model.MemberSearch; +import com.bb.model.MemberStatus; +import com.bb.model.MemberTokenInfo; +import com.bb.model.MemberUpdate; +import com.bb.model.Month10Info; +import com.bb.model.MultipleRate; +import com.bb.model.MultipleRateInfo; +import com.bb.model.NewMemRateItem; +import com.bb.model.Site; +import com.bb.model.SiteSearch; +import com.bb.model.Top15Info; +import com.bb.model.TreeListSearch; +import com.bb.model.TripleAuthInfo; +import com.bb.model.UserListSearch; +import com.bb.model.UserSearch; +import com.bb.util.StringUtils; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RequiredArgsConstructor +@Service +public class UserServiceImpl implements UserService { + + + private final UserDao userDao; + + @Override + public Site getSiteInfoByKey(String reqKey) { + // TODO Auto-generated method stub + return userDao.getSiteInfoByKey(reqKey); + } + + @Override + public Member login(MemberSearch search) { + return userDao.login(search); + } + + @Override + public Site swaggerlogin(HashMap param) { + return userDao.swaggerlogin(param); + } + + @Override + public HashMap adminLogin(SiteSearch search) { + return userDao.adminLogin(search); + } + + @Override + public int adminSignUp(String LOG_PREFIX, @Valid MemberInsert signupMember, PasswordEncoder passwordEncoder) { + int result = 0; + + //회원가입 + String password = passwordEncoder.encode(signupMember.getMemPass()); + log.info(LOG_PREFIX+ "[MEMBER PWD:" + password + "]"); + signupMember.setMemPass(password); + String sitePrefix = StringUtils.generateString(3); + + int chkPrefix = userDao.checkSitePrefix(sitePrefix); + log.info(LOG_PREFIX+ "chkPrefix::" + chkPrefix); + if(chkPrefix == 0) { + signupMember.setSitePrefix(sitePrefix); + String apiKey = StringUtils.makeRandomKey(19); + signupMember.setSiteApikey(apiKey); + result = userDao.insertSiteInfo(signupMember); + log.info(LOG_PREFIX+ "insertSiteInfo result::" + result); + Integer siteIdx = signupMember.getSiteIdx(); + log.info(LOG_PREFIX+ "insertSiteInfo siteIdx::" + siteIdx); + result = userDao.insertCompany(signupMember); + log.info(LOG_PREFIX+ "insertCompany result::" + result); + result = userDao.insertAdminHeadInfo(signupMember); + log.info(LOG_PREFIX+ "insertAdminHeadInfo result::" + result); + + if(!(signupMember.getPartnerType() == null || "".equals(signupMember.getPartnerType())) ) { + + if(result > 0) { + MemberInsert baseRcmdUser = new MemberInsert(); + baseRcmdUser.setSiteIdx(siteIdx); + baseRcmdUser.setSiteId(signupMember.getMemId()); + String baseRcmdUserId = apiKey.substring(apiKey.length()-8, apiKey.length()); + baseRcmdUser.setMemId(baseRcmdUserId); + String baseRcmdUserPw = StringUtils.makeRandomKey(10); + baseRcmdUserPw = passwordEncoder.encode(baseRcmdUserPw); + baseRcmdUser.setMemPass(baseRcmdUserPw); + String baseRcmdUserName = signupMember.getMemId() + "추천아이디"; + baseRcmdUser.setMemName(baseRcmdUserName); + baseRcmdUser.setMemNick(baseRcmdUserName); + baseRcmdUser.setRecommenderId(signupMember.getMemId()); + baseRcmdUser.setPartnerLevel("AUTO"); + result = userDao.insertBaseRcmdUser(baseRcmdUser); + log.info(LOG_PREFIX+ "insertBaseRcmdUser result::" + result); + } else { + result = 0; + } + } + } else { + result = 0; + } + + + return result; + } + + @Override + public int frontSignUp(@Valid Member signupMember) { + // TODO Auto-generated method stub + //회원가신청 + return userDao.insertMember(signupMember); + } + + @Override + public MemberDetail getMember(Member member) { + // 회원정보조회 + return userDao.getMember(member); + } + + @Override + public void updateStatus(@Valid MemberStatus status) { + // TODO Auto-generated method stub + userDao.updateStatus(status); + } + + @Override + public List getMemberRate(Member search) { + // TODO Auto-generated method stub + return userDao.getMemberRate(search); + } + + @Override + public List getMemberRateByNormal(Member search) { + // TODO Auto-generated method stub + return userDao.getMemberRateByNormal(search); + } + + @Override + public List getMemTreeList(@Valid TreeListSearch search) { + // TODO Auto-generated method stub + return userDao.getMemTreeList(search); + } + + @Override + public HashMap getHeadCashInfo(HashMap param) { + // TODO Auto-generated method stub + return userDao.getHeadCashInfo(param); + } + + @Override + public void getMemberRateUpdate(Member search, @Valid MemberRate memberRate) { + // TODO Auto-generated method stub + for(MemberRateVo mvo:memberRate.getRateList()) { + HashMap param = new HashMap(); + param.put("siteId", search.getSiteId()); + param.put("memId", search.getMemId()); + param.put("gameType", mvo.getGameType()); + param.put("pointRate", mvo.getPointRate()); + param.put("loseRate", mvo.getLoseRate()); + param.put("useYn", "Y"); + if(search.getPartnerLevel().equals("COMP") || search.getPartnerLevel().equals("AUTO")) { + param.put("betYn", "N"); + } else { + param.put("betYn", mvo.getBetYn()); + } + userDao.memberRateUpdate(param); + + if(!search.getPartnerLevel().equals("COMP")) { + HashMap updParam = new HashMap<>(); + updParam.put("siteId", search.getSiteId()); + updParam.put("memId", search.getMemId()); + updParam.put("gameCategory", ""); + updParam.put("gameCategoryEn", ""); + updParam.put("vendorCode", mvo.getGameType()); + updParam.put("rateType", ""); + updParam.put("pointRate", mvo.getPointRate()); + updParam.put("loseRate", mvo.getLoseRate()); + log.info("#-getMemberRateUpdate::"+search.getSiteId()+"::"+search.getMemId()+"::updParam::"+updParam.toString()); + int result2 = userDao.updateTopMinRate(updParam); + int result3 = userDao.updateBottomMaxRate(updParam); + } + } + } + + @Override + public HashMap updateAllBottomRate(Member search, List myRateList, MemberRate bottomRate) { + // TODO Auto-generated method stub + HashMap result = new HashMap<>(); + + loopOut: + for(MemberRateVo mvo:bottomRate.getRateList()) { + String botCode = mvo.getGameType(); + Double botPR = Double.valueOf(mvo.getPointRate()); + Double botLR = Double.valueOf(mvo.getLoseRate()); + + for(HashMap myRate : myRateList) { + String myCode = myRate.get("gameType").toString(); + Double myPR = Double.valueOf(myRate.get("pointRate").toString()); + Double myLR = Double.valueOf(myRate.get("loseRate").toString()); + if(botCode.equals(myCode)) { + if(botPR > myPR || botLR > myLR) { + log.info("## updateAllBottomRate ## botCode : " + botCode + ", myCode : " + myCode); + log.info("## updateAllBottomRate ## botPR : " + botPR + ", myPR : " + myPR); + log.info("## updateAllBottomRate ## botLR : " + botLR + ", myLR : " + myLR); + String resultMsg = "["+myRate.get("codeName").toString()+"] 롤링:"+myPR+", 루징:"+myLR+" 보다 작은값을 입력하세요"; + result.put("statusCode", "-1"); + result.put("resultMsg", resultMsg); + log.info("## updateAllBottomRate ## statusCode : " + result.get("statusCode").toString()); + log.info("## updateAllBottomRate ## resultMsg : " + result.get("resultMsg").toString()); + break loopOut; + } else { + result.put("statusCode", "0"); + } + } + } + } + + if("0".equals(result.get("statusCode".toString()))) { + for(MemberRateVo mvo:bottomRate.getRateList()) { + HashMap param = new HashMap(); + param.put("siteId", search.getSiteId()); + param.put("memId", search.getMemId()); + param.put("gameType", mvo.getGameType()); + param.put("pointRate", mvo.getPointRate()); + param.put("loseRate", mvo.getLoseRate()); + userDao.updateAllBottomRate(param); + } + result.put("resultMsg", "요율 변경완료"); + log.info("## updateAllBottomRate ## statusCode : " + result.get("statusCode").toString()); + log.info("## updateAllBottomRate ## resultMsg : " + result.get("resultMsg").toString()); + } + + return result; + } + + @Override + public int idCheck(@Valid Member signupMember) { + // TODO Auto-generated method stub + return userDao.idCheck(signupMember); + } + + @Override + public int idCheckByAdmin(@Valid Member signupMember) { + // TODO Auto-generated method stub + return userDao.idCheckByAdmin(signupMember); + } + + @Override + public int nameCheck(@Valid Member signupMember) { + // TODO Auto-generated method stub + return userDao.nameCheck(signupMember); + } + + @Override + public int phoneCheck(@Valid Member signupMember) { + // TODO Auto-generated method stub + return userDao.phoneCheck(signupMember); + } + + @Override + public int accCheck(@Valid Member signupMember) { + // TODO Auto-generated method stub + return userDao.accCheck(signupMember); + } + + @Override + public Site getSiteInfo(String siteId) { + // TODO Auto-generated method stub + return userDao.getSiteInfo(siteId); + } + + @Override + public HashMap getMemberDetail_1(Member search) { + // TODO Auto-generated method stub + return userDao.getMemberDetail_1(search); + } + + @Override + public HashMap getMemberDetail_2(Member search) { + // TODO Auto-generated method stub + return userDao.getMemberDetail_2(search); + } + + @Override + public HashMap getMemberDetail_3(Member search) { + // TODO Auto-generated method stub + return userDao.getMemberDetail_3(search); + } + + @Override + public void updateMember(MemberUpdate signupMember) { + userDao.updateMember(signupMember); + } + + + + @Override + public void getMemberbetYnUpdate(Member search, @Valid MemberRate memberRate) { + // TODO Auto-generated method stub + for(MemberRateVo mvo:memberRate.getRateList()) { + HashMap param = new HashMap(); + param.put("siteId", search.getSiteId()); + param.put("memId", search.getMemId()); + param.put("gameType", mvo.getGameType()); + if(search.getPartnerLevel().equals("COMP") || search.getPartnerLevel().equals("AUTO")) { + param.put("betYn", "N"); + } else { + param.put("betYn", mvo.getBetYn()); + } + userDao.memberRateBetYn(param); + } + } + + @Override + public int adminJoin(@Valid MemberInsert signupMember) { + // TODO Auto-generated method stub + return userDao.adminJoin(signupMember); + } + + @Override + public int adminJoin2(MemberInsert2 signupMember) { + // TODO Auto-generated method stub + return userDao.adminJoin2(signupMember); + } + + @Override + public HashMap getMemberListCnt(@Valid MemberListSearch search) { + // TODO Auto-generated method stub + return userDao.getMemberListCnt(search); + } + + @Override + public List getMemberList(@Valid MemberListSearch search) { + // TODO Auto-generated method stub + //return userDao.getMemberList(search); + + List memList = userDao.getMemberList(search); + + for(HashMap mvo:memList) { + Member search2 = new Member(); + search2.setSiteId(search.getSiteId()); + search2.setMemId(mvo.get("memId").toString()); + mvo.put("topUserList", userDao.getTopUserList2(search2)); + } + + return memList; + } + + @Override + public int getMemStatusListCnt(@Valid MemberListSearch search) { + // TODO Auto-generated method stub + return userDao.getMemStatusListCnt(search); + } + + @Override + public List getMemStatusList(@Valid MemberListSearch search) { + // TODO Auto-generated method stub + List memList = userDao.getMemStatusList(search); + for(HashMap mvo:memList) { + Member search2 = new Member(); + search2.setSiteId(search.getSiteId()); + search2.setMemId(mvo.get("memId").toString()); + mvo.put("topUserList", userDao.getTopUserList2(search2)); + } + + return memList; + } + + @Override + public int getMemLogListCnt(@Valid MemberListSearch search) { + // TODO Auto-generated method stub + return userDao.getMemLogListCnt(search); + } + + @Override + public List getMemLogList(@Valid MemberListSearch search) { + // TODO Auto-generated method stub + List memList = userDao.getMemLogList(search); + for(HashMap mvo:memList) { + Member search2 = new Member(); + search2.setSiteId(search.getSiteId()); + search2.setMemId(mvo.get("memId").toString()); + mvo.put("topUserList", userDao.getTopUserList2(search2)); + } + + return memList; + } + + @Override + public int getMemLoginListCnt(MemberListSearch search) { + // TODO Auto-generated method stub + return userDao.getMemLoginListCnt(search); + } + + @Override + public List getMemLoginList(MemberListSearch search) { + // TODO Auto-generated method stub + List userList = userDao.getMemLoginList(search); + + for(LoginUserVO user : userList) { + search.setMemId(user.getMemId()); + if(user.getPartnerLevel().equals("NORMAL")) { + String betData = userDao.getLoginUserBetData(search); + if(betData != null) { + user.setBetData(betData); + } + } else { + user.setBetData(""); + } + + LoginUserVO data = userDao.getLoginUserReportData(search); + if(data != null) { + user.setCashIn(data.getCashIn()); + user.setCashOut(data.getCashOut()); + user.setBetAmt(data.getBetAmt()); + user.setWinAmt(data.getWinAmt()); + user.setWinLose(data.getWinLose()); + } + + Member search2 = new Member(); + search2.setSiteId(user.getSiteId()); + search2.setMemId(user.getMemId()); + List> topUserList = userDao.getTopUserList2(search2); + user.setTopUserList(topUserList); + } + + return userList; + } + + @Override + public int getIpListCnt(@Valid MemberListSearch search) { + // TODO Auto-generated method stub + return userDao.getIpListCnt(search); + } + + @Override + public List getIpList(@Valid MemberListSearch search) { + // TODO Auto-generated method stub + return userDao.getIpList(search); + } + + @Override + public void recUpdate(@Valid MemberListSearch signupMember) { + // TODO Auto-generated method stub + userDao.recUpdate(signupMember); + userDao.recUpdateFlow(signupMember); + } + + @Override + public void updateOutAmtYn(@Valid MemberStatus status) { + // TODO Auto-generated method stub + userDao.updateOutAmtYn(status); + } + + @Override + public List getMemInfo(HashMap ti) { + // TODO Auto-generated method stub + return userDao.getMemInfo(ti); + } + + @Override + public void gameUseUpdate(@Valid GameUseInfo gui) { + // TODO Auto-generated method stub + userDao.gameUseUpdate(gui); + } + + @Override + public List gameUseList(@Valid GameUseInfo gui) { + // TODO Auto-generated method stub + return userDao.gameUseList(gui); + } + + @Override + public void updatePwd(@Valid Site site) { + // TODO Auto-generated method stub + userDao.updatePwd(site); + userDao.updateMemPwd(site); + } + + @Override + public int getDeniedIpCheck(HashMap param) { + // TODO Auto-generated method stub + return userDao.getDeniedIpCheck(param); + } + + @Override + public int getDeniedPhoneCheck(@Valid Member signupMember) { + // TODO Auto-generated method stub + return userDao.getDeniedPhoneCheck(signupMember); + } + + @Override + public int getDeniedAccCheck(@Valid Member signupMember) { + // TODO Auto-generated method stub + return userDao.getDeniedAccCheck(signupMember); + } + + @Override + public void updateAdminPwd(@Valid Site site) { + // TODO Auto-generated method stub + userDao.updateAdminPwd(site); + } + + @Override + public List> getAdminIpList(Map ipParam) { + // TODO Auto-generated method stub + return userDao.getAdminIpList(ipParam); + } + + @Override + public List miniGameInfo(HashMap ti) { + // TODO Auto-generated method stub + return userDao.miniGameInfo(ti); + } + + @Override + public HashMap adminSuperLogin(SiteSearch search) { + // TODO Auto-generated method stub + return userDao.adminSuperLogin(search); + } + + @Override + public List getMemberFlowList(HashMap memberDetail) { + // TODO Auto-generated method stub + return userDao.getMemberFlowList(memberDetail); + } + + @Override + public List getPartnerFlowList(HashMap memberDetail) { + // TODO Auto-generated method stub + return userDao.getPartnerFlowList(memberDetail); + } + + @Override + public HashMap getSuperHeadCashInfo() { + // TODO Auto-generated method stub + return userDao.getSuperHeadCashInfo(); + } + + @Override + public int getIdListCnt(IdListSearch search) { + // TODO Auto-generated method stub + return userDao.getIdListCnt(search); + } + + @Override + public List getIdList(IdListSearch search) { + // TODO Auto-generated method stub + return userDao.getIdList(search); + } + + @Override + public List getBISubPointRate(Member search) { + // TODO Auto-generated method stub + return userDao.getBISubPointRate(search); + } + + @Override + public MemberDetail getMemByTriple(Member search) { + // TODO Auto-generated method stub + return userDao.getMemByTriple(search); + } + + @Override + public int insertTripleAuthInfo(TripleAuthInfo user) { + // TODO Auto-generated method stub + return userDao.insertTripleAuthInfo(user); + } + + @Override + public int updateMemCash(MemberDetail memberVo) { + // TODO Auto-generated method stub + return userDao.updateMemCash(memberVo); + } + + @Override + public int adminCheck(String adminId) { + // TODO Auto-generated method stub + return userDao.adminCheck(adminId); + } + + @Override + public int updateMemListIcon(@Valid MemberUpdate memberVO) { + // TODO Auto-generated method stub + return userDao.updateMemListIcon(memberVO); + } + + @Override + public int resetPassword(Member memberVO, PasswordEncoder passwordEncoder) { + // TODO Auto-generated method stub + + String newMemPass = "0000"; + /* + MemberDetail member = userDao.getMember(memberVO); + String bankAcc = member.getBankacc(); + if(bankAcc == null || "".equals(bankAcc)) { + String today = new SimpleDateFormat("yyyyMMdd").format(new Date(System.currentTimeMillis())); + newMemPass = today + member.getMemId(); + log.info(newMemPass); + } else { + newMemPass = bankAcc + member.getMemId(); + } + */ + String password = passwordEncoder.encode(newMemPass); + memberVO.setMemPass(password); + + return userDao.resetPassword(memberVO); + } + + @Override + public int resetPassword2(Member memberVO) { + return userDao.resetPassword(memberVO); + } + + @Override + public ApiVendorCompInfo getApiVendorCompInfo(HashMap param) { + // TODO Auto-generated method stub + return userDao.getApiVendorCompInfo(param); + } + + @Override + public ApiVendorCompInfo getApiVendorCompInfoByCron(HashMap param) { + // TODO Auto-generated method stub + return userDao.getApiVendorCompInfoByCron(param); + } + + @Override + public String getBaseRecommenderId(Member search) { + // TODO Auto-generated method stub + return userDao.getBaseRecommenderId(search); + } + + @Override + public synchronized Long getUserTimeout(Member searchMem) { + // TODO Auto-generated method stub + return userDao.getUserTimeout(searchMem); + } + + @Override + public int updateUserTimeout(Member searchMem) { + // TODO Auto-generated method stub + return userDao.updateUserTimeout(searchMem); + } + + @Override + public int getMemRollingListCnt(MemberListSearch search) { + // TODO Auto-generated method stub + return userDao.getMemRollingListCnt(search); + } + + @Override + public List getMemRollingList(MemberListSearch search) { + // TODO Auto-generated method stub + return userDao.getMemRollingList(search); + } + + @Override + public List getPartnerMemIds(Member searchMem) { + // TODO Auto-generated method stub + return userDao.getPartnerMemIds(searchMem); + } + + @Override + public HashMap getPartnerMemId(Member searchMem) { + // TODO Auto-generated method stub + return userDao.getPartnerMemId(searchMem); + } + + @Override + public List getPartnerLevels(CodeSearch codesSearch) { + // TODO Auto-generated method stub + return userDao.getPartnerLevels(codesSearch); + } + + @Override + public String getPartnerLevelByRecId(@Valid MemberInsert signupMember) { + // TODO Auto-generated method stub + return userDao.getPartnerLevelByRecId(signupMember); + } + + @Override + public List getPartnerBotUserList(Member search) { + // TODO Auto-generated method stub + return userDao.getPartnerBotUserList(search); + } + + @Override + public List getPartnerRateList(MemberSearch search) { + // TODO Auto-generated method stub + return userDao.getPartnerRateList(search); + } + + @Override + public HashMap getPartnerMemberDetail(Member search) { + // TODO Auto-generated method stub + return userDao.getPartnerMemberDetail(search); + } + + @Override + public void updateBlankSpinRate(@Valid BlankSpinRate rate) { + // TODO Auto-generated method stub + userDao.updateBlankSpinRate(rate); + } + + @Override + public void updateAllBlankSpinRate(@Valid BlankSpinRate rate) { + // TODO Auto-generated method stub + userDao.updateAllBlankSpinRate(rate); + } + + @Override + public Integer getCheckMemberToken(MemberTokenInfo param) { + // TODO Auto-generated method stub + return userDao.getCheckMemberToken(param); + } + + @Override + public Integer getCheckAdminToken(AdminTokenInfo param) { + // TODO Auto-generated method stub + return userDao.getCheckAdminToken(param); + } + + @Override + public HashMap getNewMsgInfo(Member member) { + // TODO Auto-generated method stub + return userDao.getNewMsgInfo(member); + } + + @Override + public HashMap getUserGameInfo(HashMap param) { + // TODO Auto-generated method stub + return userDao.getUserGameInfo(param); + } + + @Override + public synchronized HashMap getLastGameInfo(Member searchMem) { + // TODO Auto-generated method stub + return userDao.getLastGameInfo(searchMem); + } + + @Override + public HashMap getLastGameInfoNew(HashMap logParam) { + // TODO Auto-generated method stub + return userDao.getLastGameInfoNew(logParam); + } + + @Override + public HashMap getHeadTopInfo(HashMap param) { + // TODO Auto-generated method stub + return userDao.getHeadTopInfo(param); + } + + @Override + public synchronized HashMap getLastGameInfoNoLimit(Member searchMem) { + // TODO Auto-generated method stub + return userDao.getLastGameInfoNoLimit(searchMem); + } + + @Override + public int setUserPartnerLevelUp(MemberDetail targetUser) { + // TODO Auto-generated method stub + int result = 0; + HashMap user = userDao.getPartnerLevelUpInfo(targetUser); + if(user.get("topLevel").toString().equals("PTN_7") || user.get("afMyLevel").toString().equals("NORMAL")) { + // 승급 불가능 대상 + result = 0; + } else { + // 승급 가능 대상 + userDao.updatePartnerLevel(user); + result = 1; + } + + return result; + } + + @Override + public HashMap getUserCashAmt(MemberSearch param) { + // TODO Auto-generated method stub + return userDao.getUserCashAmt(param); + } + + @Override + public TripleAuthInfo getTripleAuthInfo(Member search) { + // TODO Auto-generated method stub + return userDao.getTripleAuthInfo(search); + } + + @Override + public int getLoginTryCount(MemberSearch search) { + // TODO Auto-generated method stub + return userDao.getLoginTryCount(search); + } + + @Override + public void setLoginLock(MemberSearch search) { + // TODO Auto-generated method stub + userDao.setLoginLock(search); + } + + @Override + public HashMap getMemChargingPointInfo(HashMap pointParam) { + // TODO Auto-generated method stub + return userDao.getMemChargingPointInfo(pointParam); + } + + @Override + public void updateFstChrgByJoinFlag(HashMap param) { + // TODO Auto-generated method stub + userDao.updateFstChrgByJoinFlag(param); + } + + @Override + public HashMap getMemberMap(Member search) { + // TODO Auto-generated method stub + return userDao.getMemberMap(search); + } + + @Override + public HashMap getMemberMap2(Member search) { + // TODO Auto-generated method stub + return userDao.getMemberMap2(search); + } + + @Override + public HashMap getBonusSettingInfo(HashMap param) { + // TODO Auto-generated method stub + return userDao.getBonusSettingInfo(param); + } + + @Override + public int userChangeFlag(HashMap flagParam) { + // TODO Auto-generated method stub + return userDao.userChangeFlag(flagParam); + } + + @Override + public int bonusSettingSave(ChargingPointSettingVO settingVO) { + // TODO Auto-generated method stub + return userDao.bonusSettingSave(settingVO); + } + + @Override + public int getNormalRetailCnt(Member user) { + // TODO Auto-generated method stub + return userDao.getNormalRetailCnt(user); + } + + @Override + public int userChangeSymLock(HashMap lockParam) { + // TODO Auto-generated method stub + return userDao.userChangeSymLock(lockParam); + } + + @Override + public double getUserMinPR(HashMap minParam) { + // TODO Auto-generated method stub + return userDao.getUserMinPR(minParam); + } + + @Override + public List> getUserHierarchyList(MemberHierarchyVo search) { + // TODO Auto-generated method stub + return userDao.getUserHierarchyList(search); + } + + @Override + public int checkMyBottom(HashMap searchMap) { + // TODO Auto-generated method stub + return userDao.checkMyBottom(searchMap); + } + + @Override + public List getMultipleRateList(MultipleRateInfo param) { + // TODO Auto-generated method stub + return userDao.getMultipleRateList(param); + } + + @Override + public void updateMultipleRate(MultipleRateInfo param) { + // TODO Auto-generated method stub + for(MultipleRate mrv : param.getRateList()) { + HashMap updParam = new HashMap<>(); + updParam.put("siteId", param.getSiteId()); + updParam.put("memId", param.getMemId()); + updParam.put("vendorCode", param.getVendorCode()); + updParam.put("rateType", mrv.getRateType()); + updParam.put("pointRate", mrv.getPointRate()); + updParam.put("loseRate", mrv.getLoseRate()); + log.info("#-updateMultipleRate::"+param.getSiteId()+"::"+param.getMemId()+"::updParam::"+updParam.toString()); + + int result1 = userDao.updateMyMultipleRate(updParam); + int result2 = userDao.updateTopMultipleMinRate(updParam); + int result3 = userDao.updateBottomMultipleMaxRate(updParam); + } + } + + @Override + public List getMemRateItemList(NewMemRateItem rateItem) { + // TODO Auto-generated method stub + return userDao.getMemRateItemList(rateItem); + } + + @Override + public NewMemRateItem getMemRateItem(@Valid NewMemRateItem rateItem) { + // TODO Auto-generated method stub + return userDao.getMemRateItem(rateItem); + } + + @Override + public int updateMemRateItem(@Valid NewMemRateItem rateItem) { + // TODO Auto-generated method stub + int updResult = 0; + + if(rateItem.getRateTypeCode() == null || rateItem.getRateTypeCode().equals("")) { + HashMap updParam = new HashMap<>(); + updParam.put("siteId", rateItem.getSiteId()); + updParam.put("memId", rateItem.getMemId()); + updParam.put("gameCategory", rateItem.getGameCategory()); + updParam.put("gameCategoryEn", rateItem.getGameCategoryEn()); + updParam.put("vendorCode", rateItem.getVendorCode()); + updParam.put("rateType", ""); + updParam.put("pointRate", rateItem.getPointRate()); + updParam.put("loseRate", rateItem.getLoseRate()); + log.info("#-updateMemRateItem::"+rateItem.getSiteId()+"::"+rateItem.getMemId()+"::updParam::"+updParam.toString()); + + int result1 = userDao.updateMyRate(updParam); + int result2 = userDao.updateTopMinRate(updParam); + int result3 = userDao.updateBottomMaxRate(updParam); + updResult = result1; + } else { + HashMap updParam = new HashMap<>(); + updParam.put("siteId", rateItem.getSiteId()); + updParam.put("memId", rateItem.getMemId()); + updParam.put("vendorCode", rateItem.getVendorCode()); + updParam.put("rateType", rateItem.getRateTypeCode()); + updParam.put("pointRate", rateItem.getPointRate()); + updParam.put("loseRate", rateItem.getLoseRate()); + log.info("#-updateMemRateItem::"+rateItem.getSiteId()+"::"+rateItem.getMemId()+"::updParam::"+updParam.toString()); + + int result1 = userDao.updateMyMultipleRate(updParam); + int result2 = userDao.updateTopMultipleMinRate(updParam); + int result3 = userDao.updateBottomMultipleMaxRate(updParam); + updResult = result1; + } + + return updResult; + } + + @Override + public int updateCashOutFlag(HashMap flagParam) { + // TODO Auto-generated method stub + return userDao.updateCashOutFlag(flagParam); + } + + @Override + public List getDashInfoInfo(HashMap param) { + // TODO Auto-generated method stub + return userDao.getDashInfoInfo(param); + } + + @Override + public List getGraphInfo(HashMap param) { + // TODO Auto-generated method stub + return userDao.getGraphInfo(param); + } + + @Override + public int updLoginFailCnt(Member member) { + // TODO Auto-generated method stub + return userDao.updLoginFailCnt(member); + } + + @Override + public int getMemberTreeListCnt(MemListSearchVO search) { + // TODO Auto-generated method stub + return userDao.getMemberTreeListCnt(search); + } + + @Override + public List getMemberTreeList(MemListSearchVO search) { + // TODO Auto-generated method stub + return userDao.getMemberTreeList(search); + } + + @Override + public List getUserTreeHierarchy(MemListSearchVO search) { + // TODO Auto-generated method stub + return userDao.getUserTreeHierarchy(search); + } + + @Override + public int settingCashInOut(HashMap param) { + // TODO Auto-generated method stub + return userDao.settingCashInOut(param); + } + + @Override + public List getIpDetailList(MemberListSearch search) { + List memList = userDao.getIpDetailList(search); + + for(HashMap mvo:memList) { + Member search2 = new Member(); + search2.setSiteId(search.getSiteId()); + search2.setMemId(mvo.get("memId").toString()); + mvo.put("topUserList", userDao.getTopUserList2(search2)); + } + + return memList; + } + + @Override + public int updateMemCashByAmount(HashMap cashParam) { + // TODO Auto-generated method stub + return userDao.updateMemCashByAmount(cashParam); + } + + @Override + public HashMap getMemBankInfo(HashMap param) { + // TODO Auto-generated method stub + return userDao.getMemBankInfo(param); + } + + @Override + public int resetUserLock(HashMap lockParam) { + // TODO Auto-generated method stub + return userDao.resetUserLock(lockParam); + } + + @Override + public List getTop15Info(HashMap paramMap) { + // TODO Auto-generated method stub + return userDao.getTop15Info(paramMap); + } + + @Override + public Month10Info getMonth10Info(String siteId) { + // TODO Auto-generated method stub + return userDao.getMonth10Info(siteId); + } + + @Override + public List> delCheckMemList(CompResetInfo compResetInfo) { + // TODO Auto-generated method stub + return userDao.delCheckMemList(compResetInfo); + } + + @Override + public int deleteUsers(String LOG_PREFIX, CompResetInfo compResetInfo) { + // TODO Auto-generated method stub + int res = 0; + log.info(LOG_PREFIX+ "Delete info::" + compResetInfo); + res = userDao.deleteUsers(compResetInfo); + log.info(LOG_PREFIX+ "delRes::" + res); + res = userDao.updateAdminHeadInfo(compResetInfo); + log.info(LOG_PREFIX+ "updRes::" + res); + + return res; + } + + @Override + public int updMemPhone(HashMap param) { + // TODO Auto-generated method stub + return userDao.updMemPhone(param); + } + + @Override + public int getLowerUserListCnt(UserListSearch search) { + // TODO Auto-generated method stub + return userDao.getLowerUserListCnt(search); + } + + @Override + public List> getLowerUserList(UserListSearch search) { + // TODO Auto-generated method stub + List> list = userDao.getLowerUserList(search); + + for(HashMap memDetail : list) { + Member search2 = new Member(); + search2.setSiteId(search.getSiteId()); + search2.setMemId(memDetail.get("memId").toString()); + memDetail.put("topUserList", userDao.getTopUserList2(search2)); + } + + return list; + } + + @Override + public List> getLoginUserList(UserSearch search) { + List> userList = userDao.getLoginUserList(search); + + for(HashMap user : userList) { + MemberListSearch search1 = new MemberListSearch(); + search1.setSiteId(search.getSiteId()); + search1.setMemId(user.get("memId").toString()); + String betData = userDao.getLoginUserBetData(search1); + if(betData != null) { + user.put("betData", betData); + } else { + user.put("betData", ""); + } + + Member search2 = new Member(); + search2.setSiteId(search.getSiteId()); + search2.setMemId(user.get("memId").toString()); + user.put("topUserList", userDao.getTopUserList2(search2)); + } + + return userList; + } + + @Override + public int getPlayGameListCnt(UserListSearch search) { + // TODO Auto-generated method stub + return userDao.getPlayGameListCnt(search); + } + + @Override + public List> getPlayGameList(UserListSearch search) { + // TODO Auto-generated method stub + return userDao.getPlayGameList(search); + } + + @Override + public int getDetailBetListCnt(UserListSearch search) { + // TODO Auto-generated method stub + return userDao.getDetailBetListCnt(search); + } + + @Override + public List> getDetailBetList(UserListSearch search) { + // TODO Auto-generated method stub + return userDao.getDetailBetList(search); + } + + @Override + public int getDetailBetListNewCnt(UserListSearch search) { + // TODO Auto-generated method stub + return userDao.getDetailBetListNewCnt(search); + } + + @Override + public List> getDetailBetListNew(UserListSearch search) { + // TODO Auto-generated method stub + return userDao.getDetailBetListNew(search); + } + + @Override + public int getTotalChangePointAmt(Member search) { + // TODO Auto-generated method stub + return userDao.getTotalChangePointAmt(search); + } + + @Override + public TripleAuthInfo getTripleAuthInfo2(Member user) { + // TODO Auto-generated method stub + return userDao.getTripleAuthInfo2(user); + } + + @Override + public int getIsMyBottomCnt(Member search) { + // TODO Auto-generated method stub + return userDao.getIsMyBottomCnt(search); + } + + @Override + public List> getPassAllResetList(String siteId) { + // TODO Auto-generated method stub + return userDao.getPassAllResetList(siteId); + } + + @Override + public HashMap getSiteCashBonusInfo(HashMap param) { + // TODO Auto-generated method stub + return userDao.getSiteCashBonusInfo(param); + } + + @Override + public List> getSiteCashBonusList(long siteIdx) { + // TODO Auto-generated method stub + return userDao.getSiteCashBonusList(siteIdx); + } + + @Override + public MemberDetail getMemByRvHoldem(Member searchMem) { + // TODO Auto-generated method stub + return userDao.getMemByRvHoldem(searchMem); + } + + @Override + public int insertRvHoldemAuthInfo(HashMap userMap) { + // TODO Auto-generated method stub + return userDao.insertRvHoldemAuthInfo(userMap); + } + + @Override + public HashMap getRvHoldemCheckInfo(String uid) { + // TODO Auto-generated method stub + return userDao.getRvHoldemCheckInfo(uid); + } + +} diff --git a/src/main/java/com/bb/service/VendorService.java b/src/main/java/com/bb/service/VendorService.java new file mode 100644 index 0000000..e2c0207 --- /dev/null +++ b/src/main/java/com/bb/service/VendorService.java @@ -0,0 +1,18 @@ +package com.bb.service; + +import java.util.HashMap; +import java.util.List; + +public interface VendorService { + + List> getNexusSkinInfo(HashMap siteParam); + + List> getNexusSkinList(HashMap vendorInfo); + + HashMap getNexusSkin(HashMap skinInfo); + + int nexusSkinUpdate(HashMap skinInfo); + + List> getTripleVendorList(HashMap tripleSiteInfo); + +} diff --git a/src/main/java/com/bb/service/VendorServiceImpl.java b/src/main/java/com/bb/service/VendorServiceImpl.java new file mode 100644 index 0000000..dce59f5 --- /dev/null +++ b/src/main/java/com/bb/service/VendorServiceImpl.java @@ -0,0 +1,52 @@ +package com.bb.service; + +import java.util.HashMap; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.bb.dao.CashDao; +import com.bb.dao.UserDao; +import com.bb.dao.VendorDao; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RequiredArgsConstructor +@Service +public class VendorServiceImpl implements VendorService { + + private final VendorDao vendorDao; + + @Override + public List> getNexusSkinInfo(HashMap siteParam) { + // TODO Auto-generated method stub + return vendorDao.getNexusSkinInfo(siteParam); + } + + @Override + public List> getNexusSkinList(HashMap vendorInfo) { + // TODO Auto-generated method stub + return vendorDao.getNexusSkinList(vendorInfo); + } + + @Override + public HashMap getNexusSkin(HashMap skinInfo) { + // TODO Auto-generated method stub + return vendorDao.getNexusSkin(skinInfo); + } + + @Override + public int nexusSkinUpdate(HashMap skinInfo) { + // TODO Auto-generated method stub + return vendorDao.nexusSkinUpdate(skinInfo); + } + + @Override + public List> getTripleVendorList(HashMap tripleSiteInfo) { + // TODO Auto-generated method stub + return null; + } +} diff --git a/src/main/java/com/bb/util/AESUtil.java b/src/main/java/com/bb/util/AESUtil.java new file mode 100644 index 0000000..035d752 --- /dev/null +++ b/src/main/java/com/bb/util/AESUtil.java @@ -0,0 +1,77 @@ +package com.bb.util; + +import java.nio.charset.StandardCharsets; +import java.security.*; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +import org.springframework.util.Base64Utils; + +import com.bb.config.RequestDecryptWrapper; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class AESUtil { + + private final String ALGORITHM = "AES/CBC/PKCS5PADDING"; + private final String KEY = "25354E6B712A2"; + private String iv; + + public String encrypt(String data) { + try { + Cipher cipher = Cipher.getInstance(ALGORITHM); + cipher.init(Cipher.ENCRYPT_MODE, createKeySpec(), createIvSpec()); + byte[] encryptData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8)); + return iv + Base64Utils.encodeToString(encryptData); + } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException e) { + throw new RuntimeException("encrypt fail : " + e.getMessage()); + } catch(IllegalArgumentException e) { +// log.error("encrypt fail : " + e.getMessage()); + return ""; + } + } + + public String decrypt(String data) { + String ivStr = data.substring(0,16); + String content = data.substring(16); + + try { + byte[] dataBytes = Base64Utils.decodeFromString(content); + Cipher cipher = Cipher.getInstance(ALGORITHM); + cipher.init(Cipher.DECRYPT_MODE, createKeySpec(), new IvParameterSpec(ivStr.getBytes(StandardCharsets.UTF_8))); + byte[] original = cipher.doFinal(dataBytes); + return new String(original, StandardCharsets.UTF_8); + } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException e) { + throw new RuntimeException("decrypt fail : " + e.getMessage()); + } catch(IllegalArgumentException e) { +// log.error("encrypt fail : " + e.getMessage()); + return ""; + } + } + + private IvParameterSpec createIvSpec() { + try { + String iv = StringUtils.randomStr(16); + this.iv = iv; + return new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8)); + } catch (Exception e) { + throw new RuntimeException("createIvSpec fail : " + e.getMessage()); + } + } + + private Key createKeySpec() { + try { + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + byte[] hashBytes = digest.digest(KEY.getBytes(StandardCharsets.UTF_8)); + return new SecretKeySpec(hashBytes, "AES"); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException("createKeySpec fail : " + e.getMessage()); + } + } +} diff --git a/src/main/java/com/bb/util/DateTimeUtils.java b/src/main/java/com/bb/util/DateTimeUtils.java new file mode 100644 index 0000000..0b9025a --- /dev/null +++ b/src/main/java/com/bb/util/DateTimeUtils.java @@ -0,0 +1,280 @@ +package com.bb.util; + +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.Locale; + +public class DateTimeUtils { + private static final long TIMEOUT = 1000 * 20; + @SuppressWarnings("unused") + private static final SimpleDateFormat FORMAT_YYYYMMDDHHMMSS = new SimpleDateFormat("yyyyMMddHHmmss"); + + public static long getValidDateTime() { + return System.currentTimeMillis() + TIMEOUT; + } + + public static long getValidDateTime(long timeout) { + return System.currentTimeMillis() + timeout; + } + + public static Date now(long time) { + return new Date(time); + } + + public static boolean isBefore(Date date){ + return date.before(new Date()); + } + + /** + * 오라클DB의 DATE형식 객체 생성(현재 년월일시간분초) + * @return Timestamp + */ + public static Timestamp getCurrentTimestamp() { + Calendar calendar = Calendar.getInstance(); + + return new Timestamp(calendar.getTime().getTime()); + } + + /** + * 현재 날짜와 시각을 yyyyMMdd 형태로 반환한다. + * @return String + */ + public static String getYyyymmdd() { + Calendar calendar = Calendar.getInstance(); + Locale currentLocale = new Locale("KOREAN", "KOREA"); + String pattern = "yyyyMMdd"; + SimpleDateFormat formatter = new SimpleDateFormat(pattern, currentLocale); + return formatter.format(calendar.getTime()); + } + + public static String getYyyymmdd2() { + Calendar calendar = Calendar.getInstance(); + Locale currentLocale = new Locale("KOREAN", "KOREA"); + String pattern = "yyyy-MM-dd"; + SimpleDateFormat formatter = new SimpleDateFormat(pattern, currentLocale); + return formatter.format(calendar.getTime()); + } + + + /** + * 현재 날짜와 시각을 Yyyymmddhhmmss 형태로 반환한다. + * + * @return + */ + public static String getYyyymmddhhmmss() { + Calendar calendar = Calendar.getInstance(); + Locale currentLocale = new Locale("KOREAN", "KOREA"); + String pattern = "yyyyMMddHHmmss"; + SimpleDateFormat formatter = new SimpleDateFormat(pattern, currentLocale); + return formatter.format(calendar.getTime()); + } + + /** + * 현재 날짜와 시각을 Yyyymmdd 형태로 반환한다. + * + * @param cal + * @return + */ + public static String getYyyymmdd(Calendar cal) { + Locale currentLocale = new Locale("KOREAN", "KOREA"); + String pattern = "yyyy-MM-dd"; + SimpleDateFormat formatter = new SimpleDateFormat(pattern, currentLocale); + return formatter.format(cal.getTime()); + } + + public static String getYyyymmdd(Calendar cal, String pattern) { + Locale currentLocale = new Locale("KOREAN", "KOREA"); + SimpleDateFormat formatter = new SimpleDateFormat(pattern, currentLocale); + return formatter.format(cal.getTime()); + } + + /** + * getGregorianCalendar + * + * @param yyyymmdd + * @return + */ + public static GregorianCalendar getGregorianCalendar(String yyyymmdd) { + + int yyyy = Integer.parseInt(yyyymmdd.substring(0, 4)); + int mm = Integer.parseInt(yyyymmdd.substring(4, 6)); + int dd = Integer.parseInt(yyyymmdd.substring(6)); + + GregorianCalendar calendar = new GregorianCalendar(yyyy, mm - 1, dd, 0, 0, 0); + + return calendar; + + } + + /** + * 지정된 플래그에 따라 연도 , 월 , 일자를 연산한다. + * - 사용 예 + * String date = DateUtil.getOpDate(java.util.Calendar.DATE , 1, "20080101") + * @return String + */ + public static String getOpDate(int field, int amount, String date) { + + GregorianCalendar calDate = getGregorianCalendar(date); + + if (field == Calendar.YEAR) { + calDate.add(GregorianCalendar.YEAR, amount); + } else if (field == Calendar.MONTH) { + calDate.add(GregorianCalendar.MONTH, amount); + } else { + calDate.add(GregorianCalendar.DATE, amount); + } + + return getYyyymmdd(calDate); + + } + + public static String getOpDate2(int field, int amount, String date) { + + GregorianCalendar calDate = getGregorianCalendar(date); + + if (field == Calendar.YEAR) { + calDate.add(GregorianCalendar.YEAR, amount); + } else if (field == Calendar.MONTH) { + calDate.add(GregorianCalendar.MONTH, amount); + } else { + calDate.add(GregorianCalendar.DATE, amount); + } + + return getYyyymmdd(calDate, "yyyyMMdd"); + + + } + + /** + * 2009-03-10 String날짜변수를 2009-03-10 00:00:00 Timestamp 형식으로 반환한다. + * + * @param dateStr + * @return + */ + public static Timestamp replaceTimestamp(String dateStr) { + if(dateStr == null || dateStr.length() != 10) return null; + + String year = dateStr.substring(0, 4); + String month = dateStr.substring(5, 7); + String day = dateStr.substring(8, 10); + + Calendar calendar = Calendar.getInstance(); + + calendar.set( + Integer.parseInt(year), + Integer.parseInt(month)-1, + Integer.parseInt(day), + 0, + 0, + 0 + ); + + return new Timestamp(calendar.getTime().getTime()); + } + + /** + * 두 날짜간의 기간(년,월,일) 계산 메소드 + * 날짜 인자가 하나인 경우 Default today로 처리 + * (나이 계산에 활용) + * + * @param fromDate java.util.String (예) YYYYMMDD + * @return String[3] - 0:Year, 1:Month, 2:Day + */ + public static int getPeriodBetween(String fromDate) + { + return getPeriodBetween(fromDate, getYyyymmdd()); + } + + /** + * 두 날짜간의 기간(년,월,일) 계산 메소드 + * @param fromDate String (예)"20000710" + * @param endDate String (예)"20001111" + * @return String[3] - 0:Year, 1:Month, 2:Day + */ + public static int getPeriodBetween(String fromDate, String endDate) + { + // fromDate가 endDate보다 클 경우 swap + if (fromDate.compareTo(endDate) > 0) + { + String temp; + temp = fromDate; + fromDate = endDate; + endDate = temp; + } + + int fromYYYY= Integer.parseInt(fromDate.substring(0,4)); + int fromMM = Integer.parseInt(fromDate.substring(4,6)); + int fromDD = Integer.parseInt(fromDate.substring(6,8)); + int endYYYY = Integer.parseInt(endDate.substring(0,4)); + int endMM = Integer.parseInt(endDate.substring(4,6)); + int endDD = Integer.parseInt(endDate.substring(6,8)); + + int iYearCount = endYYYY - fromYYYY; + int iMonthCount = 0; + int iDayCount = 0; + + if(fromDate.substring(4,8).compareTo(endDate.substring(4,8)) > 0) + { + iYearCount--; + iMonthCount = (12-fromMM) + endMM; + } + else + { + //iYearCount = iYearCount; + iMonthCount = endMM - fromMM; + } + + int lastDate = 0; + if(fromDD > endDD) + { + iMonthCount--; + lastDate = getDaysOfMonth(fromYYYY, fromMM); + iDayCount = (lastDate-fromDD) + endDD; + } + else + { + iDayCount = endDD - fromDD; + } + return iDayCount + lastDate; + } + + /** + * 입력한 달의 Day count 를 return + * + * @param year as String + * @param month as String + * @return int the count of month + */ + public static int getDaysOfMonth (String year, String month) + { + if(year == null || month == null) return -1; + return getDaysOfMonth (Integer.parseInt(year), Integer.parseInt(month)) ; + } + + /** + * 입력한 달의 Day count 를 return + * + * @param year as int + * @param month as int + * @return int the count of month + */ + public static int getDaysOfMonth (int year, int month) + { + if(month < 1 || month > 12) return -1; + + if(month == 2) + { + if ( ((year%4 == 0) && (year%100 != 0)) || (year%400 == 0) ) + return 29; + else + return 28; + } + else if(month==4||month==6||month==9||month==11) + return 30; + else + return 31; + } +} diff --git a/src/main/java/com/bb/util/IPKit.java b/src/main/java/com/bb/util/IPKit.java new file mode 100644 index 0000000..b5c5962 --- /dev/null +++ b/src/main/java/com/bb/util/IPKit.java @@ -0,0 +1,134 @@ +package com.bb.util; + + + +import java.security.MessageDigest; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; + + +public class IPKit { + + public static String getIpAddressByRequest(HttpServletRequest request) { + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + + // 여러 IP가 있을 경우 첫 번째 값만 사용 + if (ip != null && ip.contains(",")) { + ip = ip.split(",")[0].trim(); + } + + // ✅ IP 형식 검증 (IPv4, IPv6만 허용) + if (!ip.matches("^[0-9a-fA-F:\\.]+$")) { + // ip = "0.0.0.0"; // 또는 null / "unknown" 으로 처리 + ip = "unknown"; + } + + return ip; + } + + public static String getIpAddressByRequest1(HttpServletRequest request) { + String ip = request.getHeader("X-Forwarded-For"); + if(!StringUtils.isEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){ + int index = ip.indexOf(","); + if(index != -1){ + return ip.substring(0,index); + }else{ + return ip; + } + } + + ip = request.getHeader("X-Real-IP"); + if(!StringUtils.isEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){ + return ip; + } + return request.getRemoteAddr(); + } + + public static String viewPage(HttpServletRequest request, String page) { + HttpSession session = request.getSession(true); + + String userAgent = request.getHeader("user-agent"); + String referer = request.getHeader("referer"); + String vt = ""; + if(!(request.getParameter("vt") == null || "".equals(request.getParameter("vt")))) { + vt = request.getParameter("vt"); + + if("M".equals(vt)) { + session.setAttribute("isMobile", "mobile"); + } + + if("W".equals(vt)) { + session.setAttribute("isMobile", "web"); + } + }else { + session.setAttribute("isMobile", ""); + } + + + + + + Boolean isMobile = false; + + String url = request.getRequestURI(); + String domain = request.getRequestURL().toString().replace(request.getRequestURI(),"/"); + + String viewName=page; + isMobile = userAgent.contains("Mobile/") + || userAgent.contains("Android") + || userAgent.contains("iPhone") + || userAgent.contains("iPad"); + + + if(isMobile) { + viewName = "mobile/"+viewName; + } else { + + + if("mobile".equals(session.getAttribute("isMobile").toString())) { + return "mobile/"+viewName; + }else { + return "front/"+viewName; + } + + + } + + return viewName; + +} + + + public static String shaEnc(String base) { + + + try{ + + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + byte[] hash = digest.digest(base.getBytes("UTF-8")); + StringBuffer hexString = new StringBuffer(); + + for (int i = 0; i < hash.length; i++) { + String hex = Integer.toHexString(0xff & hash[i]); + if(hex.length() == 1) hexString.append('0'); + hexString.append(hex); + } + + //출력 + return hexString.toString(); + + } catch(Exception ex){ + throw new RuntimeException(ex); + } + } +} diff --git a/src/main/java/com/bb/util/PagingUtil.java b/src/main/java/com/bb/util/PagingUtil.java new file mode 100644 index 0000000..fa3e92d --- /dev/null +++ b/src/main/java/com/bb/util/PagingUtil.java @@ -0,0 +1,90 @@ +package com.bb.util; + +import com.bb.model.PageFormVO; + +/** + * 페이지 네비게이션 정보 설정을 위한 클래스 + */ +public class PagingUtil { + + + + + public static PageFormVO setPageUtil(PageFormVO pageFormVO) { + //System.out.println("currentPage" + pageFormVO.getPage()); + if(pageFormVO.getPage() == 0) { + //System.out.println("currentPagee" + pageFormVO.getPage()); + pageFormVO.setPage(1); + } + //System.out.println("currentPage" + pageFormVO.getPage()); + + String pagination = ""; // 페이징 결과 값 + String functionName = pageFormVO.getFunction_name(); // 페이징 목록을 요청하는 자바스크립트 함수명 + int currentPage = pageFormVO.getPage(); // 현재 페이지 번호 + + //System.out.println("currentPage" + currentPage); + int countPerList = pageFormVO.getCount_per_list(); // 한 화면에 출력될 게시물 수 + int countPerPage = pageFormVO.getCount_per_page(); // 한 화면에 출력될 페이지 수 + int totalListCount = pageFormVO.getTatal_list_count(); // 총 게시물 수 + int totalPageCount = totalListCount / countPerList; // 총 페이지 수 + if (totalListCount % countPerList > 0) { // 총 페이수를 구할 때 int형으로 계산하면 나머지가 있는 경우 게시물이 존재하기 때문에 총 페이지의 수를 수정 + totalPageCount = totalPageCount + 1; + } + + int viewFirstPage = (((currentPage - 1) / countPerPage) * countPerPage) + 1; // 한 화면에 첫 페이지 번호 + int ViewLastPage = viewFirstPage + countPerPage - 1; // 한 화면에 마지막 페이지 번호 + if (ViewLastPage > totalPageCount) { // 마지막 페이지의 수가 총 페이지의 수보다 큰 경우는 게시물이 존재하지 않기 때문에 마지막 페이지의 수를 수정 + ViewLastPage = totalPageCount; + } + + int totalFirstPage = 1; // 전체 페이지 중에 처음 페이지 + int totalLastPage = totalPageCount; // 전체 페이지 중에 마지막 페이지 + int prePerPage = 0; // 이전 화면에 첫번째 번호 + if (viewFirstPage - countPerPage > 0) { + prePerPage = viewFirstPage - countPerPage; + } else { + prePerPage = totalFirstPage; + } + int nextPerPage = 0; // 이후 화면에 첫번째 번호 + if (viewFirstPage + countPerPage < totalPageCount) { + nextPerPage = viewFirstPage + countPerPage; + } else { + nextPerPage = totalPageCount; + } + + // 페이지 네이게이션 설정 + + + pagination += "

"; + // pagination += "
Total Page :" + totalPageCount +"
"; +// pagination += "
"; + //pagination += " "; + + pagination += " "; + + //pagination += " "; + for (int a = viewFirstPage; a <= ViewLastPage; a++) { + if (a == currentPage) { + // pagination += " "+a+""; + // pagination += " "+a+""; + pagination += " "; + } else { + pagination += " "; + } + } + //pagination += " "; + // pagination += " "; + pagination += " "; + //pagination += "
"; + pagination += "
"; + + int offset = ((currentPage - 1) * countPerList) ; // 한 화면의 표출되는 게시물의 시작 번호의 -1 (쿼리 조건절) + + // LIMIT는 가져올 row의 수, OFFSET은 몇 번째 row부터 가져올지를 결정 + pageFormVO.setLimit(countPerList); + pageFormVO.setOffset(offset); + pageFormVO.setPagination(pagination); + + return pageFormVO; + } +} diff --git a/src/main/java/com/bb/util/PassimpaySignatureUtil.java b/src/main/java/com/bb/util/PassimpaySignatureUtil.java new file mode 100644 index 0000000..d8883fb --- /dev/null +++ b/src/main/java/com/bb/util/PassimpaySignatureUtil.java @@ -0,0 +1,38 @@ +package com.bb.util; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.util.Base64; + +public class PassimpaySignatureUtil { + + private static final String HMAC_SHA256 = "HmacSHA256"; + + /** + * Passimpay API Signature 생성 + * + * @param platformId 플랫폼 ID + * @param bodyJson 요청 본문 JSON 문자열 + * @param secret Passimpay API Secret + * @return 생성된 signature (Base64) + */ + public static String generateSignature(String platformId, String bodyJson, String secret) { + try { + // signatureContract: platformId + ";" + bodyJson + ";" + secret + String signatureContract = platformId + ";" + bodyJson + ";" + secret; + + Mac mac = Mac.getInstance(HMAC_SHA256); + SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), HMAC_SHA256); + mac.init(secretKey); + + byte[] hash = mac.doFinal(signatureContract.getBytes(StandardCharsets.UTF_8)); + + // Base64 인코딩 + return Base64.getEncoder().encodeToString(hash); + + } catch (Exception e) { + throw new RuntimeException("Passimpay Signature 생성 실패", e); + } + } +} diff --git a/src/main/java/com/bb/util/RandomRolling.java b/src/main/java/com/bb/util/RandomRolling.java new file mode 100644 index 0000000..7f08731 --- /dev/null +++ b/src/main/java/com/bb/util/RandomRolling.java @@ -0,0 +1,60 @@ +package com.bb.util; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Random; + +public class RandomRolling { + + /** + * 퍼센트 확률에 당첨여부 반환(1 ~ 100%) + */ + public static boolean isBlankSpin(int percentNum) { + boolean result = false; + + List arrPick = getScopeList(1, 100); + int pickNum = getRandom(1,100); + // 백분율, 1 ~ 100개 숫자중 택1(이 숫자가 확률배열에 포함여부 체크) + + if(0 < percentNum && percentNum < 100) { + Collections.shuffle(arrPick); + + for(int i=1; i<=percentNum; i++) { + if(arrPick.get(i-1) == pickNum) { + result = true; + break; + } + } + } else if (percentNum >= 100) { + result = true; + } + + return result; + } + + /** + * 범위 숫자 리스트 반환 + */ + public static List getScopeList(int pstart, int pend){ + List list = new ArrayList(); + + for(int i=pstart; i<=pend; i++) { + list.add(i); + } + + return list; + } + + + + public static int getRandom(int p_start, int p_end){ + Random rnd = new Random(); + + if(p_start >= p_end){ + return 0; + } else { + return rnd.nextInt(p_end-p_start+1) + p_start; + } + } +} diff --git a/src/main/java/com/bb/util/StringUtils.java b/src/main/java/com/bb/util/StringUtils.java new file mode 100644 index 0000000..a78849a --- /dev/null +++ b/src/main/java/com/bb/util/StringUtils.java @@ -0,0 +1,338 @@ +package com.bb.util; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.xml.bind.DatatypeConverter; + + +public class StringUtils { + + public static boolean isNumberic(String str) { + boolean result = true; + for(char c : str.toCharArray()){ + if(!Character.isDigit(c)) { + result = false; + break; + } + } + return result; + } + + /** + * 문자열이 NULL이거나 빈값인지 검사 + * @param string + * @return + */ + public static boolean isEmpty(String string) { + return string == null || string.trim().isEmpty(); + } + + /** + * null값인 문자열 기본값으로 대체 + * @param string + * @param defaultValue + * @return + */ + public static String nullValue(String string, String defaultValue) { + if(isEmpty(string)) { + return defaultValue; + } else { + return string; + } + } + + /** + * null값인 문자열 기본값으로 대체 + * @param string + * @param defaultValue + * @return + */ + public static String nullValue(String string, int defaultValue) { + if(isEmpty(string)) { + return String.valueOf(defaultValue); + } else { + return string; + } + } + + /** + * null값인 문자열 기본값으로 대체 + * @param string + * @param defaultValue + * @return + */ + public static String nullValue(String string, float defaultValue) { + if(isEmpty(string)) { + return String.valueOf(defaultValue); + } else { + return string; + } + } + + /** + * null값인 문자열 기본값으로 대체 + * @param string + * @return + */ + public static String nullValue(String string) { + return nullValue(string, ""); + } + + + /** + * 문자열 배열을 합친다 + * @param strings + * @param separater + * @return + */ + public static String join(String[] strings, String separater) { + String joinedString = ""; + + for(int i = 0; i < strings.length; i++) { + joinedString += (joinedString.length() > 0 ? separater : "") + strings[i]; + } + + return joinedString; + } + + /** + * Map의 키값을 문자열 배열로 얻는다 + * @param map + * @return + */ + public static String[] getArrayFrom(Map map) { + String[] strings = new String[map.size()]; + + int i = 0; + for(Object key : map.keySet()) { + strings[i++] = key.toString(); + } + + return strings; + } + + + /** + * Map의 키값을 문자열로 얻는다 + * @param map + * @param separater + * @return + */ + public static String getStringFrom(Map map, String separater) { + return join(getArrayFrom(map), separater); + } + + /** + * 닉네임용 문자 난수발생기 + * @param length + * @return + */ + public static String generateString(int length) { + + Random rnd = new Random(); + StringBuffer buf =new StringBuffer(); + String returnStr = ""; + + for(int i=0;i Integer.parseInt(numStr)) { + result = result - Integer.parseInt(plusNumStr); + } + + return String.valueOf(result); + } + + public static String mask(String origin, int length, String mask) { + StringBuilder masked = new StringBuilder(origin.substring(0, length)); + + for(int i = 0; i < origin.length() - length; i++) { + masked.append(mask); + } + + return masked.toString(); + } + + public static String numberFormat(Object number, String pattern) { + DecimalFormat df = new DecimalFormat(pattern); + return df.format(number); + } + + public static String randomCharNum(int wordLength) { + Random r = new Random(); + StringBuilder sb = new StringBuilder(wordLength); + for(int i = 0; i < wordLength; i++) { + if(r.nextBoolean()){ + sb.append((char)((int)(r.nextInt(26))+97)); + }else{ + sb.append((r.nextInt(10))); + } + } + return sb.toString(); + } + + public static String randomStr(int length) { + Random random = new Random(); + StringBuilder str = new StringBuilder(); + for (int i = 0; i < length; i++) { + int choice = random.nextInt(3); + switch(choice) { + case 0: + str.append((char)(random.nextInt(25) + 97)); + break; + case 1: + str.append((char)(random.nextInt(25) + 65)); + break; + case 2: + str.append((char)(random.nextInt(10) + 48)); + break; + default: + break; + } + } + return str.toString(); + } + + public static String md5AndHex(String plainText) throws NoSuchAlgorithmException { + + String MD5 = ""; + + //MessageDigest 인스턴스 생성(MD5) + MessageDigest md = MessageDigest.getInstance("MD5"); + + //해쉬값 업데이트 + md.update(plainText.getBytes()); + byte byteData[] = md.digest(); + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < byteData.length; i++) { + sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1)); + } + + MD5 = sb.toString(); + return MD5; + + //Byte To Hex String + //return DatatypeConverter.printHexBinary(md.digest()); + } + + public static String makeRandomKey(int length) { + int leftLimit = 48; // numeral '0' + int rightLimit = 122; // letter 'z' + int targetStringLength = length; + Random random = new Random(); + String generatedString = random.ints(leftLimit, rightLimit + 1) + .filter(i -> (i <= 57 || i >= 65) && (i <= 90 || i >= 97)) + .limit(targetStringLength) + .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) + .toString(); + System.out.println("### makeRandomKey : " + generatedString); + return generatedString; + } + + public static String[] extractUrlParts(String url) { + String[] urls = null; + Pattern urlPattern = Pattern.compile("^(https?):\\/\\/([^:\\/\\s]+)(:([^\\/]*))?((\\/[^\\s/\\/]+)*)?\\/([^#\\s\\?]*)(\\?([^#\\s]*))?(#(\\w*))?$"); + Matcher mc = urlPattern.matcher(url); + + if(mc.matches()){ + urls = new String[mc.groupCount()]; + for(int i=0;i list = new ArrayList<>(); + for(int i=0; i<(numLength-1); i++) { + int num = random.nextInt(10); + System.out.println("### makeRandomCoupon::num::" + num); + sumNum = sumNum + num; + lastNum = num; + list.add(String.valueOf(num)); + } + + System.out.println("### makeRandomCoupon::sumNum::" + sumNum); + System.out.println("### makeRandomCoupon::lastNum::" + lastNum); + int numEnd = 0; + if(lastNum != 0) { + numEnd = sumNum % lastNum; + } + System.out.println("### makeRandomCoupon::numEnd::" + numEnd); + list.add(String.valueOf(numEnd)); + + StringBuffer sbNum = new StringBuffer(); + for(int i=0; i 0; value >>>= 8) { + data[i] = (byte) value; + } + + SecretKeySpec signKey = new SecretKeySpec(key, "HmacSHA1"); + Mac mac = Mac.getInstance("HmacSHA1"); + mac.init(signKey); + byte[] hash = mac.doFinal(data); + + int offset = hash[20 - 1] & 0xF; + + // We're using a long because Java hasn't got unsigned int. + long truncatedHash = 0; + for (int i = 0; i < 4; ++i) { + truncatedHash <<= 8; + // We are dealing with signed bytes: + // we just keep the first byte. + truncatedHash |= (hash[offset + i] & 0xFF); + } + + truncatedHash &= 0x7FFFFFFF; + truncatedHash %= 1000000; + + return (int) truncatedHash; + } +} diff --git a/src/main/java/com/bb/util/UnsafeOkHttpClient.java b/src/main/java/com/bb/util/UnsafeOkHttpClient.java new file mode 100644 index 0000000..d1c90b9 --- /dev/null +++ b/src/main/java/com/bb/util/UnsafeOkHttpClient.java @@ -0,0 +1,48 @@ +package com.bb.util; + +import java.util.Arrays; +import java.util.concurrent.TimeUnit; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.TrustManagerFactory; +import javax.net.ssl.X509TrustManager; + +import okhttp3.CipherSuite; +import okhttp3.ConnectionSpec; +import okhttp3.OkHttpClient; +import okhttp3.TlsVersion; + +public class UnsafeOkHttpClient { + + public static OkHttpClient getTls12Client() throws Exception { + // 기본 TrustManager 사용 (신뢰 가능한 루트 CA) + TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance( + TrustManagerFactory.getDefaultAlgorithm()); + trustManagerFactory.init((java.security.KeyStore) null); + TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); + X509TrustManager trustManager = (X509TrustManager) trustManagers[0]; + + // SSLContext TLS 1.2로 초기화 + SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); + sslContext.init(null, new TrustManager[]{trustManager}, null); + SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); + + // 서버 호환 CipherSuite만 사용 + ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS) + .tlsVersions(TlsVersion.TLS_1_2) + .cipherSuites( + CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 + ) + .build(); + + return new OkHttpClient.Builder() + .sslSocketFactory(sslSocketFactory, trustManager) + .connectionSpecs(Arrays.asList(spec)) + .connectTimeout(30, TimeUnit.SECONDS) + .readTimeout(30, TimeUnit.SECONDS) + .build(); + } +} diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml new file mode 100644 index 0000000..a28b2fb --- /dev/null +++ b/src/main/resources/application-local.yml @@ -0,0 +1,121 @@ +server: + tomcat: + connection-timeout: 15000 + threads: + max: 4096 + min-spare: 50 + accept-count: 100 + mbeanregistry: + enabled: true + + port: 80 + servlet: + encoding: + force: true + +spring: + devtools: + livereload: + enabled: true + restart: + enabled: true + exclude: static/**,templates/** + # OMS-Master + datasource1: + driver-class-name: com.mysql.cj.jdbc.Driver + jdbc-url: jdbc:mysql://ultracore.cbop3tqawysk.ap-southeast-1.rds.amazonaws.com:6600/omsDB?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul&autoReconnect=true&useEncoding=true&characterEncoding=utf-8&allowMultiQueries=true + username: dev_oms + password: YJsiJRa@oWmCgwH44SZEvPqP9Lkjw + auto-commit: true + connection-test-query: SELECT 1 + transaction-isolation: TRANSACTION_READ_COMMITTED + maximum-pool-size: 32 + minimum-idle: 32 + leak-detection-threshold: 60000 + validation-timeout: 300000 + hikari: + pool-name: hikari-cp + max-lifetime: 300000 #1800000 에서 변경 + connection-timeout: 30000 + # OMS-Slave + datasource2: + driver-class-name: com.mysql.cj.jdbc.Driver + jdbc-url: jdbc:mysql://core-ro.cbop3tqawysk.ap-southeast-1.rds.amazonaws.com:6600/omsDB?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul&autoReconnect=true&useEncoding=true&characterEncoding=utf-8&allowMultiQueries=true + # jdbc-url: jdbc:mysql://ultracore.cbop3tqawysk.ap-southeast-1.rds.amazonaws.com:6600/omsDB?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul&autoReconnect=true&useEncoding=true&characterEncoding=utf-8&allowMultiQueries=true + username: dev_oms + password: YJsiJRa@oWmCgwH44SZEvPqP9Lkjw + auto-commit: true + connection-test-query: SELECT 1 + transaction-isolation: TRANSACTION_READ_COMMITTED + maximum-pool-size: 25 + minimum-idle: 25 + leak-detection-threshold: 60000 + validation-timeout: 300000 + hikari: + pool-name: hikari-cp + max-lifetime: 300000 #1800000 에서 변경 + connection-timeout: 30000 + # Triple + datasource3: + driver-class-name: com.mysql.cj.jdbc.Driver + jdbc-url: jdbc:mysql://ultracore.cbop3tqawysk.ap-southeast-1.rds.amazonaws.com:6600/triple_db?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul&autoReconnect=true&useEncoding=true&characterEncoding=utf-8 + username: dev_triple + password: 4N!lCDki8GhCfEIHpRogIQebvrCJ0 + auto-commit: true + connection-test-query: SELECT 1 + minimum-idle: 2 + maximum-pool-size: 2 + pool-name: hikari-cp + transaction-isolation: TRANSACTION_READ_COMMITTED + task: + scheduling: + pool: + size: 20 + thread-name-prefix: cr-task-pool- + thymeleaf: + mode: HTML + prefix: classpath:/templates/ + check-template-location: true + suffix: .html + encoding: utf-8 + cache: false + aop: + auto: true + proxy-target-class: true + servlet: + multipart: + max-file-size: 20MB + max-request-size: 20MB + data.redis: + host: 47.245.52.64 + port: 9124 + password: rjsemfwlak#% + +logging: + file: + path: /home/log/oms + level: + org.springframework: INFO + com.bb: INFO + com.zaxxer.hikari.HikariConfig: DEBUG + com.zaxxer.hikari: TRACE + +mybatis: + mapper-locations: classpath:mapper/*/*.xml + type-aliases-package: + configuration: + map-underscore-to-camel-case: true + +jwt: + header: Authorization + secret: c2lsdmVybmluZS10ZWNoLXNwcmluZy1ib290LWp3dC10dXRvcmlhbC1zZWNyZXQtc2lsdmVybmluZS10ZWNoLXNwcmluZy1ib290LWp3dC10dXRvcmlhbC1zZWNyZXQK + validity-in-seconds: 36000 + +cron: PROD +#cron: LOCAL + +management: + endpoints: + web: + exposure: + include: "*" \ No newline at end of file diff --git a/src/main/resources/application-real.yml b/src/main/resources/application-real.yml new file mode 100644 index 0000000..81f1b32 --- /dev/null +++ b/src/main/resources/application-real.yml @@ -0,0 +1,138 @@ +server: + tomcat: + connection-timeout: 15000 + threads: + max: 4096 + min-spare: 50 + accept-count: 100 + mbeanregistry: + enabled: true + + # 추가: Access log 설정 + accesslog: + enabled: true # Access log 활성화 + directory: /home/log/oms/access # 로그 저장 경로 (프로젝트 실행 경로 기준) + prefix: access_log # 파일 이름 접두사 + suffix: .log # 확장자 + pattern: "%h %l %u %t \"%r\" %s %b %D ms" # 로그 패턴 + file-date-format: .yyyy-MM-dd # 날짜별로 분리 + rotate: true # 날짜별 로테이션 + rename-on-rotate: true # 파일 이름 변경 + + port: 80 + servlet: + encoding: + force: true + + +spring: + devtools: + livereload: + enabled: true + restart: + enabled: true + exclude: static/**,templates/** + # OMS-Master + datasource1: + driver-class-name: com.mysql.cj.jdbc.Driver + jdbc-url: jdbc:mysql://ultracore.cbop3tqawysk.ap-southeast-1.rds.amazonaws.com:6600/omsDB?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul&autoReconnect=true&useEncoding=true&characterEncoding=utf-8&allowMultiQueries=true + username: dev_oms + password: YJsiJRa@oWmCgwH44SZEvPqP9Lkjw + auto-commit: true + connection-test-query: SELECT 1 + transaction-isolation: TRANSACTION_READ_COMMITTED + maximum-pool-size: 100 + minimum-idle: 30 + leak-detection-threshold: 60000 + validation-timeout: 5000 + hikari: + pool-name: hikari-cp + max-lifetime: 300000 #1800000 에서 변경 + connection-timeout: 30000 + # OMS-Slave + datasource2: + driver-class-name: com.mysql.cj.jdbc.Driver + jdbc-url: jdbc:mysql://core-ro.cbop3tqawysk.ap-southeast-1.rds.amazonaws.com:6600/omsDB?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul&autoReconnect=true&useEncoding=true&characterEncoding=utf-8&allowMultiQueries=true + # jdbc-url: jdbc:mysql://ultracore.cbop3tqawysk.ap-southeast-1.rds.amazonaws.com:6600/omsDB?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul&autoReconnect=true&useEncoding=true&characterEncoding=utf-8&allowMultiQueries=true + username: dev_oms + password: YJsiJRa@oWmCgwH44SZEvPqP9Lkjw + auto-commit: true + connection-test-query: SELECT 1 + transaction-isolation: TRANSACTION_READ_COMMITTED + maximum-pool-size: 120 + minimum-idle: 40 + leak-detection-threshold: 60000 + validation-timeout: 5000 + hikari: + pool-name: hikari-cp + max-lifetime: 300000 #1800000 에서 변경 + connection-timeout: 30000 + # Triple + datasource3: + driver-class-name: com.mysql.cj.jdbc.Driver + jdbc-url: jdbc:mysql://ultracore.cbop3tqawysk.ap-southeast-1.rds.amazonaws.com:6600/triple_db?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul&autoReconnect=true&useEncoding=true&characterEncoding=utf-8 + username: dev_triple + password: 4N!lCDki8GhCfEIHpRogIQebvrCJ0 + auto-commit: true + connection-test-query: SELECT 1 + minimum-idle: 2 + maximum-pool-size: 2 + pool-name: hikari-cp + transaction-isolation: TRANSACTION_READ_COMMITTED + task: + scheduling: + pool: + size: 5 + thread-name-prefix: cr-task-pool- + thymeleaf: + mode: HTML + prefix: classpath:/templates/ + check-template-location: true + suffix: .html + encoding: utf-8 + cache: false + aop: + auto: true + proxy-target-class: true + servlet: + multipart: + max-file-size: 20MB + max-request-size: 20MB + data.redis: + host: 47.245.52.64 + port: 9124 + password: rjsemfwlak#% + +logging: + file: + path: /home/log/oms + level: + org.springframework: INFO + com.bb: INFO + com.zaxxer.hikari.HikariConfig: DEBUG + com.zaxxer.hikari: TRACE +# reactor.netty: DEBUG # Reactor Netty 디버그 +# reactor.netty.http.client: DEBUG # HTTP client 디버그 +# io.netty: DEBUG # Netty 전체 디버그 +# io.netty.handler.ssl: DEBUG # SSL 핸드셰이크 디버그 핵심 +# javax.net.ssl: DEBUG # SSL 엔진 디버그 (핵심) + +mybatis: + mapper-locations: classpath:mapper/*/*.xml + type-aliases-package: + configuration: + map-underscore-to-camel-case: true + +jwt: + header: Authorization + secret: c2lsdmVybmluZS10ZWNoLXNwcmluZy1ib290LWp3dC10dXRvcmlhbC1zZWNyZXQtc2lsdmVybmluZS10ZWNoLXNwcmluZy1ib290LWp3dC10dXRvcmlhbC1zZWNyZXQK + validity-in-seconds: 36000 + +cron: PROD +#cron: LOCAL + +management: + endpoints: + web: + exposure: + include: "*" \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..ac70aa9 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,5 @@ +spring.profiles.active: @env@ + + + + diff --git a/src/main/resources/authentication.properties b/src/main/resources/authentication.properties new file mode 100644 index 0000000..bd4dfd3 --- /dev/null +++ b/src/main/resources/authentication.properties @@ -0,0 +1,5 @@ +AUTH.HEADER_STRING=Authorization +AUTH.TOKEN_PREFIX=Bearer +AUTH.AUTHORITIES_NAME=roles +AUTH.TOKEN_VALIDITY=18000 +AUTH.SIGNING_KEY=bbsskey \ No newline at end of file diff --git a/src/main/resources/db1/BET.xml b/src/main/resources/db1/BET.xml new file mode 100644 index 0000000..26c6fb0 --- /dev/null +++ b/src/main/resources/db1/BET.xml @@ -0,0 +1,2781 @@ + + + + + + INSERT INTO betinfo( + siteId, + memId, + betType, + gameCategory, + vendorCode, + betId, + gameName, + betAmt, + betRate, + betWinAmt, + betBonus, + betCnt, + betResults, + betStatus, + bfMoney, + afMoney, + updDate, + regDate, + regId, + updId, + delYn, + biProcYn, + biPushYn, + vendor + ) VALUES ( + #{siteId}, + #{memId}, + #{betType}, + #{gameCategory}, + #{vendorCode}, + #{betId}, + #{gameName}, + #{betAmt}, + #{betRate}, + TRUNCATE(#{betRate}*#{betAmt}, 0), + #{betBonus}, + #{betCnt}, + null, + 'WAIT', + #{bfMoney}, + #{afMoney}, + + #{updDate}, + + + NOW(), + + + #{regDate}, + + + NOW(), + + #{regId}, + #{updId}, + #{delYn}, + 'Y', + #{biPushYn}, + #{vendor} + ) + + + SELECT LAST_INSERT_ID(); + + + + + + INSERT INTO betinfomap ( + betIdx, + mapId, + rateTypeCode, + betName, + betAmt, + betRate, + betWinAmt, + debitDetailStr, + creditDetailStr + ) VALUES ( + #{betIdx}, + #{mapId}, + #{rateTypeCode}, + #{betName}, + #{betAmt}, + #{betRate}, + #{betWinAmt}, + #{debitDetailStr}, + #{creditDetailStr} + ) + + + + INSERT INTO betinfo( + siteId, + memId, + betType, + gameCategory, + vendorCode, + betId, + gameName, + betAmt, + betRate, + betWinAmt, + betBonus, + betCnt, + betResults, + betStatus, + bfMoney, + afMoney, + updDate, + regDate, + regId, + updId, + delYn, + isBlankSpinYn, + biProcYn, + biPushYn, + pointRegYn, + vendor + ) VALUES ( + #{siteId}, + #{memId}, + #{betType}, + #{gameCategory}, + #{vendorCode}, + #{betId}, + #{gameName}, + #{betAmt}, + #{betRate}, + #{betWinAmt}, + #{betBonus}, + #{betCnt}, + #{betResults}, + #{betStatus}, + #{bfMoney}, + #{afMoney}, + + #{updDate}, + + + NOW(), + + + #{regDate}, + + + NOW(), + + #{regId}, + #{updId}, + 'N', + 'N', + 'Y', + #{biPushYn}, + 'Y', + #{vendor} + ) + + + SELECT LAST_INSERT_ID(); + + + + + + UPDATE + betinfo + SET betRate = IF(betAmt='0' OR betAmt='0.0', 1, TRUNCATE((${betWinAmt} + betWinAmt)/betAmt, 0)), + betWinAmt = betWinAmt + #{betWinAmt}, + betResults = IF((${betWinAmt} + betWinAmt)>0, 'PASS', 'FAIL'), + betStatus = IF((${betWinAmt} + betWinAmt)>0, 'JUNGSANEND', 'RESULTEND'), + afMoney = #{afMoney}, + + pointRegYn = #{pointRegYn}, + + updDate = NOW() + WHERE + betIdx = #{betIdx} + + + + UPDATE + old_betinfo + SET betRate = IF(betAmt='0' OR betAmt='0.0', 1, TRUNCATE((${betWinAmt} + betWinAmt)/betAmt, 0)), + betWinAmt = betWinAmt + #{betWinAmt}, + betResults = IF((${betWinAmt} + betWinAmt)>0, 'PASS', 'FAIL'), + betStatus = IF((${betWinAmt} + betWinAmt)>0, 'JUNGSANEND', 'RESULTEND'), + afMoney = #{afMoney}, + + pointRegYn = #{pointRegYn}, + + updDate = NOW() + WHERE + betIdx = #{betIdx} + + + + UPDATE + betinfomap + SET betRate = IF(betAmt='0' OR betAmt='0.0', 1, TRUNCATE((${betWinAmt} + betWinAmt)/betAmt, 0)), + betWinAmt = betWinAmt + #{betWinAmt}, + creditDetailStr = #{creditDetailStr} + WHERE + betIdx = #{betIdx} AND mapId = #{mapId} + + + + UPDATE + old_betinfomap + SET betRate = IF(betAmt='0' OR betAmt='0.0', 1, TRUNCATE((${betWinAmt} + betWinAmt)/betAmt, 0)), + betWinAmt = betWinAmt + #{betWinAmt}, + creditDetailStr = #{creditDetailStr} + WHERE + betIdx = #{betIdx} AND mapId = #{mapId} + + + + UPDATE + betinfo + SET betRate = IF(betAmt='0' OR betAmt='0.0', 1, TRUNCATE((${betWinAmt} + betWinAmt)/betAmt, 0)), + betWinAmt = betWinAmt + #{betWinAmt}, + betResults = IF((${betWinAmt} + betWinAmt)>0, 'PASS', 'FAIL'), + betStatus = IF((${betWinAmt} + betWinAmt)>0, 'JUNGSANEND', 'RESULTEND'), + afMoney = #{afMoney}, + updDate = NOW() + WHERE + betIdx = #{betIdx} + + + + UPDATE daily_periodic_reports + SET dSportBetAmtWin = dSportBetAmtWin + #{betWinAmt} + WHERE 1=1 + AND days = DATE_FORMAT(NOW(), '%Y-%m-%d') + AND siteId = #{siteId} AND memId = #{memId} + + + + UPDATE ( + SELECT + DATE_FORMAT(b1.regDate, '%Y-%m-%d') AS days, + b1.siteId, + b1.memId + FROM betinfo b1 + WHERE 1=1 + AND b1.betIdx = #{betIdx} + UNION + SELECT + DATE_FORMAT(b2.regDate, '%Y-%m-%d') AS days, + b2.siteId, + b2.memId + FROM old_betinfo b2 + WHERE 1=1 + AND b2.betIdx = #{betIdx} + ) bi LEFT JOIN daily_periodic_reports dr ON dr.days=bi.days AND dr.siteId=bi.siteId AND dr.memId=bi.memId + SET dr.dSportBetAmt = dr.dSportBetAmt + #{betAmt} + WHERE 1=1 + + + + UPDATE ( + SELECT + DATE_FORMAT(b1.regDate, '%Y-%m-%d') AS days, + b1.siteId, + b1.memId + FROM betinfo b1 + WHERE 1=1 + AND b1.betIdx = #{betIdx} + UNION + SELECT + DATE_FORMAT(b2.regDate, '%Y-%m-%d') AS days, + b2.siteId, + b2.memId + FROM old_betinfo b2 + WHERE 1=1 + AND b2.betIdx = #{betIdx} + ) bi LEFT JOIN daily_periodic_reports dr ON dr.days=bi.days AND dr.siteId=bi.siteId AND dr.memId=bi.memId + SET dr.dSportBetAmtWin = dr.dSportBetAmtWin + #{betWinAmt} + WHERE 1=1 + + + + UPDATE ( + SELECT + DATE_FORMAT(b1.regDate, '%Y-%m-%d') AS days, + b1.siteId, + b1.memId + FROM betinfo b1 + WHERE 1=1 + AND b1.betIdx = #{betIdx} + UNION + SELECT + DATE_FORMAT(b2.regDate, '%Y-%m-%d') AS days, + b2.siteId, + b2.memId + FROM old_betinfo b2 + WHERE 1=1 + AND b2.betIdx = #{betIdx} + ) bi LEFT JOIN daily_periodic_reports dr ON dr.days=bi.days AND dr.siteId=bi.siteId AND dr.memId=bi.memId + SET dr.dSportBetAmt = dr.dSportBetAmt - #{betWinAmt} + WHERE 1=1 + + + + UPDATE ( + SELECT + DATE(p1.regDate) AS days, + p1.siteId, + p1.memId, + CAST(p1.pointAmt AS SIGNED) AS pointAmt + FROM point_info p1 + WHERE 1=1 + AND p1.betIdx = #{betIdx} + UNION + SELECT + DATE(p2.regDate) AS days, + p2.siteId, + p2.memId, + CAST(p2.pointAmt AS SIGNED) AS pointAmt + FROM old_point_info p2 + WHERE 1=1 + AND p2.betIdx = #{betIdx} + ) a + LEFT JOIN daily_periodic_reports b ON a.days=b.days AND a.siteId=b.siteId AND a.memId=b.memId + SET b.dSportRollingAmt = dSportRollingAmt + CAST(a.pointAmt AS SIGNED) + WHERE 1=1 + + + + UPDATE ( + SELECT + DATE(p1.regDate) AS days, + p1.siteId, + p1.memId, + CAST(p1.pointAmt AS SIGNED) AS pointAmt + FROM point_info p1 + WHERE 1=1 + AND p1.betIdx = #{betIdx} + UNION + SELECT + DATE(p2.regDate) AS days, + p2.siteId, + p2.memId, + CAST(p2.pointAmt AS SIGNED) AS pointAmt + FROM old_point_info p2 + WHERE 1=1 + AND p2.betIdx = #{betIdx} + ) a + LEFT JOIN daily_periodic_reports b ON a.days=b.days AND a.siteId=b.siteId AND a.memId=b.memId + SET b.dSportRollingAmt = dSportRollingAmt - CAST(a.pointAmt AS SIGNED) + WHERE 1=1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE `betinfomap` mp , ( + + SELECT map.betIdx , IF(resultSum >0, 'N', 'Y') AS betResult + + + FROM( + + SELECT + res.betIdx, + + IF( (res.narea='' OR res.narea = res.resultArea), 0, 1) + + IF( (res.noe='' OR res.noe = res.resultOE), 0, 1) + + IF( (res.nuo='' OR res.nuo = res.resultUO), 0, 1) + + IF( (res.ncarea='' OR res.ncarea = CONCAT(res.resultOE, res.resultArea)), 0, 1) + + IF( (res.ncoe='' OR res.ncoe = CONCAT(res.resultOE, resultUO)), 0, 1) + + IF( (res.parea='' OR res.parea = res.powerArea), 0, 1) + + IF( (res.poe='' OR res.poe = res.powerOE), 0, 1) + + IF( (res.puo='' OR res.puo = res.powerUO), 0, 1) + + IF( (res.pnum='' OR res.pnum = res.powerball), 0, 1) + + IF( (res.pcoeuo='' OR res.pcoeuo = CONCAT(res.powerOE, res.powerUO)), 0, 1) + AS resultSum + + FROM ( + SELECT + b.betIdx, + DATE_FORMAT(b.regDate , '%Y-%m-%d'), map.mineIdx , + IFNULL(REPLACE(JSON_EXTRACT(map.data, '$.betGameInfo[0].narea'), '\"', ''), '') AS narea, + IFNULL(REPLACE(JSON_EXTRACT(map.data, '$.betGameInfo[0].noe'), '\"', ''), '') AS noe, + IFNULL(REPLACE(JSON_EXTRACT(map.data, '$.betGameInfo[0].nuo'), '\"', ''), '') AS nuo, + IFNULL(REPLACE(JSON_EXTRACT(map.data, '$.betGameInfo[0].ncarea'), '\"', ''), '') AS ncarea, + IFNULL(REPLACE(JSON_EXTRACT(map.data, '$.betGameInfo[0].ncoe'), '\"', ''), '') AS ncoe, + IFNULL(REPLACE(JSON_EXTRACT(map.data, '$.betGameInfo[0].parea'), '\"', ''), '') AS parea, + IFNULL(REPLACE(JSON_EXTRACT(map.data, '$.betGameInfo[0].poe'), '\"', ''), '') AS poe, + IFNULL(REPLACE(JSON_EXTRACT(map.data, '$.betGameInfo[0].puo'), '\"', ''), '') AS puo, + IFNULL(REPLACE(JSON_EXTRACT(map.data, '$.betGameInfo[0].pnum'), '\"', ''), '') AS pnum, + IFNULL(REPLACE(JSON_EXTRACT(map.data, '$.betGameInfo[0].pcoeuo'), '\"', ''), '') AS pcoeuo, + + result.* + + FROM `betinfo` b + LEFT JOIN betinfomap map ON b.betIdx = map.betIdx + LEFT JOIN powerresult result ON map.mineIdx = result.gameRound AND DATE_FORMAT(b.regDate , '%Y-%m-%d') = DATE_FORMAT(result.gameTime , '%Y-%m-%d') + + + WHERE + betType = 'minigame' AND b.betStatus ='WAIT' AND (betResult IS NULL OR betResult ='') + )res + )map + )rm + SET mp.betResult = rm.betResult + WHERE rm.betIdx = mp.betIdx AND mp.betIdx = #{betIdx} + + + + UPDATE betinfo, betinfomap SET + betinfo.betResults = IF(betinfomap.betResult ='Y', 'PASS', 'FAIL'), + betinfo.betStatus = 'RESULTEND', + betinfo.updDate = NOW() + WHERE betinfo.betIdx = betinfomap.betIdx AND betinfo.betIdx= #{betIdx} AND betinfo.betStatus = 'WAIT' AND gameCategory = 'minigame' + AND betinfomap.betResult IN ('Y', 'N') + + + + INSERT INTO cash_info (`siteId`,`memId`,`cashType`,`cashDesc`,`cashAmt`,`betIdx`,`cashStatus`,`updDate`,`regDate`,`preCashAmt`) + SELECT betinfo.siteId , betinfo.memId, '3', '베팅성공' , betWinAmt , betIdx, '1' , NOW(), NOW() , + 0 + FROM `betinfo` WHERE betinfo.betIdx= #{betIdx} AND betinfo.betStatus = 'RESULTEND' AND gameCategory = 'minigame' AND betResults = 'PASS' + + + + UPDATE betinfo SET betStatus = 'JUNGSANEND' WHERE betIdx= #{betIdx} AND betResults = 'PASS' + + + + INSERT INTO point_info (siteId, `memId`,`pointType`,`pointAmt`,`pointDesc`,`betIdx`,`delYn`,`regId`,`pointStatus`,`updDate`,`regDate`, adminId, memo, prePointAmt) + SELECT d.*, mm.retailType, NOW(), NOW(), '' AS adminId, '' AS memo, 0 FROM ( + SELECT FB1.siteId, FB1.recommenderId , '3' AS pointType , + + CASE WHEN FB1.order =0 THEN TRUNCATE(FB1.betAmt*FB1.pointRate*0.01, 0) + ELSE TRUNCATE( FB1.betAmt*(FB1.pointRate - IFNULL(FB2.pointRate, 0))*0.01, 0) + END AS getPoint , FB1.rateType AS pointDesc, + FB1.betIdx, 'N' AS delYn, + FB1.regId AS regId + + + + FROM ( + + SELECT FB.*, r.idleStartRate, r.idleEndRate, r.rateType, r.pointRate, r.useYn + + FROM ( + SELECT B.siteId, B.betIdx, f.recommenderId, B.betAmt, B.betRate, f.order, B.gameType , f.memId AS regid FROM ( + SELECT b.*, map.gameType FROM betinfo b LEFT JOIN betinfomap map ON b.betIdx = map.betIdx + + WHERE gameCategory='minigame' + + AND betStatus IN ('JUNGSANEND', 'RESULTEND') + AND b.pointRegYn ='N' + AND b.betIdx= #{betIdx} + )B JOIN memberflow f + WHERE B.memId = f.memId + + )FB LEFT JOIN memrateinfo r ON FB.recommenderId = r.memId AND FB.gameType = r.gameType AND r.rateType ='R' AND FB.betRate*1 > r.idleStartRate*1 AND FB.betRate*1 <= r.idleEndRate*1 AND r.useYn='Y' + + WHERE r.memId IS NOT NULL + )FB1 LEFT JOIN ( + + SELECT `order`, pointRate + + FROM ( + SELECT B.siteId, f.recommenderId, B.betAmt, B.betRate, f.order, B.gameType FROM ( + SELECT b.*, map.gameType FROM betinfo b LEFT JOIN betinfomap map ON b.betIdx = map.betIdx + + WHERE gameCategory='minigame' + + AND betStatus IN ('JUNGSANEND', 'RESULTEND') + AND b.pointRegYn ='N' + AND b.betIdx= #{betIdx} + )B JOIN memberflow f + WHERE B.memId = f.memId + + )FB LEFT JOIN memrateinfo r ON FB.recommenderId = r.memId AND FB.gameType = r.gameType AND r.rateType ='R' AND FB.betRate*1 > r.idleStartRate*1 AND FB.betRate*1 <= r.idleEndRate*1 AND r.useYn='Y' + + WHERE r.memId IS NOT NULL + )FB2 ON FB1.order = FB2.order +1 + )d LEFT JOIN member_tb mm ON d.siteId = mm.siteId AND d.recommenderId = mm.memId + + UNION + + SELECT b.siteId, b.memId, '3', ABS(b.betWinAmt - b.betAmt) * IF(sl.useYn ='Y' , sl.pointRate*0.01 , 0) AS pointAmt ,'F', b.betIdx, 'N', b.memId, '1', NOW(), NOW(), '', '' ,0 FROM betinfo b + LEFT JOIN member_tb m ON b.siteId = m.siteId AND m.memId = b.memId + LEFT JOIN site_level_fail_point sl ON m.siteId = sl.siteId AND m.memLevel = sl.level AND b.vendorCode = sl.gameCode + WHERE b.betIdx= #{betIdx} AND b.pointRegYn ='N' + AND b.siteId = #{siteId} AND sl.useYn ='Y' + AND betStatus IN ('JUNGSANEND', 'RESULTEND') + + AND b.betWinAmt - b.betAmt <0 + + + + UPDATE betinfo SET pointRegYn = 'Y' WHERE betIdx= #{betIdx} + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO triple_tran_info + (siteId, memId, betId, tranId, vendorIdx, vendorKey, gameIdx, gameKey, userId, + tranType, debit, credit, beforeCash, afterCash, isCancel, isBonus, detailStr) + VALUES + (#{siteId}, #{memId}, #{betId}, #{tranId}, #{vendorIdx}, #{vendorKey}, #{gameIdx}, #{gameKey}, #{userId}, + #{tranType}, #{debit}, #{credit}, #{beforeCash}, #{afterCash}, #{isCancel}, #{isBonus}, #{detailStr}) + + + + UPDATE triple_tran_info + SET credit = #{credit}, + isAutoCancel = 1, + afterCash = afterCash + #{credit} + WHERE betId = #{betId} AND tranId = #{tranId} + + + + + + UPDATE + betinfo + SET + betRate = '0', + betWinAmt = #{betWinAmt}, + betResults = 'FAIL', + afMoney = bfMoney, + betStatus = #{betStatus}, + biProcYn = 'Y' + WHERE + betIdx = #{betIdx} + + + + UPDATE + old_betinfo + SET + betRate = '0', + betWinAmt = #{betWinAmt}, + betResults = 'FAIL', + afMoney = bfMoney, + betStatus = #{betStatus}, + biProcYn = 'Y' + WHERE + betIdx = #{betIdx} + + + + UPDATE + betinfo + SET + betAmt = betAmt - #{betAmt}, + afMoney = afMoney + #{betAmt}, + updDate = NOW() + WHERE + betIdx = #{betIdx} + + + + UPDATE + betinfo + SET + betRate = '0', + + betAmt = betAmt + #{betAmt}, + + + betWinAmt = betWinAmt + #{betWinAmt}, + + betResults = 'FAIL', + afMoney = #{afMoney}, + betStatus = #{betStatus}, + biProcYn = 'Y' + WHERE + betIdx = #{betIdx} + + + + UPDATE betinfo + SET + betAmt = CAST( CAST(betAmt AS DECIMAL(20, 2)) + CAST(#{betAmt} AS DECIMAL(20, 2)) AS CHAR), + afMoney = CAST( CAST(afMoney AS DECIMAL(20, 2)) - CAST(#{betAmt} AS DECIMAL(20, 2)) AS CHAR), + updDate = NOW() + WHERE betIdx = #{betIdx} + + + + UPDATE old_betinfo + SET + betAmt = CAST( CAST(betAmt AS DECIMAL(20, 2)) + CAST(#{betAmt} AS DECIMAL(20, 2)) AS CHAR), + afMoney = CAST( CAST(afMoney AS DECIMAL(20, 2)) - CAST(#{betAmt} AS DECIMAL(20, 2)) AS CHAR), + updDate = NOW() + WHERE betIdx = #{betIdx} + + + + UPDATE betinfomap + SET + betAmt = CAST( CAST(betAmt AS DECIMAL(20, 2)) + CAST(#{betAmt} AS DECIMAL(20, 2)) AS CHAR), + updDate = NOW() + WHERE betIdx = #{betIdx} + + + + UPDATE old_betinfomap + SET + betAmt = CAST( CAST(betAmt AS DECIMAL(20, 2)) + CAST(#{betAmt} AS DECIMAL(20, 2)) AS CHAR), + updDate = NOW() + WHERE betIdx = #{betIdx} + + + + INSERT INTO cash_info (siteId, memId, cashType, cashDesc, cashAmt, betIdx, cashStatus, regId, updDate, regDate, adminId, memo, preCashAmt) + VALUES (#{siteId}, #{memId}, #{cashType}, #{cashDesc}, #{cashAmt}, #{betIdx}, '1', #{regId}, NOW(), NOW(), #{adminId}, #{memo}, #{preCashAmt}) + + + + + + UPDATE cash_info + SET cashAmt = cashAmt + #{cashAmt}, updDate = NOW() + WHERE siteId = #{siteId} AND memId = #{memId} + AND betIdx = #{betIdx} AND cashType = #{cashType} + + + + UPDATE mem_cash + SET cashAmt = (cashAmt + #{cashAmt}), + cashAmtD = CAST(cashAmtD AS DECIMAL(20,2)) + CAST(#{cashAmt} AS DECIMAL(20,2)) + + , changeFlag = #{changeFlag} + + , updDt = NOW() + WHERE siteId = #{siteId} AND memId = #{memId} + + + + UPDATE mem_cash + SET cashAmt = CAST(TRUNCATE((CAST(cashAmtD AS DECIMAL(20,2)) + CAST(#{cashAmt} AS DECIMAL(20,2))), 0) AS CHAR), + cashAmtD = CAST(cashAmtD AS DECIMAL(20,2)) + CAST(#{cashAmt} AS DECIMAL(20,2)) + + , changeFlag = #{changeFlag} + + , updDt = NOW() + WHERE siteId = #{siteId} AND memId = #{memId} + + + + UPDATE mem_cash + SET cashAmt = (cashAmt + #{cashAmt}), + cashAmtD = CAST(cashAmtD AS DECIMAL(20,2)) + CAST(#{cashAmt} AS DECIMAL(20,2)) + + , changeFlag = #{changeFlag} + + , updDt = NOW() + WHERE siteIdx = #{siteIdx} AND memId = #{memId} + + + + + UPDATE mem_cash + SET cashAmt = #{cashAmt}, + cashAmtD = CAST(#{cashAmt} AS DECIMAL(20,2)) + + , changeFlag = #{changeFlag} + + , updDt = NOW() + WHERE siteId = #{siteId} AND memId = #{memId} + + + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO bet_splus_info + ( + betIdx, BetIdFK, tranType, customerID, reserveID, purchaseID, amount, odds, gain, lineTypeID, lineTypeName, newLineID, lineOdds, + eventTypeID, eventTypeName, newMasterEventID, newEventID, eventName, eventDate, betTypeID, betTypeName, creationDate, + isFreeBet, isLive, `status`, branchID, branchName, newLeagueID, leagueName, homeTeam, awayTeam, leagueNameKO, homeTeamKO, awayTeamKO, yourBet, score + ) + VALUES + ( + #{betIdx}, #{BetIdFK}, #{tranType}, #{customerID}, #{reserveID}, #{purchaseID}, #{amount}, #{odds}, #{gain}, #{lineTypeID}, #{lineTypeName}, #{newLineID}, #{lineOdds}, + #{eventTypeID}, #{eventTypeName}, #{newMasterEventID}, #{newEventID}, #{eventName}, #{eventDate}, #{betTypeID}, #{betTypeName}, #{creationDate}, + #{isFreeBet}, #{isLive}, #{status}, #{branchID}, #{branchName}, #{newLeagueID}, #{leagueName}, #{homeTeam}, #{awayTeam}, #{leagueNameKO}, #{homeTeamKO}, #{awayTeamKO}, #{yourBet}, #{score} + ) + + + + UPDATE bet_splus_info + SET purchaseID = #{purchaseID}, + odds = #{odds}, + `status` = #{status}, + score = #{score} + WHERE betIdx = #{betIdx} + AND newLineID = #{newLineID} + + + + UPDATE bet_splus_info + SET `status` = 'Cancel' + WHERE betIdx = #{betIdx} + + + + UPDATE bet_splus_info + SET purchaseID = #{purchaseId} + WHERE BetIdFK = #{betId} + + + + + + + + + + + + + + + + + + + + INSERT INTO slot_tran_info + (betId, tranId, siteId, memId, apiType, tranType, bfBalance, amount, afBalance, + vendor, vendorIdx, vendorKey, gameName, betDateTime) + VALUES + (#{betId}, #{tranId}, #{siteId}, #{memId}, #{apiType}, #{tranType}, #{bfBalance}, #{amount}, #{afBalance}, + #{vendor}, #{vendorIdx}, #{vendorKey}, #{gameName}, #{betDateTime}) + + + + + + + + + + + + INSERT INTO point_info + (siteId, memId, pointType, pointAmt, pointDesc, pointRate, betIdx, regId, pointStatus, updDate, regDate, adminId, memo, prePointAmt) + SELECT + result.* + FROM ( + SELECT + bi.siteId AS siteId, + baseF.recommenderId AS memId, + '3' AS pointType, + CAST( + CAST((bi.betAmt*(((baseR.pointRate*100) - IFNULL(underR.pointRate, '0.00')*100)/100)*0.01) AS DECIMAL(20,1)) + AS CHAR + ) AS pointAmt, + baseR.rateType AS pointDesc, + CAST(CAST(baseR.pointRate AS DECIMAL(20,2)) AS CHAR) AS pointRate, + bi.betIdx AS betIdx, + bi.memId AS regId, + '1' AS pointStatus, + bi.regDate AS updDate, + bi.regDate AS regDate, + '' AS adminId, + '' AS memo, + 0 AS prePointAmt + FROM new_bet_info bi LEFT JOIN memberflow baseF ON bi.siteId=baseF.siteId AND bi.memId=baseF.memId + LEFT JOIN member_tb mb ON baseF.siteId = mb.siteId AND baseF.recommenderId=mb.memId + LEFT JOIN memrateinfo baseR ON bi.siteId=baseR.siteId AND baseF.recommenderId=baseR.memId + AND bi.vendorCode=baseR.gameType AND baseR.rateType='R' + LEFT JOIN memberflow underF ON bi.siteId=underF.siteId AND bi.memId=underF.memId AND baseF.`order`=(underF.`order`+1) + LEFT JOIN memrateinfo underR ON bi.siteId=underR.siteId AND underF.recommenderId=underR.memId + AND bi.vendorCode=underR.gameType AND underR.rateType='R' + WHERE 1=1 + AND bi.tranId = #{tranId} + AND bi.pointRegYn = 'N' + AND mb.partnerLevel NOT IN ('COMP', 'AUTO') + ) result + WHERE result.pointAmt > 0 + + + + INSERT INTO losing_info + (siteId,memId,betIdx,amount,loseRate,realRate,losingAmt,playerId,regDate,updDate) + SELECT + result.* + FROM ( + SELECT + bi.siteId AS siteId, + baseF.recommenderId AS memId, + bi.betIdx AS betIdx, + (bi.betAmtN-bi.betWinAmtN) AS amount, + CAST(CAST(baseR.loseRate AS DECIMAL(20,2)) AS CHAR) AS loseRate, + CAST((((baseR.loseRate*100) - IFNULL(underR.loseRate, '0.00')*100)/100) AS DECIMAL(20,1)) AS realRate, + CAST( + CAST(((bi.betAmtN-bi.betWinAmtN)*(((baseR.loseRate*100) - IFNULL(underR.loseRate, '0.00')*100)/100)*0.01) AS DECIMAL(20,1)) + AS CHAR + ) AS losingAmt, + bi.memId AS playerId, + bi.regDate AS regDate, + bi.regDate AS updDate + FROM new_bet_info bi LEFT JOIN memberflow baseF ON bi.siteId=baseF.siteId AND bi.memId=baseF.memId + LEFT JOIN member_tb mb ON baseF.siteId = mb.siteId AND baseF.recommenderId=mb.memId + LEFT JOIN memrateinfo baseR ON bi.siteId=baseR.siteId AND baseF.recommenderId=baseR.memId + AND bi.vendorCode=baseR.gameType AND baseR.rateType='R' + LEFT JOIN memberflow underF ON bi.siteId=underF.siteId AND bi.memId=underF.memId AND baseF.`order`=(underF.`order`+1) + LEFT JOIN memrateinfo underR ON bi.siteId=underR.siteId AND underF.recommenderId=underR.memId + AND bi.vendorCode=underR.gameType AND underR.rateType='R' + WHERE 1=1 + AND bi.tranId = #{tranId} + AND mb.partnerLevel NOT IN ('COMP', 'AUTO') + ) result + WHERE result.losingAmt != '0.0' + + + + INSERT INTO losing_info + (siteId,memId,betIdx,amount,loseRate,realRate,losingAmt,playerId,regDate,updDate) + SELECT + result.* + FROM ( + SELECT + bi.siteId AS siteId, + baseF.recommenderId AS memId, + bi.betIdx AS betIdx, + (CAST(bi.betAmtN AS DECIMAL(20,1)) - CAST((bi.betAmt*(((baseR.pointRate*100) - IFNULL(underR.pointRate, '0.00')*100)/100)*0.01) AS DECIMAL(20,1))) AS amount, + CAST(CAST(baseR.loseRate AS DECIMAL(20,2)) AS CHAR) AS loseRate, + CAST((((baseR.loseRate*100) - IFNULL(underR.loseRate, '0.00')*100)/100) AS DECIMAL(20,1)) AS realRate, + CAST( + CAST( ( + (CAST(bi.betAmtN AS DECIMAL(20,1)) - CAST((bi.betAmt*(((baseR.pointRate*100) - IFNULL(underR.pointRate, '0.00')*100)/100)*0.01) AS DECIMAL(20,1))) * + (((baseR.loseRate*100) - IFNULL(underR.loseRate, '0.00')*100)/100) * + 0.01 ) + AS DECIMAL(20,1)) + AS CHAR) AS losingAmt, + bi.memId AS playerId, + bi.regDate AS regDate, + bi.regDate AS updDate + FROM new_bet_info bi LEFT JOIN memberflow baseF ON bi.siteId=baseF.siteId AND bi.memId=baseF.memId + LEFT JOIN member_tb mb ON baseF.siteId = mb.siteId AND baseF.recommenderId=mb.memId + LEFT JOIN memrateinfo baseR ON bi.siteId=baseR.siteId AND baseF.recommenderId=baseR.memId + AND bi.vendorCode=baseR.gameType AND baseR.rateType='R' + LEFT JOIN memberflow underF ON bi.siteId=underF.siteId AND bi.memId=underF.memId AND baseF.`order`=(underF.`order`+1) + LEFT JOIN memrateinfo underR ON bi.siteId=underR.siteId AND underF.recommenderId=underR.memId + AND bi.vendorCode=underR.gameType AND underR.rateType='R' + WHERE 1=1 + AND bi.tranId = #{tranId} + AND mb.partnerLevel NOT IN ('COMP', 'AUTO') + ) result + WHERE result.losingAmt != '0.0' + + + + INSERT INTO losing_info + (siteId,memId,betIdx,amount,loseRate,realRate,losingAmt,playerId,regDate,updDate) + SELECT + result.* + FROM ( + SELECT + bi.siteId AS siteId, + baseF.recommenderId AS memId, + bi.betIdx AS betIdx, + (-1 * bi.betWinAmtN) AS amount, + CAST(CAST(baseR.loseRate AS DECIMAL(20,2)) AS CHAR) AS loseRate, + CAST((((baseR.loseRate*100) - IFNULL(underR.loseRate, '0.00')*100)/100) AS DECIMAL(20,1)) AS realRate, + CAST( + CAST(((-1 * bi.betWinAmtN)*(((baseR.loseRate*100) - IFNULL(underR.loseRate, '0.00')*100)/100)*0.01) AS DECIMAL(20,1)) + AS CHAR + ) AS losingAmt, + bi.memId AS playerId, + bi.regDate AS regDate, + bi.regDate AS updDate + FROM new_bet_info bi LEFT JOIN memberflow baseF ON bi.siteId=baseF.siteId AND bi.memId=baseF.memId + LEFT JOIN member_tb mb ON baseF.siteId = mb.siteId AND baseF.recommenderId=mb.memId + LEFT JOIN memrateinfo baseR ON bi.siteId=baseR.siteId AND baseF.recommenderId=baseR.memId + AND bi.vendorCode=baseR.gameType AND baseR.rateType='R' + LEFT JOIN memberflow underF ON bi.siteId=underF.siteId AND bi.memId=underF.memId AND baseF.`order`=(underF.`order`+1) + LEFT JOIN memrateinfo underR ON bi.siteId=underR.siteId AND underF.recommenderId=underR.memId + AND bi.vendorCode=underR.gameType AND underR.rateType='R' + WHERE 1=1 + AND bi.tranId = #{tranId} + AND mb.partnerLevel NOT IN ('COMP', 'AUTO') + ) result + WHERE result.losingAmt != '0.0' + + + + INSERT INTO point_info + (siteId, memId, pointType, pointAmt, pointDesc, pointRate, betIdx, delYn, regId, pointStatus, updDate, regDate, adminId, memo, prePointAmt) + SELECT + result.* + FROM ( + SELECT + bi.siteId AS siteId, + baseF.recommenderId AS memId, + '3' AS pointType, + CAST( + CAST((bi.betAmt*(((baseR.pointRate*100) - IFNULL(underR.pointRate, '0.00')*100)/100)*0.01) AS DECIMAL(20,1)) + AS CHAR + ) AS pointAmt, + baseR.rateType AS pointDesc, + CAST(CAST(baseR.pointRate AS DECIMAL(20,1)) AS CHAR) AS pointRate, + bi.betIdx AS betIdx, + 'N' AS delYn, + bi.memId AS regId, + '1' AS pointStatus, + bi.regDate AS updDate, + bi.regDate AS regDate, + '' AS adminId, + '' AS memo, + 0 AS prePointAmt + FROM betinfo bi LEFT JOIN memberflow baseF ON bi.siteId=baseF.siteId AND bi.memId=baseF.memId + LEFT JOIN member_tb mb ON baseF.siteId = mb.siteId AND baseF.recommenderId=mb.memId + LEFT JOIN memrateinfo baseR ON bi.siteId=baseR.siteId AND baseF.recommenderId=baseR.memId + AND bi.vendorCode=baseR.gameType AND baseR.rateType='R' + LEFT JOIN memberflow underF ON bi.siteId=underF.siteId AND bi.memId=underF.memId AND baseF.`order`=(underF.`order`+1) + LEFT JOIN memrateinfo underR ON bi.siteId=underR.siteId AND underF.recommenderId=underR.memId + AND bi.vendorCode=underR.gameType AND underR.rateType='R' + WHERE 1=1 + AND bi.betIdx = CAST(#{betIdx} AS UNSIGNED) + AND ( + (bi.gameCategory='casino' AND bi.betAmt != bi.betWinAmt) + OR + (bi.gameCategory='slot') + OR + (bi.gameCategory='sport') + ) + AND bi.pointRegYn = 'N' + AND mb.partnerLevel NOT IN ('COMP', 'AUTO') + ) result + WHERE result.pointAmt > 0 + + + + UPDATE new_bet_info + SET pointRegYn = #{pointRegYn}, + isBlankSpinYn = #{isBlankSpinYn} + WHERE tranId = #{tranId} + + + + UPDATE betinfo + SET pointRegYn ='Y' + WHERE betIdx = #{betIdx} + + + + + + + + DELETE b, c FROM new_bet_info a LEFT JOIN point_info b ON a.betIdx=b.betIdx + LEFT JOIN mem_pre_point c ON b.pointIdx=c.pointIdx + WHERE a.betId = #{betId} + AND a.tranType = 'DEBIT' + AND a.isBlankSpinYn = 'N' + AND b.pointIdx IS NOT NULL + + + + DELETE a, b FROM point_info a LEFT JOIN mem_pre_point b ON a.pointIdx=b.pointIdx + WHERE a.betIdx = #{betIdx} + + + + DELETE b FROM new_bet_info a LEFT JOIN losing_info b ON a.betIdx=b.betIdx + WHERE a.betId = #{betId} + AND a.tranType = 'DEBIT' + AND a.isBlankSpinYn = 'N' + AND b.losingIdx IS NOT NULL + + + + DELETE FROM losing_info + WHERE betIdx = #{betIdx} + + + + DELETE b, c FROM betinfo a LEFT JOIN point_info b ON a.betIdx=b.betIdx + LEFT JOIN mem_pre_point c ON b.pointIdx=c.pointIdx + WHERE a.betIdx = #{betIdx} + AND a.isBlankSpinYn = 'N' + AND b.pointIdx IS NOT NULL + + + + + + + + + + INSERT INTO new_bet_info ( + tranId, betId, siteId, memId, apiCompCode, apiVendor, gameCategory, vendorCode, gameName, + tranType, betAmt, betAmtN, betWinAmt, betWinAmtN, balance, + + isCancel, + + isBlankSpinYn, pointRegYn, regDate, updDate + ) VALUES ( + #{tranId}, #{betId}, #{siteId}, #{memId}, #{apiCompCode}, #{apiVendor}, #{gameCategory}, #{vendorCode}, #{gameName}, + #{tranType}, #{betAmt}, #{betAmt}, #{betWinAmt}, #{betWinAmt}, #{balance}, + + #{isCancel}, + + #{isBlankSpinYn}, #{pointRegYn}, #{regDate}, #{updDate} + ) + + + + UPDATE new_bet_info + SET isCancel = 'Y' + WHERE betId = #{betId} + + + + UPDATE new_bet_info + SET isCancel = 'Y' + WHERE betIdx = #{betIdx} + + + + UPDATE new_bet_info + SET isBonus = 'Y' + WHERE betId = #{betId} + + + + + + + + UPDATE mem_point + SET pointAmt = pointAmt - #{pointAmt} + WHERE siteId = #{siteId} + AND memId = #{memId} + + + + + + INSERT INTO rvholdem_callback_log ( + siteId, + memId, + callbackType, + userId, + uid, + logId, + bfBalance, + amount, + chipAmount, + afBalance, + groupId, + roomtype, + addedAt, + addedAtKST, + penaltyAmount, + penaltyChipAmount, + cb_uid, + uniqueKey + ) VALUES ( + #{siteId}, + #{memId}, + #{callbackType}, + #{userId}, + #{uid}, + #{logId,jdbcType=INTEGER}, + #{bfBalance,jdbcType=INTEGER}, + #{amount,jdbcType=INTEGER}, + #{chipAmount,jdbcType=INTEGER}, + #{afBalance,jdbcType=INTEGER}, + #{groupId,jdbcType=INTEGER}, + #{roomtype,jdbcType=INTEGER}, + #{addedAt, jdbcType=TIMESTAMP}, + #{addedAtKST, jdbcType=TIMESTAMP}, + #{penaltyAmount}, + #{penaltyChipAmount}, + #{cb_uid}, + #{uniqueKey} + ) + + + diff --git a/src/main/resources/db1/BOARD.xml b/src/main/resources/db1/BOARD.xml new file mode 100644 index 0000000..3dda0f5 --- /dev/null +++ b/src/main/resources/db1/BOARD.xml @@ -0,0 +1,697 @@ + + + + + WHERE 1=1 + AND bod.siteId = #{siteId} + AND bod.boardType = #{boardType} + + AND bod.title LIKE CONCAT('%', #{searchValue}, '%') + + + AND bod.content LIKE CONCAT('%', #{searchValue}, '%') + + + AND (bod.title LIKE CONCAT('%', #{searchValue}, '%') OR bod.content LIKE CONCAT('%', #{searchValue}, '%')) + + + AND bod.category = #{category} + + + AND bod.category = #{faqType} + + + AND bod.regId = #{memId} + + + AND DATE_FORMAT(bod.regDate, '%Y%m%d') >= DATE_FORMAT(#{startDate}, '%Y%m%d') + + + AND DATE_FORMAT(bod.regDate, '%Y%m%d') <= DATE_FORMAT(#{endDate}, '%Y%m%d') + + AND (bod.delYn !='Y' OR bod.delYn IS NULL) + + AND bod.viewYn = 'Y' + + + + + + + + + + + + + + + INSERT INTO board_info ( + + boardIdx, + + siteId, + boardType, + category, + title, + content, + viewCnt, + status, + faqType, + isReadAdmin, + regId, + regDate, + updDate, + delYn, + bettinginfo, + isTop + ) VALUES ( + + #{boardIdx}, + + #{siteId}, + #{boardType}, + #{category}, + #{title}, + #{content}, + #{viewCnt}, + + 'WAIT', + #{faqType}, + + + null, + null, + + #{isReadAdmin}, + #{regId}, + now(), + now(), + #{delYn}, + #{bettinginfo}, + #{isTop} + ) ON DUPLICATE KEY UPDATE + updDate = now() + + , title = #{title} + + + , content = #{content} + + + , category = #{category} + + + , delYn = #{delYn} + + + , isTop = #{isTop} + + + , bettinginfo = #{bettinginfo} + + + SELECT LAST_INSERT_ID(); + + + + + + + update board_info set viewCnt = ifnull(viewCnt, 0) + 1 where boardIdx = #{boardIdx} + + + + + update board_info set isReadAdmin = 'Y' where boardIdx = #{boardIdx} and ( isReadAdmin ='N' OR isReadAdmin is null) + + + + + + + INSERT INTO msginfo ( + + msgIdx, + + siteId, + msgType, + recieveId, + msgTitle, + msgDesc, + msgDescEng, + sendDate, + updDate, + regId, + delYn, + targetLevel, + targetType, + hiddenYn, + rMemId + ) VALUES ( + + #{msgIdx}, + + #{siteId}, + #{msgType}, + #{recieveId}, + #{msgTitle}, + #{msgDesc}, + #{msgDescEng}, + NOW(), + NOW(), + #{regId}, + 'N', + #{targetLevel}, + #{targetType}, + #{hiddenYn}, + #{rMemIdList} + ) ON DUPLICATE KEY UPDATE + updDate = now() + + ,hiddenYn =#{hiddenYn} + + + ,delYn = #{delYn} + + + + + + INSERT INTO msginfo + (siteId, msgType, recieveId, msgTitle, msgDesc, regId, hiddenYn) + SELECT + siteId, + 'msg' AS msgType, + memId AS recieveId, + #{msgTitle} AS msgTitle, + #{msgDesc} AS msgDesc, + siteId AS regId, + #{hiddenYn} AS hiddenYn + FROM member_tb + WHERE 1=1 + AND siteId = #{siteId} + AND ( + memId = #{recieveId} + OR + recommenderId = #{recieveId} + ) + + + + + INSERT INTO msginfo + (siteId, msgType, recieveId, msgTitle, msgDesc, regId, hiddenYn) + SELECT + siteId, + 'msg' AS msgType, + memId AS recieveId, + #{msgTitle} AS msgTitle, + #{msgDesc} AS msgDesc, + siteId AS regId, + #{hiddenYn} AS hiddenYn + FROM member_tb + WHERE 1=1 + AND siteId = #{siteId} + AND partnerLevel NOT IN ('COMP','AUTO') + + AND memId = #{recieveId} + + AND memLevel = #{targetLevel} + + + + + + + + + + + + + + INSERT INTO msginfo_read_status + (msgIdx, siteId, memId, status, updDate) + VALUES + (#{msgIdx}, #{siteId}, #{recieveId}, 'R', NOW()) + ON DUPLICATE KEY UPDATE updDate = NOW(), status ='R' + + + + + INSERT INTO `msginfo_read_status` + SELECT + msg.msgIdx AS msgIdx, + msg.siteId AS siteId, + #{recieveId} AS memId, + 'R' AS msgStatus, + NOW() + FROM + `msginfo` msg + LEFT JOIN member_tb m ON msg.recieveId = m.memId + LEFT JOIN site s ON s.siteId = msg.siteId + LEFT JOIN `msginfo_read_status` mrs ON msg.msgIdx = mrs.msgIdx AND mrs.memId=#{recieveId} + WHERE + msg.siteId = #{siteId} AND delYn= 'N' + AND msg.hiddenYn = 'N' + AND (mrs.status != 'N' OR mrs.status IS NULL) + AND (msg.recieveId = #{recieveId} OR recieveId = '') + AND msg.sendDate > (SELECT redDt FROM `member_tb` WHERE siteId = #{siteId} AND memId = #{recieveId}) + ON DUPLICATE KEY UPDATE `updDate` = NOW(), msginfo_read_status.status ='R' + + + + + UPDATE msginfo_read_status + SET status = #{status}, updDate = NOW() + WHERE msgIdx = #{msgIdx} + AND memId = #{recieveId} + + + + + INSERT INTO `msginfo_read_status` + SELECT + msg.msgIdx, + #{recieveId}, + 'N' AS msgStatus, + NOW() + FROM + `msginfo` msg + LEFT JOIN member_tb m ON msg.recieveId = m.memId + LEFT JOIN site s ON s.siteId = msg.siteId + LEFT JOIN `msginfo_read_status` mrs ON msg.msgIdx = mrs.msgIdx AND mrs.memId=#{recieveId} + WHERE + msg.siteId = #{siteId} AND delYn= 'N' + AND msg.hiddenYn = 'N' + AND (mrs.status != 'N' OR mrs.status IS NULL) + AND (msg.recieveId = #{recieveId} OR recieveId = '') + AND msg.sendDate > (SELECT redDt FROM `member_tb` WHERE siteId = #{siteId} AND memId = #{recieveId}) + AND msg.msgIdx = #{msgIdx} + ON DUPLICATE KEY UPDATE `updDate` = NOW(), msginfo_read_status.status ='N' + + + + + UPDATE msginfo_read_status + SET status = 'N', updDate = NOW() + WHERE memId = #{recieveId} + AND msgIdx IN + + #{item} + + + + + + UPDATE board_info + SET status = 'ANSWER' + WHERE boardIdx = #{boardIdx} AND boardType = 'faq' + + + + + + INSERT INTO site_answer_info + (siteId, answerType, title, answer) + VALUES + (#{siteId}, #{answerType}, #{title}, #{answer}) + + + + UPDATE site_answer_info + SET title = #{title}, answer = #{answer} + WHERE idx = #{idx} + + + + UPDATE site_answer_info + SET useYn = 'N' + WHERE idx=#{idx} + + + + + + + + UPDATE board_info + SET isReadUser = 'Y' + WHERE boardIdx = #{boardIdx} + AND (isReadUser ='N' OR isReadUser IS NULL) + + + + + + + + DELETE FROM board_info WHERE boardIdx = #{boardIdx} + + + + UPDATE board_info + SET viewYn = #{viewYn} + WHERE boardIdx = #{boardIdx} + + + + UPDATE board_info + SET delYn = 'Y' + WHERE boardIdx = #{boardIdx} + + + diff --git a/src/main/resources/db1/CASH.xml b/src/main/resources/db1/CASH.xml new file mode 100644 index 0000000..76e7f04 --- /dev/null +++ b/src/main/resources/db1/CASH.xml @@ -0,0 +1,2538 @@ + + + + + + + INSERT INTO cash_info ( + siteId, + memId, + cashType, + cashDesc, + cashAmt, + betIdx, + delYn, + cashStatus, + regId, + updDate, + regDate, + adminId, + memo, + preCashAmt + + , refIdx + + + , symbol + + + , exchangeRate + + + , amount + + ) VALUES ( + #{siteId}, + #{memId}, + #{cashType}, + #{cashDesc}, + #{cashAmt}, + #{betIdx}, + #{delYn}, + #{cashStatus}, + #{regId}, + now(), + now(), + #{adminId}, + #{memo}, + #{preCashAmt} + + , #{refIdx} + + + , #{symbol} + + + , #{exchangeRate} + + + , #{amount} + + ) + + SELECT LAST_INSERT_ID(); + + + + + UPDATE mem_cash + SET cashAmt = cashAmt + #{cashAmt}, + cashAmtD = CAST(cashAmtD AS DECIMAL(20,2)) + CAST(#{cashAmt} AS DECIMAL(20,2)) + , updDt = NOW() + WHERE siteId = #{siteId} AND memId = #{memId} + + + + + + + + + + + update cash_info set cashStatus = #{cashStatus} , updDate = now() + + , memo = #{memo} + + + where siteId = #{siteId} and cashIdx = #{cashIdx} + + + + + INSERT INTO point_info + (siteId, memId, pointType, pointAmt, pointDesc, pointRate, betIdx, delYn, regId, pointStatus, updDate, regDate, adminId, memo, prePointAmt) + SELECT + result.* + FROM ( + SELECT + bi.siteId AS siteId, + baseF.recommenderId AS memId, + '3' AS pointType, + CAST( + CAST((bi.betAmt*(((baseR.pointRate*100) - IFNULL(underR.pointRate, '0.00')*100)/100)*0.01) AS DECIMAL(20,1)) + AS CHAR + ) AS pointAmt, + baseR.rateType AS pointDesc, + CAST(CAST(baseR.pointRate AS DECIMAL(20,1)) AS CHAR) AS pointRate, + bi.betIdx AS betIdx, + 'N' AS delYn, + bi.memId AS regId, + '1' AS pointStatus, + bi.regDate AS updDate, + bi.regDate AS regDate, + '' AS adminId, + '' AS memo, + 0 AS prePointAmt + FROM betinfo bi LEFT JOIN memberflow baseF ON bi.siteId=baseF.siteId AND bi.memId=baseF.memId + LEFT JOIN member_tb mb ON baseF.siteId = mb.siteId AND baseF.recommenderId=mb.memId + LEFT JOIN memrateinfo baseR ON bi.siteId=baseR.siteId AND baseF.recommenderId=baseR.memId + AND bi.vendorCode=baseR.gameType AND baseR.rateType='R' + LEFT JOIN memberflow underF ON bi.siteId=underF.siteId AND bi.memId=underF.memId AND baseF.`order`=(underF.`order`+1) + LEFT JOIN memrateinfo underR ON bi.siteId=underR.siteId AND underF.recommenderId=underR.memId + AND bi.vendorCode=underR.gameType AND underR.rateType='R' + WHERE 1=1 + AND bi.betIdx = CAST(#{betIdx} AS UNSIGNED) + AND ( + (bi.gameCategory='casino' AND bi.betAmt != bi.betWinAmt) + OR + (bi.gameCategory='slot') + OR + (bi.gameCategory='sport') + ) + AND bi.pointRegYn = 'N' + AND mb.partnerLevel NOT IN ('COMP', 'AUTO') + ) result + WHERE result.pointAmt > 0 + + + + INSERT INTO point_info + (siteId, memId, pointType, pointAmt, pointDesc, pointRate, betIdx, delYn, regId, pointStatus, updDate, regDate, adminId, memo, prePointAmt) + SELECT + result.* + FROM ( + SELECT + bi.siteId AS siteId, + baseF.recommenderId AS memId, + '3' AS pointType, + CAST( + CAST((bm.betAmt*(((baseR.pointRate*100) - IFNULL(underR.pointRate, '0.00')*100)/100)*0.01) AS DECIMAL(20,1)) + AS CHAR + ) AS pointAmt, + baseR.rateType AS pointDesc, + CAST(CAST(baseR.pointRate AS DECIMAL(20,1)) AS CHAR) AS pointRate, + bi.betIdx AS betIdx, + 'N' AS delYn, + bi.memId AS regId, + '1' AS pointStatus, + bi.updDate AS updDate, + bi.updDate AS regDate, + '' AS adminId, + bm.mapId AS memo, + 0 AS prePointAmt + FROM betinfo bi LEFT JOIN betinfomap bm ON bi.betIdx=bm.betIdx + LEFT JOIN memberflow baseF ON bi.siteId=baseF.siteId AND bi.memId=baseF.memId + LEFT JOIN member_tb mb ON baseF.siteId = mb.siteId AND baseF.recommenderId=mb.memId + LEFT JOIN mem_multiple_rate baseR ON bi.siteId=baseR.siteId AND baseF.recommenderId=baseR.memId + AND bi.vendorCode=baseR.vendorCode AND baseR.rateType=bm.rateTypeCode + LEFT JOIN memberflow underF ON bi.siteId=underF.siteId AND bi.memId=underF.memId AND baseF.`order`=(underF.`order`+1) + LEFT JOIN mem_multiple_rate underR ON bi.siteId=underR.siteId AND underF.recommenderId=underR.memId + AND bi.vendorCode=underR.vendorCode AND underR.rateType=bm.rateTypeCode + WHERE 1=1 + AND bm.betIdx IS NOT NULL + AND bi.betIdx = CAST(#{betIdx} AS UNSIGNED) + AND bi.pointRegYn = 'N' + AND mb.partnerLevel NOT IN ('COMP', 'AUTO') + ) result + WHERE 1=1 + AND result.pointAmt > 0 + + + + UPDATE betinfo + SET pointRegYn ='Y', + isBlankSpinYn = #{isBlankSpinYn} + WHERE betIdx = #{betIdx} + + + + + + update member_tb set totalCashInAmt = ifnull(totalCashInAmt, 0) + #{amt} where siteId = #{siteId} and memId = #{memId} + + + + update member_tb set totalCashOutAmt = ifnull(totalCashOutAmt, 0) + #{amt} where siteId = #{siteId} and memId = #{memId} + + + + update member_tb + set + gameMoney = #{gameMoney} + where + siteId = #{siteId} and memId = #{memId} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO point_info + (siteId, `memId`,`pointType`,`pointAmt`,`pointDesc`,`betIdx`,`delYn`,`regId`,`pointStatus`,`updDate`,`regDate`, adminId, memo, prePointAmt) + VALUES + (#{siteId}, #{memId}, #{pointType}, #{pointAmt}, #{pointDesc}, #{betIdx}, 'N', #{regId}, #{pointStatus}, now(), now(), #{adminId}, #{memo}, #{prePointAmt}) + + SELECT LAST_INSERT_ID(); + + + + + update cash_info set delYn='Y' where siteId = #{siteId} AND memId = #{memId} and cashIdx = #{cashIdx} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO cash_info( + siteId, + memId, + cashType, + cashDesc, + cashAmt, + betIdx, + delYn, + cashStatus, + regId, + updDate, + regDate, + adminId, + memo, + preCashAmt + ) VALUES ( + #{siteId}, + #{memId}, + #{cashType}, + #{cashDesc}, + #{cashAmt}, + #{betIdx}, + #{delYn}, + #{cashStatus}, + #{regId}, + NOW(), + NOW(), + #{adminId}, + #{memo}, + #{preCashAmt} + ) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE cash_info + SET cashStatus = #{cashStatus}, + memo = #{memo}, + updDate = NOW() + WHERE 1=1 + + AND cashIdx = #{cashIdx} + + + AND refIdx = #{refIdx} + + + + + INSERT INTO cash_info + (siteId, `memId`,`cashType`,`cashDesc`,`cashAmt`,`delYn`,`cashStatus`,`regId`,`updDate`,`regDate`, adminId, memo, preCashAmt) + VALUES + (#{siteId}, #{memId}, #{cashType}, #{cashDesc}, #{cashAmt}, 'N', #{cashStatus}, #{regId}, #{regDate}, #{regDate}, #{adminId}, #{memo}, #{preCashAmt}) + + SELECT LAST_INSERT_ID(); + + + + + INSERT INTO coupon_info + (siteId, memId, couponNumber, cashAmt, couponDesc, createAdmin, endAt) + VALUES + (#{siteId}, #{memId}, #{couponNumber}, #{cashAmt}, #{couponDesc}, #{createAdmin}, #{endAt}) + + + + UPDATE coupon_info + SET couponStatus = #{couponStatus} + + , cashIdx = #{cashIdx} + + + , usedAt = #{usedAt} + + + , apprAdmin = #{apprAdmin} + + + , apprAt = #{apprAt} + + WHERE couponNumber = #{couponNumber} + + + + + + + + + + + + + + + + + + + + INSERT INTO cash_bonus_rel_log + (siteId, memId, bonusType, bonusCode, cashIdx, pointIdx, rate) + VALUES + (#{siteId}, #{memId}, #{bonusType}, #{bonusCode}, #{cashIdx}, #{pointIdx}, #{rate}) + + + + + + UPDATE cash_bonus_rel_log + SET pointIdx = #{pointIdx}, + rate = #{rate} + WHERE idx = #{idx} + + + diff --git a/src/main/resources/db1/CODE.xml b/src/main/resources/db1/CODE.xml new file mode 100644 index 0000000..8ecc666 --- /dev/null +++ b/src/main/resources/db1/CODE.xml @@ -0,0 +1,2882 @@ + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE daily_periodic_reports d + SET d.dBetAmt = #{dBetAmt}, + d.dBetAmtBS = #{dBetAmtBS}, + d.dBetAmtWin = #{dBetAmtWin}, + d.dBetAmtWinBS = #{dBetAmtWinBS}, + d.dRollingAmt = #{dRollingAmt}, + d.dLosingAmt = #{dLosingAmt}, + d.dCasinoBetAmt = #{dCasinoBetAmt}, + d.dCasinoBetAmtBS = #{dCasinoBetAmtBS}, + d.dCasinoBetAmtWin = #{dCasinoBetAmtWin}, + d.dCasinoBetAmtWinBS = #{dCasinoBetAmtWinBS}, + d.dCasinoRollingAmt = #{dCasinoRollingAmt}, + d.dCasinoLosingAmt = #{dCasinoLosingAmt}, + d.dSlotBetAmt = #{dSlotBetAmt}, + d.dSlotBetAmtBS = #{dSlotBetAmtBS}, + d.dSlotBetAmtWin = #{dSlotBetAmtWin}, + d.dSlotBetAmtWinBS = #{dSlotBetAmtWinBS}, + d.dSlotRollingAmt = #{dSlotRollingAmt}, + d.dSlotLosingAmt = #{dSlotLosingAmt}, + d.dMiniBetAmt = #{dMiniBetAmt}, + d.dMiniBetAmtWin = #{dMiniBetAmtWin}, + d.dMiniRollingAmt = #{dMiniRollingAmt}, + d.dMiniLosingAmt = #{dMiniLosingAmt}, + d.dSportBetAmt = #{dSportBetAmt}, + d.dSportBetAmtWin = #{dSportBetAmtWin}, + d.dSportRollingAmt = #{dSportRollingAmt}, + d.dSportLosingAmt = #{dSportLosingAmt}, + d.dUserPayment = #{dUserPayment}, + d.dUserPayback = #{dUserPayback}, + d.dUpperPayment = #{dUpperPayment}, + d.dUpperPayback = #{dUpperPayback}, + d.dUserCashIn = #{dUserCashIn}, + d.dUserCashOut = #{dUserCashOut}, + d.dAdminPayment = #{dAdminPayment}, + d.dAdminPayback = #{dAdminPayback}, + d.dCouponCash = #{dCouponCash}, + d.dChangePoint = #{dChangePoint}, + d.dAdminPointIn = #{dAdminPointIn}, + d.dAdminPointOut = #{dAdminPointOut}, + d.dCouponPoint = #{dCouponPoint}, + d.dCashAmt = #{dCashAmt}, + d.dPointAmt = #{dPointAmt} + WHERE d.days = #{days} + AND d.siteId = #{siteId} + AND d.memId = #{memId} + + + + UPDATE daily_periodic_reports a + LEFT JOIN mem_cash b ON a.siteId=b.siteId AND a.memId=b.memId + LEFT JOIN mem_point c ON a.siteId=c.siteId AND a.memId=c.memId + SET a.dCashAmt = CAST(CAST(b.cashAmt AS SIGNED) AS CHAR), + a.dPointAmt = CAST(CAST(c.pointAmt AS DECIMAL(20,0)) AS CHAR) + WHERE 1=1 + AND a.days = DATE_FORMAT(NOW(), '%Y-%m-%d') + AND ( + a.dCashAmt != CAST(b.cashAmt AS SIGNED) + OR + a.dPointAmt != CAST(c.pointAmt AS DECIMAL(20,0)) + ) + + + + INSERT INTO daily_periodic_reports (days, siteId, memId) + SELECT + DATE_FORMAT(NOW(), '%Y-%m-%d') AS days, + a.siteId AS siteId, + a.memId AS memId + FROM member_tb a LEFT JOIN daily_periodic_reports b ON b.days = DATE_FORMAT(NOW(), '%Y-%m-%d') AND a.siteId=b.siteId AND a.memId=b.memId + WHERE a.partnerLevel NOT IN ('COMP', 'AUTO') + AND b.memId IS NULL + + + + INSERT INTO daily_periodic_reports + (days,siteId,memId, + dBetAmt,dBetAmtBS,dBetAmtWin,dBetAmtWinBS,dRollingAmt,dLosingAmt, + dCasinoBetAmt,dCasinoBetAmtBS,dCasinoBetAmtWin,dCasinoBetAmtWinBS,dCasinoRollingAmt,dCasinoLosingAmt, + dSlotBetAmt,dSlotBetAmtBS,dSlotBetAmtWin,dSlotBetAmtWinBS,dSlotRollingAmt,dSlotLosingAmt, + dMiniBetAmt,dMiniBetAmtWin,dMiniRollingAmt,dMiniLosingAmt, + dSportBetAmt,dSportBetAmtWin,dSportRollingAmt,dSportLosingAmt, + dUserPayment,dUserPayback,dUpperPayment,dUpperPayback,dUserCashIn,dUserCashOut, + dAdminPayment,dAdminPayback,dChangePoint,dAdminPointIn,dAdminPointOut,dCouponPoint,dCashAmt,dPointAmt) + VALUES + (#{days},#{siteId},#{memId}, + #{dBetAmt},#{dBetAmtBS},#{dBetAmtWin},#{dBetAmtWinBS},#{dRollingAmt},#{dLosingAmt}, + #{dCasinoBetAmt},#{dCasinoBetAmtBS},#{dCasinoBetAmtWin},#{dCasinoBetAmtWinBS},#{dCasinoRollingAmt},#{dCasinoLosingAmt}, + #{dSlotBetAmt},#{dSlotBetAmtBS},#{dSlotBetAmtWin},#{dSlotBetAmtWinBS},#{dSlotRollingAmt},#{dSlotLosingAmt}, + #{dMiniBetAmt},#{dMiniBetAmtWin},#{dMiniRollingAmt},#{dMiniLosingAmt}, + #{dSportBetAmt},#{dSportBetAmtWin},#{dSportRollingAmt},#{dSportLosingAmt}, + #{dUserPayment},#{dUserPayback},#{dUpperPayment},#{dUpperPayback},#{dUserCashIn},#{dUserCashOut}, + #{dAdminPayment},#{dAdminPayback},#{dChangePoint},#{dAdminPointIn},#{dAdminPointOut},#{dCouponPoint},#{dCashAmt},#{dPointAmt}) + ON DUPLICATE KEY UPDATE dCashAmt = #{dCashAmt}, dPointAmt = #{dPointAmt} + + + + + + UPDATE daily_periodic_reports d + SET d.dBetAmt = #{dBetAmt}, + d.dBetAmtBS = #{dBetAmtBS}, + d.dBetAmtWin = #{dBetAmtWin}, + d.dBetAmtWinBS = #{dBetAmtWinBS}, + d.dRollingAmt = #{dRollingAmt}, + d.dLosingAmt = #{dLosingAmt}, + d.dCasinoBetAmt = #{dCasinoBetAmt}, + d.dCasinoBetAmtBS = #{dCasinoBetAmtBS}, + d.dCasinoBetAmtWin = #{dCasinoBetAmtWin}, + d.dCasinoBetAmtWinBS = #{dCasinoBetAmtWinBS}, + d.dCasinoRollingAmt = #{dCasinoRollingAmt}, + d.dCasinoLosingAmt = #{dCasinoLosingAmt}, + d.dSlotBetAmt = #{dSlotBetAmt}, + d.dSlotBetAmtBS = #{dSlotBetAmtBS}, + d.dSlotBetAmtWin = #{dSlotBetAmtWin}, + d.dSlotBetAmtWinBS = #{dSlotBetAmtWinBS}, + d.dSlotRollingAmt = #{dSlotRollingAmt}, + d.dSlotLosingAmt = #{dSlotLosingAmt}, + d.dMiniBetAmt = #{dMiniBetAmt}, + d.dMiniBetAmtWin = #{dMiniBetAmtWin}, + d.dMiniRollingAmt = #{dMiniRollingAmt}, + d.dMiniLosingAmt = #{dMiniLosingAmt}, + d.dSportBetAmt = #{dSportBetAmt}, + d.dSportBetAmtWin = #{dSportBetAmtWin}, + d.dSportRollingAmt = #{dSportRollingAmt}, + d.dSportLosingAmt = #{dSportLosingAmt}, + d.dUserPayment = #{dUserPayment}, + d.dUserPayback = #{dUserPayback}, + d.dUpperPayment = #{dUpperPayment}, + d.dUpperPayback = #{dUpperPayback}, + d.dUserCashIn = #{dUserCashIn}, + d.dUserCashOut = #{dUserCashOut}, + d.dAdminPayment = #{dAdminPayment}, + d.dAdminPayback = #{dAdminPayback}, + d.dCouponCash = #{dCouponCash}, + d.dChangePoint = #{dChangePoint}, + d.dAdminPointIn = #{dAdminPointIn}, + d.dAdminPointOut = #{dAdminPointOut}, + d.dCouponPoint = #{dCouponPoint} + WHERE d.days = #{days} + AND d.siteId = #{siteId} + AND d.memId = #{memId} + + + + UPDATE daily_periodic_reports d LEFT JOIN ( + SELECT + days, + siteId, + memId, + dCashAmt, + dPointAmt + FROM daily_periodic_reports + WHERE days = DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -1 DAY), '%Y-%m-%d') + AND (dCashAmt !=0 OR dPointAmt != 0) + ) rp ON d.days = DATE_FORMAT(DATE_ADD(rp.days, INTERVAL +1 DAY), '%Y-%m-%d') AND d.siteId = rp.siteId AND d.memId=rp.memId + SET + d.dCashAmtY = IFNULL(rp.dCashAmt, 0), + d.dPointAmtY = IFNULL(rp.dPointAmt, 0) + WHERE d.days = DATE_FORMAT(NOW(), '%Y-%m-%d') + + + + UPDATE member_tb mb LEFT JOIN ( + SELECT + siteId, + memId, + SUM(dBetAmt) AS betSum, + SUM(dBetAmtWin) AS betWinSum, + SUM(dBetAmtWin) - SUM(IFNULL(dBetAmt, 0)) AS winLoseSum + FROM daily_periodic_reports + WHERE 1=1 + AND days = DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -1 DAY), '%Y-%m-%d') + GROUP BY siteId, memId + HAVING SUM(dBetAmt) != 0 OR SUM(dBetAmtWin) != 0 + ) dr ON mb.siteId=dr.siteId AND mb.memId=dr.memId + SET mb.totalBetAmt = mb.totalBetAmt + IFNULL(dr.betSum, 0), + mb.totalBetWinAmt = mb.totalBetWinAmt + IFNULL(dr.betWinSum, 0), + mb.totalWlAmt = mb.totalWlAmt + IFNULL(dr.winLoseSum, 0) + WHERE 1=1 + AND dr.memId IS NOT NULL + + + + UPDATE `daily_reports_last_time` + SET startDate = #{startDate}, + endDate = #{endDate} + WHERE idx = 1 + + + + + + + + INSERT INTO `mem_log` + ( + `siteId`, + `memId`, + `logType`, + `logoutYn`, + `logName`, + `logDesc`, + + `vendorName`, + + + `gameName`, + + `regDate`, + `regId`, + `regIp`, + `token` + ) + VALUES + ( + #{siteId}, + #{memId}, + #{logType}, + #{logoutYn}, + #{logName}, + #{logDesc}, + + #{vendorName}, + + + #{gameName}, + + now(), + #{regId}, + #{regIp}, + #{token} + ) + + + + UPDATE member_tb + SET lastIp = #{regIp}, + totalLoginCount = IFNULL(totalLoginCount, 0) + 1, + lastLoginDt = NOW() + WHERE siteId = #{siteId} + AND memId = #{memId} + + + + UPDATE mem_cash + SET lastCashInDate = DATE_FORMAT(NOW(), '%Y-%m-%d') + WHERE siteId = #{siteId} + AND memId = #{memId} + + + + + + UPDATE mem_log + SET + logoutYn =#{logoutYn}, + regIp = #{regIp}, + token = #{token} + WHERE + siteId = #{siteId} + AND memId = #{memId} + AND logType = #{logType} + + + + + INSERT INTO site_setting ( + siteId, + signupYn, + loginYn, + betYn, + memLockYn, + partnerLevelChgYn, + userRecommenderChgYn, + recommendYn, + recommendLimit, + companyRecommender, + accInfoRequestYn, + accInfoRequestType, + siteStatusYn, + multiLoginYn, + liveStreamYn, + boardYn, + qnaYn, + callYn, + userLoginAlarmYn, + liveSprotsMsgYn, + specialBetMonoYn, + smsAuthPass, + maxBetRateYn, + maxBetRate, + logoutTimeLimit, + adminAutoLogoutYn, + casinoRollChangeYn, + betCancelTimeLimitBeforeGame, + betCancelTimeLimitAfterBet, + alarmSounds, + alarmRepeatYn, + alarmQnaYn, + strangeBetAlarm, + maxWinAmt, + cashInYn, + cashInAmtLimit, + cashInAmtMin, + cashInAmtUnit, + cashInWaitTime, + cashOutYn, + cashOutRollMsgYn, + cashOutAmtLimit, + cashOutAmtMin, + cashOutAmtUnit, + cashOutWaitTime, + pointChangeAmtLimit, + pointChangeAmtUnit, + pointChangeType, + pointStatusYn, + sns1, + sns1Link, + sns1Id, + sns2, + sns2Link, + sns2Id, + sns3, + sns3Link, + sns3Id, + insuredUpYn, + victoryPassYn, + siteCheckYn, + vendorComp, + payGCurrency, + payVCurrency, + cashDecimal, + rollingType, + blankSpinSetType, + vaccCode, + secuType + ) VALUES ( + #{siteId}, + #{signupYn}, + #{loginYn}, + #{betYn}, + #{memLockYn}, + #{partnerLevelChgYn}, + #{userRecommenderChgYn}, + #{recommendYn}, + #{recommendLimit}, + #{companyRecommender}, + #{accInfoRequestYn}, + #{accInfoRequestType}, + #{siteStatusYn}, + #{multiLoginYn}, + #{liveStreamYn}, + #{boardYn}, + #{qnaYn}, + #{callYn}, + #{userLoginAlarmYn}, + #{liveSprotsMsgYn}, + #{specialBetMonoYn}, + #{smsAuthPass}, + #{maxBetRateYn}, + #{maxBetRate}, + #{logoutTimeLimit}, + #{adminAutoLogoutYn}, + #{casinoRollChangeYn}, + #{betCancelTimeLimitBeforeGame}, + #{betCancelTimeLimitAfterBet}, + #{alarmSounds}, + #{alarmRepeatYn}, + #{alarmQnaYn}, + #{strangeBetAlarm}, + #{maxWinAmt}, + #{cashInYn}, + #{cashInAmtLimit}, + #{cashInAmtMin}, + #{cashInAmtUnit}, + #{cashInWaitTime}, + #{cashOutYn}, + #{cashOutRollMsgYn}, + #{cashOutAmtLimit}, + #{cashOutAmtMin}, + #{cashOutAmtUnit}, + #{cashOutWaitTime}, + #{pointChangeAmtLimit}, + #{pointChangeAmtUnit}, + #{pointChangeType}, + #{pointStatusYn}, + #{sns1}, + #{sns1Link}, + #{sns1Id}, + #{sns2}, + #{sns2Link}, + #{sns2Id}, + #{sns3}, + #{sns3Link}, + #{sns3Id}, + #{insuredUpYn}, + #{victoryPassYn}, + #{siteCheckYn}, + #{vendorComp}, + #{payGCurrency}, + #{payVCurrency}, + #{cashDecimal}, + #{rollingType}, + #{blankSpinSetType}, + #{vaccCode}, + #{secuType} + ) ON DUPLICATE KEY UPDATE siteId = siteId + + , signupYn = #{signupYn} + + + , loginYn = #{loginYn} + + + , betYn = #{betYn} + + + , memLockYn = #{memLockYn} + + + , partnerLevelChgYn = #{partnerLevelChgYn} + + + , userRecommenderChgYn = #{userRecommenderChgYn} + + + , recommendYn = #{recommendYn} + + + ,recommendLimit = #{recommendLimit} + + + ,accInfoRequestYn = #{accInfoRequestYn} + + + ,siteStatusYn = #{siteStatusYn} + + + ,multiLoginYn = #{multiLoginYn} + + + ,liveStreamYn = #{liveStreamYn} + + + ,boardYn = #{boardYn} + + + ,userLoginAlarmYn = #{userLoginAlarmYn} + + + ,maxBetRateYn = #{maxBetRateYn} + + + ,liveSprotsMsgYn = #{liveSprotsMsgYn} + + + ,specialBetMonoYn = #{specialBetMonoYn} + + + ,specialBetMonoYn = #{specialBetMonoYn} + + + ,companyRecommender = #{companyRecommender} + + + ,smsAuthPass = #{smsAuthPass} + + + + , cashInYn = #{cashInYn} + + + , cashInAmtLimit = #{cashInAmtLimit} + + + , cashInAmtMin = #{cashInAmtMin} + + + , cashInAmtUnit = #{cashInAmtUnit} + + + , cashInWaitTime = #{cashInWaitTime} + + + , cashOutYn = #{cashOutYn} + + + , cashOutRollMsgYn = #{cashOutRollMsgYn} + + + , cashOutAmtLimit = #{cashOutAmtLimit} + + + , cashOutAmtMin = #{cashOutAmtMin} + + + , cashOutAmtUnit = #{cashOutAmtUnit} + + + , cashOutWaitTime = #{cashOutWaitTime} + + + , pointChangeAmtLimit = #{pointChangeAmtLimit} + + + , pointChangeAmtUnit = #{pointChangeAmtUnit} + + + , pointChangeType = #{pointChangeType} + + + , pointStatusYn = #{pointStatusYn} + + + + ,accInfoRequestType = #{accInfoRequestType} + + + ,logoutTimeLimit = #{logoutTimeLimit} + + + ,adminAutoLogoutYn = #{adminAutoLogoutYn} + + + ,casinoRollChangeYn = #{casinoRollChangeYn} + + + ,betCancelTimeLimitBeforeGame = #{betCancelTimeLimitBeforeGame} + + + ,betCancelTimeLimitAfterBet = #{betCancelTimeLimitAfterBet} + + + ,alarmSounds = #{alarmSounds} + + + ,alarmRepeatYn = #{alarmRepeatYn} + + + ,alarmQnaYn = #{alarmQnaYn} + + + ,qnaYn = #{qnaYn} + + + ,callYn = #{callYn} + + + ,strangeBetAlarm = #{strangeBetAlarm} + + + ,maxWinAmt = #{maxWinAmt} + + + ,sns1 = #{sns1} + + + ,sns1Id = #{sns1Id} + + + ,sns1Link = #{sns1Link} + + + ,sns2 = #{sns2} + + + ,sns2Id = #{sns2Id} + + + ,sns2Link = #{sns2Link} + + + ,sns3 = #{sns3} + + + ,sns3Id = #{sns3Id} + + + ,sns3Link = #{sns3Link} + + + ,insuredUpYn = #{insuredUpYn} + + + ,victoryPassYn = #{victoryPassYn} + + + ,cashDecimal = #{cashDecimal} + + + ,rollingType = #{rollingType} + + + ,blankSpinSetType = #{blankSpinSetType} + + + ,vaccCode = #{vaccCode} + + + ,secuType = #{secuType} + + + + + INSERT INTO bank_info + ( + siteId, + bankCode, + bankNameKr, + bankNameEn, + bankDomain, + bankImg, + useYn, + inspectTimeStart, + inspectTimeEnd, + delYn + ) + VALUES + ( + #{siteId}, + #{bankCode}, + #{bankNameKr}, + #{bankNameEn}, + #{bankDomain}, + #{bankImg}, + 'Y', + #{inspectTimeStart}, + #{inspectTimeEnd}, + 'N' + )ON DUPLICATE KEY UPDATE + + bankNameKr = #{bankNameKr}, + bankNameEn = #{bankNameEn}, + bankDomain = #{bankDomain}, + bankImg = #{bankImg}, + useYn = #{useYn}, + inspectTimeStart = #{inspectTimeStart}, + inspectTimeEnd = #{inspectTimeEnd}, + delYn = #{delYn} + + + + DELETE FROM bank_info + WHERE siteId = #{siteId} + AND bankCode = #{bankCode} + + + + + + + + INSERT INTO banner_info ( + + bannerIdx, + + siteId, + bannerType, + bannerTitle, + bannerImg, + domain, + bannerPosition, + bannerContent, + delYn, + loginYn, + regDate, + updDate + ) + VALUES ( + + #{bannerIdx}, + + #{siteId}, + #{bannerType}, + #{bannerTitle}, + #{bannerImg}, + #{domain}, + #{bannerPosition}, + #{bannerContent}, + 'N', + #{loginYn}, + NOW(), + NOW() + ) ON DUPLICATE KEY UPDATE + updDate = now() + + , bannerImg = #{bannerImg} + + + , bannerTitle = #{bannerTitle} + + + , domain = #{domain} + + + , bannerPosition = #{bannerPosition} + + + , bannerContent = #{bannerContent} + + + , delYn = #{delYn} + + + , loginYn = #{loginYn} + + + + + + + + + + + + + + + + INSERT INTO `code` + ( + masterCode, + groupCode, + groupCodeName, + `code`, + codeName, + `ord`, + useYn + ) + VALUES + ( + #{masterCode}, + #{groupCode}, + 'category', + #{code}, + #{codeName}, + #{ord}, + + #{useYn} + + + 'Y' + + ) + ON DUPLICATE KEY UPDATE masterCode =masterCode + + ,codeName = #{codeName} + + + ,ord = #{ord} + + + ,useYn = #{useYn} + + + + + + + + + insert into site_level_bank ( + siteId, + level, + bankCode, + bankAcc, + useYn, + msg + )VALUES( + #{siteId}, + #{level}, + #{bankCode}, + #{bankAcc}, + #{useYn}, + #{msg} + )ON DUPLICATE KEY UPDATE + + bankCode = #{bankCode}, + bankAcc = #{bankAcc}, + useYn = #{useYn}, + msg = #{msg} + + + + + + + UPDATE site_level_betlimit + SET regDate = NOW() + + , betAmtMax = #{betAmtMax} + + + , betAmtMin = #{betAmtMin} + + + , betWinAmtMax = #{betWinAmtMax} + + + , betAmtMaxSlot = #{betAmtMaxSlot} + + + , betAmtMinSlot = #{betAmtMinSlot} + + + , betWinAmtMaxSlot = #{betWinAmtMaxSlot} + + WHERE 1=1 + AND siteId = #{siteId} + AND memLevel = #{memLevel} + + + + + + insert into site_level_fail_point ( + siteId, + level, + gameCode, + folder, + pointRate, + useYn + )VALUES( + #{siteId}, + #{level}, + #{gameCode}, + #{folder}, + #{pointRate}, + #{useYn} + )ON DUPLICATE KEY UPDATE + + folder = #{folder}, + pointRate = #{pointRate}, + useYn = #{useYn} + + + + + + + + + + insert into site_level_domain ( + siteId, + level, + domain, + useYn + )VALUES( + #{siteId}, + #{level}, + #{domain}, + #{useYn} + )ON DUPLICATE KEY UPDATE siteId=siteId + + + ,domain = #{domain} + + + ,useYn = #{useYn} + + + + + + + + + + insert into site_level_outpwd ( + siteId, + level, + cashOutPass, + useYn + )VALUES( + #{siteId}, + #{level}, + #{cashOutPass}, + #{useYn} + )ON DUPLICATE KEY UPDATE siteId = siteId + + + ,cashOutPass = #{cashOutPass} + + + ,useYn = #{useYn} + + + + + + + + + + + + + INSERT INTO `admin_log` + ( + `siteId`, + `memId`, + `logType`, + `logoutYn`, + `logEndPoint`, + `logName`, + `logDesc`, + `regDate`, + `regId`, + `regIp`, + `token` + ) + VALUES + ( + #{siteId}, + #{memId}, + #{logType}, + #{logoutYn}, + #{logEndPoint}, + #{logName}, + #{logDesc}, + now(), + #{regId}, + #{regIp}, + #{token} + ) + + + + + + + + INSERT INTO `site_denied_info` + ( + + `blockIdx`, + + `siteId`, + `blockType`, + `blockTarget`, + `blockTerm`, + `delYn`, + `regDate`, + `regId` + ) + VALUES + ( + + #{blockIdx}, + + #{siteId}, + #{blockType}, + #{blockTarget}, + #{blockTerm}, + 'N', + now(), + #{regId} + )ON DUPLICATE KEY UPDATE siteId = siteId + + + ,delYn = #{delYn} + + + + + INSERT INTO site_admin ( + siteIdx, + siteId, + adminId, + adminName, + adminPass, + loginYn, + regDate, + regId + ) VALUES ( + #{siteIdx}, + #{siteId}, + #{adminId}, + #{adminName}, + #{adminPass}, + 'Y', + NOW(), + #{regId} + ) ON DUPLICATE KEY UPDATE siteId = siteId + + , adminName = #{adminName} + + + , loginYn = #{loginYn} + + + , adminPass = #{adminPass} + + + + + DELETE FROM site_admin + WHERE siteId = #{siteId} + AND adminId = #{adminId} + + + + + + + + INSERT INTO admin_ip ( + siteId, + adminId, + ip, + regId + ) VALUES ( + #{siteId}, + #{adminId}, + #{ip}, + #{regId} + ) + + + + DELETE FROM admin_ip + WHERE siteId = #{siteId} + AND adminId = #{adminId} + AND ip = #{ip} + + + + + + + + update admin_ip set lastLoginDate = now() where siteId = #{siteId} and adminId=#{adminId} and ip = #{ip} + + + + + + + INSERT INTO site_game_setting + (siteId, gameType, vendorCode, minBetAmt, maxBetAmt, compBetYn, topCompId, rollingRateOption) + VALUES + + (#{item.siteId}, #{item.gameType}, #{item.vendorCode}, #{item.minBetAmt}, #{item.maxBetAmt}, #{item.compBetYn}, #{item.topCompId}, #{item.rollingRateOption}) + + ON DUPLICATE KEY UPDATE + minBetAmt = values(minBetAmt), + maxBetAmt = values(maxBetAmt), + compBetYn = values(compBetYn), + rollingRateOption = values(rollingRateOption) + + + + + + INSERT INTO site_check_info ( + + siteCheckIdx, + + siteId, + checkType, + startDate, + endDate, + contents, + regId, + updId, + regDate, + updDate + ) VALUES ( + + #{siteCheckIdx}, + + #{siteId}, + #{checkType}, + + + DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'), + DATE_FORMAT(DATE_ADD(NOW(), INTERVAL +1 YEAR), '%Y-%m-%d %H:%i:%s'), + + + + #{startDate}, + + + #{endDate}, + + + + #{contents}, + #{regId}, + #{regId}, + NOW(), + NOW() + ) ON DUPLICATE KEY UPDATE + updId = #{regId}, updDate = NOW() + + + , startDate = DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') + , endDate = DATE_FORMAT(DATE_ADD(NOW(), INTERVAL +1 YEAR), '%Y-%m-%d %H:%i:%s') + + + + , startDate = #{startDate} + + + , endDate = #{endDate} + + + + + , checkType = #{checkType} + + + , contents = #{contents} + + + + + + + + + + + + + + + UPDATE site_check_info + SET isCheckOff = #{isCheckOff} + WHERE 1=1 + AND siteId = #{siteId} + + AND siteCheckIdx = #{siteCheckIdx} + + + + + UPDATE site_setting + SET siteCheckYn = #{siteCheckYn} + WHERE + siteId = #{siteId} + + + + + + + + + + INSERT INTO code + (masterCode, groupCode, groupCodeName, groupCodeNameEN, code, codeName, codeNameEN, + ord, useYn, kgonVendor, kgonLobby, kgonCode, tripleVendor, tripleLobby, tripleCode, sdApiVendor, sdApiLobby, sdApiCode) + VALUES + ('kplay', #{groupCode}, #{groupCodeName}, #{groupCodeNameEN}, #{code}, #{codeName}, #{codeNameEN}, + #{ord}, #{useYn}, #{kgonVendor}, #{kgonLobby}, #{kgonCode}, #{tripleVendor}, #{tripleLobby}, #{tripleCode}, #{sdApiVendor}, #{sdApiLobby}, #{sdApiCode}) + + + + UPDATE `code` c + SET + groupCodeName = #{groupCodeName}, groupCodeNameEN = #{groupCodeNameEN}, + codeName = #{codeName}, codeNameEN = #{codeNameEN}, ord = #{ord}, useYn = #{useYn}, + kgonVendor = #{kgonVendor}, kgonLobby = #{kgonLobby}, kgonCode = #{kgonCode}, + tripleVendor = #{tripleVendor}, tripleLobby = #{tripleLobby}, tripleCode = #{tripleCode}, + sdApiVendor = #{sdApiVendor}, sdApiLobby = #{sdApiLobby}, sdApiCode = #{sdApiCode} + WHERE + c.masterCode = 'kplay' + AND c.groupCode = #{groupCode} + AND c.code = #{code} + + + + INSERT INTO `memrateinfo` + (siteId, memId, category1, category2, gameType) + SELECT + m.siteId AS siteId, m.memId AS memId, #{groupCode} AS category1, #{groupCodeNameEN} AS category2, #{code} AS gameType + FROM + `member_tb` m + + + + INSERT INTO `site_game_setting` + (siteId, gameType, vendorCode, topCompId) + SELECT + m.siteId, #{groupCode}, #{code}, IFNULL(m.recommenderId, '') + FROM + `member_tb` m + WHERE + m.partnerType IS NOT NULL + AND + m.partnerType != '' + + + + + + + + + + + + + + + INSERT INTO site_domain_partner_setting + (siteIdx, domain, siteId, memId) + VALUES + (#{siteIdx}, #{domain}, #{siteId}, #{memId}) + ON DUPLICATE KEY UPDATE updDate = NOW() + + , memId = #{memId} + + + , useYn = #{useYn} + + + + + DELETE FROM site_domain_partner_setting + WHERE siteIdx = #{siteIdx} AND domain = #{domain} + + + + + + + + + + + + + UPDATE member_charging_point_setting mcp + LEFT JOIN member_tb mb ON mcp.siteIdx=mb.siteIdx AND mcp.memIdx=mb.memIdx + SET mcp.updDate = NOW() + , mcp.memLevel = mb.memLevel + + , mcp.memLevelName = #{memLevelName} + + + , mcp.fstChrgByJoinRate = #{fstChrgByJoinRate} + + + , mcp.fstChrgByDailyRate = #{fstChrgByDailyRate} + + + , mcp.fstChrgByEveryTimeRate = #{fstChrgByEveryTimeRate} + + + , mcp.bonusLimit = #{bonusLimit} + + + , mcp.folderCountLimit = #{folderCountLimit} + + WHERE mcp.siteIdx = #{siteIdx} + AND mb.memLevel = #{memLevel} + + + + UPDATE site_charging_point_setting + SET updDate = NOW() + + , memLevelName = #{memLevelName} + + + , fstChrgByJoinRate = #{fstChrgByJoinRate} + + + , fstChrgByDailyRate = #{fstChrgByDailyRate} + + + , fstChrgByEveryTimeRate = #{fstChrgByEveryTimeRate} + + + , bonusLimit = #{bonusLimit} + + + , folderCountLimit = #{folderCountLimit} + + + , useAutoLevelUp = #{useAutoLevelUp} + + + , autoLvBetAmt = #{autoLvBetAmt} + + + , autoLvCashIn = #{autoLvCashIn} + + WHERE siteIdx = #{siteIdx} + AND memLevel = #{memLevel} + + + + + + + + + + + + + + + + + + UPDATE site_menu_setting + SET bookmarkYn = #{bookmarkYn} + WHERE 1=1 + AND siteId = #{siteId} + AND menuCode = #{menuCode} + + + + + + UPDATE site + SET lastUpdAdmin = #{lastUpdAdmin}, siteMemo = #{siteMemo} + WHERE 1=1 + AND siteId = #{siteId} + + + + + + INSERT INTO daily_month_reports + (monthDate,siteId,mofAccessCnt,mofJoinCnt,mBetAMT,mWinAMT,mBetBEP,mRollingAMT,mofCashInUserCnt,mUserCashIN,mUserCashOUT,mUserCashBEP, + mAdminCashPYM,mAdminCashPYB,mAdminPointIN,mAdminPointOUT,mCreditPayAMT,mCreditAMT,mCreditPointAMT,mInsuredAMT,mInsuredPointAMT) + VALUES + (#{monthDate},#{siteId},#{mofAccessCnt},#{mofJoinCnt},#{mBetAMT},#{mWinAMT},#{mBetBEP},#{mRollingAMT},#{mofCashInUserCnt},#{mUserCashIN},#{mUserCashOUT},#{mUserCashBEP}, + #{mAdminCashPYM},#{mAdminCashPYB},#{mAdminPointIN},#{mAdminPointOUT},#{mCreditPayAMT},#{mCreditAMT},#{mCreditPointAMT},#{mInsuredAMT},#{mInsuredPointAMT}) + ON DUPLICATE KEY UPDATE updDate = NOW(), + mofAccessCnt = #{mofAccessCnt}, + mofJoinCnt = #{mofJoinCnt}, + mBetAMT = #{mBetAMT}, + mWinAMT = #{mWinAMT}, + mBetBEP = #{mBetBEP}, + mRollingAMT = #{mRollingAMT}, + mofCashInUserCnt = #{mofCashInUserCnt}, + mUserCashIN = #{mUserCashIN}, + mUserCashOUT = #{mUserCashOUT}, + mUserCashBEP = #{mUserCashBEP}, + mAdminCashPYM = #{mAdminCashPYM}, + mAdminCashPYB = #{mAdminCashPYB}, + mAdminPointIN = #{mAdminPointIN}, + mAdminPointOUT = #{mAdminPointOUT}, + mCreditPayAMT = #{mCreditPayAMT}, + mCreditAMT = #{mCreditAMT}, + mCreditPointAMT = #{mCreditPointAMT}, + mInsuredAMT = #{mInsuredAMT}, + mInsuredPointAMT = #{mInsuredPointAMT} + + + + UPDATE mem_action_log + SET actionType = #{actionType}, + lastActionDt = NOW(3) + WHERE siteId = #{siteId} AND memId = #{memId} + + + + + + INSERT INTO daily_rolling_reports + (days, siteId, ptnMemId, usrMemId, pointAmt, casinoAmt, slotAmt, miniAmt, sportsAmt, regDate, updDate) + VALUES + (#{days}, #{siteId}, #{ptnMemId}, #{usrMemId}, #{pointAmt}, #{casinoAmt}, #{slotAmt}, #{miniAmt}, #{sportsAmt}, NOW(), NOW()) + ON DUPLICATE KEY UPDATE updDate = NOW(), + pointAmt = #{pointAmt}, + casinoAmt = #{casinoAmt}, + slotAmt = #{slotAmt}, + miniAmt = #{miniAmt}, + sportsAmt = #{sportsAmt} + + + + + + + + INSERT INTO bgm_noti_info + (siteId, notiType, notiBgmFile, useYN, regDate, updDate) + VALUES + (#{siteId}, #{notiType}, #{notiBgmFile}, #{useYN}, NOW(), NOW()) + ON DUPLICATE KEY UPDATE updDate = NOW() + + , notiBgmFile = #{notiBgmFile} + + + , useYN = #{useYN} + + + + + + + UPDATE member_tb + SET memLevel = #{matchedLevel} + WHERE siteIdx = #{siteIdx} + AND memIdx = #{memIdx} + ; + + UPDATE member_charging_point_setting + SET memLevel = #{matchedLevel}, + memLevelName = #{memLevelName}, + fstChrgByJoinRate = #{fstChrgByJoinRate}, + fstChrgByDailyRate = #{fstChrgByDailyRate}, + fstChrgByEveryTimeRate = #{fstChrgByEveryTimeRate}, + bonusLimit = #{bonusLimit} + WHERE siteIdx = #{siteIdx} + AND memIdx = #{memIdx} + ; + + + + + + + UPDATE site_cash_bonus_setting + SET bonusTitle = #{bonusTitle} + , bonusDesc = #{bonusDesc} + , fstChrgByJoinRate = #{fstChrgByJoinRate} + , fstChrgByDailyRate = #{fstChrgByDailyRate} + , fstChrgByEveryTimeRate = #{fstChrgByEveryTimeRate} + , bonusLimit = #{bonusLimit} + , useYn = #{useYn} + WHERE siteIdx = #{siteIdx} + AND bonusCode = #{bonusCode} + + + diff --git a/src/main/resources/db1/COMP.xml b/src/main/resources/db1/COMP.xml new file mode 100644 index 0000000..e8534b3 --- /dev/null +++ b/src/main/resources/db1/COMP.xml @@ -0,0 +1,1176 @@ + + + + + + + + + + + + + + INSERT INTO site_game_setting ( + siteId, + topCompId, + gameType, + vendorCode + + , compBetYn + + + , biSubPointRate + + ) + VALUES ( + #{siteId}, + #{topCompId}, + #{gameType}, + #{vendorCode} + + , #{compBetYn} + + + , #{biSubPointRate} + + ) + ON DUPLICATE KEY UPDATE + updDate = NOW() + + , compBetYn = #{compBetYn} + + + , biSubPointRate = #{biSubPointRate} + + + + + UPDATE + member_tb + SET + maxCredit = #{maxCredit}, creditRate = #{creditRate} + WHERE + siteId = #{siteId} + AND memId = #{siteId} + AND recommenderId = #{topCompId} + + + + UPDATE memrateinfo + SET + pointRate = #{pointRate}, + + loseRate = #{loseRate}, + + useYn = 'Y', + betYn = 'Y' + WHERE siteId = #{siteId} AND memId = #{memId} AND gameType = #{gameType} + + + + UPDATE site_setting + SET + cashInYn = #{cashInYn} + , cashOutYn = #{cashOutYn} + , betYn = #{betYn} + , siteStatusYn = #{siteStatusYn} + + , signupYn = #{signupYn} + + + , insuredUpYn = #{insuredUpYn} + + + , payGCurrency = #{payGCurrency} + + + , payVCurrency = #{payVCurrency} + + WHERE siteId = #{siteId} + + + + + + UPDATE member_tb LEFT JOIN site ON member_tb.siteId=site.siteId AND member_tb.memId=site.adminId + SET + member_tb.updDt = NOW(), + site.updDate = NOW() + + , member_tb.memPass = #{password} + , site.sitePass = #{password} + + + , member_tb.memName = #{siteName} + , site.siteName = #{siteName} + + + , site.userCountLimit = #{userCountLimit} + + + , site.compCountLimit = #{compCountLimit} + + + , site.siteDomain = #{siteDomain} + + + , site.siteDomains = #{siteDomains} + + WHERE + member_tb.siteId = #{siteId} + AND member_tb.memId = #{siteId} + AND member_tb.recommenderId = #{topCompId} + AND (member_tb.partnerType IS NOT NULL AND member_tb.partnerType != '') + + + + + + + + + + + + + + INSERT INTO site_game_setting ( + siteId, + topCompId, + gameType, + vendorCode + + , compBetYn + + + , apiVendor + + + , superUseYn + + ) + VALUES ( + #{siteId}, + #{topCompId}, + #{groupCode}, + #{code} + + , #{compBetYn} + + + , #{apiVendor} + + + , #{superUseYn} + + ) + ON DUPLICATE KEY UPDATE + updDate = NOW() + + , compBetYn = #{compBetYn} + + + , apiVendor = #{apiVendor} + + + , superUseYn = #{superUseYn} + + + + + + + UPDATE site_menu_setting + SET useYn = #{useYn} + WHERE + siteId = #{siteId} + AND menuCode = #{menuCode} + + + + + + + + UPDATE site_game_setting sg LEFT JOIN memrateinfo sr + ON sr.siteId = sg.siteId AND sr.memId = sg.siteId AND sr.gameType = sg.vendorCode + SET sg.vendor = #{vendor}, + sr.pointRate = CAST(#{gameRate} AS DECIMAL(10,2)) + WHERE 1=1 + AND sg.siteId = #{siteId} + AND sg.vendorCode = #{vendorCode} + + + + + + DELETE FROM site_game_triple_rate_setting + WHERE siteId = #{siteId} + + + + INSERT INTO site_game_triple_rate_setting + (siteId, vendorCode, vendor, baseRate, gameRate, useYn) + SELECT + vi.siteId AS siteId, + c.code AS vendorCode, + #{vendor} AS vendor, + CAST(s.creditRate AS DECIMAL(10,2)) AS baseRate, + CAST(#{gameRate} AS DECIMAL(10,2)) AS gameRate, + #{setVendor} AS useYn + FROM vendor_comp_info vi LEFT JOIN member_tb s ON vi.siteId=s.siteId AND vi.siteId=s.memId + , `code` c + WHERE 1=1 + AND vi.clientId = #{clientId} + AND vi.clientSecretKey = #{clientSecretKey} + AND c.masterCode = 'kplay' + AND c.tripleVendor != '' + AND c.tripleVendor IS NOT NULL + AND c.tripleCode = #{vendorIdx} + ON DUPLICATE KEY UPDATE + baseRate = CAST(s.creditRate AS DECIMAL(10,2)), + gameRate = CAST(#{gameRate} AS DECIMAL(10,2)), + useYn = #{setVendor} + + + + + + UPDATE site_game_setting og LEFT JOIN site_game_triple_rate_setting tg ON tg.siteId=og.siteId AND tg.vendorCode = og.vendorCode + AND tg.siteId = #{siteId} AND tg.useYn = 'Y' + LEFT JOIN memrateinfo sr ON sr.siteId=og.siteId AND sr.memId=og.siteId AND sr.gameType=og.vendorCode + SET og.vendor = IFNULL(tg.vendor, 'nexus'), + og.superUseYn = IFNULL(tg.useYn, 'N'), + sr.pointRate = IFNULL(CAST(tg.gameRate AS CHAR), sr.pointRate) + WHERE 1=1 + AND og.siteId = #{siteId} + AND og.apiVendor = 'triple' + + + + DELETE FROM admin_ip WHERE siteId = #{siteId}; + + DELETE FROM old_admin_log WHERE siteId = #{siteId}; + + DELETE FROM admin_log WHERE siteId = #{siteId}; + + DELETE FROM banner_info WHERE siteId = #{siteId}; + + DELETE a FROM old_betinfomap a LEFT JOIN old_betinfo b ON a.betIdx=b.betIdx WHERE b.siteId = #{siteId}; + + DELETE a FROM betinfomap a LEFT JOIN betinfo b ON a.betIdx=b.betIdx WHERE b.siteId = #{siteId}; + + DELETE a FROM bet_splus_info a LEFT JOIN betinfo b ON a.betIdx=b.betIdx WHERE b.siteId = #{siteId}; + + DELETE a FROM bet_splus_info a LEFT JOIN old_betinfo b ON a.betIdx=b.betIdx WHERE b.siteId = #{siteId}; + + DELETE FROM old_betinfo WHERE siteId = #{siteId}; + + DELETE FROM betinfo WHERE siteId = #{siteId}; + + DELETE FROM old_new_bet_info WHERE siteId = #{siteId}; + + DELETE FROM new_bet_info WHERE siteId = #{siteId}; + + DELETE a FROM cmt_info a LEFT JOIN board_info b ON a.boardIdx=b.boardIdx WHERE b.siteId = #{siteId}; + + DELETE FROM board_info WHERE siteId = #{siteId}; + + DELETE FROM old_daily_periodic_reports WHERE siteId = #{siteId}; + + DELETE FROM daily_periodic_reports WHERE siteId = #{siteId}; + + DELETE FROM daily_month_reports WHERE siteId = #{siteId}; + + DELETE a FROM old_mem_pre_point a LEFT JOIN old_point_info b ON a.pointIdx=b.pointIdx WHERE b.siteId = #{siteId}; + + DELETE FROM old_point_info WHERE siteId = #{siteId}; + + DELETE a FROM mem_pre_point a LEFT JOIN point_info b ON a.pointIdx=b.pointIdx WHERE b.siteId = #{siteId}; + + DELETE FROM point_info WHERE siteId = #{siteId}; + + DELETE FROM old_cash_info WHERE siteId = #{siteId}; + + DELETE FROM cash_info WHERE siteId = #{siteId}; + + DELETE FROM cash_bonus_rel_log WHERE siteId = #{siteId}; + + DELETE FROM mem_log WHERE siteId = #{siteId}; + + DELETE FROM old_mem_log WHERE siteId = #{siteId}; + + DELETE FROM triple_tran_info WHERE siteId = #{siteId}; + + DELETE a FROM msginfo_read_status a LEFT JOIN msginfo b ON a.msgIdx=b.msgIdx WHERE b.siteId = #{siteId}; + + DELETE FROM msginfo WHERE siteId = #{siteId}; + + DELETE FROM site_check_info WHERE siteId = #{siteId}; + + DELETE FROM old_daily_rolling_reports WHERE siteId = #{siteId}; + + DELETE FROM daily_rolling_reports WHERE siteId = #{siteId}; + + DELETE FROM slot_tran_info WHERE siteId = #{siteId}; + + DELETE a FROM mem_action_log a LEFT JOIN member_tb b ON a.siteId=b.siteId AND a.memId=b.memId + WHERE b.siteId = #{siteId} + AND b.partnerLevel NOT IN ('COMP', 'AUTO') + + AND b.memId NOT IN + + #{item} + + + ; + + DELETE a FROM member_charging_point_setting a LEFT JOIN member_tb b ON a.siteIdx=b.siteIdx AND a.memIdx=b.memIdx + WHERE b.siteId = #{siteId} + AND b.partnerLevel NOT IN ('COMP', 'AUTO') + + AND b.memId NOT IN + + #{item} + + + ; + + DELETE a FROM mem_point a LEFT JOIN member_tb b ON a.siteId=b.siteId AND a.memId=b.memId + WHERE b.siteId = #{siteId} + AND b.partnerLevel NOT IN ('COMP', 'AUTO') + + AND b.memId NOT IN + + #{item} + + + ; + + DELETE a FROM mem_cash a LEFT JOIN member_tb b ON a.siteId=b.siteId AND a.memId=b.memId + WHERE b.siteId = #{siteId} + AND b.partnerLevel NOT IN ('COMP', 'AUTO') + + AND b.memId NOT IN + + #{item} + + + ; + + DELETE a FROM memberflow a LEFT JOIN member_tb b ON a.siteId=b.siteId AND a.memId=b.memId + WHERE b.siteId = #{siteId} + AND b.partnerLevel NOT IN ('COMP', 'AUTO') + + AND b.memId NOT IN + + #{item} + + + ; + + DELETE a FROM memrateinfo a LEFT JOIN member_tb b ON a.siteId=b.siteId AND a.memId=b.memId + WHERE b.siteId = #{siteId} + AND b.partnerLevel NOT IN ('COMP', 'AUTO') + + AND b.memId NOT IN + + #{item} + + + ; + + DELETE a FROM mem_multiple_rate a LEFT JOIN member_tb b ON a.siteId=b.siteId AND a.memId=b.memId + WHERE b.siteId = #{siteId} + AND b.partnerLevel NOT IN ('COMP', 'AUTO') + + AND b.memId NOT IN + + #{item} + + + ; + + DELETE FROM member_tb + WHERE siteId = #{siteId} + AND partnerLevel NOT IN ('COMP', 'AUTO') + + AND memId NOT IN + + #{item} + + + ; + + + + UPDATE partner_credit + SET creditAmt='0', creditSubPoint='0', calculateIdx=UNIX_TIMESTAMP(NOW()), creditAmtHoldem='0', creditAmtHholdem='0', creditAmtInplay='0' + WHERE siteId = #{siteId} + ; + + UPDATE partner_insured + SET insuredAmt='0', insuredSubPoint='0' + WHERE siteId = #{siteId} + ; + + UPDATE mem_point + SET pointAmt='0' + WHERE siteId = #{siteId} AND memId IN ( + SELECT + memId + FROM member_tb + WHERE siteId = #{siteId} + AND ( + partnerLevel IN ('COMP', 'AUTO') + + OR memId IN + + #{item} + + + ) + ); + + UPDATE mem_cash + SET cashAmt='0', + cashAmtD='0.0' + WHERE siteId = #{siteId} AND memId IN ( + SELECT + memId + FROM member_tb + WHERE siteId = #{siteId} + AND ( + partnerLevel IN ('COMP', 'AUTO') + + OR memId IN + + #{item} + + + ) + ); + + UPDATE adminheadinfo a + SET a.memWaitCnt = 0, + a.memJoinCnt = 0, + a.memCnt = (SELECT COUNT(memIdx) FROM member_tb WHERE siteId=#{siteId} AND partnerLevel NOT IN ('COMP', 'AUTO')) + WHERE a.siteId = #{siteId} + ; + + UPDATE site_charging_point_setting a LEFT JOIN site b ON a.siteIdx=b.siteIdx + SET a.memLevelName = '', + a.fstChrgByJoinRate = 0, + a.fstChrgByJoinLimit = 0, + a.fstChrgByDailyRate = 0, + a.fstChrgByDailyLimit = 0, + a.fstChrgByEveryTimeRate = 0, + a.fstChrgByEveryTimeLimit = 0, + a.bonusLimit = 0, + a.folderCountLimit = 0, + a.useAutoLevelUp = 'N', + a.autoLvBetAmt = 0, + a.autoLvCashIn = 0 + WHERE b.siteId = #{siteId} + ; + + UPDATE site_cash_bonus_setting a LEFT JOIN site b ON a.siteIdx=b.siteIdx + SET a.bonusTitle = '', + a.bonusDesc = '', + a.fstChrgByJoinRate = 0, + a.fstChrgByDailyRate = 0, + a.fstChrgByEveryTimeRate = 0, + a.bonusLimit = 0, + a.useYn = 'N' + WHERE b.siteId = #{siteId} + ; + + UPDATE site_level_betlimit + SET betAmtMax = '1000000', + betAmtMin = '1000', + betWinAmtMax = '5000000', + betAmtMaxSlot = '1000000', + betAmtMinSlot = '100', + betWinAmtMaxSlot = '5000000' + WHERE siteId = #{siteId} + ; + + + + + + UPDATE vendor_comp_info + SET clientId = #{clientId}, clientSecretKey = #{clientSecretKey} + WHERE apiVendorCode='triple' + AND siteId = #{siteId} + + + + + + + + + + UPDATE member_tb + SET victoryPassYn = #{victoryPassYn} + WHERE siteId = #{siteId} AND memId = #{siteId} + + + + + + + + INSERT INTO totp_info + (account, issuer, secretKey, url, regDate, updDate) + VALUES + (#{account}, #{issuer}, #{secretKey}, #{url}, NOW(), NOW()) + ON DUPLICATE KEY UPDATE + secretKey = #{secretKey}, + url = #{url}, + updDate = NOW() + + + + UPDATE admininfo + SET adminOtp = #{useYn} + WHERE adminId = #{account} + + + + + UPDATE site + + + UPDATE site_admin + + SET adminOtp = #{useYn} + WHERE adminId = #{account} + + + + + + + + + + + + UPDATE site_game_setting a LEFT JOIN `code` b ON b.masterCode='kplay' AND a.vendorCode=b.code + SET a.minBetAmt = CAST(#{minBetAmt} AS CHAR), + a.maxBetAmt = CAST(#{maxBetAmt} AS CHAR) + WHERE 1=1 + AND a.siteId = #{siteId} + AND b.tripleCode = #{vendorIdx} + + + + + + + diff --git a/src/main/resources/db1/MAIN.xml b/src/main/resources/db1/MAIN.xml new file mode 100644 index 0000000..e667aeb --- /dev/null +++ b/src/main/resources/db1/MAIN.xml @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db1/MINIGAME.xml b/src/main/resources/db1/MINIGAME.xml new file mode 100644 index 0000000..7c888a8 --- /dev/null +++ b/src/main/resources/db1/MINIGAME.xml @@ -0,0 +1,55 @@ + + + + + + + INSERT INTO `site_minigame_set` VALUES + ( + #{siteId}, #{gameType}, #{useYn}, #{betLimitSec} + ) ON DUPLICATE KEY UPDATE siteId =siteId + + ,useYn=#{useYn} + + + + ,betLimitSec=#{betLimitSec} + + + + + + + INSERT INTO `minigamesetting` + (SELECT #{siteId} , `gameType`, `optionGroup`, `optionGroupTitle`, `optionSubGroup`, `optionSubGroupTitle`, `option`, `optionTitle`, `betIdle`, #{betRate}, #{useYn}, 'Y' , #{updId}, NOW() + FROM minigamesetting_code + WHERE gameType = #{gameType} AND optionGroup = #{optionGroup} AND optionSubGroup =#{optionSubGroup} ) + ON DUPLICATE KEY UPDATE siteId = siteId + + ,`betRate` = #{betRate} + + + , useYn=#{useYn} + + + + + + + + diff --git a/src/main/resources/db1/PASSIM.xml b/src/main/resources/db1/PASSIM.xml new file mode 100644 index 0000000..4c314bc --- /dev/null +++ b/src/main/resources/db1/PASSIM.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/resources/db1/POINT.xml b/src/main/resources/db1/POINT.xml new file mode 100644 index 0000000..e246a09 --- /dev/null +++ b/src/main/resources/db1/POINT.xml @@ -0,0 +1,295 @@ + + + + + + + + + + + + + + + + + + INSERT INTO point_info + (siteId, `memId`,`pointType`,`pointAmt`,`pointDesc`,`betIdx`,`delYn`,`regId`,`pointStatus`,`updDate`,`regDate`, adminId, memo, prePointAmt) + VALUES + (#{siteId}, #{memId}, #{pointType}, #{pointAmt}, #{pointDesc}, #{betIdx}, 'N', #{regId}, #{pointStatus}, now(), now(), #{adminId}, #{memo}, #{prePointAmt}) + + SELECT LAST_INSERT_ID(); + + + + diff --git a/src/main/resources/db1/RATE.xml b/src/main/resources/db1/RATE.xml new file mode 100644 index 0000000..0b382c9 --- /dev/null +++ b/src/main/resources/db1/RATE.xml @@ -0,0 +1,236 @@ + + + + + + + + UPDATE memrateinfo mr + SET mr.pointRate = #{pointRate}, + mr.loseRate = #{loseRate} + WHERE 1=1 + AND mr.siteId = #{siteId} + AND mr.memId = #{memId} + + AND mr.category1 = #{category} + + AND mr.category2 = #{cateCode} + + + AND mr.gameType = #{cateCode} + + + + + + UPDATE memrateinfo mr LEFT JOIN member_tb mb ON mr.siteId=mb.siteId AND mr.memId=mb.recommenderId + LEFT JOIN ( + SELECT + bmr.siteId, + bmr.category1, + bmr.category2, + bmr.gameType, + MAX(CAST(bmr.pointRate AS DECIMAL(10,2))) AS bMaxPointRate, + MAX(CAST(bmr.loseRate AS DECIMAL(10,2))) AS bMaxLoseRate + FROM memrateinfo bmr LEFT JOIN memberflow mf ON bmr.siteId=mf.siteId AND bmr.memId=mf.memId + WHERE 1=1 + AND mf.siteId = #{siteId} + AND mf.`order` = 1 + AND mf.recommenderId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = #{memId}) + + AND bmr.category1 = #{category} + + AND bmr.category2 = #{cateCode} + + + AND bmr.gameType = #{cateCode} + + + GROUP BY bmr.siteId, bmr.category1, bmr.category2 + ) botMr ON mr.siteId=botMr.siteId + SET mr.minPointRate = IF( CAST(#{pointRate} AS DECIMAL(4,2)) > botMr.bMaxPointRate, #{pointRate}, CAST(botMr.bMaxPointRate AS CHAR) ), + mr.minLoseRate = IF( CAST(#{loseRate} AS DECIMAL(4,2)) > botMr.bMaxLoseRate, #{loseRate}, CAST(botMr.bMaxLoseRate AS CHAR) ) + WHERE 1=1 + AND mb.siteId = #{siteId} + AND mb.memId = #{memId} + + AND mr.category1 = #{category} + + AND mr.category2 = #{cateCode} + + + AND mr.gameType = #{cateCode} + + + + + + UPDATE memrateinfo mr LEFT JOIN member_tb mb ON mr.siteId=mb.siteId AND mr.memId=mb.memId + SET mr.maxPointRate = #{pointRate}, + mr.maxLoseRate = #{loseRate} + WHERE 1=1 + AND mb.siteId = #{siteId} + AND mb.recommenderId = #{memId} + + AND mr.category1 = #{category} + + AND mr.category2 = #{cateCode} + + + AND mr.gameType = #{cateCode} + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db1/REPORT.xml b/src/main/resources/db1/REPORT.xml new file mode 100644 index 0000000..bab27e0 --- /dev/null +++ b/src/main/resources/db1/REPORT.xml @@ -0,0 +1,2251 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db1/RETAIL.xml b/src/main/resources/db1/RETAIL.xml new file mode 100644 index 0000000..e7f17a6 --- /dev/null +++ b/src/main/resources/db1/RETAIL.xml @@ -0,0 +1,2872 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update member_tb set retailPeriod = #{retailPeriod}, retailType=#{retailType} where memId =#{memId} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update point_info set pointStatus ='1' where siteId = #{siteId} AND memId = #{memId} AND pointStatus =0 + + + AND YEARWEEK(updDate) = #{dateIdx} + + + AND DATE_FORMAT(updDate, '%Y%m') = REPLACE(#{dateIdx}, '-', '') + + + + + update mem_point set pointAmt = pointAmt + #{pointAmt} where siteId = #{siteId} AND memId = #{memId} + + + + + + + + + + + + UPDATE memrateinfo mr LEFT JOIN code cd ON cd.masterCode='kplay' AND mr.gameType=cd.code + SET + mr.regDate = NOW() + + , mr.pointRate = #{casinoPR} + + + , mr.loseRate = #{casinoLR} + + WHERE 1=1 + AND mr.siteId = #{siteId} + AND mr.memId = #{memId} + AND cd.groupCode = 'casino' + AND cd.groupCodeNameEN = 'CASINO' + + + + UPDATE memrateinfo mr LEFT JOIN code cd ON cd.masterCode='kplay' AND mr.gameType=cd.code + SET + mr.regDate = NOW() + + , mr.pointRate = #{hcasinoPR} + + + , mr.loseRate = #{hcasinoLR} + + WHERE 1=1 + AND mr.siteId = #{siteId} + AND mr.memId = #{memId} + AND cd.groupCode = 'casino' + AND cd.groupCodeNameEN = 'HC-CASINO' + + + + UPDATE memrateinfo mr LEFT JOIN code cd ON cd.masterCode='kplay' AND mr.gameType=cd.code + SET + mr.regDate = NOW() + + , mr.pointRate = #{slotPR} + + + , mr.loseRate = #{slotLR} + + WHERE 1=1 + AND mr.siteId = #{siteId} + AND mr.memId = #{memId} + AND cd.groupCode = 'slot' + + + + UPDATE memrateinfo mr LEFT JOIN code cd ON cd.masterCode='kplay' AND mr.gameType=cd.code + SET + mr.regDate = NOW() + + , mr.pointRate = #{miniPR} + + + , mr.loseRate = #{miniLR} + + WHERE 1=1 + AND mr.siteId = #{siteId} + AND mr.memId = #{memId} + AND cd.groupCode = 'minigame' + + + + UPDATE memrateinfo mr LEFT JOIN code cd ON cd.masterCode='kplay' AND mr.gameType=cd.code + SET + mr.regDate = NOW() + + , mr.pointRate = #{sportPR} + + + , mr.loseRate = #{slotLR} + + WHERE 1=1 + AND mr.siteId = #{siteId} + AND mr.memId = #{memId} + AND cd.groupCode = 'sport' + + + + UPDATE member_charging_point_setting mcp LEFT JOIN member_tb mb + ON mcp.siteIdx=mb.siteIdx AND mcp.memIdx=mb.memIdx + SET mcp.updDate = NOW() + + , mcp.fstChrgByJoinRate = #{fstChrgByJoinRate} + + + , mcp.fstChrgByDailyRate = #{fstChrgByDailyRate} + + + , mcp.fstChrgByEveryTimeRate = #{fstChrgByEveryTimeRate} + + + , mcp.bonusLimit = #{bonusLimit} + + + , mcp.folderCountLimit = #{folderCountLimit} + + WHERE 1=1 + AND mb.siteId = #{siteId} + AND ( + mb.memid = #{memId} + OR + (mb.recommenderId = #{memId} AND mb.partnerLevel='NORMAL') + ) + + + + + + + + + + + + UPDATE member_tb a LEFT JOIN memberflow b ON a.siteId=b.siteId AND a.memId=b.memId + SET a.memLockYn = #{memLockYn}, + a.updId = #{updId}, + a.updDt = NOW() + WHERE 1=1 + AND b.siteId = #{siteId} + AND b.recommenderId = #{memId} + + + + + + + + + + + + + + + + + + + + + UPDATE member_tb SET + + memNick = #{memNick}, + + + memPhone = #{memPhone}, + + + loginYn = #{loginYn}, + + + betYn = #{betYn}, + + updDt = NOW() + WHERE siteId = #{siteId} AND memId = #{memId} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db1/SUPER.xml b/src/main/resources/db1/SUPER.xml new file mode 100644 index 0000000..1521414 --- /dev/null +++ b/src/main/resources/db1/SUPER.xml @@ -0,0 +1,61 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db1/USER.xml b/src/main/resources/db1/USER.xml new file mode 100644 index 0000000..f83d663 --- /dev/null +++ b/src/main/resources/db1/USER.xml @@ -0,0 +1,4795 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO member_tb + ( + memId, + siteIdx, + siteId, + memPass, + memNick, + memName, + memPhone, + memLevel, + partnerLevel, + partnerType, + nationCode, + partSendYn, + maxCredit, + creditRate, + creditStatus, + recommenderId, + + loginYn, + + + recommendYn, + + + betYn, + + + pointExchangeYn, + + + rollingYn, + + adminId, + regId, + updId, + regIp, + redDt, + updDt, + memStatus, + memBlackYn, + + cashSendYn, + + + cashReceiveYn, + + + memLockYn, + + lastIp, + memo, + bank, + bankacc, + cashOutPass, + joinDomain + ) + VALUES + ( + #{memId}, + #{siteIdx}, + #{siteId}, + #{memPass}, + #{memNick}, + #{memName}, + #{memPhone}, + #{memLevel}, + #{partnerLevel}, + #{partnerType}, + #{nationCode}, + #{partSendYn}, + #{maxCredit}, + #{creditRate}, + #{creditStatus}, + #{recommenderId}, + + #{loginYn}, + + + #{recommendYn}, + + + #{betYn}, + + + #{pointExchangeYn}, + + + #{rollingYn}, + + '', + '', + '', + #{regIp}, + now(), + now(), + #{memStatus}, + 'N', + + #{memLockYn}, + + + #{cashSendYn}, + + + #{cashReceiveYn}, + + #{lastIp}, + #{memo}, + #{bank}, + #{bankacc}, + #{cashOutPass}, + #{joinDomain} + ) + + + + + UPDATE member_tb SET + + memPass = #{memPass}, + + + memNick = #{memNick}, + + + cashOutPass = #{cashOutPass}, + + + memName = #{memName}, + + + memPhone = #{memPhone}, + + + memStatus = #{memStatus}, + + + loginYn = #{loginYn}, + + + betYn = #{betYn}, + + + recommendYn = #{recommendYn}, + + + memBlackYn = #{memBlackYn}, + + + memLockYn = #{memLockYn}, + + + subMemBetLockYn = #{subMemBetLockYn}, + + + subMemRateModifyYn = #{subMemRateModifyYn}, + + + accInfoRequestYn = #{accInfoRequestYn}, + + + memLevel = #{memLevel}, + + + sportsLevel = #{sportsLevel}, + + + casinoLevel = #{casinoLevel}, + + + slotLevel = #{slotLevel}, + + + mgLevel = #{mgLevel}, + + + pointExchangeYn = #{pointExchangeYn}, + + + memDelYn = #{memDelYn}, + + + memo = #{memo}, + + + betLevel = #{betLevel}, + + + pointLevel = #{pointLevel}, + + + bankLevel = #{bankLevel}, + + + bank = #{bank}, + + + bankacc = #{bankacc}, + + + cashSendYn = #{cashSendYn}, + + + cashReceiveYn = #{cashReceiveYn}, + + + victoryPassYn = #{victoryPassYn}, + + + updId = #{updId}, + + updDt = NOW() + WHERE + siteId = #{siteId} AND memId = #{memId} + + + + + + + + + + + + + + + + + + + + UPDATE member_tb + SET + memStatus = #{memStatus}, + + joinMemo = #{memo}, + + updDt = NOW() + WHERE siteId = #{siteId} AND memId = #{memId} + + + + + + + + + insert into memrateinfo ( + memId, + gameType, + idleStartRate, + idleEndRate, + rateType, + pointRate, + regDate, + useYn + ) values ( + #{memId}, + #{gameType}, + #{idleStartRate}, + #{idleEndRate}, + #{rateType}, + #{pointRate}, + now(), + #{useYn} + ) + ON DUPLICATE KEY UPDATE + pointRate = IF( #{pointRate}*100 > (SELECT m.maxPointRate*100 FROM memrateinfo m WHERE + m.memId=#{memId} AND + m.gameType=#{gameType} AND + m.idleStartRate=#{idleStartRate} AND + m.idleEndRate=#{idleEndRate} AND + m.rateType=#{rateType}) , + (SELECT b.maxPointRate FROM memrateinfo b WHERE + b.memId=#{memId} AND + b.gameType=#{gameType} AND + b.idleStartRate=#{idleStartRate} AND + b.idleEndRate=#{idleEndRate} AND + b.rateType=#{rateType}) , + #{pointRate} + ) + + ,useYn = #{useYn} + + + + INSERT INTO `site`(siteId, adminId, sitePrefix, upperSite, sitePass, siteType, siteName, ip, apiKey, memberRegYn) + VALUES (#{memId}, #{adminId}, #{sitePrefix}, #{recommenderId}, #{memPass}, #{partnerType}, #{memName}, '0.0.0.0', #{siteApikey}, 'Y') + + SELECT LAST_INSERT_ID(); + + + + + + + + + + + update memrateinfo + set + pointRate = #{pointRate} + + , loseRate = #{loseRate} + + + , useYn = #{useYn} + + + , betYn = #{betYn} + + where siteId = #{siteId} and memId = #{memId} and gameType = #{gameType} + + + + UPDATE member_tb mb LEFT JOIN memrateinfo mr + ON mb.siteId=mr.siteId AND mb.memId=mr.memId + SET mr.pointRate = #{pointRate}, mr.loseRate = #{loseRate} + WHERE 1=1 + AND mb.siteId = #{siteId} + AND mb.recommenderId = #{memId} + AND mb.partnerLevel = 'NORMAL' + AND mr.gameType = #{gameType} + + + + update memrateinfo set betYn = #{betYn} + where siteId =#{siteId} and memId =#{memId} and gameType = #{gameType} + + + + + + + + + + + + + + + + + + update member_tb + set outAmtYn = #{outAmtYn} + where siteId = #{siteId} and memId = #{memId} + + + + INSERT INTO member_tb + ( + memId, + siteIdx, + siteId, + memPass, + memName, + memNick, + memPhone, + memLevel, + partnerLevel, + partnerType, + nationCode, + partSendYn, + maxCredit, + creditStatus, + recommenderId, + adminId, + regId, + updId, + regIp, + redDt, + updDt, + memStatus, + memBlackYn, + lastIp, + memo, + bank, + bankAcc, + cashOutPass, + sportsLevel, + casinoLevel, + slotLevel, + mgLevel, + loginYn, + betYn, + recommendYn, + pointExchangeYn, + rollingYn, + cashSendYn, + cashReceiveYn, + memLockYn, + joinDomain + ) + VALUES + ( + #{memId}, + #{siteIdx}, + #{siteId}, + #{memPass}, + #{memName}, + #{memNick}, + #{memPhone}, + #{memLevel}, + #{partnerLevel}, + #{partnerType}, + #{nationCode}, + #{partSendYn}, + #{maxCredit}, + #{creditStatus}, + #{recommenderId}, + '', + #{regId}, + #{regId}, + '', + now(), + now(), + #{memStatus}, + #{memBlackYn}, + '', + #{memo}, + #{bank}, + #{bankAcc}, + #{cashOutPass}, + #{sportsLevel}, + #{casinoLevel}, + #{slotLevel}, + #{mgLevel}, + #{loginYn}, + #{betYn}, + #{recommendYn}, + #{pointExchangeYn}, + #{rollingYn}, + #{cashSendYn}, + #{cashReceiveYn}, + #{memLockYn}, + #{joinDomain} + ) + + + + INSERT INTO member_tb + ( + siteIdx, + siteId, + memId, + memPass, + memName, + memNick, + memPhone, + memLevel, + bank, + bankAcc, + cashOutPass, + partnerLevel, + recommenderId, + recommendYn, + loginYn, + betYn, + memLockYn, + memStatus, + casinoLevel, + slotLevel, + cashSendYn, + cashReceiveYn, + memo, + regId, + updId, + regIp, + redDt, + updDt, + joinDomain + ) + VALUES + ( + #{siteIdx}, + #{siteId}, + #{memId}, + #{memPass}, + #{memName}, + #{memNick}, + #{memPhone}, + #{memLevel}, + #{bank}, + #{bankAcc}, + #{cashOutPass}, + #{partnerLevel}, + #{recommenderId}, + #{recommendYn}, + #{loginYn}, + #{betYn}, + #{memLockYn}, + #{memStatus}, + #{casinoLevel}, + #{slotLevel}, + #{cashSendYn}, + #{cashReceiveYn}, + #{memo}, + #{regId}, + #{regId}, + '', + NOW(), + NOW(), + #{joinDomain} + ) + + + + INSERT INTO member_tb + ( + memId, + siteIdx, + siteId, + memPass, + memName, + memNick, + memPhone, + memLevel, + partnerLevel, + partnerType, + nationCode, + partSendYn, + insuredYn, + maxCredit, + creditRate, + creditStatus, + recommenderId, + adminId, + regId, + updId, + regIp, + redDt, + updDt, + memStatus, + memBlackYn, + lastIp, + memo, + bank, + bankAcc, + cashOutPass, + sportsLevel, + casinoLevel, + slotLevel, + mgLevel, + loginYn, + betYn, + recommendYn, + memLockYn + ) + VALUES + ( + #{memId}, + #{siteIdx}, + #{siteId}, + #{memPass}, + #{memName}, + #{memNick}, + #{memPhone}, + #{memLevel}, + #{partnerLevel}, + #{partnerType}, + #{nationCode}, + #{partSendYn}, + #{insuredYn}, + #{maxCredit}, + #{creditRate}, + #{creditStatus}, + #{recommenderId}, + '', + #{regId}, + #{regId}, + '', + now(), + now(), + #{memStatus}, + #{memBlackYn}, + '', + #{memo}, + #{bank}, + #{bankAcc}, + #{cashOutPass}, + #{sportsLevel}, + #{casinoLevel}, + #{slotLevel}, + #{mgLevel}, + #{loginYn}, + #{betYn}, + #{recommendYn}, + #{memLockYn} + ) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE member_tb + SET recommenderId = #{recommenderId} + WHERE siteId = #{siteId} AND memId = #{memId} + + + + DELETE FROM memberflow WHERE siteId = #{siteId} AND memId = #{memId} + + + + INSERT INTO `memberflow` + SELECT * FROM ( + SELECT siteId, 0 AS `order`, memId AS recommenderId, #{memId} AS memId FROM member_tb WHERE siteId = #{siteId} AND memId = #{memId} + UNION + SELECT siteId, 1 AS `order`, recommenderId, #{memId} AS memId FROM member_tb WHERE siteId = #{siteId} AND memId = #{memId} AND partnerLevel NOT IN ('COMP', 'AUTO') + UNION + SELECT siteId, 2 AS `order`, recommenderId, #{memId} AS memId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = #{memId}) AND partnerLevel NOT IN ('COMP', 'AUTO') + UNION + SELECT siteId, 3 AS `order`, recommenderId, #{memId} AS memId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = #{memId})) AND partnerLevel NOT IN ('COMP', 'AUTO') + UNION + SELECT siteId, 4 AS `order`, recommenderId, #{memId} AS memId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = #{memId}))) AND partnerLevel NOT IN ('COMP', 'AUTO') + UNION + SELECT siteId, 5 AS `order`, recommenderId, #{memId} AS memId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = #{memId})))) AND partnerLevel NOT IN ('COMP', 'AUTO') + UNION + SELECT siteId, 6 AS `order`, recommenderId, #{memId} AS memId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = #{memId}))))) AND partnerLevel NOT IN ('COMP', 'AUTO') + UNION + SELECT siteId, 7 AS `order`, recommenderId, #{memId} AS memId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = #{memId})))))) AND partnerLevel NOT IN ('COMP', 'AUTO') + UNION + SELECT siteId, 8 AS `order`, recommenderId, #{memId} AS memId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = #{memId}))))))) AND partnerLevel NOT IN ('COMP', 'AUTO') + UNION + SELECT siteId, 9 AS `order`, recommenderId, #{memId} AS memId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = #{memId})))))))) AND partnerLevel NOT IN ('COMP', 'AUTO') + UNION + SELECT siteId, 10 AS `order`, recommenderId, #{memId} AS memId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = #{memId}))))))))) AND partnerLevel NOT IN ('COMP', 'AUTO') + UNION + SELECT siteId, 11 AS `order`, recommenderId, #{memId} AS memId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = #{memId})))))))))) AND partnerLevel NOT IN ('COMP', 'AUTO') + UNION + SELECT siteId, 12 AS `order`, recommenderId, #{memId} AS memId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = #{memId}))))))))))) AND partnerLevel NOT IN ('COMP', 'AUTO') + UNION + SELECT siteId, 13 AS `order`, recommenderId, #{memId} AS memId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = #{memId})))))))))))) AND partnerLevel NOT IN ('COMP', 'AUTO') + UNION + SELECT siteId, 14 AS `order`, recommenderId, #{memId} AS memId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = #{memId}))))))))))))) AND partnerLevel NOT IN ('COMP', 'AUTO') + UNION + SELECT siteId, 15 AS `order`, recommenderId, #{memId} AS memId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = #{memId})))))))))))))) AND partnerLevel NOT IN ('COMP', 'AUTO') + ) f + WHERE f.recommenderId IS NOT NULL + + + + + + + + + + + UPDATE site_game_setting + SET compBetYn = #{useYn} + WHERE siteId = #{siteId} AND vendorCode = #{gameCode} + + + + + + update site set sitePass = #{newSitePass} where siteId = #{siteId} + + + update site_admin set adminPass = #{newSitePass} where siteId =#{siteId} and adminId = #{adminId} + + + update member_tb set memPass = #{newSitePass} where siteId = #{siteId} AND memId = #{siteId} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO triple_auth_info + (siteId, memId, id, username, nickname) + VALUES + (#{siteId}, #{memId}, #{id}, #{username}, #{nickname}) + ON DUPLICATE KEY UPDATE + id = #{id} + + + + UPDATE mem_cash + SET cashAmt = #{cashAmt}, + cashAmtD = CAST(#{cashAmt} AS DECIMAL(20,2)) + , updDt = NOW() + WHERE siteId = #{siteId} AND memId = #{memId} + + + + UPDATE mem_cash + SET cashAmt = (cashAmt + #{cashAmt}), + cashAmtD = CAST(cashAmtD AS DECIMAL(20,2)) + CAST(#{cashAmt} AS DECIMAL(20,2)) + , updDt = NOW() + WHERE siteId = #{siteId} AND memId = #{memId} + + + + + + UPDATE member_tb + SET + + memBlackYn = #{memBlackYn}, + + + memLockYn = #{memLockYn}, + + + loginYn = #{loginYn}, + + + loginYn = #{loginYn}, + + + memo = #{memo}, + + updDt = NOW() + WHERE siteId = #{siteId} AND memId = #{memId} + + + + UPDATE member_tb SET + memPass = #{memPass}, + updDt = NOW() + WHERE + siteId = #{siteId} AND memId = #{memId} + + + + + + + + + + + + + + + + INSERT INTO member_tb + (siteIdx, siteId, memId, partnerType, memPass, memName, memNick, memPhone, memLevel, partnerLevel, recommenderId, memStatus, recommendYn, cashOutPass, loginYn, betYn, pointExchangeYn, outAmtYn, rollingYn) + VALUES + (#{siteIdx}, #{siteId}, #{memId}, '', #{memPass}, #{memName}, #{memNick}, '', '0', 'AUTO', #{recommenderId}, '1', 'Y', '', 'N', 'N', 'N', 'N', 'N') + + + + + + + + UPDATE member_tb + SET gameUrlTimeout = #{gameUrlTimeout} + WHERE siteId = #{siteId} + AND memId = #{memId} + + + + + + + + + + UPDATE `member_tb` mb + SET + mb.blankSpinCasinoRate = #{blankSpinCasinoRate}, + mb.blankSpinSlotRate = #{blankSpinSlotRate} + WHERE 1=1 + AND mb.siteId = #{siteId} + AND ( + mb.memId = #{memId} + OR ( + mb.recommenderId = #{memId} + AND + mb.partnerLevel = 'NORMAL' + ) + ) + + + + UPDATE memberflow mf LEFT JOIN member_tb mb ON mf.siteId=mb.siteId AND mf.memId=mb.memId + SET mb.blankSpinCasinoRate = #{blankSpinCasinoRate}, + mb.blankSpinSlotRate = #{blankSpinSlotRate} + WHERE 1=1 + AND mf.siteId = #{siteId} + AND mf.recommenderId = #{memId} + + + + INSERT INTO adminheadinfo (siteId) + VALUES (#{siteId}) + + + + + + + + + + UPDATE member_tb + SET partnerLevel = #{afMyLevel}, + recommendYn = 'Y', + cashSendYn = 'Y', + cashReceiveYn = 'Y' + WHERE siteId = #{siteId} AND memId = #{memId} + + + + + + + + UPDATE member_tb + SET loginYn = 'N' + WHERE siteId = #{siteId} AND memId = #{memId} + + + + + + UPDATE member_charging_point_setting + SET fstChrgByJoinFlag = 1 + WHERE siteIdx = #{siteIdx} AND memIdx = #{memIdx} + + + + + + UPDATE mem_cash + SET changeFlag = #{changeFlag} + WHERE 1=1 + AND siteId = #{siteId} + AND memId = #{memId} + + + + UPDATE member_charging_point_setting mcp + SET mcp.updDate = NOW() + + , mcp.memLevel = #{memLevel} + + + , mcp.memLevelName = #{memLevelName} + + + , mcp.fstChrgByJoinRate = #{fstChrgByJoinRate} + + + , mcp.fstChrgByDailyRate = #{fstChrgByDailyRate} + + + , mcp.fstChrgByEveryTimeRate = #{fstChrgByEveryTimeRate} + + + , mcp.bonusLimit = #{bonusLimit} + + + , mcp.folderCountLimit = #{folderCountLimit} + + WHERE mcp.siteIdx = #{siteIdx} + AND mcp.memIdx = #{memIdx} + + + + + + + + UPDATE member_tb + SET symLock = #{symLock} + WHERE siteId = #{siteId} and memId = #{memId} + + + + UPDATE member_tb + SET betYn = 'N', + abuseLock = DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'), + abuseLockCnt = (abuseLockCnt+1) + WHERE siteId = #{siteId} AND memId = #{memId} + + + + UPDATE member_tb + SET betYn = 'Y', + + abuseLockCnt = 0, + + abuseLock = '' + WHERE siteId = #{siteId} AND memId = #{memId} + + + + + + + + + + + + UPDATE mem_multiple_rate mmr + SET mmr.pointRate = #{pointRate}, + mmr.loseRate = #{loseRate} + WHERE 1=1 + AND mmr.siteId = #{siteId} + AND mmr.memId = #{memId} + AND mmr.vendorCode = #{vendorCode} + AND mmr.rateType = #{rateType} + + + + UPDATE mem_multiple_rate mmr LEFT JOIN member_tb mb ON mmr.siteId=mb.siteId AND mmr.memId=mb.recommenderId + LEFT JOIN ( + SELECT + bmmr.siteId, + bmmr.vendorCode, + bmmr.rateType, + MAX(bmmr.pointRate) AS bMaxPointRate, + MAX(bmmr.loseRate) AS bMaxLoseRate + FROM mem_multiple_rate bmmr LEFT JOIN memberflow mf ON bmmr.siteId=mf.siteId AND bmmr.memId=mf.memId + WHERE 1=1 + AND mf.siteId = #{siteId} + AND mf.`order` = 1 + AND mf.recommenderId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = #{memId}) + AND bmmr.vendorCode = #{vendorCode} + AND bmmr.rateType = #{rateType} + GROUP BY bmmr.siteId, bmmr.vendorCode, bmmr.rateType + ) botMr ON mmr.siteId=botMr.siteId AND mmr.vendorCode=botMr.vendorCode AND mmr.rateType=botMr.rateType + SET mmr.minPointRate = IF( CAST(#{pointRate} AS DECIMAL(4,2)) > CAST(botMr.bMaxPointRate AS DECIMAL(4,2)), #{pointRate}, botMr.bMaxPointRate ), + mmr.minLoseRate = IF( CAST(#{loseRate} AS DECIMAL(4,2)) > CAST(botMr.bMaxLoseRate AS DECIMAL(4,2)), #{loseRate}, botMr.bMaxLoseRate ) + WHERE 1=1 + AND mb.siteId = #{siteId} + AND mb.memId = #{memId} + AND mmr.vendorCode = #{vendorCode} + AND mmr.rateType = #{rateType} + + + + UPDATE mem_multiple_rate mmr LEFT JOIN member_tb mb ON mmr.siteId=mb.siteId AND mmr.memId=mb.memId + SET mmr.maxPointRate = #{pointRate}, + mmr.maxLoseRate = #{loseRate} + WHERE 1=1 + AND mb.siteId = #{siteId} + AND mb.recommenderId = #{memId} + AND mmr.vendorCode = #{vendorCode} + AND mmr.rateType = #{rateType} + + + + + + + + UPDATE memrateinfo mr LEFT JOIN code c ON c.masterCode='kplay' AND c.code=mr.gameType + SET mr.pointRate = #{pointRate}, + mr.loseRate = #{loseRate} + WHERE 1=1 + AND mr.siteId = #{siteId} + AND mr.memId = #{memId} + + AND c.groupCode = #{gameCategory} + + + AND c.groupCodeNameEN = #{gameCategoryEn} + + + AND mr.gameType = #{vendorCode} + + + + + UPDATE memrateinfo mr LEFT JOIN member_tb mb ON mr.siteId=mb.siteId AND mr.memId=mb.recommenderId + LEFT JOIN code c ON c.masterCode='kplay' AND c.code=mr.gameType + LEFT JOIN ( + SELECT + bmr.siteId, + bmr.memId, + cc.groupCode, + cc.groupCodeNameEN, + bmr.gameType, + MAX(bmr.pointRate) AS bMaxPointRate, + MAX(bmr.loseRate) AS bMaxLoseRate + FROM memrateinfo bmr LEFT JOIN memberflow mf ON bmr.siteId=mf.siteId AND bmr.memId=mf.memId + LEFT JOIN code cc ON cc.masterCode='kplay' AND cc.code=bmr.gameType + WHERE 1=1 + AND mf.siteId = #{siteId} + AND mf.`order` = 1 + AND mf.recommenderId = (SELECT recommenderId FROM member_tb WHERE siteId = #{siteId} AND memId = #{memId}) + + AND cc.groupCode = #{gameCategory} + + + AND cc.groupCodeNameEN = #{gameCategoryEn} + + + AND bmr.gameType = #{vendorCode} + + GROUP BY bmr.siteId, cc.groupCode, cc.groupCodeNameEN + ) botMr ON mr.siteId=botMr.siteId + SET mr.minPointRate = IF( CAST(#{pointRate} AS DECIMAL(4,2)) > CAST(botMr.bMaxPointRate AS DECIMAL(4,2)), #{pointRate}, botMr.bMaxPointRate ), + mr.minLoseRate = IF( CAST(#{loseRate} AS DECIMAL(4,2)) > CAST(botMr.bMaxLoseRate AS DECIMAL(4,2)), #{loseRate}, botMr.bMaxLoseRate ) + WHERE 1=1 + AND mb.siteId = #{siteId} + AND mb.memId = #{memId} + + AND c.groupCode = #{gameCategory} + + + AND c.groupCodeNameEN = #{gameCategoryEn} + + + AND mr.gameType = #{vendorCode} + + + + + UPDATE memrateinfo mr LEFT JOIN member_tb mb ON mr.siteId=mb.siteId AND mr.memId=mb.memId + LEFT JOIN code c ON c.masterCode='kplay' AND c.code=mr.gameType + SET mr.maxPointRate = #{pointRate}, + mr.maxLoseRate = #{loseRate} + WHERE 1=1 + AND mb.siteId = #{siteId} + AND mb.recommenderId = #{memId} + + AND c.groupCode = #{gameCategory} + + + AND c.groupCodeNameEN = #{gameCategoryEn} + + + AND mr.gameType = #{vendorCode} + + + + + UPDATE mem_cash + SET cashOutFlag = #{cashOutFlag} + WHERE siteId = #{siteId} AND memId = #{memId} + + + + + + + + UPDATE member_tb + SET loginFailCnt = #{loginFailCnt} + WHERE siteId = #{siteId} AND memId = #{memId} + + + + + + + + + + + + + + UPDATE member_tb + SET updDt = NOW() + + , cashSendYn = #{setYn} + + + , cashReceiveYn = #{setYn} + + WHERE 1=1 + AND siteId = #{siteId} + AND memId = #{memId} + + + + + + + + + + + + + + + DELETE a FROM betinfomap a + LEFT JOIN betinfo b ON a.betIdx=b.betIdx + WHERE b.siteId = #{siteId} + + AND b.memId IN + + #{item} + + + ; + + DELETE a FROM old_betinfomap a + LEFT JOIN old_betinfo b ON a.betIdx=b.betIdx + WHERE b.siteId = #{siteId} + + AND b.memId IN + + #{item} + + + ; + + DELETE a FROM bet_splus_info a + LEFT JOIN betinfo b ON a.betIdx=b.betIdx + WHERE b.siteId = #{siteId} + + AND b.memId IN + + #{item} + + + ; + + DELETE a FROM betinfo a + WHERE a.siteId = #{siteId} + + AND a.memId IN + + #{item} + + + ; + + DELETE a FROM old_betinfo a + WHERE a.siteId = #{siteId} + + AND a.memId IN + + #{item} + + + ; + + DELETE a FROM new_bet_info a + WHERE a.siteId = #{siteId} + + AND a.memId IN + + #{item} + + + ; + + DELETE a FROM old_new_bet_info a + WHERE a.siteId = #{siteId} + + AND a.memId IN + + #{item} + + + ; + + DELETE a FROM bet_mem_play_status a + WHERE a.siteId = #{siteId} + + AND a.memId IN + + #{item} + + + ; + + DELETE a FROM board_info a + WHERE a.siteId = #{siteId} + + AND a.regId IN + + #{item} + + + ; + + DELETE a FROM cash_info a + WHERE a.siteId = #{siteId} + + AND a.memId IN + + #{item} + + + ; + + DELETE a FROM old_cash_info a + WHERE a.siteId = #{siteId} + + AND a.memId IN + + #{item} + + + ; + + DELETE a FROM memberflow a + WHERE a.siteId = #{siteId} + + AND a.memId IN + + #{item} + + + ; + + DELETE a FROM member_charging_point_setting a + LEFT JOIN member_tb mb ON a.siteIdx=mb.siteIdx AND a.memIdx=mb.memIdx + WHERE mb.siteId = #{siteId} + + AND mb.memId IN + + #{item} + + + ; + + DELETE a FROM memrateinfo a + WHERE a.siteId = #{siteId} + + AND a.memId IN + + #{item} + + + ; + + DELETE a FROM mem_cash a + WHERE a.siteId = #{siteId} + + AND a.memId IN + + #{item} + + + ; + + DELETE a FROM mem_log a + WHERE a.siteId = #{siteId} + + AND a.memId IN + + #{item} + + + ; + + DELETE a FROM mem_multiple_rate a + WHERE a.siteId = #{siteId} + + AND a.memId IN + + #{item} + + + ; + + DELETE a FROM mem_point a + WHERE a.siteId = #{siteId} + + AND a.memId IN + + #{item} + + + ; + + DELETE a FROM msginfo a + WHERE a.siteId = #{siteId} + + AND a.recieveId IN + + #{item} + + + ; + + DELETE a FROM msginfo_read_status a + WHERE a.siteId = #{siteId} + + AND a.memId IN + + #{item} + + + ; + + DELETE a FROM mem_pre_point a + LEFT JOIN point_info b ON a.pointIdx=b.pointIdx + WHERE b.siteId = #{siteId} + + AND b.memId IN + + #{item} + + + ; + + DELETE a FROM old_mem_pre_point a + LEFT JOIN old_point_info b ON a.pointIdx=b.pointIdx + WHERE b.siteId = #{siteId} + + AND b.memId IN + + #{item} + + + ; + + DELETE a FROM point_info a + WHERE a.siteId = #{siteId} + + AND a.memId IN + + #{item} + + + ; + + DELETE a FROM old_point_info a + WHERE a.siteId = #{siteId} + + AND a.memId IN + + #{item} + + + ; + + DELETE a FROM cash_bonus_rel_log a + WHERE a.siteId = #{siteId} + + AND a.memId IN + + #{item} + + + ; + + DELETE a FROM slot_tran_info a + WHERE a.siteId = #{siteId} + + AND a.memId IN + + #{item} + + + ; + + DELETE a FROM triple_tran_info a + WHERE a.siteId = #{siteId} + + AND a.memId IN + + #{item} + + + ; + + DELETE a FROM daily_periodic_reports a + WHERE a.siteId = #{siteId} + + AND a.memId IN + + #{item} + + + ; + + DELETE a FROM old_daily_periodic_reports a + WHERE a.siteId = #{siteId} + + AND a.memId IN + + #{item} + + + ; + + DELETE a FROM mem_action_log a + WHERE a.siteId = #{siteId} + + AND a.memId IN + + #{item} + + + ; + + DELETE FROM member_tb + WHERE siteId = #{siteId} + + AND memId IN + + #{item} + + + ; + + + + UPDATE adminheadinfo a + SET a.memCnt = (SELECT COUNT(memIdx) FROM member_tb WHERE siteId=#{siteId} AND partnerLevel NOT IN ('COMP', 'AUTO')) + WHERE a.siteId = #{siteId} + + + + UPDATE member_tb + SET memPhone = #{memPhone} + WHERE siteId = #{siteId} AND memId = #{memId} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO rvholdem_auth_info + (siteId, memId, userId, uid, nickname) + VALUES + (#{siteId}, #{memId}, #{userId}, #{uid}, #{nickname}) + ON DUPLICATE KEY UPDATE + userId = #{userId}, + updDate = NOW(); + + + + + \ No newline at end of file diff --git a/src/main/resources/db2/COMP.xml b/src/main/resources/db2/COMP.xml new file mode 100644 index 0000000..a1f2254 --- /dev/null +++ b/src/main/resources/db2/COMP.xml @@ -0,0 +1,128 @@ + + + + + + + + UPDATE site_credit_info a LEFT JOIN site_info b ON a.siteId=b.siteId + SET a.credit = a.credit + #{creditAmt} + WHERE 1=1 + AND b.siteId = #{tripleSiteId} + AND b.siteKey = #{tripleSiteKey} + + + + + + + + + + INSERT INTO credit_info ( + siteIdx, + siteId, + targetSiteIdx, + targetSiteId, + creditType, + `inOut`, + creditAmt, + preCreditAmt, + creditStatus, + regDate, + updDate, + pointAmt + ) + + VALUES ( + #{siteIdx}, + #{siteId}, + #{targetSiteIdx}, + #{targetSiteId}, + #{creditType}, + #{inOut}, + #{creditAmt}, + #{preCreditAmt}, + #{creditStatus}, + NOW(), + NOW(), + #{pointAmt} + ) + + + SELECT LAST_INSERT_ID(); + + + + + + INSERT INTO credit_info_aiao ( + creditIdx, + siteIdx, + siteId, + targetSiteIdx, + targetSiteId, + creditType, + preCreditAmt, + creditAmt, + regDate + ) + + VALUES ( + #{creditIdx}, + #{siteIdx}, + #{siteId}, + #{targetSiteIdx}, + #{targetSiteId}, + #{creditType}, + #{preCreditAmt}, + #{creditAmt}, + NOW() + ) + + + \ No newline at end of file diff --git a/src/main/resources/db2/PARSE_DB2.xml b/src/main/resources/db2/PARSE_DB2.xml new file mode 100644 index 0000000..8d0030c --- /dev/null +++ b/src/main/resources/db2/PARSE_DB2.xml @@ -0,0 +1,36 @@ + + + + + + + + + + INSERT INTO `powerresult` + SELECT #{seq} AS gameSeq, + #{round} AS gameRound, + (SELECT CONCAT( #{gameDate}, ' ' , (SELECT gameTime FROM `minigametimeinfo` WHERE game='powerball' AND gameRound =#{round}))), + + #{pb} AS powerball, + '' AS powerArea, + IF( MOD(#{pb}, '2') = 0, 'even', 'odd') AS powerOE, + IF( #{pb} > '4.5', 'over', 'under') AS powerUO, + CONCAT( LPAD(#{num1}, 2, '0'), ',' , LPAD(#{num2}, 2, '0'), ',' , LPAD(#{num3}, 2, '0'), ',' , LPAD(#{num4}, 2, '0'), ',' , LPAD(#{num5}, 2, '0') ) AS results, + (0+ ${num1}+${num2}+${num3}+${num4}+${num5}+ 0) AS resultSum, + '' AS resultArea, + '' AS resultSize, + IF( MOD((0+ ${num1}+${num2}+${num3}+${num4}+${num5}+ 0) , '2') = 0, 'even', 'odd') AS resultOE, + IF( (0+ ${num1}+${num2}+${num3}+${num4}+${num5}+ 0) > '72.5', 'over', 'under') AS resultUO, + NOW(), NOW() + + FROM DUAL + ON DUPLICATE KEY UPDATE updDate = now() + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db2/VENDOR.xml b/src/main/resources/db2/VENDOR.xml new file mode 100644 index 0000000..4b81dc0 --- /dev/null +++ b/src/main/resources/db2/VENDOR.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + UPDATE site_vendors_map + SET nexusSkinType = #{nexusSkinType} + WHERE 1=1 + AND siteIdx = #{siteIdx} + AND vendorIdx = #{vendorIdx} + + + + UPDATE site_credit_info + SET credit = CAST(#{credit} AS SIGNED) + WHERE siteId = #{siteId} + + + + UPDATE site_point_info + SET point = CAST(#{point} AS SIGNED) + WHERE siteId = #{siteId} + + + \ No newline at end of file diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..00eff14 --- /dev/null +++ b/src/main/resources/logback-spring.xml @@ -0,0 +1,49 @@ + + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + ${filePath}/app.log + + ${filePath}/app.%d{yyyy-MM-dd}.%i.gz + + 1GB + + 10 + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + ${filePath}/error.log + + ERROR + ACCEPT + DENY + + + ${filePath}/error-%d{yyyy-MM-dd}.%i.gz + + 100MB + + 30 + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/static/html/health.html b/src/main/resources/static/html/health.html new file mode 100644 index 0000000..080655f --- /dev/null +++ b/src/main/resources/static/html/health.html @@ -0,0 +1 @@ +alive \ No newline at end of file diff --git a/src/main/resources/static/html/jquery-2.2.4.min.js b/src/main/resources/static/html/jquery-2.2.4.min.js new file mode 100644 index 0000000..4024b66 --- /dev/null +++ b/src/main/resources/static/html/jquery-2.2.4.min.js @@ -0,0 +1,4 @@ +/*! jQuery v2.2.4 | (c) jQuery Foundation | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="2.2.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isPlainObject:function(a){var b;if("object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype||{},"isPrototypeOf"))return!1;for(b in a);return void 0===b||k.call(a,b)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=d.createElement("script"),b.text=a,d.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:h.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(d=e.call(arguments,2),f=function(){return a.apply(b||this,d.concat(e.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return h.call(b,a)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&f.parentNode&&(this.length=1,this[0]=f),this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(n(a),this[0]):h.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||n.uniqueSort(e),D.test(a)&&e.reverse()),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J),n.ready()}n.ready.promise=function(b){return I||(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(n.ready):(d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J))),I.promise(b)},n.ready.promise();var K=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)K(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},L=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function M(){this.expando=n.expando+M.uid++}M.uid=1,M.prototype={register:function(a,b){var c=b||{};return a.nodeType?a[this.expando]=c:Object.defineProperty(a,this.expando,{value:c,writable:!0,configurable:!0}),a[this.expando]},cache:function(a){if(!L(a))return{};var b=a[this.expando];return b||(b={},L(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[b]=c;else for(d in b)e[d]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=a[this.expando];if(void 0!==f){if(void 0===b)this.register(a);else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in f?d=[b,e]:(d=e,d=d in f?[d]:d.match(G)||[])),c=d.length;while(c--)delete f[d[c]]}(void 0===b||n.isEmptyObject(f))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!n.isEmptyObject(b)}};var N=new M,O=new M,P=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Q=/[A-Z]/g;function R(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Q,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:P.test(c)?n.parseJSON(c):c; +}catch(e){}O.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return O.hasData(a)||N.hasData(a)},data:function(a,b,c){return O.access(a,b,c)},removeData:function(a,b){O.remove(a,b)},_data:function(a,b,c){return N.access(a,b,c)},_removeData:function(a,b){N.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=O.get(f),1===f.nodeType&&!N.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),R(f,d,e[d])));N.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){O.set(this,a)}):K(this,function(b){var c,d;if(f&&void 0===b){if(c=O.get(f,a)||O.get(f,a.replace(Q,"-$&").toLowerCase()),void 0!==c)return c;if(d=n.camelCase(a),c=O.get(f,d),void 0!==c)return c;if(c=R(f,d,void 0),void 0!==c)return c}else d=n.camelCase(a),this.each(function(){var c=O.get(this,d);O.set(this,d,b),a.indexOf("-")>-1&&void 0!==c&&O.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){O.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=N.get(a,b),c&&(!d||n.isArray(c)?d=N.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return N.get(a,c)||N.access(a,c,{empty:n.Callbacks("once memory").add(function(){N.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length",""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};$.optgroup=$.option,$.tbody=$.tfoot=$.colgroup=$.caption=$.thead,$.th=$.td;function _(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function aa(a,b){for(var c=0,d=a.length;d>c;c++)N.set(a[c],"globalEval",!b||N.get(b[c],"globalEval"))}var ba=/<|&#?\w+;/;function ca(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],o=0,p=a.length;p>o;o++)if(f=a[o],f||0===f)if("object"===n.type(f))n.merge(m,f.nodeType?[f]:f);else if(ba.test(f)){g=g||l.appendChild(b.createElement("div")),h=(Y.exec(f)||["",""])[1].toLowerCase(),i=$[h]||$._default,g.innerHTML=i[1]+n.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;n.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",o=0;while(f=m[o++])if(d&&n.inArray(f,d)>-1)e&&e.push(f);else if(j=n.contains(f.ownerDocument,f),g=_(l.appendChild(f),"script"),j&&aa(g),c){k=0;while(f=g[k++])Z.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var da=/^key/,ea=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,fa=/^([^.]*)(?:\.(.+)|)/;function ga(){return!0}function ha(){return!1}function ia(){try{return d.activeElement}catch(a){}}function ja(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ja(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ha;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return"undefined"!=typeof n&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(G)||[""],j=b.length;while(j--)h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.hasData(a)&&N.get(a);if(r&&(i=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&N.remove(a,"handle events")}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(N.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,la=/\s*$/g;function pa(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function qa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function ra(a){var b=na.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function sa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(N.hasData(a)&&(f=N.access(a),g=N.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}O.hasData(a)&&(h=O.access(a),i=n.extend({},h),O.set(b,i))}}function ta(a,b){var c=b.nodeName.toLowerCase();"input"===c&&X.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function ua(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&ma.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),ua(f,b,c,d)});if(o&&(e=ca(b,a[0].ownerDocument,!1,a,d),g=e.firstChild,1===e.childNodes.length&&(e=g),g||d)){for(h=n.map(_(e,"script"),qa),i=h.length;o>m;m++)j=e,m!==p&&(j=n.clone(j,!0,!0),i&&n.merge(h,_(j,"script"))),c.call(a[m],j,m);if(i)for(k=h[h.length-1].ownerDocument,n.map(h,ra),m=0;i>m;m++)j=h[m],Z.test(j.type||"")&&!N.access(j,"globalEval")&&n.contains(k,j)&&(j.src?n._evalUrl&&n._evalUrl(j.src):n.globalEval(j.textContent.replace(oa,"")))}return a}function va(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(_(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&aa(_(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(ka,"<$1>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=_(h),f=_(a),d=0,e=f.length;e>d;d++)ta(f[d],g[d]);if(b)if(c)for(f=f||_(a),g=g||_(h),d=0,e=f.length;e>d;d++)sa(f[d],g[d]);else sa(a,h);return g=_(h,"script"),g.length>0&&aa(g,!i&&_(a,"script")),h},cleanData:function(a){for(var b,c,d,e=n.event.special,f=0;void 0!==(c=a[f]);f++)if(L(c)){if(b=c[N.expando]){if(b.events)for(d in b.events)e[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);c[N.expando]=void 0}c[O.expando]&&(c[O.expando]=void 0)}}}),n.fn.extend({domManip:ua,detach:function(a){return va(this,a,!0)},remove:function(a){return va(this,a)},text:function(a){return K(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.appendChild(a)}})},prepend:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(_(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return K(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!la.test(a)&&!$[(Y.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(_(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return ua(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(_(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),f=e.length-1,h=0;f>=h;h++)c=h===f?this:this.clone(!0),n(e[h])[b](c),g.apply(d,c.get());return this.pushStack(d)}});var wa,xa={HTML:"block",BODY:"block"};function ya(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function za(a){var b=d,c=xa[a];return c||(c=ya(a,b),"none"!==c&&c||(wa=(wa||n("