feat(point): 가계부 내역 작성 포인트 — 건당 10p, 일 50p 한도
Deploy / deploy (push) Failing after 11m31s

AccountService.create() 호출 시 PointService.awardAccountEntry() 적립.
ACCOUNT_ENTRY reason, 일 5회(50p) 초과 시 미지급.
This commit is contained in:
ByungCheol
2026-07-04 23:14:46 +09:00
parent a10e16c1af
commit 1d90f065e5
2 changed files with 25 additions and 3 deletions
@@ -22,6 +22,7 @@ import com.sb.web.account.mapper.AccountEntryMapper;
import com.sb.web.account.mapper.AccountTagMapper; import com.sb.web.account.mapper.AccountTagMapper;
import com.sb.web.account.mapper.WalletMapper; import com.sb.web.account.mapper.WalletMapper;
import com.sb.web.common.exception.ApiException; import com.sb.web.common.exception.ApiException;
import com.sb.web.point.PointService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -48,6 +49,7 @@ public class AccountService {
private final WalletMapper walletMapper; private final WalletMapper walletMapper;
private final InvestService investService; private final InvestService investService;
private final CardNotificationParser notificationParser; private final CardNotificationParser notificationParser;
private final PointService pointService;
/* ===================== 항목 ===================== */ /* ===================== 항목 ===================== */
@@ -252,6 +254,7 @@ public class AccountService {
.build(); .build();
mapper.insert(entry); mapper.insert(entry);
applyTags(entry.getId(), req.getTagIds(), memberId); applyTags(entry.getId(), req.getTagIds(), memberId);
pointService.awardAccountEntry(memberId);
return toResponse(mapper.findByIdAndMember(entry.getId(), memberId)); return toResponse(mapper.findByIdAndMember(entry.getId(), memberId));
} }
@@ -542,7 +545,7 @@ public class AccountService {
wallet.setType(req.getType()); wallet.setType(req.getType());
wallet.setName(req.getName().trim()); wallet.setName(req.getName().trim());
wallet.setIssuer(blankToNull(req.getIssuer())); wallet.setIssuer(blankToNull(req.getIssuer()));
wallet.setAccountNumber("BANK".equals(req.getType()) ? blankToNull(req.getAccountNumber()) : null); wallet.setAccountNumber(("BANK".equals(req.getType()) || "MINUS".equals(req.getType())) ? blankToNull(req.getAccountNumber()) : null);
wallet.setCardType("CARD".equals(req.getType()) ? blankToNull(req.getCardType()) : null); wallet.setCardType("CARD".equals(req.getType()) ? blankToNull(req.getCardType()) : null);
wallet.setOpeningBalance(req.getOpeningBalance() != null ? req.getOpeningBalance() : 0L); wallet.setOpeningBalance(req.getOpeningBalance() != null ? req.getOpeningBalance() : 0L);
wallet.setOpeningDate(req.getOpeningDate()); wallet.setOpeningDate(req.getOpeningDate());
@@ -587,7 +590,7 @@ public class AccountService {
.type(req.getType()) .type(req.getType())
.name(req.getName().trim()) .name(req.getName().trim())
.issuer(blankToNull(req.getIssuer())) .issuer(blankToNull(req.getIssuer()))
.accountNumber("BANK".equals(req.getType()) ? blankToNull(req.getAccountNumber()) : null) .accountNumber(("BANK".equals(req.getType()) || "MINUS".equals(req.getType())) ? blankToNull(req.getAccountNumber()) : null)
.cardType("CARD".equals(req.getType()) ? blankToNull(req.getCardType()) : null) .cardType("CARD".equals(req.getType()) ? blankToNull(req.getCardType()) : null)
.openingBalance(req.getOpeningBalance() != null ? req.getOpeningBalance() : 0L) .openingBalance(req.getOpeningBalance() != null ? req.getOpeningBalance() : 0L)
.openingDate(req.getOpeningDate()) .openingDate(req.getOpeningDate())
@@ -7,7 +7,7 @@ import org.springframework.transaction.annotation.Transactional;
/** /**
* 활동 포인트 적립/조회. * 활동 포인트 적립/조회.
* 게시판 글/댓글 작성 시 10점, 하루 3회까지만 지급(글+댓글 합산). * 게시판 글/댓글 작성 시 10점(하루 3회), 가계부 내역 작성 시 10점(하루 50점 한도).
*/ */
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
@@ -19,6 +19,10 @@ public class PointService {
public static final int BOARD_WRITE_DAILY_LIMIT = 3; public static final int BOARD_WRITE_DAILY_LIMIT = 3;
public static final String REASON_BOARD_WRITE = "BOARD_WRITE"; public static final String REASON_BOARD_WRITE = "BOARD_WRITE";
public static final int ACCOUNT_ENTRY_POINT = 10;
public static final int ACCOUNT_ENTRY_DAILY_LIMIT = 5; // 10pt × 5 = 일 50pt 한도
public static final String REASON_ACCOUNT_ENTRY = "ACCOUNT_ENTRY";
/** /**
* 게시판 글/댓글 작성 보상. 오늘 지급 횟수가 한도 미만일 때만 지급한다. * 게시판 글/댓글 작성 보상. 오늘 지급 횟수가 한도 미만일 때만 지급한다.
* @return 지급되면 지급 포인트, 한도 초과로 미지급이면 0 * @return 지급되면 지급 포인트, 한도 초과로 미지급이면 0
@@ -34,6 +38,21 @@ public class PointService {
return BOARD_WRITE_POINT; return BOARD_WRITE_POINT;
} }
/**
* 가계부 내역 작성 보상. 건당 10점, 하루 5건(50점)까지만 지급한다.
* @return 지급되면 지급 포인트, 한도 초과로 미지급이면 0
*/
@Transactional
public int awardAccountEntry(Long memberId) {
int today = pointMapper.countTodayGrants(memberId, REASON_ACCOUNT_ENTRY);
if (today >= ACCOUNT_ENTRY_DAILY_LIMIT) {
return 0;
}
pointMapper.insertHistory(memberId, ACCOUNT_ENTRY_POINT, REASON_ACCOUNT_ENTRY);
pointMapper.addPoints(memberId, ACCOUNT_ENTRY_POINT);
return ACCOUNT_ENTRY_POINT;
}
public long getPoints(Long memberId) { public long getPoints(Long memberId) {
Long p = pointMapper.getPoints(memberId); Long p = pointMapper.getPoints(memberId);
return p == null ? 0L : p; return p == null ? 0L : p;