New World

[해외공구관리사이트] 주문 - 저장 본문

Project/old

[해외공구관리사이트] 주문 - 저장

hyeovi 2022. 9. 6. 19:58
728x90
반응형

 

주문서를 저장하는 페이지 기능

 

1. 프로젝트의 정보가 제대로 노출되는지 확인

2. 로그인한 정보로 주문서가 저장되는지 확인

3. 프로젝트의 상태에 따라 제대로 노출되는지 확인

4. 프로젝트 구매 방식에 따라 페이지가 다르게 나오는 것 확인

 

controller

ㄴ OrderController

프로젝트 구매 방식이 계좌인지 캐쉬인지에 따라 페이지를 다르게 하여 나오도록 하였다. 만약 판매 중이 아니라면 임시 저장인 느낌으로 주문서를 하나 만들어준다.

    // 생성
    @RequestMapping("/checkout{projectNo}")
    public String orderSave(@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.SALE)) {
            if (project.getOrderStatus().equals(ProjectOrderStatus.ACCOUNT)) {
                return "sample/order/checkout-account";
            } else if (project.getOrderStatus().equals(ProjectOrderStatus.CASH)) {
                return "sample/order/checkout-cash";
            } else {
                return "찾는 페이지가 없습니다";
            }
        } else {
            orderService.saveWithoutSale(memberController.modelMember(httpSession), project).toString();

            return "sample/order/confirmation";
        }
    }

API

ㄴ OrderApiController

만약 계좌나 캐쉬와 같은 것으로 주문하였다면 주문서로 입력한 정보와 계좌 정보를 저장하며 캐쉬로는 프로젝트의 단계에 맞게 뺄 수 있게 만들었다.

    // 생성
    @PostMapping("/api/order/save/{projectId}")
    public Long save(@SessionAttribute("mSession") Long nowLoginMemberNo,
            @PathVariable("projectId") Long projectNo, @RequestBody @Valid OrderAccountForm request) {
        Member member = memberService.myInfo(nowLoginMemberNo);
        Project project = projectService.surchOne(projectNo);

        OrderForm orderInfo = new OrderForm(request.getPhone(), request.getMemo(), request.getCity(),
                request.getStreet(), request.getZipcode());
        AccountInfoForm accountInfo = new AccountInfoForm(request.getRefundName(), request.getRefundBankName(),
                request.getRefundAccount(), request.getPurchaseDate(),
                request.getPurchaseBankName(), request.getPurchaseAccount());

        Long no = orderService.save(orderInfo, accountInfo, member, project);

        if (project.getOrderStatus().equals(ProjectOrderStatus.CASH)) {
            if (project.getStepStatus().equals(ProjectStepStatus.FIRST)) {
                cashService.saveList(project.getFirstPrice(), member.getCash(), orderService.findOne(no));
            } else if (project.getStepStatus().equals(ProjectStepStatus.SECOND)) {
                cashService.saveList(project.getSecondPrice(), member.getCash(), orderService.findOne(no));
            } else {
                cashService.saveList(project.getThirdPrice(), member.getCash(), orderService.findOne(no));
            }

            cashService.updateProjectBuy(project, member);
        }

        if (no != null) {
            return no;
        } else {
            throw new IllegalStateException("주문서 발행 중 이상이 생겼습니다.");
        }
    }

Service

ㄴ OrderService

ㄴ OrderServiceImpl

프로젝트의 상태값이 sale이 아닌 경우 메소드와 주문서로 들어가 계좌인지, 캐쉬인지에 따라 각각 정보를 저장해주며 주문서가 나중에 크게 변화할 것을 대비하여 주문서에 맞는 주문서 id 도 따로 만들어주었다.

    @Override
    @Transactional
    public Long saveWithoutSale(Member nowLoginMember, Project project) {
        Order order = new Order();

        order.setDate(LocalDateTime.now());
        order.setMemo("아직 판매중이 아닙니다");
        order.setOrderStatus(OrderStatus.ORDER);

        String idMarker = findByOrderIdMarker(nowLoginMember, project);

        if (idMarker == null) {
            order.setId(idMaker());
        } else {
            order.setId(idMarker);
        }

        order.setMember(nowLoginMember);
        order.setProject(project);

        if (project.getMember() != nowLoginMember) {
            return orderRepository.save(order);
        } else {
            return null;
        }
    }

