diff --git a/src/main/java/com/ssginc/nojam/order/mapper/OrderMapperQ.java b/src/main/java/com/ssginc/nojam/order/mapper/OrderMapperQ.java new file mode 100644 index 0000000..1e49cbc --- /dev/null +++ b/src/main/java/com/ssginc/nojam/order/mapper/OrderMapperQ.java @@ -0,0 +1,15 @@ +package com.ssginc.nojam.order.mapper; + +import com.ssginc.nojam.order.vo.OrderVOQ; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * @author Queue-ri + */ + +@Mapper +public interface OrderMapperQ { + + OrderVOQ findOrderById(@Param("orderId") Long orderId); +} diff --git a/src/main/java/com/ssginc/nojam/order/vo/OrderVOQ.java b/src/main/java/com/ssginc/nojam/order/vo/OrderVOQ.java new file mode 100644 index 0000000..003ea28 --- /dev/null +++ b/src/main/java/com/ssginc/nojam/order/vo/OrderVOQ.java @@ -0,0 +1,27 @@ +package com.ssginc.nojam.order.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +/** + * @author Queue-ri + */ + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class OrderVOQ { + private Long orderId; + private Long itemId; + private String branchId; + private String status; + private Integer quantity; + private LocalDateTime orderTime; + private LocalDateTime outStartTime; + private LocalDateTime inEndTime; +} diff --git a/src/main/java/com/ssginc/nojam/outgoing/controller/OutgoingController.java b/src/main/java/com/ssginc/nojam/outgoing/controller/OutgoingController.java new file mode 100644 index 0000000..ae1a0c3 --- /dev/null +++ b/src/main/java/com/ssginc/nojam/outgoing/controller/OutgoingController.java @@ -0,0 +1,97 @@ +package com.ssginc.nojam.outgoing.controller; + +import com.ssginc.nojam.outgoing.dto.OutgoingViewDTO; +import com.ssginc.nojam.outgoing.mapper.OutgoingMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +import java.util.List; + +/** + * @author Queue-ri + */ + +@Controller +@RequiredArgsConstructor +@RequestMapping("outgoing") +public class OutgoingController { + private final OutgoingMapper outgoingMapper; + + @GetMapping("/view") + public String viewOutgoingDefault(RedirectAttributes redirectAttributes) { + redirectAttributes.addAttribute("pdx", 1); + return "redirect:/outgoing/view/{pdx}"; + } + + @GetMapping("/view/{pdx}") + public String viewOutgoing(@PathVariable("pdx") int pdx, Model model) { + int pageIdx = (pdx-1) * 50; + + int totalRow = outgoingMapper.countAllOutgoings(); // 총 totalRow개의 검색 결과 + int pageBlockSize = 5; // 1 2 3 4 5 + int pageNavSize = (int)Math.ceil((double)totalRow / pageBlockSize); // << >> 를 몇 번 할 수 있는지 + + List ogList = outgoingMapper.get50Outgoings(pageIdx); + + model.addAttribute("ogList", ogList); + model.addAttribute("totalRow", totalRow); + model.addAttribute("pageBlockSize", pageBlockSize); + model.addAttribute("pageNavSize", pageNavSize); + + return "outgoing/view"; + } + + @GetMapping("/pending") + public String viewPendingOutgoingDefault(RedirectAttributes redirectAttributes) { + redirectAttributes.addAttribute("pdx", 1); + return "redirect:/outgoing/pending/{pdx}"; + } + + @GetMapping("/pending/{pdx}") + public String viewPendingOutgoing(@PathVariable("pdx") int pdx, Model model) { + int pageIdx = (pdx-1) * 50; + + int totalRow = outgoingMapper.countAllPendingOutgoings(); // 총 totalRow개의 검색 결과 + int pageBlockSize = 5; // 1 2 3 4 5 + int pageNavSize = (int)Math.ceil((double)totalRow / pageBlockSize); // << >> 를 몇 번 할 수 있는지 + + List poList = outgoingMapper.get50PendingOutgoings(pageIdx); + + model.addAttribute("poList", poList); + model.addAttribute("totalRow", totalRow); + model.addAttribute("pageBlockSize", pageBlockSize); + model.addAttribute("pageNavSize", pageNavSize); + + return "outgoing/pending"; + } + + @GetMapping("/indelivery") + public String viewIndeliveryOutgoingDefault(RedirectAttributes redirectAttributes) { + redirectAttributes.addAttribute("pdx", 1); + return "redirect:/outgoing/indelivery/{pdx}"; + } + + @GetMapping("/indelivery/{pdx}") + public String viewIndeliveryOutgoing(@PathVariable("pdx") int pdx, Model model) { + int pageIdx = (pdx-1) * 50; + + int totalRow = outgoingMapper.countAllPendingOutgoings(); // 총 totalRow개의 검색 결과 + int pageBlockSize = 5; // 1 2 3 4 5 + int pageNavSize = (int)Math.ceil((double)totalRow / pageBlockSize); // << >> 를 몇 번 할 수 있는지 + + List idoList = outgoingMapper.get50IndeliveryOutgoings(pageIdx); + + model.addAttribute("idoList", idoList); + model.addAttribute("totalRow", totalRow); + model.addAttribute("pageBlockSize", pageBlockSize); + model.addAttribute("pageNavSize", pageNavSize); + + return "outgoing/indelivery"; + } + +} diff --git a/src/main/java/com/ssginc/nojam/outgoing/controller/OutgoingRestController.java b/src/main/java/com/ssginc/nojam/outgoing/controller/OutgoingRestController.java new file mode 100644 index 0000000..59bc239 --- /dev/null +++ b/src/main/java/com/ssginc/nojam/outgoing/controller/OutgoingRestController.java @@ -0,0 +1,46 @@ +package com.ssginc.nojam.outgoing.controller; + +import com.ssginc.nojam.order.mapper.OrderMapperQ; +import com.ssginc.nojam.order.vo.OrderVOQ; +import com.ssginc.nojam.outgoing.mapper.OutgoingMapper; +import jakarta.servlet.http.HttpSession; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; + +/** + * @author Queue-ri + */ + +@RestController +@RequiredArgsConstructor +@RequestMapping("outgoing") +public class OutgoingRestController { + private final OutgoingMapper outgoingMapper; + private final OrderMapperQ orderMapperQ; + + @GetMapping("/pending/confirm") + public void confirmOrder(@RequestParam("oid") Long orderId, HttpSession session) { + outgoingMapper.confirm(orderId, LocalDateTime.now()); + OrderVOQ order = orderMapperQ.findOrderById(orderId); + // 신규 출고 내역 추가 + outgoingMapper.insertNewOutgoing(orderId, order.getQuantity(), (String)session.getAttribute("userId"), LocalDateTime.now()); + // 본사 재고 차감 + outgoingMapper.decHeadStock(order.getQuantity(), order.getItemId()); + } + + @GetMapping("/pending/reject") + public void rejectOrder(@RequestParam("oid") Long orderId) { + outgoingMapper.reject(orderId); + } + + @GetMapping("/indelivery/done") + public void doneOutgoing(@RequestParam("oid") Long orderId) { + OrderVOQ order = orderMapperQ.findOrderById(orderId); + // 출고 완료 처리 - 다중 SQL 실행 + outgoingMapper.markDone(orderId, order.getBranchId() + "_" + order.getOrderId(), order.getItemId(), order.getBranchId(), order.getQuantity(), LocalDateTime.now()); + // 발주 요청했던 지점의 해당 상품 재고 증가 + outgoingMapper.incBranchStock(order.getQuantity(), order.getItemId()); + } +} diff --git a/src/main/java/com/ssginc/nojam/outgoing/dto/OutgoingViewDTO.java b/src/main/java/com/ssginc/nojam/outgoing/dto/OutgoingViewDTO.java new file mode 100644 index 0000000..686c591 --- /dev/null +++ b/src/main/java/com/ssginc/nojam/outgoing/dto/OutgoingViewDTO.java @@ -0,0 +1,34 @@ +package com.ssginc.nojam.outgoing.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +/** + * @author Queue-ri + */ + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class OutgoingViewDTO { + // ** 주의 ** + // 출고 테이블 아니고 발주 테이블에서 가져오는 것임 + // 출고대기 상태에선 출고 테이블에 들어가는 데이터가 없음 + private Long outgoingId; + private Long orderId; + private Long itemId; + private String name; // item name. join + private String branchName; // join + private Integer price; // join + private Integer quantity; + private Integer stock; // head stock. join + private String status; + private LocalDateTime orderTime; + private LocalDateTime outStartTime; + private LocalDateTime outEndTime; +} diff --git a/src/main/java/com/ssginc/nojam/outgoing/mapper/OutgoingMapper.java b/src/main/java/com/ssginc/nojam/outgoing/mapper/OutgoingMapper.java new file mode 100644 index 0000000..19619e6 --- /dev/null +++ b/src/main/java/com/ssginc/nojam/outgoing/mapper/OutgoingMapper.java @@ -0,0 +1,44 @@ +package com.ssginc.nojam.outgoing.mapper; + +import com.ssginc.nojam.outgoing.dto.OutgoingViewDTO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author Queue-ri + */ + +@Mapper +public interface OutgoingMapper { + // 조회 메소드 + int countAllOutgoings(); + List get50Outgoings(int startIdx); + + int countAllPendingOutgoings(); + List get50PendingOutgoings(int startIdx); + List get50IndeliveryOutgoings(int startIdx); + void confirm(@Param("orderId") Long orderId, @Param("outStartTime") LocalDateTime outStartTime); + void reject(Long orderId); + + // confirm시 출고내역 신규 등록해야 함 + int insertNewOutgoing(@Param("orderId") Long orderId, @Param("quantity") Integer quantity, @Param("userId") String userId, @Param("outStartTime") LocalDateTime outStartTime); + + // confirm시 본사에서 발주요청된 수량만큼 재고 차감 + void decHeadStock(@Param("decValue") Integer decValue, @Param("itemId") Long itemId); + + // 출고 완료 처리 + void markDone( + @Param("orderId") Long orderId, + @Param("incomingId") String incomingId, + @Param("itemId") Long itemId, + @Param("branchId") String branchId, + @Param("quantity") Integer quantity, + @Param("markTime") LocalDateTime markTime + ); + + // markDone시 출고완료(=발주 기준으로 '입고완료')에 따른 해당 지점의 재고 추가 + void incBranchStock(@Param("incValue") Integer incValue, @Param("itemId") Long itemId); +} diff --git a/src/main/java/com/ssginc/nojam/outgoing/vo/OutgoingVO.java b/src/main/java/com/ssginc/nojam/outgoing/vo/OutgoingVO.java new file mode 100644 index 0000000..e3aa9d9 --- /dev/null +++ b/src/main/java/com/ssginc/nojam/outgoing/vo/OutgoingVO.java @@ -0,0 +1,25 @@ +package com.ssginc.nojam.outgoing.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +/** + * @author Queue-ri + */ + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class OutgoingVO { + private Long outgoingId; + private Long orderId; + private String status; + private Integer quantity; + private LocalDateTime outStartTime; + private LocalDateTime outEndTime; +} diff --git a/src/main/java/com/ssginc/nojam/stock/vo/HeadStockVO.java b/src/main/java/com/ssginc/nojam/stock/vo/HeadStockVO.java index 8439c3a..18387e3 100644 --- a/src/main/java/com/ssginc/nojam/stock/vo/HeadStockVO.java +++ b/src/main/java/com/ssginc/nojam/stock/vo/HeadStockVO.java @@ -1,6 +1,5 @@ package com.ssginc.nojam.stock.vo; -import com.ssginc.nojam.crawl.vo.ItemVO; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 148ff8c..99cf720 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -31,7 +31,7 @@ spring.web.encoding.enabled=true spring.web.encoding.force=true ################ mysql8 -spring.datasource.url=jdbc:mysql://localhost:3306/nojam?serverTimezone=UTC&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true +spring.datasource.url=jdbc:mysql://localhost:3306/nojam?serverTimezone=UTC&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=true spring.datasource.username=root spring.datasource.password=1234 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver diff --git a/src/main/resources/mapper/orderMapperQ.xml b/src/main/resources/mapper/orderMapperQ.xml new file mode 100644 index 0000000..af843b4 --- /dev/null +++ b/src/main/resources/mapper/orderMapperQ.xml @@ -0,0 +1,15 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/outgoingMapper.xml b/src/main/resources/mapper/outgoingMapper.xml new file mode 100644 index 0000000..add6c64 --- /dev/null +++ b/src/main/resources/mapper/outgoingMapper.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + UPDATE `order` + SET status = '출고중', out_start_time = #{outStartTime} + WHERE order_id = ${orderId} + + + + UPDATE `order` + SET status = '출고거절' + WHERE order_id = ${orderId} + + + + + + UPDATE head_stock + SET stock = stock - ${decValue} + WHERE item_id = ${itemId} + + + + + INSERT INTO outgoing(order_id, quantity, committer, out_start_time) + VALUES + (${orderId}, ${quantity}, #{userId}, #{outStartTime}) + + + + + + + + + UPDATE outgoing + SET status = '출고완료', out_end_time = #{markTime} + WHERE order_id = ${orderId}; + + UPDATE `order` + SET status = '입고완료', in_end_time = #{markTime} + WHERE order_id = ${orderId}; + + INSERT INTO incoming(incoming_id, item_id, branch_id, quantity, in_time) + VALUES + (#{incomingId}, ${itemId}, #{branchId}, ${quantity}, #{markTime}) + + + + + + UPDATE branch_stock + SET stock = stock + ${incValue} + WHERE item_id = ${itemId} + + + \ No newline at end of file diff --git a/src/main/resources/templates/outgoing/indelivery.html b/src/main/resources/templates/outgoing/indelivery.html new file mode 100644 index 0000000..fcdb01c --- /dev/null +++ b/src/main/resources/templates/outgoing/indelivery.html @@ -0,0 +1,375 @@ + + + + + + + 출고 관리 - 출고 완료 처리 + + + + + + + + +
+
+
+ 출고 관리 + 출고 완료 처리 +
+
+ +
+ [[${totalRow}]]건이 검색되었습니다. +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
출고ID발주ID상품명지점명발주수량발주일시출고시작일시출고완료
+
+ +
+ +
+ +
+
+
+ + + + \ No newline at end of file diff --git a/src/main/resources/templates/outgoing/pending.html b/src/main/resources/templates/outgoing/pending.html new file mode 100644 index 0000000..bc82c87 --- /dev/null +++ b/src/main/resources/templates/outgoing/pending.html @@ -0,0 +1,413 @@ + + + + + + + 출고 관리 - 출고 승인/거절 + + + + + + + + +
+
+
+ 출고 관리 + 출고 승인/거절 +
+
+ +
+ [[${totalRow}]]건이 검색되었습니다. +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
발주ID상품ID상품명지점명상품 단가발주 수량재고총 단가발주일시출고승인출고거절
+
+ +
+ +
+ +
+
+
+ + + + \ No newline at end of file diff --git a/src/main/resources/templates/outgoing/view.html b/src/main/resources/templates/outgoing/view.html new file mode 100644 index 0000000..be63d34 --- /dev/null +++ b/src/main/resources/templates/outgoing/view.html @@ -0,0 +1,373 @@ + + + + + + + 출고 관리 - 출고 내역 조회 + + + + + + + + +
+
+
+ 출고 관리 + 출고 내역 조회 +
+
+ +
+ [[${totalRow}]]건이 검색되었습니다. +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
발주ID상품명지점명출고수량출고상태출고시작일시출고완료일시
+
+ +
+ +
+ +
+
+
+ + + + \ No newline at end of file