From 39aae6fd594bd210c38d481c55d0bcfc262501f6 Mon Sep 17 00:00:00 2001 From: n-kawahito Date: Thu, 10 Sep 2026 15:22:20 +0900 Subject: [PATCH] =?UTF-8?q?[EDIT]=E9=83=A8=E7=BD=B2=E5=89=8A=E9=99=A4?= =?UTF-8?q?=E6=A9=9F=E8=83=BD=E3=81=AE=E5=AE=9F=E6=96=BD?= 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 | 34 +++++ .../DeleteDepartmentController.java | 131 ++++++++++++++++++ 3 files changed, 170 insertions(+) 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..6638c58 --- /dev/null +++ b/src/main/java/com/example/rhizome/app/domain/service/impl/DeleteDepartmentImpl.java @@ -0,0 +1,34 @@ +package com.example.rhizome.app.domain.service.impl; + +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.DeleteDepartment; +import com.example.rhizome.app.infra.repository.DepartmentRepository; + +/** + * Employee レコード削除関連の機能を持つサービス + */ +@Service +@Transactional +public class DeleteDepartmentImpl implements DeleteDepartment { + + DepartmentRepository departmentRepository; + + @Autowired + public DeleteDepartmentImpl(DepartmentRepository departmentRepository) { + this.departmentRepository = departmentRepository; + } + + + /** + * idDepartment を元に department データを削除 + * + * @param idDepartment 削除対象のidDepartment + */ + public void deleteDepartment(Integer idDepartment) { + departmentRepository.deleteById(idDepartment); + } + +} 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..bcdbbca --- /dev/null +++ b/src/main/java/com/example/rhizome/app/presentation/controller/DeleteDepartmentController.java @@ -0,0 +1,131 @@ +package com.example.rhizome.app.presentation.controller; + + +import static com.example.rhizome.app.presentation.controller.pageproperty.TransitionTargetPageNameKeyword.*; + +import java.util.List; +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.aop.aspect.PermissionCheck; +import com.example.rhizome.aop.aspect.SessionCheck; +import com.example.rhizome.app.domain.model.Employee; +import com.example.rhizome.app.domain.model.LoginUser; +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.SessionKeyword; +import com.example.rhizome.app.presentation.controller.pageproperty.TransitionTargetPageNameKeyword; +import com.example.rhizome.app.presentation.form.DepartmentForm; +import com.example.rhizome.app.presentation.form.LoginUserForm; +import com.example.rhizome.app.presentation.form.MessageForm;; + +/** + * 削除処理のコントロータ + */ +@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(DeleteDepartment deleteDepartment, SearchDepartment searchDepartment, HttpSession httpSession, SearchEmployee searchEmployee) { + this.httpSession = httpSession; + this.deleteDepartment = deleteDepartment; + this.searchDepartment = searchDepartment; + this.searchEmployee = searchEmployee; + } + + /** + * 削除処理のコントローラ + * + * @param idDepartment 削除対象のdepartmentId + * @param model ビューにデータを渡すためのコンテナ + * @return 遷移先の画面 + */ + @PermissionCheck + @SessionCheck + @RequestMapping(value = DELETE_DEPARTMENT, method = RequestMethod.POST) + public String deleteDepartment(@RequestParam("idDepartment") Integer idDepartment, Model model) { + + try { + // 部署一覧を取得し、画面に返す用のクラスに詰め替える + // 作成した部署一覧をセット + model.addAttribute( + PageReturnAttributeKeyword.DEPARTMENT_FORM_LIST, + DepartmentForm.convertFrom(searchDepartment.selectAll()) + ); + + // 削除処理実施 + deleteExec( + model, + idDepartment, + LoginUserForm.convertTo((LoginUserForm) httpSession.getAttribute(SessionKeyword.LOGIN_USER))); + + // 検索画面に遷移 + return "forward:" + TransitionTargetPageNameKeyword.SELECT_DEPARTMENT_INFO_FORM_EMPTY; + + } catch (Exception e) { + // ログイン情報の破棄 + httpSession.invalidate(); + + e.printStackTrace(); + // エラーログ出力 + LOGGER.log(Level.SEVERE, SEVERE_ERROR_MESSAGE, e); + // エラー画面遷移 + return TransitionTargetPageNameKeyword.ERROR_HTML; + } + } + + /** + * 削除処理実施 + * + * @param model ビューにデータを渡すためのコンテナ + * @param idEmployee 削除対象のemployeeId + * @param loginUser ログインユーザー情報 + */ + private void deleteExec(Model model, Integer idDepartment, LoginUser loginUser) { + + final String DELETE_TARGET_ID_CAN_NOT_DELETE = "1名以上が所属している部署は削除出来ません。"; + final String DELETE_COMPLETE = "削除しました。"; + + List employeeList = + searchEmployee.searchEmployeeByIdDepartment(idDepartment); + + if (!employeeList.isEmpty()) { + + model.addAttribute( + PageReturnAttributeKeyword.MESSAGE_ERROR, + new MessageForm(DELETE_TARGET_ID_CAN_NOT_DELETE) + ); + + return; + } + + // 削除を実施 + deleteDepartment.deleteDepartment(idDepartment); + + // 削除完了したメッセージをセット + model.addAttribute(PageReturnAttributeKeyword.MESSAGE_INFO, new MessageForm(DELETE_COMPLETE)); + + } +}