엑셀 csv 형식으로 변경
전투시스템 종료시간 추가 메모리 버퍼 정리
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user