From df39974a57dcf1280d03e430ff7c820cba7c305f Mon Sep 17 00:00:00 2001 From: t-eguchi <26-t-eguchi-tmn@it-college.co.jp> Date: Tue, 13 Oct 2026 15:30:22 +0900 Subject: [PATCH] =?UTF-8?q?2=E6=AE=B5=E9=9A=8E=E7=9B=AE=E7=B5=82=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/domain/service/DeleteDepartment.java | 6 + .../service/impl/DeleteDepartmentImpl.java | 26 ++++ .../DeleteDepartmentController.java | 127 ++++++++++++++++++ 3 files changed, 159 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..e075b30 --- /dev/null +++ b/src/main/java/com/example/rhizome/app/domain/service/DeleteDepartment.java @@ -0,0 +1,6 @@ +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..9bedc7e --- /dev/null +++ b/src/main/java/com/example/rhizome/app/domain/service/impl/DeleteDepartmentImpl.java @@ -0,0 +1,26 @@ +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; + +@Service +@Transactional +public class DeleteDepartmentImpl implements DeleteDepartment { + + DepartmentRepository departmentRepository; + @Autowired + public DeleteDepartmentImpl(DepartmentRepository departmentRepository) { + this.departmentRepository = departmentRepository; + } + + + 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..1b66358 --- /dev/null +++ b/src/main/java/com/example/rhizome/app/presentation/controller/DeleteDepartmentController.java @@ -0,0 +1,127 @@ +package com.example.rhizome.app.presentation.controller; + +import java.util.List; +import java.util.Objects; +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.EmployeeInfo; +import com.example.rhizome.app.domain.model.LoginUser; +import com.example.rhizome.app.domain.model.SearchConditionEmployee; +import com.example.rhizome.app.domain.service.DeleteDepartment; +import com.example.rhizome.app.domain.service.SearchDepartment; +import com.example.rhizome.app.domain.service.SearchEmployeeInfo; +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; +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 = "エラーが発生しました!"; + + private final HttpSession httpSession; + private final DeleteDepartment deleteDepartment; + private final SearchDepartment searchDepartment; + private final SearchEmployeeInfo searchEmployeeInfo; + + @Autowired + public DeleteDepartmentController(DeleteDepartment deleteDepartment, SearchDepartment searchDepartment, + SearchEmployeeInfo searchEmployeeInfo, HttpSession httpSession) { + this.httpSession = httpSession; + this.deleteDepartment = deleteDepartment; + this.searchDepartment = searchDepartment; + this.searchEmployeeInfo = searchEmployeeInfo; + } + + @PermissionCheck + @SessionCheck + @RequestMapping(value = "/deleteDepartment", method = RequestMethod.POST) + public String deleteDepartment(@RequestParam(value = "idDepartment", required = false) Integer idDepartment, + Model model) { + + try { + // 削除対象の部署IDが存在しない場合 + if (idDepartment == null) { + model.addAttribute(PageReturnAttributeKeyword.MESSAGE_ERROR, new MessageForm("削除対象のIDが不明です。")); + model.addAttribute(PageReturnAttributeKeyword.DEPARTMENT_FORM_LIST, + DepartmentForm.convertFrom(searchDepartment.selectAll())); + return TransitionTargetPageNameKeyword.SELECT_DEPARTMENT_HTML; + } + + // ログインユーザー情報を取得 + LoginUser loginUser = LoginUserForm + .convertTo((LoginUserForm) httpSession.getAttribute(SessionKeyword.LOGIN_USER)); + + // 削除バリデーションと削除の実行 + deleteExec(model, idDepartment, loginUser); + + // 最新の部署一覧を再取得してセット + model.addAttribute( + PageReturnAttributeKeyword.DEPARTMENT_FORM_LIST, + DepartmentForm.convertFrom(searchDepartment.selectAll())); + + model.addAttribute("searchConditionDepartmentForm", new SearchConditionDepartmentForm()); + + return TransitionTargetPageNameKeyword.SELECT_DEPARTMENT_HTML; + + } catch (Exception e) { + httpSession.invalidate(); + e.printStackTrace(); + LOGGER.log(Level.SEVERE, SEVERE_ERROR_MESSAGE, e); + return TransitionTargetPageNameKeyword.ERROR_HTML; + } + } + + private boolean deleteExec(Model model, Integer idDepartment, LoginUser loginUser) { + final String DELETE_TARGET_ID_CAN_NOT_DELETE = "ログイン者自身は削除出来ません。"; + final String BELONG_EMPLOYEE_EXIST_ERROR = "1名以上が所属している部署は削除出来ません。"; + final String DELETE_COMPLETE = "削除しました。"; + + // ログイン者自身の部署削除ブロック + if (loginUser != null && Objects.equals(loginUser.getIdDepartment(), idDepartment)) { + model.addAttribute(PageReturnAttributeKeyword.MESSAGE_ERROR, + new MessageForm(DELETE_TARGET_ID_CAN_NOT_DELETE)); + return false; + } + + SearchConditionEmployee searchCondition = new SearchConditionEmployee( + null, + null, + null, + null, + idDepartment); + + // 社員検索サービスを呼び出す + List employeeList = searchEmployeeInfo.searchBy(searchCondition); + + // 1件以上レコードが返ってきた(所属社員がいた)場合は削除を中断 + if (employeeList != null && !employeeList.isEmpty()) { + model.addAttribute(PageReturnAttributeKeyword.MESSAGE_ERROR, new MessageForm(BELONG_EMPLOYEE_EXIST_ERROR)); + return false; + } + + // すべてのバリデーションチェックを通過したら削除を実施 + deleteDepartment.deleteDepartment(idDepartment); + + // 削除完了メッセージをセット(画面側のアラートボックスと連動) + model.addAttribute(PageReturnAttributeKeyword.MESSAGE_INFO, new MessageForm(DELETE_COMPLETE)); + return true; + } +}