Files
operationSystem-back/src/main/java/com/caliverse/admin/domain/service/CaliumService.java
2025-08-06 14:39:05 +09:00

247 lines
11 KiB
Java

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<ResponseWithdrawableData> 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<ResponseErrorCode> 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<Calium> 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<GenericLog> 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<ResponseRequestData> 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<Calium> scheduleList = caliumMapper.getScheduleCaliumRequest();
for(Calium calium : scheduleList){
String url = Web3Constants.URL_REQUEST_CONFIRM + calium.getRequestId();
Web3Response<ResponseConfirmData> 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<ResponseErrorCode> 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<String,Object> 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<String,Object> 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);
}
}