New World

[해외공구관리사이트] 프로젝트 - 수정 & 삭제 본문

Project/old

[해외공구관리사이트] 프로젝트 - 수정 & 삭제

hyeovi 2022. 9. 6. 18:59
728x90
반응형

수정 페이지의 기능

 

1. 프로젝트의 상태에 따라 상태 값 변경이 가능하다

2. 빈값이 있다면 기존 값으로 입력해주기

3. UI 적으로 프로젝트 기존 값 노출

4. 수량은 움직일 수 없도록 변경 금지

 

삭제 버튼

1. 프로젝트에 주문서가 있는 경우 환불 확인

 

 

 

controller

ㄴ ProjectController

프로젝트의 상태값에 따라 변경하는 프로젝트 상태값이 각각 달라 현재의 프로젝트 상태값에 따라 다른 UI로 이동할 수 있게 해주었다.

    // 프로젝트 수정
    @RequestMapping("/projectEdit{projectNo}")
    public String projectEdit(@PathVariable("projectNo") Long projectNo, HttpSession httpSession, Model model) {
        Project project = projectService.surchOne(projectNo);
        model.addAttribute("project", project);
        model.addAttribute("nowLoginMember", memberController.modelMember(httpSession));

        if (project.getStatus().equals(ProjectStatus.HELP)) {
            return "sample/project/product-help-edit";
        } else if (project.getStatus().equals(ProjectStatus.RESEARCH)) {
            return "sample/project/product-research-edit";
        } else if (project.getStatus().equals(ProjectStatus.SALE)) {
            return "sample/project/product-sale-edit";
        } else if (project.getStatus().equals(ProjectStatus.GRAD)) {
            return "sample/project/product-grad-edit";
        } else {
            return "sample/project/product-finish-edit";
        }
    }

 

API

ㄴ MemberApiController

입력받은 프로젝트 정보와 그 프로젝트의 번호를 프로젝트를 업데이트 하는 메소드로 전달해준다. 만약 상태값이 가이드인 경우, 배송정보를 저장해주도록 한다.

    // 업뎃
    @PutMapping("/api/project/edit/{projectNo}")
    public UpdateProjectResponse updateMemberV2(@PathVariable("projectNo") Long projectNo,
            @SessionAttribute("mSession") Long nowLoginMemberNo,
            @RequestBody @Valid UpdateProjectRequest request) {
        Project project = projectService.update(projectNo, request);

        if (project.getStatus().equals(ProjectStatus.GRAD)) {
            List<Order> orders = orderService.updateByProject(project);
            trackingService.saveByGRAD(orders, project);
        }

        return new UpdateProjectResponse(projectNo, request.getName());
    }

    @Data
    @AllArgsConstructor
    static class UpdateProjectResponse {
        private Long no;
        private String name;
    }

Service

ㄴ ProjectService

ㄴ ProjectServiceImpl

프로젝트를 찾고 그 프로젝트의 정보를 변경한다.

프로젝트 상태는 아래의 경로로 변경이 가능케한다.

RESEARCH > SALE, RESEARCH
SALERESEARCH, GRAD, SALE
GRAD > SALE, FINISH, GRAD
FINISH > GRAD, HELP
HELP > CLOSED, HELP
 
