package com.caliverse.admin.domain.service; import com.caliverse.admin.domain.dao.admin.CaliumMapper; import com.caliverse.admin.domain.entity.*; import com.caliverse.admin.domain.entity.log.GenericLog; import com.caliverse.admin.domain.entity.web3.ResponseConfirmData; import com.caliverse.admin.domain.entity.web3.ResponseErrorCode; import com.caliverse.admin.domain.entity.web3.ResponseRequestData; import com.caliverse.admin.domain.entity.web3.ResponseWithdrawableData; import com.caliverse.admin.domain.request.CaliumRequest; import com.caliverse.admin.domain.request.LogGenericRequest; import com.caliverse.admin.domain.request.Web3Request; import com.caliverse.admin.domain.response.CaliumResponse; import com.caliverse.admin.domain.response.Web3Response; import com.caliverse.admin.dynamodb.service.DynamodbCaliumService; import com.caliverse.admin.global.common.annotation.BusinessProcess; import com.caliverse.admin.global.common.annotation.RequestLog; import com.caliverse.admin.global.common.code.CommonCode; import com.caliverse.admin.global.common.code.ErrorCode; import com.caliverse.admin.global.common.code.SuccessCode; import com.caliverse.admin.global.common.constants.Web3Constants; import com.caliverse.admin.global.common.utils.CommonUtils; import com.caliverse.admin.logs.entity.LogAction; import com.caliverse.admin.logs.logservice.businesslogservice.BusinessLogGenericService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpMethod; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; @Service @Slf4j @RequiredArgsConstructor public class CaliumService { private final CaliumMapper caliumMapper; private final Web3Service web3Service; private final DynamodbCaliumService dynamodbCaliumService; private final BusinessLogGenericService businessLogGenericService; public CaliumResponse getCaliumLimit(){ Web3Response web3Response = web3Service.get( Web3Constants.URL_SERVER_TYPE, null, ResponseWithdrawableData.class ); log.info("getCaliumLimit calium WithdrawableInfo: {}", web3Response); if(web3Response.isSuccess()) return CaliumResponse.builder() .status(CommonCode.SUCCESS.getHttpStatus()) .result(CommonCode.SUCCESS.getResult()) .resultData(CaliumResponse.ResultData.builder() .withdrawableInfo(web3Response.getData()) .build() ) .build(); else{ String code = web3Response.getCode(); Optional error = ResponseErrorCode.fromCode(code); return CaliumResponse.builder() .status(CommonCode.ERROR.getHttpStatus()) .result(code) .resultData(CaliumResponse.ResultData.builder() .message(error.get().getMessage()) .build() ) .build(); } } @RequestLog public CaliumResponse getList(Map requestParam){ //페이징 처리 requestParam = CommonUtils.pageSetting(requestParam); List list = caliumMapper.getCaliumRequestList(requestParam); double allCnt = caliumMapper.getCaliumTotal(); double stock_qty = dynamodbCaliumService.getCaliumTotal(); LogGenericRequest logGenericRequest = new LogGenericRequest(); logGenericRequest.setLogAction(LogAction.FailCaliumEchoSystem); logGenericRequest.setStartDt(LocalDateTime.now().minusDays(1)); logGenericRequest.setEndDt(LocalDateTime.now()); logGenericRequest.setOrderBy("ASC"); List failList = businessLogGenericService.loadBusinessLogData(logGenericRequest, GenericLog.class); return CaliumResponse.builder() .status(CommonCode.SUCCESS.getHttpStatus()) .result(CommonCode.SUCCESS.getResult()) .resultData(CaliumResponse.ResultData.builder() .caliumList(list) .total(stock_qty) .totalAll(allCnt) .failCount(failList.size()) .pageNo(requestParam.get("page_no")!=null? Integer.parseInt(requestParam.get("page_no").toString()):1) .build() ) .build(); } public CaliumResponse getDetail(Long id){ Calium calium = caliumMapper.getCaliumRequestDetail(id); log.info("getDetail call Detail Info: {}", calium); return CaliumResponse.builder() .status(CommonCode.SUCCESS.getHttpStatus()) .result(CommonCode.SUCCESS.getResult()) .resultData(CaliumResponse.ResultData.builder() .calium(calium) .build()) .build(); } @BusinessProcess(action = com.caliverse.admin.domain.entity.log.LogAction.CALIUM_REQUEST) @Transactional(transactionManager = "transactionManager") @RequestLog public CaliumResponse postCaliumRequest(CaliumRequest caliumRequest){ caliumRequest.setCreateBy(CommonUtils.getAdmin().getId()); Web3Request apiRequest = Web3Request.builder() .serverType(Web3Constants.SERVER_NAME) .historyMessage(caliumRequest.getContent()) .requestor(CommonUtils.getAdmin().getName()) .amount(-Math.abs(caliumRequest.getCount())).build(); // 음수로 변환 Web3Response web3Response = web3Service.callWeb3Api(Web3Constants.URL_REQUEST, HttpMethod.POST, apiRequest, ResponseRequestData.class); if(!web3Response.isSuccess()){ log.error("postEvent Web3 api error: {}", web3Response); String code = web3Response.getCode(); ResponseErrorCode error = ResponseErrorCode.fromCode(code).get(); return CaliumResponse.builder() .status(CommonCode.ERROR.getHttpStatus()) .result(code) .resultData(CaliumResponse.ResultData.builder() .message(error.getMessage()) .build() ) .build(); } log.info("postEvent Request Api Response: {}", web3Response); ResponseRequestData responseData = web3Response.getData(); caliumRequest.setRequestId(responseData.get_id()); caliumRequest.setCreateTime(responseData.getCreateTime()); int result = caliumMapper.postCaliumRequest(caliumRequest); log.info("postEvent AdminToolDB Event Save: {}", caliumRequest); return CaliumResponse.builder() .status(CommonCode.SUCCESS.getHttpStatus()) .result(CommonCode.SUCCESS.getResult()) .resultData(CaliumResponse.ResultData.builder() .message(SuccessCode.SAVE.getMessage()) .build()) .build(); } @BusinessProcess(action = com.caliverse.admin.domain.entity.log.LogAction.CALIUM_REQUEST) @Transactional(transactionManager = "transactionManager") @RequestLog public CaliumResponse updateCaliumCharged(CaliumRequest caliumRequest){ log.info("updateCaliumCharged calium Request: {}", caliumRequest); Calium calium = caliumMapper.getCaliumRequestDetail(caliumRequest.getId()); Long userId = CommonUtils.getAdmin().getId(); // 상태가 승인완료거나 요청한 본인이 아니면 에러처리 if(!calium.getStatus().equals(Calium.CALIUMREQUESTSTATUS.COMPLETE) || !calium.getCreateBy().equals(userId.toString())){ log.error("updateCaliumCharged Calium Request Status or User Not Match status: {}, id: {}", calium.getStatus(), userId); return CaliumResponse.builder() .status(CommonCode.ERROR.getHttpStatus()) .result(ErrorCode.ERROR_CALIUM_FINISH.toString()) .resultData(CaliumResponse.ResultData.builder() .build() ) .build(); } Calium info = caliumMapper.getCaliumRequestDetail(caliumRequest.getId()); dynamodbCaliumService.updateCaliumTotal(caliumRequest.getCount()); updateCaliumRequest(caliumRequest.getId(), Calium.CALIUMREQUESTSTATUS.FINISH); return CaliumResponse.builder() .status(CommonCode.SUCCESS.getHttpStatus()) .result(CommonCode.SUCCESS.getResult()) .build(); } @BusinessProcess(action = com.caliverse.admin.domain.entity.log.LogAction.CALIUM_REQUEST) @Transactional(transactionManager = "transactionManager") public void getScheduleCaliumRequestList(){ List scheduleList = caliumMapper.getScheduleCaliumRequest(); for(Calium calium : scheduleList){ String url = Web3Constants.URL_REQUEST_CONFIRM + calium.getRequestId(); Web3Response web3Response = web3Service.get( url, null, ResponseConfirmData.class ); if(web3Response.isSuccess()){ ResponseConfirmData data = web3Response.getData(); String state = data.getState(); if(state.equals("confirm")){ updateCaliumRequest(calium.getId(), Calium.CALIUMREQUESTSTATUS.COMPLETE, data); log.info("getScheduleCaliumRequestList Calium Request Confirm: {}", data); }else if(state.equals("cancel")){ updateCaliumRequest(calium.getId(), Calium.CALIUMREQUESTSTATUS.REJECT, data); log.info("getScheduleCaliumRequestList Calium Request Cancel: {}", data); } }else{ String code = web3Response.getCode(); Optional error = ResponseErrorCode.fromCode(code); log.error("getScheduleCaliumRequestList calium confirm request request_id: {}, Error: {}", calium.getRequestId(), error.get().getMessage()); } } } private void updateCaliumRequest(Long id, Calium.CALIUMREQUESTSTATUS status){ Map map = new HashMap<>(); map.put("id", id); map.put("status", status.toString()); map.put("updateBy", CommonUtils.getAdmin().getId()); caliumMapper.updateStatusCaliumRequest(map); } private void updateCaliumRequest(Long id, Calium.CALIUMREQUESTSTATUS status, ResponseConfirmData data){ Map map = new HashMap<>(); map.put("id", id); map.put("status", status.toString()); map.put("stateTime", data.getStateTime()); map.put("stateMessage", data.getState().equals("confirm") ? data.getStateMessage(): ""); caliumMapper.updateStatusCaliumRequest(map); } }