From 571fcc6d902d40de637435df6639f5914165d6eb Mon Sep 17 00:00:00 2001 From: k-oshita Date: Fri, 18 Sep 2026 10:16:49 +0900 Subject: [PATCH] =?UTF-8?q?[add]=E4=BD=99=E5=88=86=E3=81=AA=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB=E3=82=92=E3=82=B3=E3=83=9F=E3=83=83?= =?UTF-8?q?=E3=83=88=E3=81=97=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/model/CategoryAnalysisModel.java | 2 +- .../service/impl/AnalysisServiceImpl.java | 132 ++++++++++++++++-- .../repository/AllocationRepository.java | 2 +- .../app/infra/repository/UserRepository.java | 1 + .../controller/AnalysisController.java | 12 +- src/main/resources/templates/analysis.html | 63 ++++++--- .../templates/user_register_confirm.html | 2 +- 7 files changed, 177 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/example/demo/app/domain/model/CategoryAnalysisModel.java b/src/main/java/com/example/demo/app/domain/model/CategoryAnalysisModel.java index 3a94930..47cdadf 100644 --- a/src/main/java/com/example/demo/app/domain/model/CategoryAnalysisModel.java +++ b/src/main/java/com/example/demo/app/domain/model/CategoryAnalysisModel.java @@ -13,7 +13,7 @@ public class CategoryAnalysisModel { private Integer previousMonthAmount; - private Integer previousMonthDifferenceAmount; + private Integer monthDifferenceAmount; private Integer courseLimitAmount; diff --git a/src/main/java/com/example/demo/app/domain/service/impl/AnalysisServiceImpl.java b/src/main/java/com/example/demo/app/domain/service/impl/AnalysisServiceImpl.java index 66f4bbc..d0f3388 100644 --- a/src/main/java/com/example/demo/app/domain/service/impl/AnalysisServiceImpl.java +++ b/src/main/java/com/example/demo/app/domain/service/impl/AnalysisServiceImpl.java @@ -1,9 +1,21 @@ package com.example.demo.app.domain.service.impl; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + import org.springframework.stereotype.Service; import com.example.demo.app.domain.model.AnalysisModel; +import com.example.demo.app.domain.model.CategoryAnalysisModel; import com.example.demo.app.domain.service.AnalysisService; +import com.example.demo.app.infra.entity.AllocationEntity; +import com.example.demo.app.infra.entity.CategoryEntity; +import com.example.demo.app.infra.entity.UserEntity; +import com.example.demo.app.infra.repository.AllocationRepository; +import com.example.demo.app.infra.repository.CategoryRepository; +import com.example.demo.app.infra.repository.TransactionRepository; +import com.example.demo.app.infra.repository.UserRepository; import lombok.RequiredArgsConstructor; @@ -12,29 +24,119 @@ import lombok.RequiredArgsConstructor; public class AnalysisServiceImpl implements AnalysisService { //Repositoryの呼び出し -// private final TransactionRepository transactionRepository; -// private final AllocationRepository allocationRepository; -// private final UserRepository userRepository; -// private final CategoryRepository categoryRepository; + private final TransactionRepository transactionRepository; + private final AllocationRepository allocationRepository; + private final UserRepository userRepository; + private final CategoryRepository categoryRepository; @Override public AnalysisModel getAnalysis(Long userId) { // ユーザー情報取得、月別使用可能資金取得 + UserEntity userEntity = userRepository.findById(userId).orElseThrow(); + + // コースID取得 + Long courseId = userEntity.getCourseEntity().getCourseId(); + + // 月別使用可能資金取得 + Integer monthlyBudget =userEntity.getMonthlyBudget(); // 今月の期間取得 - // 前月の期間取得 - // 今月の支出取得 - // 前月の支出取得 - // コース配分取得 - // カテゴリ別集計 - // 前月との差額集計 - //総支出算出 - // コース限度額算出、コース別差額算出 - // CategoryAnalysisModel生成 - // AnalysisModelの生成 + LocalDate currentMonthStartDate = LocalDate.now().withDayOfMonth(1); + LocalDate currentMonthEndDate = LocalDate.now().withDayOfMonth(LocalDate.now().lengthOfMonth()); - return null; + // 前月の期間取得 + LocalDate previousMonthStartDate = LocalDate.now().minusMonths(1).withDayOfMonth(1); + LocalDate previousMonthEndDate = LocalDate.now().minusMonths(1).withDayOfMonth(LocalDate.now().minusMonths(1).lengthOfMonth()); + + // 今月の支出取得 + Integer currentMonthTotalAmount = transactionRepository.findTotalExpense(currentMonthStartDate, currentMonthEndDate, userId); + + if (currentMonthTotalAmount == null) { + currentMonthTotalAmount = 0; + } + + // 前月の支出取得 + Integer previousMonthTotalAmount = transactionRepository.findTotalExpense(previousMonthStartDate, previousMonthEndDate, userId); + + if (previousMonthTotalAmount == null) { + previousMonthTotalAmount = 0; + } + + //総支出差額算出 + Integer totalDifferenceAmount = currentMonthTotalAmount - previousMonthTotalAmount; + + //カテゴリ一覧取得 + List categoryAnalysisModelList = new ArrayList<>(); + List categoryEntityList = categoryRepository.findAll(); + List allocationEntityList = allocationRepository.findByCourseEntity_CourseId(courseId); + + //取得ループ + for (CategoryEntity categoryEntity : categoryEntityList) { + + if (categoryEntity.getTransactionType() != 0) { + continue; + } + // カテゴリ別今月金額取得 + Integer currentMonthAmount = + transactionRepository.findCategoryExpense(currentMonthStartDate, + currentMonthEndDate, + userId, + categoryEntity.getCategoryId()); + + // カテゴリ別前月金額取得 + Integer previousMonthAmount = + transactionRepository.findCategoryExpense(previousMonthStartDate, + previousMonthEndDate, + userId, + categoryEntity.getCategoryId()); + + if (currentMonthAmount == null) { + currentMonthAmount = 0; + } + + if (previousMonthAmount == null) { + previousMonthAmount = 0; + } + + // カテゴリ別前月差額算出 + Integer monthDifferenceAmount = currentMonthAmount - previousMonthAmount; + + // コース配分取得 + AllocationEntity allocationEntity = allocationEntityList.stream().filter(allocation -> + allocation.getCategoryEntity() + .getCategoryId() + .equals(categoryEntity.getCategoryId())) + .findFirst() + .orElse(null); + + Integer allocationRatio = 0; + + if (allocationEntity != null) { + allocationRatio = + allocationEntity.getAllocationRatio(); + } + + // コース限度額算出 + Integer courseLimitAmount = monthlyBudget * allocationRatio / 100; + + // コース差額算出 + Integer courseDifferenceAmount = currentMonthAmount - courseLimitAmount; + + // CategoryAnalysisModel生成 + CategoryAnalysisModel categoryAnalysisModel = new CategoryAnalysisModel( + categoryEntity.getCategoryName(), + currentMonthAmount, + previousMonthAmount, + monthDifferenceAmount, + courseLimitAmount, + courseDifferenceAmount); + + categoryAnalysisModelList.add(categoryAnalysisModel); + } + + // AnalysisModelの生成 + return new AnalysisModel(currentMonthTotalAmount, previousMonthTotalAmount, totalDifferenceAmount, categoryAnalysisModelList); } } diff --git a/src/main/java/com/example/demo/app/infra/repository/AllocationRepository.java b/src/main/java/com/example/demo/app/infra/repository/AllocationRepository.java index 5dc0ece..28656c2 100644 --- a/src/main/java/com/example/demo/app/infra/repository/AllocationRepository.java +++ b/src/main/java/com/example/demo/app/infra/repository/AllocationRepository.java @@ -28,5 +28,5 @@ public interface AllocationRepository extends JpaRepository findAllJoinedAllocation(); - + } diff --git a/src/main/java/com/example/demo/app/infra/repository/UserRepository.java b/src/main/java/com/example/demo/app/infra/repository/UserRepository.java index 239dba4..868dd8a 100644 --- a/src/main/java/com/example/demo/app/infra/repository/UserRepository.java +++ b/src/main/java/com/example/demo/app/infra/repository/UserRepository.java @@ -16,5 +16,6 @@ public interface UserRepository extends JpaRepository { String mailAddress, String password); + Optional findByMailAddress(String mailAddress); } diff --git a/src/main/java/com/example/demo/app/presentation/controller/AnalysisController.java b/src/main/java/com/example/demo/app/presentation/controller/AnalysisController.java index 905f2c3..5bc8cd9 100644 --- a/src/main/java/com/example/demo/app/presentation/controller/AnalysisController.java +++ b/src/main/java/com/example/demo/app/presentation/controller/AnalysisController.java @@ -1,10 +1,15 @@ package com.example.demo.app.presentation.controller; +import jakarta.servlet.http.HttpSession; + import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; +import com.example.demo.app.domain.model.AnalysisModel; +import com.example.demo.app.domain.model.LoginModel; import com.example.demo.app.domain.service.AnalysisService; +import com.example.demo.app.presentation.form.AnalysisForm; import lombok.RequiredArgsConstructor; @@ -16,13 +21,18 @@ public class AnalysisController { private final AnalysisService analysisService; @GetMapping("/analysis") - public String showAnalysis(Model model) { + public String showAnalysis(Model model, HttpSession session) { //ログインユーザーの取得(セッション) + LoginModel loginUser = (LoginModel) session.getAttribute("loginUser"); //分析結果の取得(Service) + AnalysisModel analysisModel = analysisService.getAnalysis(loginUser.getUserId()); + AnalysisForm analysisForm = AnalysisForm.convertFrom(analysisModel); + //model格納 + model.addAttribute("analysisForm", analysisForm); return "analysis"; } diff --git a/src/main/resources/templates/analysis.html b/src/main/resources/templates/analysis.html index 31b6d9b..55201dd 100644 --- a/src/main/resources/templates/analysis.html +++ b/src/main/resources/templates/analysis.html @@ -12,7 +12,7 @@ - + @@ -20,8 +20,17 @@ - - + +
カテゴリ別 支出 前月比
総支出¥234,000+¥38,000 + 0 + + 0 +
@@ -33,24 +42,42 @@ カテゴリ別 支出 - 前月比
コース比 + + 前月比 +
+ コース比 + - - 食費 - ¥34,000 - +¥8,000
+¥1,100 - - - 交通費 - ¥14,000 - +¥8,000
+¥1,100 - - - 日用品 - ¥4,000 - +¥8,000
+¥1,100 + + + + 食費 + + + + 0 + + + + + +
+ + + diff --git a/src/main/resources/templates/user_register_confirm.html b/src/main/resources/templates/user_register_confirm.html index aad56dd..2b35041 100644 --- a/src/main/resources/templates/user_register_confirm.html +++ b/src/main/resources/templates/user_register_confirm.html @@ -1,5 +1,5 @@ - + 新規会員登録確認