다른 프로젝트 정보는 값이 0인지 공백인지 나누어 0 또는 공백이라면 기존 정보로 놔둘 수 있도록 코딩하였다.
@Override
    @Transactional
    public Project update(Long no, UpdateProjectRequest request) {
        Project project = projectRepository.findOne(no);

        if (request.getName().length() != 0) {
            project.setName(request.getName());
        }

        if (project.getStatus().equals(ProjectStatus.HELP)) {
            if (request.getStatus().equals("CLOSED")) {
                project.setStatus(ProjectStatus.CLOSED);

                if (project.getOrderStatus().equals(ProjectOrderStatus.CASH)) {
                    cashService.cashUpdateByOrder(project);
                }
            }
        } else {
            if (project.getStatus().equals(ProjectStatus.RESEARCH)) {
                if (request.getStatus().equals("SALE")) {
                    project.setStatus(ProjectStatus.SALE);
                } else if (request.getStatus().equals("RESEARCH")) {
                    project.setStatus(ProjectStatus.RESEARCH);
                }
            } else if (project.getStatus().equals(ProjectStatus.SALE)) {
                if (request.getStatus().equals("GRAD")) {
                    project.setStatus(ProjectStatus.GRAD);
                } else if (request.getStatus().equals("SALE")) {
                    project.setStatus(ProjectStatus.SALE);
                } else if (request.getStatus().equals("RESEARCH")) {
                    project.setStatus(ProjectStatus.RESEARCH);
                }
            } else if (project.getStatus().equals(ProjectStatus.GRAD)) {
                if (request.getStatus().equals("FINISH")) {
                    project.setStatus(ProjectStatus.FINISH);
                } else if (request.getStatus().equals("GRAD")) {
                    project.setStatus(ProjectStatus.GRAD);
                } else if (request.getStatus().equals("SALE")) {
                    project.setStatus(ProjectStatus.SALE);
                }
            } else if (project.getStatus().equals(ProjectStatus.FINISH)) {
                if (request.getStatus().equals("FINISH")) {
                    project.setStatus(ProjectStatus.FINISH);
                } else if (request.getStatus().equals("GRAD")) {
                    project.setStatus(ProjectStatus.GRAD);
                }
            }
        }

        if (request.getFirstPrice() > 0) {
            project.setFirstPrice(request.getFirstPrice());

            if (request.getSecondPrice() > 0) {
                project.setSecondPrice(request.getSecondPrice());

                if (request.getThirdPrice() > 0) {
                    project.setThirdPrice(request.getThirdPrice());
                }
            }
        }

        if (request.getQuantity() > 0) {
            project.setQuantity(request.getQuantity());
        }

        if (request.getExp().length() != 0) {
            project.setExp(request.getExp());
        }

        return project;
    }

API

ㄴ MemberApiController

프로젝트를 찾고 예치금을 돌려주도록 만들었다.

@DeleteMapping("/api/project/remove/{projectNo}")
    public void deleteMember(@SessionAttribute("mSession") Long nowLoginMemberNo,
            @PathVariable("projectNo") Long projectNo) {
        Project project = projectService.surchOne(projectNo);

        // 예치금 돌려주기
        orderService.deleteByProject(project.getOrders(), project);
        projectService.delete(projectNo, memberService.myInfo(nowLoginMemberNo));
    }

Service

ㄴ OrderService

ㄴ OrderServiceImpl

주문서가 있는지 찾고 만약 주문 형태가 계좌라면 직접 취소하도록 유도하며 캐쉬인 경우에는 첫번째, 두번째, 세번째 가이드 중 어디에 있는지 찾아내어 그 금액의 전체를 환불하도록 만들었다.

    @Override
    @Transactional
    public void deleteByProject(List<Order> orders, Project project) {
        if (orders.size() > 0) {
            for (int list = 0; list >= orders.size(); list++) {
                if (project.getOrderStatus().equals(ProjectOrderStatus.CASH)) {
                    deleteByProjectByCash(orders, list);
                } else if (project.getOrderStatus().equals(ProjectOrderStatus.ACCOUNT)) {
                    throw new IllegalStateException("직접 취소 부탁드립니다.");
                }

                orders.get(list).setDate(LocalDateTime.now());
                orders.get(list).setOrderStatus(OrderStatus.CANCEL);
            }
        }
    }

    public void deleteByProjectByCash(List<Order> orders, int list) {
        int money = 0;
        Member member = orders.get(list).getMember();

        if (orders.get(list).getProject().getStepStatus().equals(ProjectStepStatus.FIRST)) {
            money += orders.get(list).getProject().getFirstPrice();
        } else if (orders.get(list).getProject().getStepStatus().equals(ProjectStepStatus.SECOND)) {
            money += orders.get(list).getProject().getSecondPrice();
        } else if (orders.get(list).getProject().getStepStatus().equals(ProjectStepStatus.THIRD)) {
            money += orders.get(list).getProject().getThirdPrice();
        }

        money += member.getCash().getMoney();

        cashService.update(member.getCash().getNo(), money, member);
    }

Service

ㄴ ProjectService

ㄴ ProjectServiceImpl

프로젝트를 삭제하는 메소드인데 프로젝트를 만든 사람과 로그인한  멤버가 같은 사람인지 파악하고 삭제할 수 있도록 한다.

    // 삭제
    @Override
    @Transactional
    public void delete(Long no, Member member) {
        Project project = surchOne(no);
        if (project.getMember() == member) {
            ProjectRepositoryJPA.deleteById(project.getNo());
        } else {
            throw new IllegalStateException("회원님이 생성한 프로젝트가 아니라 삭제 불가합니다.");
        }
    };
반응형
Comments