From a0fc546ad8361389663fe3c080e1d9eb9e07249d Mon Sep 17 00:00:00 2001 From: ByungCheol Date: Fri, 12 Jun 2026 22:22:54 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=9E=90=EB=8F=99=EC=9D=B8=EC=8B=9D=20?= =?UTF-8?q?=EB=B6=84=EB=A5=98=20=ED=95=99=EC=8A=B5=20=E2=80=94=20=EA=B0=99?= =?UTF-8?q?=EC=9D=80=20=EB=A9=94=EB=AA=A8=20=ED=82=A4=EC=9B=8C=EB=93=9C?= =?UTF-8?q?=EB=8A=94=20=EA=B3=BC=EA=B1=B0=20=EB=B6=84=EB=A5=98=EB=A1=9C=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=20=EC=B1=84=EC=9B=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 알림 자동등록 시 memo(가맹점) 키워드로 과거에 '확정'한 내역의 분류를 찾아(가장 많이 쓴 분류) pending 내역에 미리 채운다. - 메모 포함관계 매칭('스타벅스' ↔ '스타벅스 강남점'), 같은 type(수입/지출)만. - 안전상 '확인 필요' 상태는 유지(분류만 선반영) — 무검토 오확정 방지. - AccountEntryMapper.findLearnedCategory 추가. Co-Authored-By: Claude Opus 4.8 --- .../web/account/mapper/AccountEntryMapper.java | 5 +++++ .../sb/web/account/service/AccountService.java | 13 ++++++++++--- .../resources/mapper/AccountEntryMapper.xml | 18 ++++++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sb/web/account/mapper/AccountEntryMapper.java b/src/main/java/com/sb/web/account/mapper/AccountEntryMapper.java index c158f98..426a4ea 100644 --- a/src/main/java/com/sb/web/account/mapper/AccountEntryMapper.java +++ b/src/main/java/com/sb/web/account/mapper/AccountEntryMapper.java @@ -66,6 +66,11 @@ public interface AccountEntryMapper { /** 미확인(확인 필요) 내역 개수 */ int countPending(@Param("memberId") Long memberId); + /** 자동인식 분류 학습: 같은 메모 키워드로 과거에 가장 많이 쓴 분류 1건(없으면 null) */ + String findLearnedCategory(@Param("memberId") Long memberId, + @Param("type") String type, + @Param("memo") String memo); + /** 미확인 내역 확정 (pending=0, 분류/계좌 보정) */ int confirm(@Param("id") Long id, @Param("memberId") Long memberId, @Param("category") String category, @Param("walletId") Long walletId); diff --git a/src/main/java/com/sb/web/account/service/AccountService.java b/src/main/java/com/sb/web/account/service/AccountService.java index c5ec16a..6763adf 100644 --- a/src/main/java/com/sb/web/account/service/AccountService.java +++ b/src/main/java/com/sb/web/account/service/AccountService.java @@ -231,13 +231,20 @@ public class AccountService { String walletType = p.isBankTransfer() ? "BANK" : "CARD"; Long walletId = matchWalletId(p.getIssuer(), memberId, walletType); + // 분류 자동학습: 같은 메모(가맹점) 키워드로 과거에 확정한 분류가 있으면 그대로 채워준다. + String type = p.isIncome() ? "INCOME" : "EXPENSE"; + String merchant = p.getMerchant(); + String learnedCategory = (merchant != null && !merchant.isBlank()) + ? mapper.findLearnedCategory(memberId, type, merchant) + : null; + AccountEntry entry = AccountEntry.builder() .memberId(memberId) .entryDate(p.getDate() != null ? p.getDate() : java.time.LocalDate.now()) - .type(p.isIncome() ? "INCOME" : "EXPENSE") - .category(null) + .type(type) + .category(learnedCategory) .amount(p.getAmount()) - .memo(p.getMerchant()) + .memo(merchant) .walletId(walletId) .toWalletId(null) .installmentMonths(null) diff --git a/src/main/resources/mapper/AccountEntryMapper.xml b/src/main/resources/mapper/AccountEntryMapper.xml index 5317807..459488a 100644 --- a/src/main/resources/mapper/AccountEntryMapper.xml +++ b/src/main/resources/mapper/AccountEntryMapper.xml @@ -160,6 +160,24 @@ SELECT COUNT(*) FROM account_entry WHERE member_id = #{memberId} AND pending = 1 + + + UPDATE account_entry SET pending = 0,