엑셀 csv 형식으로 변경

전투시스템 종료시간 추가
메모리 버퍼 정리
This commit is contained in:
2025-06-27 09:32:15 +09:00
parent 1129f4017f
commit a06e625cbd
14 changed files with 526 additions and 103 deletions

View File

@@ -6,6 +6,8 @@ import com.caliverse.admin.domain.entity.BattleEvent;
import com.caliverse.admin.domain.entity.HISTORYTYPEDETAIL;
import com.caliverse.admin.domain.entity.metadata.MetaBattleConfigData;
import com.caliverse.admin.domain.entity.metadata.MetaBattleRewardData;
import com.caliverse.admin.domain.entity.metadata.MetaGameFFAConfigData;
import com.caliverse.admin.domain.entity.metadata.MetaGameModeData;
import com.caliverse.admin.domain.request.BattleEventRequest;
import com.caliverse.admin.domain.response.BattleEventResponse;
import com.caliverse.admin.dynamodb.service.DynamodbBattleEventService;
@@ -23,10 +25,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestParam;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -75,6 +74,21 @@ public class BattleEventService {
.build();
}
//전투시스템 게임모드 데이터
public BattleEventResponse getGameModeList(){
List<MetaGameModeData> list = metaDataHandler.getMetaGameModeListData();
return BattleEventResponse.builder()
.status(CommonCode.SUCCESS.getHttpStatus())
.result(CommonCode.SUCCESS.getResult())
.resultData(BattleEventResponse.ResultData.builder()
.gameModeList(list)
.build()
)
.build();
}
// 전투시스템 이벤트 조회
public BattleEventResponse getBattleEventList(@RequestParam Map<String, String> requestParam){
@@ -112,6 +126,7 @@ public class BattleEventService {
.build();
}
// 전투시스템 이벤트 저장
@Transactional(transactionManager = "transactionManager")
public BattleEventResponse postBattleEvent(BattleEventRequest battleEventRequest){
if(battleEventRequest.getRepeatType().equals(BattleEvent.BATTLE_REPEAT_TYPE.NONE)){
@@ -130,11 +145,8 @@ public class BattleEventService {
}
battleEventRequest.setInstanceId(CommonConstants.BATTLE_INSTANCE_ID); //고정값으로 넣고 추후 맵정보가 늘어나면 선택하는 걸로
if(battleEventRequest.getRoundTime().equals(0)
|| battleEventRequest.getHotTime().equals(0)
|| battleEventRequest.getConfigId().equals(0)
if(battleEventRequest.getGameModeId().equals(0)
|| battleEventRequest.getRoundCount().equals(0)
|| battleEventRequest.getRewardGroupId().equals(0)
){
return BattleEventResponse.builder()
.status(CommonCode.ERROR.getHttpStatus())
@@ -142,10 +154,15 @@ public class BattleEventService {
.build();
}
int operation_time = calcEndTime(battleEventRequest);
// int operation_time = ffACalcEndTime(battleEventRequest);
LocalTime startTime = battleEventRequest.getEventStartDt().toLocalTime();
LocalTime endTime = battleEventRequest.getEventEndTime().toLocalTime();
long duration = Duration.between(startTime, endTime).getSeconds();
int operation_time = (int) duration;
battleEventRequest.setEventOperationTime(operation_time);
// int is_time = battleMapper.chkTimeOver(battleEventRequest);
List<BattleEvent> existingList = battleMapper.getCheckBattleEventList(battleEventRequest);
boolean isTime = isTimeOverlapping(existingList, battleEventRequest);
if(isTime){
@@ -155,7 +172,7 @@ public class BattleEventService {
.result(ErrorCode.ERROR_BATTLE_EVENT_TIME_OVER.toString())
.build();
}
// dynamoDB 기준으로 id를 관리하려고했으나 종료된 데이터를 주기적으로 지워주다보니 id가 꼬일수 있어서 운영DB기준으로 변경
// int next_event_id = dynamodbBattleEventService.getEventId() + 1;
// battleEventRequest.setEventId(next_event_id);
@@ -188,6 +205,7 @@ public class BattleEventService {
.build();
}
// 전투시스템 이벤트 수정
@Transactional(transactionManager = "transactionManager")
public BattleEventResponse updateBattleEvent(Long id, BattleEventRequest battleEventRequest) {
battleEventRequest.setId(id);
@@ -212,7 +230,7 @@ public class BattleEventService {
.build();
}
int operation_time = calcEndTime(battleEventRequest);
int operation_time = ffACalcEndTime(battleEventRequest);
battleEventRequest.setEventOperationTime(operation_time);
// 일자만 필요해서 UTC시간으로 변경되다보니 한국시간(+9)을 더해서 마지막시간으로 설정
@@ -250,6 +268,7 @@ public class BattleEventService {
.build();
}
// 전투시스템 이벤트 중단
@Transactional(transactionManager = "transactionManager")
public BattleEventResponse updateStopBattleEvent(Long id){
Map<String,Object> map = new HashMap<>();
@@ -291,6 +310,7 @@ public class BattleEventService {
.build();
}
// 전투시스템 이벤트 삭제(사용안함)
@Transactional(transactionManager = "transactionManager")
public BattleEventResponse deleteBattleEvent(BattleEventRequest battleEventRequest){
Map<String,Object> map = new HashMap<>();
@@ -352,14 +372,25 @@ public class BattleEventService {
}
// 이벤트 동작 시간 계산
private int calcEndTime(BattleEventRequest battleEventRequest){
MetaBattleConfigData config = metaDataHandler.getMetaBattleConfigsListData().stream()
.filter(data -> data.getId().equals(battleEventRequest.getConfigId()))
private int ffACalcEndTime(BattleEventRequest battleEventRequest){
MetaGameModeData gameModeData = metaDataHandler.getMetaGameModeListData().stream()
.filter(data -> data.getId().equals(battleEventRequest.getGameModeId()))
.findFirst()
.orElse(null);
if(gameModeData == null) return 0;
MetaGameFFAConfigData config = metaDataHandler.getMetaGameFFAConfigListData().stream()
.filter(data -> data.getId().equals(gameModeData.getModeConfigId()))
.findFirst()
.orElse(null);
// MetaBattleConfigData config = metaDataHandler.getMetaBattleConfigsListData().stream()
// .filter(data -> data.getId().equals(battleEventRequest.getConfigId()))
// .findFirst()
// .orElse(null);
if(config == null) return 0;
int round_time = battleEventRequest.getRoundTime();
int round_time = config.getRoundTime();
int round_count = battleEventRequest.getRoundCount();
int round_wait_time = config.getNextRoundWaitTime();
int result_wait_time = config.getResultUIWaitTime();
@@ -380,12 +411,10 @@ public class BattleEventService {
BattleEvent.BATTLE_REPEAT_TYPE newRepeatType = battleEventRequest.getRepeatType();
return existingList.stream().anyMatch(existingEvent -> {
// 자기 자신은 제외 (수정 시)
if (battleEventRequest.getId() != null && battleEventRequest.getId().equals(existingEvent.getId())) {
return false;
}
// 기존 이벤트 정보
LocalDateTime existingStartDt = existingEvent.getEventStartDt();
LocalDateTime existingEndDt = existingEvent.getEventEndDt();
LocalDate existingStartDate = existingStartDt.toLocalDate();
@@ -395,60 +424,44 @@ public class BattleEventService {
BattleEvent.BATTLE_REPEAT_TYPE existingRepeatType = existingEvent.getRepeatType();
// 1. 두 이벤트가 모두 NONE 타입인 경우
if (newRepeatType == BattleEvent.BATTLE_REPEAT_TYPE.NONE &&
existingRepeatType == BattleEvent.BATTLE_REPEAT_TYPE.NONE) {
// 같은 날짜인지 확인
if (newRepeatType == BattleEvent.BATTLE_REPEAT_TYPE.NONE && existingRepeatType == BattleEvent.BATTLE_REPEAT_TYPE.NONE) {
if (newStartDate.equals(existingStartDate)) {
// 시간이 겹치는지 확인
return !existingStartTime.isAfter(newEndTime) && !newStartTime.isAfter(existingEndTime);
}
return false;
}
// 2. NONE 타입과 DAY 타입 간의 중복 체크
if (newRepeatType == BattleEvent.BATTLE_REPEAT_TYPE.NONE &&
existingRepeatType == BattleEvent.BATTLE_REPEAT_TYPE.DAY) {
// NONE 이벤트의 날짜가 DAY 이벤트의 기간 내에 있는지 확인
if (newRepeatType == BattleEvent.BATTLE_REPEAT_TYPE.NONE && existingRepeatType == BattleEvent.BATTLE_REPEAT_TYPE.DAY) {
if (isDateInRange(newStartDate, existingStartDate, existingEndDate)) {
// 시간이 겹치는지 확인
return !existingStartTime.isAfter(newEndTime) && !newStartTime.isAfter(existingEndTime);
}
return false;
}
// 3. DAY 타입과 NONE 타입 간의 중복 체크
if (newRepeatType == BattleEvent.BATTLE_REPEAT_TYPE.DAY &&
existingRepeatType == BattleEvent.BATTLE_REPEAT_TYPE.NONE) {
// NONE 이벤트의 날짜가 DAY 이벤트의 기간 내에 있는지 확인
if (newRepeatType == BattleEvent.BATTLE_REPEAT_TYPE.DAY && existingRepeatType == BattleEvent.BATTLE_REPEAT_TYPE.NONE) {
if (isDateInRange(existingStartDate, newStartDate, newEndDate)) {
// 시간이 겹치는지 확인
return !existingStartTime.isAfter(newEndTime) && !newStartTime.isAfter(existingEndTime);
}
return false;
}
// 4. 두 이벤트가 모두 DAY 타입인 경우
if (newRepeatType == BattleEvent.BATTLE_REPEAT_TYPE.DAY &&
existingRepeatType == BattleEvent.BATTLE_REPEAT_TYPE.DAY) {
// 날짜 범위가 겹치는지 확인
if (newRepeatType == BattleEvent.BATTLE_REPEAT_TYPE.DAY && existingRepeatType == BattleEvent.BATTLE_REPEAT_TYPE.DAY) {
if (datesOverlap(newStartDate, newEndDate, existingStartDate, existingEndDate)) {
// 시간이 겹치는지 확인
return !existingStartTime.isAfter(newEndTime) && !newStartTime.isAfter(existingEndTime);
}
return false;
}
// 5. NONE 타입과 요일 타입 간의 중복 체크
if (newRepeatType == BattleEvent.BATTLE_REPEAT_TYPE.NONE &&
isWeekdayType(existingRepeatType)) {
// NONE 이벤트의 날짜가 요일 이벤트의 기간 내에 있는지 확인
if (newRepeatType == BattleEvent.BATTLE_REPEAT_TYPE.NONE && isWeekdayType(existingRepeatType)) {
if (isDateInRange(newStartDate, existingStartDate, existingEndDate)) {
// NONE 이벤트의 요일이 요일 이벤트의 요일과 일치하는지 확인
DayOfWeek noneDayOfWeek = newStartDate.getDayOfWeek();
DayOfWeek weekdayType = getDayOfWeekFromRepeatType(existingRepeatType);
if (noneDayOfWeek == weekdayType) {
// 시간이 겹치는지 확인
return !existingStartTime.isAfter(newEndTime) && !newStartTime.isAfter(existingEndTime);
}
}
@@ -456,16 +469,12 @@ public class BattleEventService {
}
// 6. 요일 타입과 NONE 타입 간의 중복 체크
if (isWeekdayType(newRepeatType) &&
existingRepeatType == BattleEvent.BATTLE_REPEAT_TYPE.NONE) {
// NONE 이벤트의 날짜가 요일 이벤트의 기간 내에 있는지 확인
if (isWeekdayType(newRepeatType) && existingRepeatType == BattleEvent.BATTLE_REPEAT_TYPE.NONE) {
if (isDateInRange(existingStartDate, newStartDate, newEndDate)) {
// NONE 이벤트의 요일이 요일 이벤트의 요일과 일치하는지 확인
DayOfWeek noneDayOfWeek = existingStartDate.getDayOfWeek();
DayOfWeek weekdayType = getDayOfWeekFromRepeatType(newRepeatType);
if (noneDayOfWeek == weekdayType) {
// 시간이 겹치는지 확인
return !existingStartTime.isAfter(newEndTime) && !newStartTime.isAfter(existingEndTime);
}
}
@@ -473,13 +482,9 @@ public class BattleEventService {
}
// 7. DAY 타입과 요일 타입 간의 중복 체크
if (newRepeatType == BattleEvent.BATTLE_REPEAT_TYPE.DAY &&
isWeekdayType(existingRepeatType)) {
// 날짜 범위가 겹치는지 확인
if (newRepeatType == BattleEvent.BATTLE_REPEAT_TYPE.DAY && isWeekdayType(existingRepeatType)) {
if (datesOverlap(newStartDate, newEndDate, existingStartDate, existingEndDate)) {
// 날짜 범위 내에 해당 요일이 적어도 하나 있는지 확인
if (hasOverlappingWeekday(newStartDate, newEndDate, existingStartDate, existingEndDate, getDayOfWeekFromRepeatType(existingRepeatType))) {
// 시간이 겹치는지 확인
return !existingStartTime.isAfter(newEndTime) && !newStartTime.isAfter(existingEndTime);
}
}
@@ -487,13 +492,9 @@ public class BattleEventService {
}
// 8. 요일 타입과 DAY 타입 간의 중복 체크
if (isWeekdayType(newRepeatType) &&
existingRepeatType == BattleEvent.BATTLE_REPEAT_TYPE.DAY) {
// 날짜 범위가 겹치는지 확인
if (isWeekdayType(newRepeatType) && existingRepeatType == BattleEvent.BATTLE_REPEAT_TYPE.DAY) {
if (datesOverlap(newStartDate, newEndDate, existingStartDate, existingEndDate)) {
// 날짜 범위 내에 해당 요일이 적어도 하나 있는지 확인
if (hasOverlappingWeekday(newStartDate, newEndDate, existingStartDate, existingEndDate, getDayOfWeekFromRepeatType(newRepeatType))) {
// 시간이 겹치는지 확인
return !existingStartTime.isAfter(newEndTime) && !newStartTime.isAfter(existingEndTime);
}
}
@@ -502,11 +503,8 @@ public class BattleEventService {
// 9. 두 이벤트가 모두 요일 타입인 경우
if (isWeekdayType(newRepeatType) && isWeekdayType(existingRepeatType)) {
// 같은 요일인지 확인
if (newRepeatType == existingRepeatType) {
// 날짜 범위가 겹치는지 확인
if (datesOverlap(newStartDate, newEndDate, existingStartDate, existingEndDate)) {
// 시간이 겹치는지 확인
return !existingStartTime.isAfter(newEndTime) && !newStartTime.isAfter(existingEndTime);
}
}
@@ -558,18 +556,18 @@ public class BattleEventService {
LocalDate overlapEnd = end1.isBefore(end2) ? end1 : end2;
if (overlapStart.isAfter(overlapEnd)) {
return false; // 겹치는 날짜 범위 없음
return false;
}
// 겹치는 날짜 범위 내에 해당 요일이 있는지 확인
LocalDate current = overlapStart;
while (!current.isAfter(overlapEnd)) {
if (current.getDayOfWeek() == dayOfWeek) {
return true; // 해당 요일 발견
return true;
}
current = current.plusDays(1);
}
return false; // 해당 요일 없음
return false;
}
}