feat(point): 한 달 개근(모든 날 기록) 랜덤 보너스 1~100P
내역 저장 시 현재 월 모든 날에 기록이 있으면 월 1회 랜덤 1~100P 지급. 전월 소급 입력 파밍 방지(현재 월만 인정), 화면 안내 없음(포인트 내역에만). - AccountEntryMapper.countDistinctEntryDays, PointMapper.countByReason - PointService.awardMonthComplete(reason=MONTH_COMPLETE_yyyyMM 로 월 1회) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -256,9 +256,28 @@ public class AccountService {
|
||||
mapper.insert(entry);
|
||||
applyTags(entry.getId(), req.getTagIds(), memberId);
|
||||
pointService.awardAccountEntry(memberId);
|
||||
awardIfMonthComplete(entry.getEntryDate(), memberId);
|
||||
return toResponse(mapper.findByIdAndMember(entry.getId(), memberId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 내역의 월이 '현재 진행 중인 달'이고 그 달 모든 날에 기록이 있으면 개근 보너스(랜덤 1~100P) 지급.
|
||||
* 지난달을 소급 입력해 채우는 파밍을 막기 위해 현재 월만 인정한다(전 월 제외). 판정 실패는 저장에 영향 없음.
|
||||
*/
|
||||
private void awardIfMonthComplete(java.time.LocalDate entryDate, Long memberId) {
|
||||
if (entryDate == null) return;
|
||||
try {
|
||||
java.time.LocalDate today = java.time.LocalDate.now();
|
||||
if (entryDate.getYear() != today.getYear() || entryDate.getMonthValue() != today.getMonthValue()) return;
|
||||
int recorded = mapper.countDistinctEntryDays(memberId, entryDate.getYear(), entryDate.getMonthValue());
|
||||
if (recorded >= entryDate.lengthOfMonth()) {
|
||||
pointService.awardMonthComplete(memberId, entryDate.getYear(), entryDate.getMonthValue());
|
||||
}
|
||||
} catch (Exception ignore) {
|
||||
// 개근 판정 오류는 무시(내역 저장은 이미 완료)
|
||||
}
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public AccountEntryResponse update(Long id, AccountEntryRequest req, Long memberId) {
|
||||
AccountEntry entry = mustFind(id, memberId);
|
||||
|
||||
Reference in New Issue
Block a user