2段階目終了

This commit is contained in:
2026-10-13 15:30:22 +09:00
parent 74f67a9301
commit df39974a57
3 changed files with 159 additions and 0 deletions

View File

@@ -0,0 +1,6 @@
package com.example.rhizome.app.domain.service;
public interface DeleteDepartment {
void deleteDepartment(Integer idDepartment);
}

View File

@@ -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);
}
}

View File

@@ -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<EmployeeInfo> 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;
}
}