From a5e0d976a6ce1514710c62dc2ee75c63dce66ad2 Mon Sep 17 00:00:00 2001 From: kkazuya Date: Thu, 10 Sep 2026 13:43:43 +0900 Subject: [PATCH] =?UTF-8?q?[add]=20=E9=83=A8=E7=BD=B2=E6=83=85=E5=A0=B1?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=A9=9F=E8=83=BD=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/domain/service/UpdateDepartment.java | 7 ++ .../service/impl/UpdateDepartmentImpl.java | 35 ++++++ .../UpdateDepartmentController.java | 88 +++++++++++++++ .../UpdateDepartmentResultController.java | 105 ++++++++++++++++++ .../form/UpdateDepartmentForm.java | 50 +++++++++ .../templates/updateDepartmentInput.html | 88 +++++++++++++++ 6 files changed, 373 insertions(+) create mode 100644 src/main/java/com/example/rhizome/app/domain/service/UpdateDepartment.java create mode 100644 src/main/java/com/example/rhizome/app/domain/service/impl/UpdateDepartmentImpl.java create mode 100644 src/main/java/com/example/rhizome/app/presentation/controller/UpdateDepartmentController.java create mode 100644 src/main/java/com/example/rhizome/app/presentation/controller/UpdateDepartmentResultController.java create mode 100644 src/main/java/com/example/rhizome/app/presentation/form/UpdateDepartmentForm.java create mode 100644 src/main/resources/templates/updateDepartmentInput.html diff --git a/src/main/java/com/example/rhizome/app/domain/service/UpdateDepartment.java b/src/main/java/com/example/rhizome/app/domain/service/UpdateDepartment.java new file mode 100644 index 0000000..8adbad8 --- /dev/null +++ b/src/main/java/com/example/rhizome/app/domain/service/UpdateDepartment.java @@ -0,0 +1,7 @@ +package com.example.rhizome.app.domain.service; + +import com.example.rhizome.app.domain.model.Department; + +public interface UpdateDepartment { + void updateDepartment(Department beforeDepartment, Department updateDepartment); +} diff --git a/src/main/java/com/example/rhizome/app/domain/service/impl/UpdateDepartmentImpl.java b/src/main/java/com/example/rhizome/app/domain/service/impl/UpdateDepartmentImpl.java new file mode 100644 index 0000000..29e488d --- /dev/null +++ b/src/main/java/com/example/rhizome/app/domain/service/impl/UpdateDepartmentImpl.java @@ -0,0 +1,35 @@ +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.model.Department; +import com.example.rhizome.app.domain.service.UpdateDepartment; +import com.example.rhizome.app.infra.entity.DepartmentEntity; +import com.example.rhizome.app.infra.repository.DepartmentRepository; + +@Service +@Transactional +public class UpdateDepartmentImpl implements UpdateDepartment { + + DepartmentRepository departmentRepository; + + @Autowired + public UpdateDepartmentImpl(DepartmentRepository departmentRepository) { + this.departmentRepository = departmentRepository; + } + + + public void updateDepartment(Department beforeDepartment, Department updateDepartment) { + departmentRepository.save(DepartmentEntity.convertFrom(mergeDepartment(beforeDepartment, updateDepartment))); + } + + private Department mergeDepartment(Department beforeDepartment, Department updateDepartment) { + return new Department( + updateDepartment.getIdDepartment(), + updateDepartment.getNmDepartment() + ); + } + +} diff --git a/src/main/java/com/example/rhizome/app/presentation/controller/UpdateDepartmentController.java b/src/main/java/com/example/rhizome/app/presentation/controller/UpdateDepartmentController.java new file mode 100644 index 0000000..db0f371 --- /dev/null +++ b/src/main/java/com/example/rhizome/app/presentation/controller/UpdateDepartmentController.java @@ -0,0 +1,88 @@ +package com.example.rhizome.app.presentation.controller; + +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.ModelAttribute; +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.Department; +import com.example.rhizome.app.domain.model.SearchConditionDepartment; +import com.example.rhizome.app.domain.service.SearchDepartment; +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.MessageForm; +import com.example.rhizome.app.presentation.form.SearchConditionDepartmentForm; +import com.example.rhizome.app.presentation.form.UpdateDepartmentForm; + + +@Controller +public class UpdateDepartmentController { + + // ログ出力用インスタンス + private final static Logger LOGGER = Logger.getLogger(UpdateEmployeeController.class.getName()); + // エラーメッセージ用の定数フィールド + private final static String SEVERE_ERROR_MESSAGE = "エラーが発生しました!"; + + HttpSession httpSession; + SearchDepartment searchDepartment; + + @Autowired + public UpdateDepartmentController(HttpSession httpSession, + SearchDepartment searchDepartment) { + this.httpSession = httpSession; + this.searchDepartment = searchDepartment; + } + + @ModelAttribute + public SearchConditionDepartmentForm searchConditionDepartmentForm() { + return new SearchConditionDepartmentForm(); + } + + /** + * 更新対象の department が存在するか確認する為のコントローラ + * + * @param idDepartment 更新対象の department の id + * @param model ビューにデータを渡すためのコンテナ + * @return 遷移先の画面 + */ + @PermissionCheck + @SessionCheck + @RequestMapping(value = TransitionTargetPageNameKeyword.SHOW_UPDATE_DEPARTMENT, method=RequestMethod.POST) + public String showUpdateDepartment(@RequestParam("idDepartment") Integer idDepartment, Model model) { + final String UPDATE_TARGET_ID_NOT_FOUND = "更新対象のデータが見つかりません。"; + + try { + List departmentList = searchDepartment.searchBy( + new SearchConditionDepartment(idDepartment, null) + ); + + if (departmentList.isEmpty()) { + model.addAttribute(PageReturnAttributeKeyword.MESSAGE_ERROR, new MessageForm(UPDATE_TARGET_ID_NOT_FOUND)); + return "forward:" + TransitionTargetPageNameKeyword.SELECT_DEPARTMENT_INFO; + } + + model.addAttribute(PageReturnAttributeKeyword.UPDATE_DEPARTMENT_FORM, UpdateDepartmentForm.convertFrom(departmentList.get(0))); + + return TransitionTargetPageNameKeyword.UPDATE_DEPARTMENT_INPUT_HTML; + } catch (Exception e) { + httpSession.invalidate(); + + e.printStackTrace(); + + LOGGER.log(Level.SEVERE, SEVERE_ERROR_MESSAGE, e); + + return TransitionTargetPageNameKeyword.ERROR_HTML; + } + } +} diff --git a/src/main/java/com/example/rhizome/app/presentation/controller/UpdateDepartmentResultController.java b/src/main/java/com/example/rhizome/app/presentation/controller/UpdateDepartmentResultController.java new file mode 100644 index 0000000..74b5123 --- /dev/null +++ b/src/main/java/com/example/rhizome/app/presentation/controller/UpdateDepartmentResultController.java @@ -0,0 +1,105 @@ +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.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import com.example.rhizome.aop.aspect.PermissionCheck; +import com.example.rhizome.aop.aspect.SessionCheck; +import com.example.rhizome.app.domain.model.Department; +import com.example.rhizome.app.domain.service.SearchDepartment; +import com.example.rhizome.app.domain.service.UpdateDepartment; +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.MessageForm; +import com.example.rhizome.app.presentation.form.UpdateDepartmentForm; + +@Controller +public class UpdateDepartmentResultController { + + private final static Logger LOGGER = Logger.getLogger(UpdateDepartmentController.class.getName()); + + private final static String SEVERE_ERROR_MESSAGE = "エラーが発生しました!"; + + HttpSession httpSession; + SearchDepartment searchDepartment; + UpdateDepartment updateDepartment; + + @Autowired + public UpdateDepartmentResultController(HttpSession httpSession, SearchDepartment searchDepartment, UpdateDepartment updateDepartment) { + this.httpSession = httpSession; + this.searchDepartment = searchDepartment; + this.updateDepartment = updateDepartment; + } + + private static boolean checkDuplicateNmDepartment(List departmentList, UpdateDepartmentForm updateDepartmentForm) { + if(!departmentList.isEmpty()) { + return !Objects.equals(departmentList.get(0).getNmDepartment(), updateDepartmentForm.getNmDepartment()); + } + return true; + } + + @PermissionCheck + @SessionCheck + @RequestMapping(value = TransitionTargetPageNameKeyword.UPDATE_DEPARTMENT_RESULT, method = RequestMethod.POST) + public String departmentUpdateResult(@ModelAttribute UpdateDepartmentForm updateDepartmentForm, Model model) { + + final String DUPLICATION = "既に同名の部署が存在するか、値が変更されていません。"; + final String NOTHING = "項目が空欄です。"; + final String NO_TARGET = "更新対象のデータが見つかりません。"; + + final String UPDATE_COMPLETE = "更新が完了しました。"; + + try { + List departmentList = searchDepartment.searchDepartment(updateDepartmentForm.getNmDepartment()); + + if (!checkDuplicateNmDepartment(departmentList, updateDepartmentForm)) { + model.addAttribute(PageReturnAttributeKeyword.MESSAGE_ERROR, new MessageForm(DUPLICATION)); + model.addAttribute(PageReturnAttributeKeyword.UPDATE_DEPARTMENT_FORM, updateDepartmentForm); + + return TransitionTargetPageNameKeyword.UPDATE_DEPARTMENT_INPUT_HTML; + } + + if (!UpdateDepartmentForm.hasErrorParameter(updateDepartmentForm)) { + model.addAttribute(PageReturnAttributeKeyword.MESSAGE_ERROR, new MessageForm(NOTHING)); + model.addAttribute(PageReturnAttributeKeyword.UPDATE_DEPARTMENT_FORM, updateDepartmentForm); + + return TransitionTargetPageNameKeyword.UPDATE_DEPARTMENT_INPUT_HTML; + } + + Department beforeDepartment = searchDepartment.searchDepartmentById(updateDepartmentForm.getIdDepartment()).get(0); + if (beforeDepartment.getIdDepartment() == null) { + model.addAttribute(PageReturnAttributeKeyword.MESSAGE_ERROR, new MessageForm(NO_TARGET)); + model.addAttribute(PageReturnAttributeKeyword.UPDATE_DEPARTMENT_FORM, updateDepartmentForm); + + return TransitionTargetPageNameKeyword.UPDATE_DEPARTMENT_INPUT_HTML; + } + + updateDepartment.updateDepartment(beforeDepartment, UpdateDepartmentForm.counvertTo(updateDepartmentForm)); + + model.addAttribute(PageReturnAttributeKeyword.MESSAGE_INFO, new MessageForm(UPDATE_COMPLETE)); + + 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; + } + } + +} diff --git a/src/main/java/com/example/rhizome/app/presentation/form/UpdateDepartmentForm.java b/src/main/java/com/example/rhizome/app/presentation/form/UpdateDepartmentForm.java new file mode 100644 index 0000000..137ed1b --- /dev/null +++ b/src/main/java/com/example/rhizome/app/presentation/form/UpdateDepartmentForm.java @@ -0,0 +1,50 @@ +package com.example.rhizome.app.presentation.form; + +import java.util.List; + +import com.example.rhizome.app.domain.model.Department; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UpdateDepartmentForm { + + private Integer idDepartment; + + private String nmDepartment; + + public static UpdateDepartmentForm convertFrom(Department department) { + return new UpdateDepartmentForm( + department.getIdDepartment(), + department.getNmDepartment() + ); + } + + public static List counvertFrom(List departmentList){ + return departmentList.stream().map(UpdateDepartmentForm::convertFrom).toList(); + } + + public static Department counvertTo(UpdateDepartmentForm updateDepartmentForm) { + return new Department( + updateDepartmentForm.getIdDepartment(), + updateDepartmentForm.getNmDepartment() + ); + } + + public static boolean hasErrorParameter(UpdateDepartmentForm updateDeaprtmentForm) { + boolean errorFlag = !isNullOrBlank(updateDeaprtmentForm.getNmDepartment()); + + return errorFlag; + } + + private static boolean isNullOrBlank(String str) { + if (null == str) { + return true; + } + return str.isBlank(); + } +} diff --git a/src/main/resources/templates/updateDepartmentInput.html b/src/main/resources/templates/updateDepartmentInput.html new file mode 100644 index 0000000..30cd475 --- /dev/null +++ b/src/main/resources/templates/updateDepartmentInput.html @@ -0,0 +1,88 @@ + + + + + + + + + + + + 部署情報更新 + + + +

+ 部署情報更新    +
+ ログイン者名: + +
+

+
+
+ +
+ + + + + + + + + + + + +
部署ID + +
部署名 + +
+ +
+
+一覧に戻る + + + + \ No newline at end of file