@Override
@Transactional
    public Long save(OrderForm orderInfo, AccountInfoForm accountInfo, Member nowLoginMember, Project project) {
        Order order = orderInfo(orderInfo);

        String idMarker = orderRepository.findMyOrder(nowLoginMember).get(0).getId();

        if (idMarker.length() == 0) {
            order.setId(idMaker());
        } else {
            order.setId(idMarker);
        }

        order.setMember(nowLoginMember);
        order.setProject(project);

        if (project.getStepStatus().equals(ProjectStepStatus.FIRST)) {
            order.setProjectStepStatus(ProjectStepStatus.FIRST);
        } else if (project.getStepStatus().equals(ProjectStepStatus.SECOND)) {
            order.setProjectStepStatus(ProjectStepStatus.SECOND);
        } else if (project.getStepStatus().equals(ProjectStepStatus.THIRD)) {
            order.setProjectStepStatus(ProjectStepStatus.THIRD);
        }

        if (project.getMember() != nowLoginMember) {
            if (project.getOrderStatus().equals(ProjectOrderStatus.ACCOUNT)) {
                return saveAccount(project, nowLoginMember, order, accountInfo);
            } else if (project.getOrderStatus().equals(ProjectOrderStatus.CASH)) {
                return saveCash(project, nowLoginMember, order);
            } else {
                return null;
            }
        } else {
            return null;
        }
    }

    public Long saveAccount(Project project, Member myMember, Order order, AccountInfoForm accountInfo) {
        Account account = new Account();

        Refund refund = new Refund(accountInfo.getRefundName(), accountInfo.getRefundBankName(),
                accountInfo.getRefundAccount());
        Purchase purchase = new Purchase(accountInfo.getPurchaseBankName(), accountInfo.getPurchaseAccount(),
                accountInfo.getPurchaseDate());

        account.setRefund(refund);
        account.setPurchase(purchase);

        accountRepository.save(account);

        order.setAccount(account);

        return orderRepository.save(order);
    }

    public Long saveCash(Project project, Member myMember, Order order) {
        Cash cash = cashRepository.findByNo(myMember.getCash().getNo());

        if (project.getStatus().equals(ProjectStatus.HELP)) {
            order.getCashList().setCash(cash);

            return orderRepository.save(order);
        } else {
            int cashMoney = 0;

            if (project.getStepStatus().equals(ProjectStepStatus.FIRST)) {
                cashMoney = project.getFirstPrice();
            } else if (project.getStepStatus().equals(ProjectStepStatus.SECOND)) {
                cashMoney = project.getSecondPrice();
            } else if (project.getStepStatus().equals(ProjectStepStatus.THIRD)) {
                cashMoney = project.getThirdPrice();
            }

            int money = cash.getMoney() - cashMoney;

            if (money >= 0) {
                order.getCashList().setCash(cash);

                return orderRepository.save(order);
            } else {
                throw new IllegalStateException("돈이 부족합니다");
            }
        }
    }
    
        public Order orderInfo(OrderForm orderInfo) {
        Order order = new Order();

        checkPhone(orderInfo.getPhone());

        Address address = new Address(orderInfo.getCity(), orderInfo.getStreet(), orderInfo.getZipcode());

        order.setDate(LocalDateTime.now());
        order.setPhone(orderInfo.getPhone());
        order.setMemo(orderInfo.getMemo());
        order.setAddress(address);
        order.setOrderStatus(OrderStatus.ORDER);

        return order;
    }

    public void checkPhone(String phone) {
        String firstPhone = phone.substring(0, 3);

        if (!(firstPhone.equals("010") || firstPhone.equals("070")) && phone.length() == 11) {
            throw new IllegalStateException("핸드폰 번호가 규칙에 맞지 않습니다");
        }
    }

    public String idMaker() {
        StringBuffer idMaker = new StringBuffer();
        Random rnd = new Random();
        idMaker.append(LocalDate.now());
        idMaker.append("-");

        for (int i = 0; i < 5; i++) {
            if (rnd.nextBoolean()) {
                idMaker.append((char) ((int) (rnd.nextInt(26)) + 97));
            } else {
                idMaker.append((rnd.nextInt(10)));
            }
        }
        return idMaker.toString();
    }

 

반응형
Comments