From b08d51d187a5f6368b006460d2b81f4efb581481 Mon Sep 17 00:00:00 2001 From: a-takayama <26-a-takayama-scm@it-college.co.jp> Date: Wed, 14 Oct 2026 16:50:59 +0900 Subject: [PATCH] =?UTF-8?q?2=E6=AE=B5=E9=9A=8E=5F=E9=80=94=E4=B8=AD?= =?UTF-8?q?=E3=81=BE=E3=81=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/domain/service/DeleteDepartment.java | 5 + .../service/impl/DeleteDepartmentImpl.java | 22 +++ .../service/impl/DeleteEmployeeImpl.java | 6 +- .../DeleteDepartmentController.java | 72 ++++++++++ .../SelectDepartmentController.java | 131 +++++++++--------- .../controller/SelectEmployeeController.java | 2 + .../TransitionTargetPageNameKeyword.java | 6 + .../resources/templates/selectDepartment.html | 13 ++ 8 files changed, 193 insertions(+), 64 deletions(-) create mode 100644 src/main/java/com/example/rhizome/app/domain/service/DeleteDepartment.java create mode 100644 src/main/java/com/example/rhizome/app/domain/service/impl/DeleteDepartmentImpl.java create mode 100644 src/main/java/com/example/rhizome/app/presentation/controller/DeleteDepartmentController.java diff --git a/src/main/java/com/example/rhizome/app/domain/service/DeleteDepartment.java b/src/main/java/com/example/rhizome/app/domain/service/DeleteDepartment.java new file mode 100644 index 0000000..3c6ce34 --- /dev/null +++ b/src/main/java/com/example/rhizome/app/domain/service/DeleteDepartment.java @@ -0,0 +1,5 @@ +package com.example.rhizome.app.domain.service; + +public interface DeleteDepartment { + void deleteDepartment(Integer idDepartment); +} diff --git a/src/main/java/com/example/rhizome/app/domain/service/impl/DeleteDepartmentImpl.java b/src/main/java/com/example/rhizome/app/domain/service/impl/DeleteDepartmentImpl.java new file mode 100644 index 0000000..b566fd9 --- /dev/null +++ b/src/main/java/com/example/rhizome/app/domain/service/impl/DeleteDepartmentImpl.java @@ -0,0 +1,22 @@ +package com.example.rhizome.app.domain.service.impl; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.example.rhizome.app.domain.service.DeleteDepartment; +import com.example.rhizome.app.infra.repository.DepartmentRepository; + +public class DeleteDepartmentImpl implements DeleteDepartment { + DepartmentRepository departmentRepository; + + @Autowired + public DeleteDepartmentImpl(DepartmentRepository departmentRepository) { + this.departmentRepository = departmentRepository; + } + + public void deleteDepartment(Integer idDepartment) { + // ★考える:Repository のどのメソッドで「IDを指定して削除」できる? + // (お手本の DeleteEmployeeImpl を見る) + departmentRepository.deleteById(idDepartment); + } + +} diff --git a/src/main/java/com/example/rhizome/app/domain/service/impl/DeleteEmployeeImpl.java b/src/main/java/com/example/rhizome/app/domain/service/impl/DeleteEmployeeImpl.java index ca5a67a..b8df6dc 100644 --- a/src/main/java/com/example/rhizome/app/domain/service/impl/DeleteEmployeeImpl.java +++ b/src/main/java/com/example/rhizome/app/domain/service/impl/DeleteEmployeeImpl.java @@ -1,11 +1,13 @@ package com.example.rhizome.app.domain.service.impl; -import com.example.rhizome.app.domain.service.DeleteEmployee; -import com.example.rhizome.app.infra.repository.EmployeeRepository; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import com.example.rhizome.app.domain.service.DeleteEmployee; +import com.example.rhizome.app.infra.repository.EmployeeRepository; + /** * Employee レコード削除関連の機能を持つサービス */ diff --git a/src/main/java/com/example/rhizome/app/presentation/controller/DeleteDepartmentController.java b/src/main/java/com/example/rhizome/app/presentation/controller/DeleteDepartmentController.java new file mode 100644 index 0000000..467eb0b --- /dev/null +++ b/src/main/java/com/example/rhizome/app/presentation/controller/DeleteDepartmentController.java @@ -0,0 +1,72 @@ +package com.example.rhizome.app.presentation.controller; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.servlet.http.HttpSession; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import com.example.rhizome.app.domain.service.DeleteDepartment; +import com.example.rhizome.app.domain.service.SearchDepartment; +import com.example.rhizome.app.domain.service.SearchEmployee; +import com.example.rhizome.app.presentation.controller.pageproperty.PageReturnAttributeKeyword; +import com.example.rhizome.app.presentation.controller.pageproperty.TransitionTargetPageNameKeyword; +import com.example.rhizome.app.presentation.form.DepartmentForm; +import com.example.rhizome.app.presentation.form.SearchConditionDepartmentForm; + +@Controller +public class DeleteDepartmentController { + private final static Logger LOGGER = Logger.getLogger(DeleteDepartmentController.class.getName()); + private final static String SEVERE_ERROR_MESSAGE = "エラーが発生しました!"; + + HttpSession httpSession; + DeleteDepartment deleteDepartment; + SearchDepartment searchDepartment; + SearchEmployee searchEmployee; // 所属社員の確認に使う(既存) + + //コンストラクタ + @Autowired + public DeleteDepartmentController(HttpSession httpSession, DeleteDepartment deleteDepartment, + SearchDepartment searchDepartment, SearchEmployee searchEmployee) { + this.httpSession = httpSession; + this.deleteDepartment = deleteDepartment; + this.searchDepartment = searchDepartment; + this.searchEmployee = searchEmployee; + } + + @RequestMapping(value = TransitionTargetPageNameKeyword.DELETE_DEPARTMENT, method = RequestMethod.POST) + public String deleteDepartment(@RequestParam(value = "idDepartment", required = false) Integer idDepartment, Model model) { + + final String UNKNOWN_ID = "削除対象のIDが不明です。"; + final String HAS_EMPLOYEE = "1名以上が所属している部署は削除出来ません。"; + final String DELETE_COMPLETE = "削除しました。"; + + try { + // ★① idDepartment が null、または searchDepartment.searchBy(new SearchConditionDepartment(idDepartment, null)) が空 + // → MESSAGE_ERROR に UNKNOWN_ID を載せて一覧へ + deleteDepartment.deleteDepartment(idDepartment); + // ★② searchEmployee.searchEmployeeByIdDepartment(idDepartment) が空でない + // → MESSAGE_ERROR に HAS_EMPLOYEE を載せて一覧へ + model.addAttribute(PageReturnAttributeKeyword.DEPARTMENT_FORM_LIST,DepartmentForm.convertFrom(searchDepartment.selectAll())); + // ★③ deleteDepartment.deleteDepartment(idDepartment) → MESSAGE_INFO に DELETE_COMPLETE を載せて一覧へ + model.addAttribute("searchConditinDepartmentForm", new SearchConditionDepartmentForm()); + +// return "一覧へ戻る(ステップ 2-5 で決める)"; + return TransitionTargetPageNameKeyword.SELECT_DEPARTMENT_HTML; + } catch (Exception e) { + + httpSession.invalidate(); + e.printStackTrace(); + LOGGER.log(Level.SEVERE, SEVERE_ERROR_MESSAGE, e); + model.addAttribute(PageReturnAttributeKeyword.MESSAGE_ERROR,"部署を削除できませんでした"); +// return TransitionTargetPageNameKeyword.ERROR_HTML; + return TransitionTargetPageNameKeyword.SELECT_DEPARTMENT_HTML; + } + } +} diff --git a/src/main/java/com/example/rhizome/app/presentation/controller/SelectDepartmentController.java b/src/main/java/com/example/rhizome/app/presentation/controller/SelectDepartmentController.java index 497e7ce..9cbe53c 100644 --- a/src/main/java/com/example/rhizome/app/presentation/controller/SelectDepartmentController.java +++ b/src/main/java/com/example/rhizome/app/presentation/controller/SelectDepartmentController.java @@ -1,6 +1,5 @@ package com.example.rhizome.app.presentation.controller; - import java.util.logging.Level; import java.util.logging.Logger; //import java.util.List; @@ -28,69 +27,80 @@ import com.example.rhizome.app.presentation.form.SearchConditionDepartmentForm; @Controller public class SelectDepartmentController { - // ログ出力用インスタンス - private final static Logger LOGGER = Logger.getLogger(SelectDepartmentController.class.getName()); - // エラーメッセージ用の定数フィールド - private final static String SEVERE_ERROR_MESSAGE = "エラーが発生しました!"; + // ログ出力用インスタンス + private final static Logger LOGGER = Logger.getLogger(SelectDepartmentController.class.getName()); + // エラーメッセージ用の定数フィールド + private final static String SEVERE_ERROR_MESSAGE = "エラーが発生しました!"; -// private static final String DEPARTMENT_HTML = "/department"; - - HttpSession httpSession; - SearchDepartment searchDepartment; - + // public static final String SELECT_DEPARTMENT_FORM_EMPTY = "/selectDepartmentAll"; - @Autowired - public SelectDepartmentController (HttpSession httpSession, SearchDepartment serchDepartment) { - this.httpSession = httpSession; - this.searchDepartment = serchDepartment; - } + // private static final String DEPARTMENT_HTML = "/department"; - //空の検索条件FormをこのControllerの画面用に用意する - @ModelAttribute - public SearchConditionDepartmentForm searchConditionDepartmentForm() { - return new SearchConditionDepartmentForm(); - } - - @RequestMapping(value = TransitionTargetPageNameKeyword.SELECT_DEPARTMENT, method = RequestMethod.POST) - public String select(SearchConditionDepartmentForm searchConditionDepartmentForm, Model model) { - try { - // ★考える:①検索サービスを呼ぶ(Form→Model変換 → 部分一致のメソッド) - // ②結果(List)を DepartmentForm.convertFrom(...) で画面用に変換 - // ③ model に PageReturnAttributeKeyword.DEPARTMENT_FORM_LIST という名前で載せる - model.addAttribute(PageReturnAttributeKeyword.DEPARTMENT_FORM_LIST,DepartmentForm - .convertFrom(searchDepartment.searchByWithLike(SearchConditionDepartmentForm - .convertTo(searchConditionDepartmentForm) - ) - ) - ); - - return TransitionTargetPageNameKeyword.SELECT_DEPARTMENT_HTML; - }catch(Exception e) { - //httpSessionを破棄 - httpSession.invalidate(); - - //エラー内容を出力 - e.printStackTrace(); - - //ログにエラーを記録 - LOGGER.log(Level.SEVERE, SEVERE_ERROR_MESSAGE, e); - - //エラー画面へ遷移 - return TransitionTargetPageNameKeyword.ERROR_HTML; - } - } + HttpSession httpSession; + SearchDepartment searchDepartment; + + @Autowired + public SelectDepartmentController(HttpSession httpSession, SearchDepartment serchDepartment) { + this.httpSession = httpSession; + this.searchDepartment = serchDepartment; + } + + //空の検索条件FormをこのControllerの画面用に用意する + @ModelAttribute + public SearchConditionDepartmentForm searchConditionDepartmentForm() { + return new SearchConditionDepartmentForm(); + } + + @RequestMapping(value = TransitionTargetPageNameKeyword.SELECT_DEPARTMENT, method = RequestMethod.POST) + public String select(SearchConditionDepartmentForm searchConditionDepartmentForm, Model model) { + try { + // ★考える:①検索サービスを呼ぶ(Form→Model変換 → 部分一致のメソッド) + // ②結果(List)を DepartmentForm.convertFrom(...) で画面用に変換 + // ③ model に PageReturnAttributeKeyword.DEPARTMENT_FORM_LIST という名前で載せる + model.addAttribute(PageReturnAttributeKeyword.DEPARTMENT_FORM_LIST, DepartmentForm + .convertFrom(searchDepartment.searchByWithLike(SearchConditionDepartmentForm + .convertTo(searchConditionDepartmentForm)))); + + return TransitionTargetPageNameKeyword.SELECT_DEPARTMENT_HTML; + } catch (Exception e) { + //httpSessionを破棄 + httpSession.invalidate(); + + //エラー内容を出力 + e.printStackTrace(); + + //ログにエラーを記録 + LOGGER.log(Level.SEVERE, SEVERE_ERROR_MESSAGE, e); + + //エラー画面へ遷移 + return TransitionTargetPageNameKeyword.ERROR_HTML; + } + } + + @RequestMapping(value = TransitionTargetPageNameKeyword.SELECT_DEPARTMENT_FORM_EMPTY, method = RequestMethod.POST) + public String select(Model model) { + try { + // ★全件取得 → DepartmentForm に変換 → DEPARTMENT_FORM_LIST で model へ + return TransitionTargetPageNameKeyword.SELECT_DEPARTMENT_HTML; + } catch (Exception e) { + httpSession.invalidate(); + e.printStackTrace(); + LOGGER.log(Level.SEVERE, SEVERE_ERROR_MESSAGE, e); + return TransitionTargetPageNameKeyword.ERROR_HTML; + + } + + } } - - - /** - * 社員検索画面表示処理コントローラ - * - * @param searchConditionEmployeeForm 検索画面のフォーム - * @param model ビューにデータを渡すためのコンテナ - * @return 遷移先の画面 - */ - +/** + * 社員検索画面表示処理コントローラ + * + * @param searchConditionEmployeeForm 検索画面のフォーム + * @param model ビューにデータを渡すためのコンテナ + * @return 遷移先の画面 + */ + // @PermissionCheck // @SessionCheck // @RequestMapping(value = TransitionTargetPageNameKeyword.SELECT_DEPARTMENT, @@ -109,12 +119,9 @@ public class SelectDepartmentController { // SearchConditionEmployeeForm.convertTo(searchConditionEmployeeForm()) // ); - // /** // * 社員検索画面表示処理コントローラ // * 検索条件無しの状態を作るため、空の検索条件で検索した結果を画面に返す // * // * @param model ビューにデータを渡すためのコンテナ // * @return 遷移先の画面 - - diff --git a/src/main/java/com/example/rhizome/app/presentation/controller/SelectEmployeeController.java b/src/main/java/com/example/rhizome/app/presentation/controller/SelectEmployeeController.java index 2c5c19d..c7c9631 100644 --- a/src/main/java/com/example/rhizome/app/presentation/controller/SelectEmployeeController.java +++ b/src/main/java/com/example/rhizome/app/presentation/controller/SelectEmployeeController.java @@ -32,6 +32,8 @@ public class SelectEmployeeController { private final static Logger LOGGER = Logger.getLogger(SelectEmployeeController.class.getName()); // エラーメッセージ用の定数フィールド private final static String SEVERE_ERROR_MESSAGE = "エラーが発生しました!"; + + public static final String SELECT_DEPARTMENT_FORM_EMPTY = "/selectDepartmentAll"; HttpSession httpSession; SearchDepartment searchDepartment; diff --git a/src/main/java/com/example/rhizome/app/presentation/controller/pageproperty/TransitionTargetPageNameKeyword.java b/src/main/java/com/example/rhizome/app/presentation/controller/pageproperty/TransitionTargetPageNameKeyword.java index 848dbbf..22bb6b5 100644 --- a/src/main/java/com/example/rhizome/app/presentation/controller/pageproperty/TransitionTargetPageNameKeyword.java +++ b/src/main/java/com/example/rhizome/app/presentation/controller/pageproperty/TransitionTargetPageNameKeyword.java @@ -56,8 +56,14 @@ public class TransitionTargetPageNameKeyword { // Department // HTML 実装手順書ステップ1-2通りの定数追加 public static final String SELECT_DEPARTMENT_HTML = "selectDepartment"; + // Controller 実装手順書ステップ1-2通りの定数追加 -> 管理者向けと重複、エラーでたため一旦コメアウト public static final String SELECT_DEPARTMENT = "/selectDepartment"; + + // ステップ2-3*TransitionTargetPageNameKeyword の Department(Controller) の枠に追記 + public static final String DELETE_DEPARTMENT = "/deleteDepartment"; + + public static final String SELECT_DEPARTMENT_FORM_EMPTY = "/selectDepartmentAll"; /** * 管理者向けのページリストを返す diff --git a/src/main/resources/templates/selectDepartment.html b/src/main/resources/templates/selectDepartment.html index 0a383ca..bca876f 100644 --- a/src/main/resources/templates/selectDepartment.html +++ b/src/main/resources/templates/selectDepartment.html @@ -1,4 +1,17 @@ + + + + + + + + + + + + +