From 85bfbad37fd897c8bf242d6cec275b51221f83cc Mon Sep 17 00:00:00 2001 From: freehyeon Date: Mon, 16 Dec 2024 10:38:42 +0900 Subject: [PATCH 1/9] =?UTF-8?q?=ED=95=98=EB=8D=94=EA=B1=B0=20=EA=B9=8C?= =?UTF-8?q?=EC=A7=80=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit order 완료 및 -> 수주? 발주? 아무튼 그때 가용재고 관련 버그 수정해야함 order list 작업중 -> 상세보기 안만듬 --- stockMate/pom.xml | 18 + .../java/com/stockm8/config/WebConfig.java | 2 +- .../stockm8/controller/OrderController.java | 92 ++- .../com/stockm8/domain/vo/OrderItemVO.java | 5 + .../java/com/stockm8/domain/vo/OrderVO.java | 12 +- .../java/com/stockm8/domain/vo/StockVO.java | 2 +- .../java/com/stockm8/domain/vo/StockVO2.java | 58 -- .../com/stockm8/persistence/OrderDAO.java | 27 +- .../com/stockm8/persistence/OrderDAOImpl.java | 106 ++- .../com/stockm8/service/OrderService.java | 21 +- .../com/stockm8/service/OrderServiceImpl.java | 129 +++- stockMate/src/main/resources/log4j.xml | 12 +- .../main/resources/log4jdbc.log4j2.properties | 3 + .../main/resources/mappers/OrderMapper.xml | 76 +- .../resources/mappers/receivingMapper.xml | 6 +- .../webapp/WEB-INF/spring/root-context.xml | 3 +- .../webapp/WEB-INF/views/order/orderList.jsp | 65 ++ .../webapp/WEB-INF/views/order/register.jsp | 147 ++-- .../webapp/WEB-INF/views/order/register2.jsp | 399 ---------- .../webapp/WEB-INF/views/order/register3.jsp | 713 ------------------ stockMate/src/test/resources/log4j.xml | 6 + 21 files changed, 599 insertions(+), 1303 deletions(-) delete mode 100644 stockMate/src/main/java/com/stockm8/domain/vo/StockVO2.java create mode 100644 stockMate/src/main/webapp/WEB-INF/views/order/orderList.jsp delete mode 100644 stockMate/src/main/webapp/WEB-INF/views/order/register2.jsp delete mode 100644 stockMate/src/main/webapp/WEB-INF/views/order/register3.jsp diff --git a/stockMate/pom.xml b/stockMate/pom.xml index 139afe2..9e92ed8 100644 --- a/stockMate/pom.xml +++ b/stockMate/pom.xml @@ -251,6 +251,24 @@ javase 3.5.1 + + + + + org.aspectj + aspectjrt + 1.9.7 + + + org.aspectj + aspectjweaver + 1.9.7 + + + org.springframework + spring-aspects + ${org.springframework-version} + diff --git a/stockMate/src/main/java/com/stockm8/config/WebConfig.java b/stockMate/src/main/java/com/stockm8/config/WebConfig.java index 2a4840b..82e335e 100644 --- a/stockMate/src/main/java/com/stockm8/config/WebConfig.java +++ b/stockMate/src/main/java/com/stockm8/config/WebConfig.java @@ -66,7 +66,7 @@ public class WebConfig implements WebMvcConfigurer { public void addInterceptors(InterceptorRegistry registry) { // Intercepter 적용 registry.addInterceptor(authorizationInterceptor) - .addPathPatterns("/category/**", "/product/**", "/dashboard", "/business") // 인터셉터를 적용할 경로 + .addPathPatterns("/category/**", "/product/**", "/dashboard", "/business", "/order/**") // 인터셉터를 적용할 경로 .excludePathPatterns( // 인터셉터를 제외할 경로 "/", // HomeController 경로 "/favicon.ico", // 브라우저 기본 요청 diff --git a/stockMate/src/main/java/com/stockm8/controller/OrderController.java b/stockMate/src/main/java/com/stockm8/controller/OrderController.java index 7421d16..d32319f 100644 --- a/stockMate/src/main/java/com/stockm8/controller/OrderController.java +++ b/stockMate/src/main/java/com/stockm8/controller/OrderController.java @@ -5,6 +5,7 @@ import java.util.Map; import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.slf4j.Logger; @@ -19,6 +20,7 @@ import com.stockm8.domain.vo.OrderItemVO; import com.stockm8.domain.vo.OrderVO; +import com.stockm8.domain.vo.OrderVO.OrderType; import com.stockm8.domain.vo.StockVO; import com.stockm8.domain.vo.UserVO; import com.stockm8.service.OrderService; @@ -43,18 +45,34 @@ public class OrderController { * */ @RequestMapping(value = "/register", method = RequestMethod.GET) - public String orderRegisterGET(Model model, HttpServletRequest request) throws Exception { + public String orderRegisterGET(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception { logger.info("orderRegisterGET() 호출"); -// // 세션에서 userId 가져오기 -// HttpSession session = request.getSession(false); -// Long userId = (session != null) ? (Long)session.getAttribute("userId") : null; -// -// // userId로 사용자 정보 조회 -// UserVO user = userService.getUserById(userId); -// int businessId = user.getBusinessId(); + + // 세션에서 userId 가져오기 + HttpSession session = request.getSession(false); + Long userId = (session != null) ? (Long)session.getAttribute("userId") : null; + + // userId로 사용자 정보 조회 + UserVO user = userService.getUserById(userId); + int businessId = user.getBusinessId(); + +// HttpSession session = request.getSession(false); +// if (session != null) { +// Long userId = (Long) session.getAttribute("userId"); +// if (userId != null) { +// UserVO user = userService.getUserById(userId); +// if (user != null) { +// model.addAttribute("businessId", user.getBusinessId()); +// // 추가적인 권한 체크나 비즈니스 로직 +// return "order/register"; +// } +// } +// } +// // 인증 실패 처리 => 음 메세지 ??? 어떻게 ?? +// return "user/main"; - return "order/register"; + return "order/register"; } /** @@ -72,12 +90,30 @@ public String orderRegisterGET(Model model, HttpServletRequest request) throws E public Map orderRegisterPOST(@RequestBody OrderVO order) throws Exception { logger.info("orderRegisterPOST() 호출"); logger.info("주문 정보: " + order); + + // orderType 유효성 검사 추가(수주인지 / 발주인지 주문유형) + if (order.getOrderType() == null) { + throw new IllegalArgumentException("주문 유형이 누락되었습니다."); + } + - // 주문에 orderItems가 있는지 확인(유효성 검사) + // 주문에 orderItems가 있는지 확인(유효성 검사) if (order.getOrderItems() == null || order.getOrderItems().isEmpty()) { throw new IllegalArgumentException("주문 항목이 누락되었습니다."); } + // 주문 항목별 재고 검증 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + for (OrderItemVO item : order.getOrderItems()) { + if (order.getOrderType() == OrderType.INBOUND) { + // 수주의 경우 가용 재고 체크 + if (!orderService.checkAvailableStock(item)) { + throw new IllegalArgumentException( + String.format("재고 부족 - StockId: %d, 요청수량: %d", + item.getStockId(), item.getQuantity()) + ); + } + } + } // 주문번호 생성 및 설정 String orderNumber = orderService.generateOrderNumber(); @@ -87,7 +123,7 @@ public Map orderRegisterPOST(@RequestBody OrderVO order) throws OrderItemVO orderItem = order.getOrderItems().get(0); // 주문 처리 - orderService.insertOrder(order); + orderService.insertOrderWithItems(order, order.getOrderItems()); // 응답 생성 Map response = new HashMap<>(); @@ -106,9 +142,18 @@ public Map orderRegisterPOST(@RequestBody OrderVO order) throws method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody - public List findAvailableStocks() throws Exception { + public List findAvailableStocks(HttpServletRequest request) throws Exception { logger.info("findAvailableStocks() 호출"); - return orderService.findAvailableStocks(); + + // 세션에서 userId 가져오기 + HttpSession session = request.getSession(false); + Long userId = (session != null) ? (Long)session.getAttribute("userId") : null; + + // userId로 사용자 정보 조회 + UserVO user = userService.getUserById(userId); + int businessId = user.getBusinessId(); + + return orderService.findAvailableStocks(businessId); } /** @@ -123,4 +168,25 @@ public String generateOrderNumber() throws Exception { logger.info("generateOrderNumber() 호출"); return orderService.generateOrderNumber(); } + + /** + * 주문 목록 조회 + * http://localhost:8088/order/orderList + */ + @RequestMapping(value = "/orderList" , method = RequestMethod.GET) + public String orderListGET(Model model) { + logger.info("orderListGET() 호출"); + + // main에서 넘어올떄 정달정보 ?? 로그인???세션 ?? + + //서비스 -> DAO(주문 목록) + List orderList = orderService.getOrderList(); + + //뷰 페이지 정보 전달(model) + + model.addAttribute("orderList",orderList); + + return "/order/orderList"; + } + } //OrderController \ No newline at end of file diff --git a/stockMate/src/main/java/com/stockm8/domain/vo/OrderItemVO.java b/stockMate/src/main/java/com/stockm8/domain/vo/OrderItemVO.java index 1f07a2b..39ea44b 100644 --- a/stockMate/src/main/java/com/stockm8/domain/vo/OrderItemVO.java +++ b/stockMate/src/main/java/com/stockm8/domain/vo/OrderItemVO.java @@ -16,4 +16,9 @@ public class OrderItemVO { private double stotalPrice; // 주문 1건의 전체 총 금액 private Timestamp createdAt; // 생성 시간 private Timestamp updatedAt; // 수정 시간 + + + private int stockId; // 가용 재고 구분위해 필요 + + } //OrderItemVO diff --git a/stockMate/src/main/java/com/stockm8/domain/vo/OrderVO.java b/stockMate/src/main/java/com/stockm8/domain/vo/OrderVO.java index 4bc49b7..a9c4254 100644 --- a/stockMate/src/main/java/com/stockm8/domain/vo/OrderVO.java +++ b/stockMate/src/main/java/com/stockm8/domain/vo/OrderVO.java @@ -8,6 +8,11 @@ @Data public class OrderVO { + + public enum OrderType { + INBOUND, // 수주 + OUTBOUND // 발주 + } private int orderId; // 주문 고유 ID private String orderNumber; // 주문 번호 (예: ORD-YYYYMMDD-001) @@ -15,10 +20,13 @@ public class OrderVO { private int createdBy; // 주문을 생성한 사용자 ID private Timestamp createdAt; // 주문 생성 날짜 private Timestamp updatedAt; // 주문 수정 날짜 - private String status; // 주문 상태 (pending, confirmed, cancelled) + private OrderType orderType; // 주문 유형 (INBOUND/OUTBOUND) private List orderItems; // 주문 항목 리스트 - + + + + }// OrderVO diff --git a/stockMate/src/main/java/com/stockm8/domain/vo/StockVO.java b/stockMate/src/main/java/com/stockm8/domain/vo/StockVO.java index c89d2dc..d9ef602 100644 --- a/stockMate/src/main/java/com/stockm8/domain/vo/StockVO.java +++ b/stockMate/src/main/java/com/stockm8/domain/vo/StockVO.java @@ -21,4 +21,4 @@ public class StockVO { private ProductVO product; // 상품 정보 (JOIN 용) private String warehouseName; // 창고명 (JOIN 용) -} +} //StockVO diff --git a/stockMate/src/main/java/com/stockm8/domain/vo/StockVO2.java b/stockMate/src/main/java/com/stockm8/domain/vo/StockVO2.java deleted file mode 100644 index f4a5821..0000000 --- a/stockMate/src/main/java/com/stockm8/domain/vo/StockVO2.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.stockm8.domain.vo; - -import java.sql.Timestamp; - -import lombok.Data; - -@Data -public class StockVO2 { - private int stockId; // 고유 재고 ID - private int productId; // 상품 ID - private int warehouseId; // 창고 ID - private int businessId; // 사업자 ID - - private int totalQuantity; // 창고 내 총 재고 수량 - private int reservedQuantity; // 예약된 수량 - - // availableStock은 totalQuantity - reservedQuantity로 계산 - private int availableStock; // 사용 가능한 재고 (totalQuantity - reservedQuantity) - - // totalQuantity에 대한 getter - public int getTotalQuantity() { - return totalQuantity; - } - - public void setTotalQuantity(int totalQuantity) { - this.totalQuantity = totalQuantity; - updateAvailableStock(); // 값이 변경되면 availableStock을 자동으로 업데이트 - } - - // reservedQuantity에 대한 getter - public int getReservedQuantity() { - return reservedQuantity; - } - - public void setReservedQuantity(int reservedQuantity) { - this.reservedQuantity = reservedQuantity; - updateAvailableStock(); // 값이 변경되면 availableStock을 자동으로 업데이트 - } - - // availableStock을 계산하는 getter - public int getAvailableStock() { - return availableStock; - } - - // availableStock 계산 - private void updateAvailableStock() { - this.availableStock = this.totalQuantity - this.reservedQuantity; - } - - private Timestamp createdAt; // 재고 등록 시간 - private Timestamp updatedAt; // 최근 수정 시간 - - private String description; // 재고 설명 - - private String dscription; // 재고 설명 - private Boolean isDeleted; // 논리 삭제 여부 (true: 삭제됨, false: 활성) - -} diff --git a/stockMate/src/main/java/com/stockm8/persistence/OrderDAO.java b/stockMate/src/main/java/com/stockm8/persistence/OrderDAO.java index 8d4d4dd..6a0b007 100644 --- a/stockMate/src/main/java/com/stockm8/persistence/OrderDAO.java +++ b/stockMate/src/main/java/com/stockm8/persistence/OrderDAO.java @@ -1,6 +1,7 @@ package com.stockm8.persistence; import java.util.List; +import java.util.Map; import com.stockm8.domain.vo.OrderItemVO; import com.stockm8.domain.vo.OrderVO; @@ -13,18 +14,28 @@ public interface OrderDAO { public void insertOrder(OrderVO order) throws Exception; // 주문 항목 등록 - public void insertOrderItem(OrderItemVO orderItem) throws Exception; - - // 주문과 주문항목을 한번에 처리 - public void insertOrderWithItems(OrderVO order) throws Exception; + public void insertOrderItem(List orderItem) throws Exception; // 모든 재고 목록 조회 - public List findAvailableStocks() throws Exception; + public List findAvailableStocks(int businessId) throws Exception; - //주문번호 생성 + // 주문번호 생성 public String generateOrderNumber() throws Exception; + // 재고 수량 업데이트 + public int updateStockQuantity(Map params) throws Exception; + + // 주문 목록 + public List getOrderList(); + + // 재고 정보 조회 ============> 미사용 + public StockVO getStockById(int stockId) throws Exception; + + // 재고 이력 등록 =========> 미사용 + public void insertStockHistory(Map params) throws Exception; + + + + - // 재고의 예약 수량을 업데이트.. 이거는 뭐지..>> - public void updateStockReservedQuantity(int stockId, int quantity) throws Exception; } // OrderDAO diff --git a/stockMate/src/main/java/com/stockm8/persistence/OrderDAOImpl.java b/stockMate/src/main/java/com/stockm8/persistence/OrderDAOImpl.java index 4431d58..19d6a5f 100644 --- a/stockMate/src/main/java/com/stockm8/persistence/OrderDAOImpl.java +++ b/stockMate/src/main/java/com/stockm8/persistence/OrderDAOImpl.java @@ -2,7 +2,9 @@ import java.text.SimpleDateFormat; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.inject.Inject; @@ -26,38 +28,59 @@ public class OrderDAOImpl implements OrderDAO { private static final String NAMESPACE = "com.stockm8.mapper.OrderMapper."; + + // 주문 등록 @Override public void insertOrder(OrderVO order) throws Exception { - sqlSession.insert(NAMESPACE + "insertOrder", order); } + // 주문 항목 등록 @Override - public void insertOrderItem(OrderItemVO orderItem) throws Exception { - sqlSession.insert(NAMESPACE + "insertOrderItem", orderItem); - } + public void insertOrderItem(List orderItems) throws Exception { + for (OrderItemVO item : orderItems) { - @Override - public List findAvailableStocks() throws Exception { - return sqlSession.selectList(NAMESPACE + "findAvailableStocks"); - } - - @Override - public void updateStockReservedQuantity(int stockId, int quantity) throws Exception { - sqlSession.update(NAMESPACE + "updateStockReservedQuantity", - new java.util.HashMap() {{ - put("stockId", stockId); - put("quantity", quantity); - }} - ); + sqlSession.insert(NAMESPACE + "insertOrderItem", item); + } } - /** - * 새로운 주문번호 생성 - * 동시성 제어를 위해 synchronized 키워드 사용 - * 형식: ORD-YYYYMMDD-### - */ - +// public void insertOrderWithItems(OrderVO order) throws Exception { +// try { +// +// logger.info("주문 기본 정보 저장 시작"); +// // 주문 마스터 등록(Order 와 Orderitem 을 한번에 처리) +// sqlSession.insert(NAMESPACE + "insertOrder", order); +// logger.info("주문 기본 정보 저장 완료, orderId: {}", order.getOrderId()); +// +// +// // 생성된 주문 ID로 각 주문 항목 등록 +// for (OrderItemVO item : order.getOrderItems()) { +// logger.info("주문 항목 저장 시작: productId={}, quantity={}", +// item.getProductId(), item.getQuantity()); +// item.setOrderId(order.getOrderId()); +// sqlSession.insert(NAMESPACE + "insertOrderItem", item); +// logger.info("주문 항목 저장 완료"); +// } +// +// } catch(Exception e) { +// logger.error("주문 정보 저장 중 오류 발생", e); +// throw e; +// +// } +// } + // 모든 재고 목록 조회 + @Override + public List findAvailableStocks(int businessId) throws Exception { + return sqlSession.selectList(NAMESPACE + "findAvailableStocks",businessId); + } + + + //주문번호 생성 + /** + * 새로운 주문번호 생성 + * 동시성 제어를 위해 synchronized 키워드 사용 + * 형식: ORD-YYYYMMDD-### + */ @Override public synchronized String generateOrderNumber() throws Exception { // 현재 날짜 형식 지정 @@ -77,17 +100,36 @@ public synchronized String generateOrderNumber() throws Exception { // 주문번호 생성 및 반환 return String.format("ORD-%s-%03d", date, sequence); } + + + // 재고 수량 업데이트 =>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 문제 수정해야함 + @Override + public int updateStockQuantity(Map params) throws Exception { + return sqlSession.update(NAMESPACE + "updateStockQuantity", params); + } + + + // 재고 정보 조회 ==== > 미사용 + @Override + public StockVO getStockById(int stockId) throws Exception { + return sqlSession.selectOne(NAMESPACE + "getStockById", stockId); + } + + // 재고 이력 등록 =====> 미사용 @Override - public void insertOrderWithItems(OrderVO order) throws Exception { - // 주문 마스터 등록(Order 와 Orderitem 을 한번에 처리) - sqlSession.insert(NAMESPACE + "insertOrder", order); - - // 생성된 주문 ID로 각 주문 항목 등록 - for (OrderItemVO item : order.getOrderItems()) { - item.setOrderId(order.getOrderId()); - sqlSession.insert(NAMESPACE + "insertOrderItem", item); - } + public void insertStockHistory(Map params) throws Exception { + sqlSession.insert(NAMESPACE + "insertStockHistory", params); } + + //오더 목록 + @Override + public List getOrderList() { + return sqlSession.selectList(NAMESPACE+ "orderList"); + } + + + + } // OrderImpl \ No newline at end of file diff --git a/stockMate/src/main/java/com/stockm8/service/OrderService.java b/stockMate/src/main/java/com/stockm8/service/OrderService.java index da1c567..1a0bd0d 100644 --- a/stockMate/src/main/java/com/stockm8/service/OrderService.java +++ b/stockMate/src/main/java/com/stockm8/service/OrderService.java @@ -8,13 +8,28 @@ import com.stockm8.domain.vo.StockVO; public interface OrderService { - // 주문 등록 (주문항목 포함) - public void insertOrder(OrderVO order) throws Exception; + + // 주문항목을 한꺼번에 처리 + public void insertOrderWithItems(OrderVO order, List orderItems) throws Exception; // 재고 목록 조회 - public List findAvailableStocks() throws Exception; + public List findAvailableStocks(int businessId) throws Exception; // 주문번호 생성 public String generateOrderNumber() throws Exception; + // 재고 수량 업데이트 + public void updateStockQuantity(int stockId, int quantity) throws Exception; + + // 주문목록 + public List getOrderList(); + + // 가용 재고 체크 ===> 미사용 + public boolean checkAvailableStock(OrderItemVO item) throws Exception; + + // 재고 이력 등록 ====> 미사용 + public void insertStockHistory(StockVO stock, OrderVO order, int quantityChanged) throws Exception; + + + } //OrderService diff --git a/stockMate/src/main/java/com/stockm8/service/OrderServiceImpl.java b/stockMate/src/main/java/com/stockm8/service/OrderServiceImpl.java index 1299db1..53f9d44 100644 --- a/stockMate/src/main/java/com/stockm8/service/OrderServiceImpl.java +++ b/stockMate/src/main/java/com/stockm8/service/OrderServiceImpl.java @@ -1,14 +1,24 @@ package com.stockm8.service; +import java.util.HashMap; import java.util.List; +import java.util.Map; + import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; +import org.springframework.transaction.support.DefaultTransactionDefinition; import com.stockm8.domain.vo.OrderItemVO; import com.stockm8.domain.vo.OrderVO; // OrderItemVO import 제거 +import com.stockm8.domain.vo.OrderVO.OrderType; import com.stockm8.domain.vo.ProductVO; import com.stockm8.domain.vo.StockVO; import com.stockm8.persistence.OrderDAO; @@ -25,19 +35,118 @@ public class OrderServiceImpl implements OrderService { @Inject private ReceivingDAO rdao; - @Override + @Transactional - public void insertOrder(OrderVO order) throws Exception { - odao.insertOrderWithItems(order); - } @Override - public List findAvailableStocks() throws Exception { - return odao.findAvailableStocks(); + public void insertOrderWithItems(OrderVO order, List orderItems) throws Exception { + odao.insertOrder(order); + for(OrderItemVO item : orderItems) { + item.setOrderId(order.getOrderId()); + } + odao.insertOrderItem(orderItems); + processOrderByType(order); + } + + + + // 주문 유형에 따라 처리 + private void processOrderByType(OrderVO order) throws Exception { + if (order.getOrderType() == OrderType.INBOUND) { + // 수주(출고) 처리 + for (OrderItemVO item : order.getOrderItems()) { + // 재고 감소 + updateStockQuantity(item.getStockId(), item.getQuantity()); + // 수주(출고)일 때는 예약수량을 양수로 처리해야 함 (+) + // 재고 이력 기록 +// StockVO stock = odao.getStockById(item.getStockId()); +// insertStockHistory(stock, order, -item.getQuantity()); + + // TODO: 기존 TODO 항목들 유지 + // - 출고 지시서 생성 + // - 거래명세서 생성 + // - 출고 작업 지시서 생성 + // - 픽킹 리스트 생성 + // - 고객사 알림 발송 + // - 매출 전표 생성 + } + } else if (order.getOrderType() == OrderType.OUTBOUND) { + // 발주(입고) 처리 + for (OrderItemVO item : order.getOrderItems()) { + // 재고 증가 + updateStockQuantity(item.getStockId(), -item.getQuantity()); + // 발주(입)일 때는 예약수량을 음수로 처리해야 함 (-) + // 재고 이력 기록 +// StockVO stock = odao.getStockById(item.getStockId()); +// insertStockHistory(stock, order, item.getQuantity()); + + // TODO: 기존 TODO 항목들 유지 + // - 발주서 생성 + // - 입고 예정 등록 + // - 구매 오더 생성 + // - 구매처 발주 확인 + // - 지출 전표 생성 + // - 입고 검수 체크리스트 생성 + } + } } - @Override - public String generateOrderNumber() throws Exception { - return odao.generateOrderNumber(); - } + + // 재고 수량 업데이트 => 수정필요 + @Override + public void updateStockQuantity(int stockId, int quantity) throws Exception { + Map params = new HashMap<>(); + params.put("stockId", stockId); + params.put("quantity", quantity); + + int updatedRows = odao.updateStockQuantity(params); + if (updatedRows == 0) { + throw new Exception("재고 수정에 실패했습니다. StockId: " + stockId); + } + + } + + // 재고 목록 조회 + @Override + public List findAvailableStocks(int businessId) throws Exception { + return odao.findAvailableStocks(businessId); + } + + // 주문번호 생성 + @Override + public String generateOrderNumber() throws Exception { + return odao.generateOrderNumber(); + } + + // 주문목록 + @Override + public List getOrderList() { + return odao.getOrderList(); + } + + // 가용 재고 체크 => 미사용 + @Override + public boolean checkAvailableStock(OrderItemVO item) throws Exception { + StockVO stock = odao.getStockById(item.getStockId()); + return stock != null && stock.getAvailableStock() >= item.getQuantity(); + } + + // 재고 이력 등록 => 미사용 + @Override + public void insertStockHistory(StockVO stock, OrderVO order, int quantityChanged) throws Exception { + Map params = new HashMap<>(); + params.put("stockId", stock.getStockId()); + params.put("orderId", order.getOrderId()); + params.put("quantityChanged", quantityChanged); + params.put("actionType", order.getOrderType().toString()); + params.put("createdBy", order.getCreatedBy()); + params.put("remarks", "주문에 의한 재고 변동"); + + odao.insertStockHistory(params); + + } + + + + } //OrderServiceImpl \ No newline at end of file diff --git a/stockMate/src/main/resources/log4j.xml b/stockMate/src/main/resources/log4j.xml index 141ebc6..5df8957 100644 --- a/stockMate/src/main/resources/log4j.xml +++ b/stockMate/src/main/resources/log4j.xml @@ -40,7 +40,17 @@ - + + + + + + + + + + + diff --git a/stockMate/src/main/resources/log4jdbc.log4j2.properties b/stockMate/src/main/resources/log4jdbc.log4j2.properties index 65c11c4..ca37df4 100644 --- a/stockMate/src/main/resources/log4jdbc.log4j2.properties +++ b/stockMate/src/main/resources/log4jdbc.log4j2.properties @@ -2,3 +2,6 @@ log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator + +log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator +log4jdbc.dump.sql.maxlinelength=0 \ No newline at end of file diff --git a/stockMate/src/main/resources/mappers/OrderMapper.xml b/stockMate/src/main/resources/mappers/OrderMapper.xml index 91cff9c..0788f70 100644 --- a/stockMate/src/main/resources/mappers/OrderMapper.xml +++ b/stockMate/src/main/resources/mappers/OrderMapper.xml @@ -31,6 +31,7 @@ AND p.is_deleted = false AND w.is_deleted = false AND s.available_stock > 0 + AND s.business_id = #{businessId} ORDER BY p.name ASC @@ -64,13 +65,13 @@ total_price, created_by, created_at, - status + order_type ) VALUES ( #{orderNumber}, #{totalPrice}, #{createdBy}, NOW(), - 'pending' + #{orderType} ) SELECT LAST_INSERT_ID() @@ -87,6 +88,7 @@ unit_price, remarks, created_at + ) VALUES ( #{orderId}, @@ -96,12 +98,13 @@ #{unitPrice}, #{remarks}, NOW() + ) - - + + UPDATE test_stocks SET reserved_quantity = reserved_quantity + #{quantity} WHERE stock_id = #{stockId} @@ -115,4 +118,69 @@ ORDER BY order_number DESC LIMIT 1 + + + + + + + + + + + + + INSERT INTO test_stock_history ( + stock_id, + order_id, + quantity_changed, + action_type, + created_by, + created_at, + remarks + ) VALUES ( + #{stockId}, + #{orderId}, + #{quantityChanged}, + #{actionType}, + #{createdBy}, + NOW(), + #{remarks} + ) + + + + + + + \ No newline at end of file diff --git a/stockMate/src/main/resources/mappers/receivingMapper.xml b/stockMate/src/main/resources/mappers/receivingMapper.xml index 90afd9f..725140e 100644 --- a/stockMate/src/main/resources/mappers/receivingMapper.xml +++ b/stockMate/src/main/resources/mappers/receivingMapper.xml @@ -33,18 +33,16 @@ status, product_id, change_quantity, - transaction_unit, order_item_id, stock_id, warehouse_id, created_by ) SELECT - 'INBOUND', - 'PENDING', + 'in', + 'pending', p.product_id, o.quantity, - p.base_unit, o.order_item_id, s.stock_id, o.warehouse_id, diff --git a/stockMate/src/main/webapp/WEB-INF/spring/root-context.xml b/stockMate/src/main/webapp/WEB-INF/spring/root-context.xml index a4d079b..774a389 100644 --- a/stockMate/src/main/webapp/WEB-INF/spring/root-context.xml +++ b/stockMate/src/main/webapp/WEB-INF/spring/root-context.xml @@ -72,5 +72,4 @@ - - + \ No newline at end of file diff --git a/stockMate/src/main/webapp/WEB-INF/views/order/orderList.jsp b/stockMate/src/main/webapp/WEB-INF/views/order/orderList.jsp new file mode 100644 index 0000000..1e42a03 --- /dev/null +++ b/stockMate/src/main/webapp/WEB-INF/views/order/orderList.jsp @@ -0,0 +1,65 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + +주문 목록 + + + +

주문 목록

+ + + + + + + + + + + + + + + + +<%-- --%> + + + +
주문번호발주일자총액주문유형상세보기
+ + ${order.orderNumber} + 값이 없습니다 + + + + ${order.createdAt} + 값이 없습니다 + + + + ${order.totalPrice} + 값이 없습니다 + + + + ${order.orderType} + 값이 없습니다 + + + + ${order.status} + 값이 없습니다 + + + 상세 +
+ + diff --git a/stockMate/src/main/webapp/WEB-INF/views/order/register.jsp b/stockMate/src/main/webapp/WEB-INF/views/order/register.jsp index 6d9b78a..7466903 100644 --- a/stockMate/src/main/webapp/WEB-INF/views/order/register.jsp +++ b/stockMate/src/main/webapp/WEB-INF/views/order/register.jsp @@ -12,28 +12,48 @@

주문 발주

+
-
주문 정보
-
-
-
-
- - -
-
-
-
- - -
-
-
-
-
+
주문 정보
+
+
+
+
+ +
+ 수주 + + + 발주 + +
+
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
@@ -235,9 +255,10 @@ // 첫 번째 재고 정보 카드 추가 addOrder(); }); - // 재고 정보 카드 추가 + // 재고 정보 카드 추가 function addOrder() { - // 템플릿 복제 + + // 템플릿 복제 const newCard = $('#stockInfoTemplate').clone() .removeAttr('id') .show(); @@ -424,55 +445,67 @@ // 재고 선택 function selectStock(stock) { + // 현재 표시된 재고 정보 카드 중 현재 인덱스에 해당하는 카드를 선택 const card = $('.stock-info-card:visible').eq(currentItemIndex); + + // stockId 설정이 제대로 되는지 확인######################################################## 디버깅 + card.find('.stock-id').val(stock.stockId); + console.log('Selected Stock ID:', stock.stockId); // 디버깅용 // 숨겨진 필드 업데이트 - card.find('.stock-id').val(stock.stockId); - card.find('.product-id').val(stock.product.productId); - card.find('.warehouse-id').val(stock.warehouseId); + card.find('.stock-id').val(stock.stockId); // 재고 고유 ID + card.find('.product-id').val(stock.product.productId); // 제품 고유 ID + card.find('.warehouse-id').val(stock.warehouseId); // 창고 고유 ID - // 표시 필드 업데이트 - card.find('.product-name').val(stock.product.name); - card.find('.warehouse-name').val(stock.warehouseName); - card.find('.barcode').val(stock.product.barcode); - card.find('.total-quantity').val(stock.totalQuantity); - card.find('.reserved-quantity').val(stock.reservedQuantity); - card.find('.available-stock').val(stock.availableStock); - card.find('.base-unit').val(stock.product.baseUnit); - card.find('.unit-price').val(stock.product.price); + // 사용자 View 표시 필드 업데이트 + card.find('.product-name').val(stock.product.name); // 제품명 + card.find('.warehouse-name').val(stock.warehouseName); // 창고명 + card.find('.barcode').val(stock.product.barcode); // 바코드 + card.find('.total-quantity').val(stock.totalQuantity); // 총 재고량 + card.find('.reserved-quantity').val(stock.reservedQuantity); // 예약된 수량 + card.find('.available-stock').val(stock.availableStock); // 실제 주문 가능한 재고량 @@@@@@@@@@@@@@@@@ + card.find('.base-unit').val(stock.product.baseUnit); // 기본 단위 + card.find('.unit-price').val(stock.product.price); // 단가 - // 주문 수량 최대값 설정 - const quantityInput = card.find('.order-quantity'); - quantityInput.attr('max', stock.availableStock); - validateQuantity(quantityInput); + // 주문 수량 최대값 설정(가용 재고량으로 설정) + const quantityInput = card.find('.order-quantity'); + quantityInput.attr('max', stock.availableStock); // HTML input의 max 속성 설정 + validateQuantity(quantityInput); // 현재 입력된 수량의 유효성 검사 실행 closeModal(); } - // 수량 유효성 검사 + // 수량 유효성 검사(입력된 수량이 유효한지 확인) function validateQuantity(input) { + // 현재 수량 입력이 속한 카드 요소 찾기 const card = input.closest('.stock-info-card'); - const quantity = parseInt(input.val()) || 0; - const available = parseInt(card.find('.available-stock').val()) || 0; + // 입력된 수량과 가용 재고를 정수로 변환 (값이 없으면 0으로 설정) + const quantity = parseInt(input.val()) || 0; // 입력된 주문 수량 반환실패 시 null 대신 0 값 들어감 + const available = parseInt(card.find('.available-stock').val()) || 0; // 가용 재고량 - if (quantity < 1) { + // 수량 유효성 검사 조건문 + if (quantity < 1) { // 최소 주문 수량(1개) 미만인 경우 alert('주문 수량은 1 이상이어야 합니다.'); - input.val(1); - } else if (quantity > available) { + input.val(1); // 수량을 1로 재설정 + } else if (quantity > available) { // 가용 재고보다 많은 경우 alert('주문 수량이 가용 재고를 초과할 수 없습니다.'); - input.val(available); + input.val(available); // 수량을 가용 재고량으로 재설정 } - calculateSubtotal(card); + calculateSubtotal(card); // 수량 변경에 따른 소계 재계산 } - // 소계 계산 + // 소계 계산(주문 수량과 단가를 곱하여 소계 계산) function calculateSubtotal(card) { - const quantity = parseInt(card.find('.order-quantity').val()) || 0; - const unitPrice = parseFloat(card.find('.unit-price').val()) || 0; - const subtotal = quantity * unitPrice; + // 현재 카드의 수량과 단가 가져오기 (값이 없으면 0으로 설정) + const quantity = parseInt(card.find('.order-quantity').val()) || 0; // 주문 수량 + const unitPrice = parseFloat(card.find('.unit-price').val()) || 0; // 단가 + const subtotal = quantity * unitPrice; // 소계 계산 (수량 * 단가) + // 계산된 소계를 소수점 둘째 자리까지 표시하여 필드에 설정 card.find('.subtotal-price').val(subtotal.toFixed(2)); + + // 전체 주문 금액 업데이트 (다른 함수에서 구현) updateGrandTotal(); } @@ -491,11 +524,18 @@ buttons.prop('disabled', buttons.length <= 1); } - // 폼 유효성 검사 + // 폼 유효성 검사 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ function validateForm() { let isValid = true; let hasUnselectedItems = false; + // 주문 유형 체크(수주/ 발주) + if (!$('input[name="orderType"]:checked').val()){ + alert('주문 유형을 선택 해주세요.'); + return false; + } + + $('.stock-info-card:visible').each(function() { const card = $(this); if (!card.find('.stock-id').val()) { @@ -532,16 +572,18 @@ quantity: parseInt(card.find('.order-quantity').val()), unitPrice: parseFloat(card.find('.unit-price').val()), remarks: card.find('.remarks').val(), - stotalPrice: parseFloat(card.find('.subtotal-price').val()) // 소계 추가 + stotalPrice: parseFloat(card.find('.subtotal-price').val()),// 소계 추가 + stockId: parseInt(card.find('.stock-id').val()) // 스톡 아이디 추가 }); }); - + // formData 객체 값추가 필요시 추가 해야함 const formData = { orderNumber: $('#orderNumber').val(), createdAt: $('#createdAt').val(), totalPrice: parseFloat($('#grandTotal').val()), createdBy: $('#createdBy').val(), - orderItems: orderItems + orderItems: orderItems, + orderType: $('input[name="orderType"]:checked').val() // INBOUND 또는 OUTBOUND 추가 }; showLoading(); @@ -571,6 +613,7 @@ $('#orderForm')[0].reset(); $('#stockInfoContainer').empty(); $('#grandTotal').val('0.00'); + $('input[name="orderType"]').prop('checked', false); // 수주/ 발주 라디오 버튼 초기화 추가 // 날짜 재설정 document.getElementById('createdAt').value = new Date().toISOString().split('T')[0]; diff --git a/stockMate/src/main/webapp/WEB-INF/views/order/register2.jsp b/stockMate/src/main/webapp/WEB-INF/views/order/register2.jsp deleted file mode 100644 index 7adbb6e..0000000 --- a/stockMate/src/main/webapp/WEB-INF/views/order/register2.jsp +++ /dev/null @@ -1,399 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - - - - - 주문 발주 페이지 - - - -
-

주문 발주

- - -
-
주문 정보
-
-
-
-
- - -
-
-
-
- - -
-
-
-
-
- - -
-
재고 정보
-
-
-
- -
-
- - - - - -
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
- -
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
- -
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
- -
-
-
- - -
-
-
-
-
- - - - -
- - -
- -
- - - - - - - - \ No newline at end of file diff --git a/stockMate/src/main/webapp/WEB-INF/views/order/register3.jsp b/stockMate/src/main/webapp/WEB-INF/views/order/register3.jsp deleted file mode 100644 index 120e67d..0000000 --- a/stockMate/src/main/webapp/WEB-INF/views/order/register3.jsp +++ /dev/null @@ -1,713 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - - - - - 주문 발주 페이지 - - - - - -
-

주문 발주

- -
- -
-
주문 정보
-
-
-
-
- - -
-
-
-
- - -
-
-
-
-
- - -
- - -
- -
- - -
-
총계 정보
-
-
-
-
- - -
-
-
-
-
- - - - - -
- - -
-
-
- - - - - - - - - - - \ No newline at end of file diff --git a/stockMate/src/test/resources/log4j.xml b/stockMate/src/test/resources/log4j.xml index 6a0a3ed..d83c373 100644 --- a/stockMate/src/test/resources/log4j.xml +++ b/stockMate/src/test/resources/log4j.xml @@ -14,6 +14,12 @@ + + + + + + From 8630d80a8c241ceaa3fab88bb6400e29ade1cefa Mon Sep 17 00:00:00 2001 From: freehyeon Date: Mon, 16 Dec 2024 11:54:37 +0900 Subject: [PATCH 2/9] test --- .../src/main/java/com/stockm8/controller/OrderController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stockMate/src/main/java/com/stockm8/controller/OrderController.java b/stockMate/src/main/java/com/stockm8/controller/OrderController.java index d32319f..2b3e692 100644 --- a/stockMate/src/main/java/com/stockm8/controller/OrderController.java +++ b/stockMate/src/main/java/com/stockm8/controller/OrderController.java @@ -189,4 +189,4 @@ public String orderListGET(Model model) { return "/order/orderList"; } -} //OrderController \ No newline at end of file +} //OrderController ajknhdfkasjld \ No newline at end of file From 2a28c618d957e396d6e898028b15ac7236f67764 Mon Sep 17 00:00:00 2001 From: freehyeon Date: Mon, 16 Dec 2024 11:59:06 +0900 Subject: [PATCH 3/9] =?UTF-8?q?receivingMapper=20=EC=B5=9C=EC=8B=A0?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/mappers/receivingMapper.xml | 85 ++++++++++++------- 1 file changed, 52 insertions(+), 33 deletions(-) diff --git a/stockMate/src/main/resources/mappers/receivingMapper.xml b/stockMate/src/main/resources/mappers/receivingMapper.xml index 725140e..42830b9 100644 --- a/stockMate/src/main/resources/mappers/receivingMapper.xml +++ b/stockMate/src/main/resources/mappers/receivingMapper.xml @@ -20,37 +20,40 @@ - - - + + + + - INSERT INTO test_receiving_shipment ( + INSERT INTO receiving_shipment ( transaction_type, status, product_id, change_quantity, + transaction_unit, order_item_id, stock_id, warehouse_id, created_by ) SELECT - 'in', - 'pending', + 'INBOUND', + 'PENDING', p.product_id, o.quantity, + p.base_unit, o.order_item_id, s.stock_id, o.warehouse_id, u.created_by - FROM test_products p - JOIN test_order_items o ON o.product_id = p.product_id - JOIN test_stocks s ON s.product_id = p.product_id - JOIN test_users u ON u.business_id = p.business_id; + FROM products p + JOIN order_items o ON o.product_id = p.product_id + JOIN stocks s ON s.product_id = p.product_id + JOIN users u ON u.business_id = p.business_id; @@ -61,14 +64,16 @@ r.created_at, r.status, r.product_id, - p.name, - p.description, + p.product_name, + p.product_description, r.change_quantity, r.memo from receiving_shipment r join products p on r.product_id = p.product_id join warehouses w on w.warehouse_id = r.warehouse_id - where Date(r.created_at) = CURRENT_DATE and r.status = 'pending' and r.transaction_type = 'INBOUND' + JOIN users u on u.created_by = r.created_by + where Date(r.created_at) = CURRENT_DATE and r.status = 'PENDING' and r.transaction_type = 'INBOUND' + AND u.business_id = #{businessId} order by r.receiving_shipment_no desc limit 0, 20 @@ -81,14 +86,16 @@ r.created_at, r.status, r.product_id, - p.name, - p.description, + p.product_name, + p.product_description, r.change_quantity, r.memo from receiving_shipment r join products p on r.product_id = p.product_id join warehouses w on w.warehouse_id = r.warehouse_id + JOIN users u on u.created_by = r.created_by where Date(r.created_at) = DATE_ADD(CURRENT_DATE, INTERVAL -1 DAY) + AND u.business_id = #{businessId} order by r.receiving_shipment_no desc limit 0, 20 @@ -101,14 +108,16 @@ r.created_at, r.status, r.product_id, - p.name, - p.description, + p.product_name, + p.product_description, r.change_quantity, r.memo from receiving_shipment r join products p on r.product_id = p.product_id join warehouses w on w.warehouse_id = r.warehouse_id + JOIN users u on u.created_by = r.created_by where Date(r.created_at) = DATE_ADD(CURRENT_DATE, INTERVAL -2 DAY) + AND u.business_id = #{businessId} order by r.receiving_shipment_no desc limit 0, 20 @@ -121,17 +130,19 @@ r.created_at, r.status, r.product_id, - p.name, - p.description, + p.product_name, + p.product_description, r.change_quantity, - p.price, + p.product_price, + r.warehouse_id, r.memo - from test_receiving_shipment r - join test_products p on r.product_id = p.product_id - join test_warehouses w on w.warehouse_id = r.warehouse_id - where transaction_type = 'in' + from receiving_shipment r + join products p on r.product_id = p.product_id + join warehouses w on w.warehouse_id = r.warehouse_id + JOIN users u on u.created_by = r.created_by + where transaction_type = 'INBOUND' AND u.business_id = #{businessId} order by r.receiving_shipment_no desc - limit #{startPage},#{pageSize}; + limit #{cri.startPage},#{cri.pageSize}; @@ -142,14 +153,16 @@ r.created_at, r.status, r.product_id, - p.name, - p.description, + p.product_name, + p.product_description, r.change_quantity, - p.price, + p.product_price, + r.warehouse_id, r.memo FROM receiving_shipment r JOIN products p ON r.product_id = p.product_id JOIN warehouses w ON w.warehouse_id = r.warehouse_id + JOIN users u on u.created_by = r.created_by r.created_at >= #{startDate} @@ -158,9 +171,10 @@ AND r.created_at <= #{endDate} - AND (p.name LIKE CONCAT('%', #{keyword}, '%') ) + AND (p.product_name LIKE CONCAT('%', #{keyword}, '%') ) - AND transaction_type = 'INBOUND' + AND transaction_type = 'INBOUND' + AND u.business_id = #{businessId} ORDER BY r.receiving_shipment_no desc limit #{cri.startPage},#{cri.pageSize}; @@ -171,6 +185,7 @@ SELECT COUNT(*) FROM receiving_shipment r JOIN products p ON r.product_id = p.product_id + JOIN users u on u.created_by = r.created_by r.created_at >= #{startDate} @@ -179,9 +194,10 @@ AND r.created_at <= #{endDate} - AND p.name LIKE CONCAT('%', #{keyword}, '%') + AND p.product_name LIKE CONCAT('%', #{keyword}, '%') AND r.transaction_type = 'INBOUND' + AND u.business_id = #{businessId} ORDER BY r.receiving_shipment_no desc @@ -189,8 +205,11 @@ + \ No newline at end of file From efcc28098b8d7e7b9e3021181d2df86d7c3a7c8c Mon Sep 17 00:00:00 2001 From: Insung <110476794+in27sung@users.noreply.github.com> Date: Mon, 16 Dec 2024 12:07:07 +0900 Subject: [PATCH 4/9] Update OrderDAO.java --- stockMate/src/main/java/com/stockm8/persistence/OrderDAO.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stockMate/src/main/java/com/stockm8/persistence/OrderDAO.java b/stockMate/src/main/java/com/stockm8/persistence/OrderDAO.java index 6a0b007..1aae210 100644 --- a/stockMate/src/main/java/com/stockm8/persistence/OrderDAO.java +++ b/stockMate/src/main/java/com/stockm8/persistence/OrderDAO.java @@ -28,10 +28,10 @@ public interface OrderDAO { // 주문 목록 public List getOrderList(); - // 재고 정보 조회 ============> 미사용 + // 재고 정보 조회 미사용 public StockVO getStockById(int stockId) throws Exception; - // 재고 이력 등록 =========> 미사용 + // 재고 이력 등록 미사용 public void insertStockHistory(Map params) throws Exception; From a0dc4074bb9ce1081bd57f6cac507960f4c4f9cf Mon Sep 17 00:00:00 2001 From: Insung <110476794+in27sung@users.noreply.github.com> Date: Mon, 16 Dec 2024 12:07:40 +0900 Subject: [PATCH 5/9] Update OrderService.java --- stockMate/src/main/java/com/stockm8/service/OrderService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stockMate/src/main/java/com/stockm8/service/OrderService.java b/stockMate/src/main/java/com/stockm8/service/OrderService.java index 1a0bd0d..37ac9d2 100644 --- a/stockMate/src/main/java/com/stockm8/service/OrderService.java +++ b/stockMate/src/main/java/com/stockm8/service/OrderService.java @@ -24,10 +24,10 @@ public interface OrderService { // 주문목록 public List getOrderList(); - // 가용 재고 체크 ===> 미사용 + // 가용 재고 체크 미사용 public boolean checkAvailableStock(OrderItemVO item) throws Exception; - // 재고 이력 등록 ====> 미사용 + // 재고 이력 등록 미사용 public void insertStockHistory(StockVO stock, OrderVO order, int quantityChanged) throws Exception; From 7228fb78bd23cc021f337b963957f15a6625dacd Mon Sep 17 00:00:00 2001 From: Insung <110476794+in27sung@users.noreply.github.com> Date: Mon, 16 Dec 2024 12:08:37 +0900 Subject: [PATCH 6/9] Update register.jsp --- .../src/main/webapp/WEB-INF/views/order/register.jsp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/stockMate/src/main/webapp/WEB-INF/views/order/register.jsp b/stockMate/src/main/webapp/WEB-INF/views/order/register.jsp index 7466903..da86748 100644 --- a/stockMate/src/main/webapp/WEB-INF/views/order/register.jsp +++ b/stockMate/src/main/webapp/WEB-INF/views/order/register.jsp @@ -448,7 +448,7 @@ // 현재 표시된 재고 정보 카드 중 현재 인덱스에 해당하는 카드를 선택 const card = $('.stock-info-card:visible').eq(currentItemIndex); - // stockId 설정이 제대로 되는지 확인######################################################## 디버깅 + // stockId 설정이 제대로 되는지 확인 디버깅 card.find('.stock-id').val(stock.stockId); console.log('Selected Stock ID:', stock.stockId); // 디버깅용 @@ -463,7 +463,7 @@ card.find('.barcode').val(stock.product.barcode); // 바코드 card.find('.total-quantity').val(stock.totalQuantity); // 총 재고량 card.find('.reserved-quantity').val(stock.reservedQuantity); // 예약된 수량 - card.find('.available-stock').val(stock.availableStock); // 실제 주문 가능한 재고량 @@@@@@@@@@@@@@@@@ + card.find('.available-stock').val(stock.availableStock); // 실제 주문 가능한 재고량 card.find('.base-unit').val(stock.product.baseUnit); // 기본 단위 card.find('.unit-price').val(stock.product.price); // 단가 @@ -524,7 +524,7 @@ buttons.prop('disabled', buttons.length <= 1); } - // 폼 유효성 검사 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + // 폼 유효성 검사 function validateForm() { let isValid = true; let hasUnselectedItems = false; @@ -637,4 +637,4 @@ - \ No newline at end of file + From 1daf78637cf6c9680517d847b9e448649044f838 Mon Sep 17 00:00:00 2001 From: shoqying Date: Mon, 16 Dec 2024 12:12:09 +0900 Subject: [PATCH 7/9] =?UTF-8?q?=EC=88=98=EC=A0=951?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/stockm8/persistence/ReceivingDAO.java | 10 +++++ .../stockm8/persistence/ReceivingDAOImpl.java | 38 ++++++++++++++++-- .../com/stockm8/persistence/StockDAO.java | 9 +---- .../com/stockm8/persistence/StockDAOImpl.java | 29 -------------- .../stockm8/service/ReceivingServiceImpl.java | 6 +-- .../resources/mappers/receivingMapper.xml | 39 ++++++++++++++++--- .../main/resources/mappers/stockMapper.xml | 27 +------------ 7 files changed, 82 insertions(+), 76 deletions(-) diff --git a/stockMate/src/main/java/com/stockm8/persistence/ReceivingDAO.java b/stockMate/src/main/java/com/stockm8/persistence/ReceivingDAO.java index 7f1db8d..ac5d756 100644 --- a/stockMate/src/main/java/com/stockm8/persistence/ReceivingDAO.java +++ b/stockMate/src/main/java/com/stockm8/persistence/ReceivingDAO.java @@ -4,6 +4,7 @@ import com.stockm8.domain.vo.Criteria; import com.stockm8.domain.vo.ReceivingShipmentVO; +import com.stockm8.domain.vo.StockVO; public interface ReceivingDAO { @@ -30,5 +31,14 @@ public interface ReceivingDAO { // recevingShipment 테이블 insert public void insertReceiving(int businessId) throws Exception; + + // 바코드로 재고 조회 + public List selectQuantityCheckByBarcode(int businessId, String barcode) throws Exception; + + // 바코드로 재고 감소 + public int updateIncreseStock(int businessId, String barcode) throws Exception; + + // 바코드로 재고 감소 실시간 조회 + public int selectStockByBarcode(int businessId, String barcode) throws Exception; } // ReceivingDAO end \ No newline at end of file diff --git a/stockMate/src/main/java/com/stockm8/persistence/ReceivingDAOImpl.java b/stockMate/src/main/java/com/stockm8/persistence/ReceivingDAOImpl.java index e67c86b..ca5b550 100644 --- a/stockMate/src/main/java/com/stockm8/persistence/ReceivingDAOImpl.java +++ b/stockMate/src/main/java/com/stockm8/persistence/ReceivingDAOImpl.java @@ -13,13 +13,14 @@ import com.stockm8.domain.vo.Criteria; import com.stockm8.domain.vo.ReceivingShipmentVO; +import com.stockm8.domain.vo.StockVO; @Repository public class ReceivingDAOImpl implements ReceivingDAO { private static final Logger logger = LoggerFactory.getLogger(ReceivingDAOImpl.class); - private static final String NAMESPACE = "com.stockm8.mapper.ReceivingShipmentMapper."; + private static final String NAMESPACE = "com.stockm8.mappers.receivingMapper."; // 디비 연결 객체 주입 @Inject @@ -28,7 +29,7 @@ public class ReceivingDAOImpl implements ReceivingDAO { // 입고 메인 오늘 들어올 리스트 @Override public List selectReceivingList(int businessId) throws Exception { - logger.info("ReceivingList() 호출"); + logger.info("selectReceivingList() 호출"); return sqlSession.selectList(NAMESPACE + "getReceivingList", businessId); } @@ -36,7 +37,7 @@ public List selectReceivingList(int businessId) throws Exce // 입고 메인 오늘 들어올 리스트 @Override public List selectYesterdayReceivingList(int businessId) throws Exception { - logger.info("ReceivingList() 호출"); + logger.info("selectYesterdayReceivingList() 호출"); return sqlSession.selectList(NAMESPACE + "getYesterdayReceivingList", businessId); } @@ -44,7 +45,7 @@ public List selectYesterdayReceivingList(int businessId) th // 입고 메인 오늘 들어올 리스트 @Override public List selectTDBYReceivingList(int businessId) throws Exception { - logger.info("ReceivingList() 호출"); + logger.info("selectTDBYReceivingList() 호출"); return sqlSession.selectList(NAMESPACE + "getTDBYReceivingList", businessId); } @@ -100,7 +101,36 @@ public void insertReceiving(int businessId) throws Exception { sqlSession.insert(NAMESPACE + "insertReceiving", businessId); } + @Override + public List selectQuantityCheckByBarcode(int businessId, String barcode) throws Exception { + logger.info("selectReceiving() 호출"); + Map paramMap = new HashMap(); + paramMap.put("businessId", businessId); + paramMap.put("barcode", barcode); + + return sqlSession.selectList(NAMESPACE + "selectQuantityCheckByBarcode", paramMap); + } + + @Override + public int updateIncreseStock(int businessId, String barcode) throws Exception { + logger.info("updateDecreaseStock() 호출"); + // 매개변수 묶기 + Map params = new HashMap<>(); + params.put("businessId", businessId); + params.put("barcode", barcode); + + // SQL 실행 + return sqlSession.update(NAMESPACE + "updateIncreseStock", params); + } + @Override + public int selectStockByBarcode(int businessId, String barcode) throws Exception { + logger.info("selectStockByBarcode() 호출"); + Map params = new HashMap<>(); + params.put("businessId", businessId); + params.put("barcode", barcode); + return sqlSession.selectOne(NAMESPACE + "selectStockByBarcode", params); + } diff --git a/stockMate/src/main/java/com/stockm8/persistence/StockDAO.java b/stockMate/src/main/java/com/stockm8/persistence/StockDAO.java index 5b6d747..07b0bcc 100644 --- a/stockMate/src/main/java/com/stockm8/persistence/StockDAO.java +++ b/stockMate/src/main/java/com/stockm8/persistence/StockDAO.java @@ -33,12 +33,5 @@ public interface StockDAO { // 카테고리 목록 조회 public List selectAllCategories() throws Exception; - // 바코드로 재고 조회 - public List selectQuantityCheckByBarcode(int businessId, String barcode) throws Exception; - - // 바코드로 재고 감소 - public int updateIncreseStock(int businessId, String barcode) throws Exception; - - // 바코드로 재고 감소 실시간 조회 - public int selectStockByBarcode(int businessId, String barcode) throws Exception; + } diff --git a/stockMate/src/main/java/com/stockm8/persistence/StockDAOImpl.java b/stockMate/src/main/java/com/stockm8/persistence/StockDAOImpl.java index 8e59c46..2bfb25d 100644 --- a/stockMate/src/main/java/com/stockm8/persistence/StockDAOImpl.java +++ b/stockMate/src/main/java/com/stockm8/persistence/StockDAOImpl.java @@ -95,36 +95,7 @@ public List selectAllCategories() throws Exception { - @Override - public List selectQuantityCheckByBarcode(int businessId, String barcode) throws Exception { - logger.info("selectReceiving() 호출"); - Map paramMap = new HashMap(); - paramMap.put("businessId", businessId); - paramMap.put("barcode", barcode); - - return sqlSession.selectList(NAMESPACE + "selectQuantityCheckByBarcode", paramMap); - } - - @Override - public int updateIncreseStock(int businessId, String barcode) throws Exception { - logger.info("updateDecreaseStock() 호출"); - // 매개변수 묶기 - Map params = new HashMap<>(); - params.put("businessId", businessId); - params.put("barcode", barcode); - - // SQL 실행 - return sqlSession.update(NAMESPACE + "updateIncreseStock", params); - } - @Override - public int selectStockByBarcode(int businessId, String barcode) throws Exception { - logger.info("selectStockByBarcode() 호출"); - Map params = new HashMap<>(); - params.put("businessId", businessId); - params.put("barcode", barcode); - return sqlSession.selectOne(NAMESPACE + "selectStockByBarcode", params); - } } diff --git a/stockMate/src/main/java/com/stockm8/service/ReceivingServiceImpl.java b/stockMate/src/main/java/com/stockm8/service/ReceivingServiceImpl.java index a372a8e..3c1efbb 100644 --- a/stockMate/src/main/java/com/stockm8/service/ReceivingServiceImpl.java +++ b/stockMate/src/main/java/com/stockm8/service/ReceivingServiceImpl.java @@ -81,14 +81,14 @@ public void insertReceiving(int businessId) throws Exception { @Override public int increseStockByBarcode(int businessId, String barcode) throws Exception { logger.info("increseStockByBarcode() 호출"); - List stock = sdao.selectQuantityCheckByBarcode(businessId, barcode); + List stock = rdao.selectQuantityCheckByBarcode(businessId, barcode); if (stock == null) { return -1; // 유효하지 않은 바코드 } - int updatedRows = sdao.updateIncreseStock(businessId, barcode); + int updatedRows = rdao.updateIncreseStock(businessId, barcode); if (updatedRows > 0) { - return sdao.selectStockByBarcode(businessId, barcode); // 증가 후 남은 재고 반환 + return rdao.selectStockByBarcode(businessId, barcode); // 증가 후 남은 재고 반환 } else { throw new RuntimeException("재고 업데이트 실패"); } diff --git a/stockMate/src/main/resources/mappers/receivingMapper.xml b/stockMate/src/main/resources/mappers/receivingMapper.xml index 9084d26..0a4ec8a 100644 --- a/stockMate/src/main/resources/mappers/receivingMapper.xml +++ b/stockMate/src/main/resources/mappers/receivingMapper.xml @@ -4,7 +4,7 @@ "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + @@ -57,7 +57,7 @@ - select r.receiving_shipment_no, r.transaction_type, @@ -79,7 +79,7 @@ - select r.receiving_shipment_no, r.transaction_type, @@ -101,7 +101,7 @@ - select r.receiving_shipment_no, r.transaction_type, @@ -123,7 +123,7 @@ - select r.receiving_shipment_no, r.transaction_type, @@ -146,7 +146,7 @@ - SELECT r.receiving_shipment_no, r.transaction_type, @@ -211,5 +211,32 @@ AND u.business_id = #{businessId} + + + + + + + UPDATE stocks s + JOIN products p on p.product_id = s.product_id + SET s.total_quantity = s.total_quantity + 1 + WHERE p.product_barcode = #{barcode} AND s.business_id = #{businessId} + AND s.total_quantity > 0 + + + + + + diff --git a/stockMate/src/main/resources/mappers/stockMapper.xml b/stockMate/src/main/resources/mappers/stockMapper.xml index 1408efb..865ce24 100644 --- a/stockMate/src/main/resources/mappers/stockMapper.xml +++ b/stockMate/src/main/resources/mappers/stockMapper.xml @@ -211,31 +211,6 @@ WHERE business_id = #{businessId} AND is_deleted = 0 - - - - - - - UPDATE stocks s - JOIN products p on p.product_id = s.product_id - SET s.total_quantity = s.total_quantity + 1 - WHERE p.product_barcode = #{barcode} AND s.business_id = #{businessId} - AND s.total_quantity > 0 - - - - - + \ No newline at end of file From c112a6c0be45b7aed6c518e18f640cf191e96719 Mon Sep 17 00:00:00 2001 From: insung Date: Mon, 16 Dec 2024 15:12:10 +0900 Subject: [PATCH 8/9] Debuging qrScanner --- stockMate/pom.xml | 60 ++--- .../controller/api/QRCodeApiController.java | 22 +- .../main/webapp/WEB-INF/views/qrScanner.jsp | 232 ++++++++++-------- 3 files changed, 178 insertions(+), 136 deletions(-) diff --git a/stockMate/pom.xml b/stockMate/pom.xml index 0b68114..89e83b7 100644 --- a/stockMate/pom.xml +++ b/stockMate/pom.xml @@ -15,7 +15,6 @@ 1.6.6 - org.springframework @@ -230,43 +229,38 @@ - com.fasterxml.jackson.core - jackson-databind - 2.12.3 - - - - com.google.protobuf - protobuf-java - 3.21.12 - - - - - com.google.zxing - core - 3.5.1 - - - - com.google.zxing - javase - 3.5.1 - - - - com.fasterxml.jackson.core - jackson-databind - 2.18.2 - - - + com.fasterxml.jackson.core + jackson-databind + 2.12.3 + + + + com.google.protobuf + protobuf-java + 3.21.12 + + + + + com.google.zxing + core + 3.5.1 + + + + com.google.zxing + javase + 3.5.1 + + + com.google.code.gson gson 2.10.1 - + + diff --git a/stockMate/src/main/java/com/stockm8/controller/api/QRCodeApiController.java b/stockMate/src/main/java/com/stockm8/controller/api/QRCodeApiController.java index d700b1c..70e5be8 100644 --- a/stockMate/src/main/java/com/stockm8/controller/api/QRCodeApiController.java +++ b/stockMate/src/main/java/com/stockm8/controller/api/QRCodeApiController.java @@ -113,31 +113,43 @@ public ResponseEntity downloadQRCode(@RequestBody QRCodeDTO qrCodeDTO) // QR 코드 스캔 후 DB 조회 @PostMapping("/scan") - public Map scanProduct(@RequestBody ScanProductDTO scanProduct) { + public Map scanProduct(@RequestBody Map qrData) { Map response = new HashMap<>(); Gson gson = new Gson(); try { - // QR 코드 데이터에서 상품 ID 추출 + // Step 1: 원본 데이터 확인 (디버깅 로그 추가) + logger.info("Received QR Data: " + qrData); + + // Step 2: productId 문자열이 JSON 객체인 경우 파싱 + String rawProductId = qrData.get("productId"); + logger.info("Raw productId: " + rawProductId); + + // JSON 객체를 ScanProductDTO로 변환 + ScanProductDTO scanProduct = gson.fromJson(rawProductId, ScanProductDTO.class); int productId = scanProduct.getProductId(); - - // DB에서 상품 정보 조회 - ProductVO product = productService.getProductByID(productId); + logger.info("Parsed productId: " + productId); + // Step 3: DB에서 상품 정보 조회 + ProductVO product = productService.getProductByID(productId); if (product != null) { + logger.info("Product Found: " + product); response.put("success", true); response.put("productName", product.getProductName()); response.put("productPrice", product.getProductPrice()); response.put("productUnit", product.getBaseUnit()); response.put("productBarcode", product.getProductBarcode()); } else { + logger.warn("Product Not Found with ID: " + productId); response.put("success", false); response.put("message", "해당 상품을 찾을 수 없습니다."); } } catch (Exception e) { + logger.error("Error Occurred: " + e.getMessage()); response.put("success", false); response.put("message", "오류가 발생했습니다: " + e.getMessage()); } + return response; } diff --git a/stockMate/src/main/webapp/WEB-INF/views/qrScanner.jsp b/stockMate/src/main/webapp/WEB-INF/views/qrScanner.jsp index 4db7cf6..e5ac34a 100644 --- a/stockMate/src/main/webapp/WEB-INF/views/qrScanner.jsp +++ b/stockMate/src/main/webapp/WEB-INF/views/qrScanner.jsp @@ -78,104 +78,140 @@ th, td { From bf729768d72077d8af275cd7b08cd87480619513 Mon Sep 17 00:00:00 2001 From: freehyeon Date: Mon, 16 Dec 2024 16:11:21 +0900 Subject: [PATCH 9/9] stockover commit-1 --- .../src/main/java/com/stockm8/controller/OrderController.java | 2 +- stockMate/src/main/java/com/stockm8/persistence/OrderDAO.java | 4 ++-- .../src/main/java/com/stockm8/service/OrderServiceImpl.java | 4 ++-- stockMate/src/main/webapp/WEB-INF/views/order/register.jsp | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/stockMate/src/main/java/com/stockm8/controller/OrderController.java b/stockMate/src/main/java/com/stockm8/controller/OrderController.java index 2b3e692..d32319f 100644 --- a/stockMate/src/main/java/com/stockm8/controller/OrderController.java +++ b/stockMate/src/main/java/com/stockm8/controller/OrderController.java @@ -189,4 +189,4 @@ public String orderListGET(Model model) { return "/order/orderList"; } -} //OrderController ajknhdfkasjld \ No newline at end of file +} //OrderController \ No newline at end of file diff --git a/stockMate/src/main/java/com/stockm8/persistence/OrderDAO.java b/stockMate/src/main/java/com/stockm8/persistence/OrderDAO.java index 1aae210..6643ed0 100644 --- a/stockMate/src/main/java/com/stockm8/persistence/OrderDAO.java +++ b/stockMate/src/main/java/com/stockm8/persistence/OrderDAO.java @@ -28,10 +28,10 @@ public interface OrderDAO { // 주문 목록 public List getOrderList(); - // 재고 정보 조회 미사용 + // 재고 정보 조회 @@@@@@@@@@@@@@@@@@@@@@@@@@@@ 미사용 public StockVO getStockById(int stockId) throws Exception; - // 재고 이력 등록 미사용 + // 재고 이력 등록 @@@@@@@@@@@@@@@@@@@@@@@@@@@@ 미사용 public void insertStockHistory(Map params) throws Exception; diff --git a/stockMate/src/main/java/com/stockm8/service/OrderServiceImpl.java b/stockMate/src/main/java/com/stockm8/service/OrderServiceImpl.java index 53f9d44..428d95d 100644 --- a/stockMate/src/main/java/com/stockm8/service/OrderServiceImpl.java +++ b/stockMate/src/main/java/com/stockm8/service/OrderServiceImpl.java @@ -123,14 +123,14 @@ public List getOrderList() { return odao.getOrderList(); } - // 가용 재고 체크 => 미사용 + // 가용 재고 체크 ================> 미사용 @Override public boolean checkAvailableStock(OrderItemVO item) throws Exception { StockVO stock = odao.getStockById(item.getStockId()); return stock != null && stock.getAvailableStock() >= item.getQuantity(); } - // 재고 이력 등록 => 미사용 + // 재고 이력 등록 =================> 미사용 @Override public void insertStockHistory(StockVO stock, OrderVO order, int quantityChanged) throws Exception { Map params = new HashMap<>(); diff --git a/stockMate/src/main/webapp/WEB-INF/views/order/register.jsp b/stockMate/src/main/webapp/WEB-INF/views/order/register.jsp index da86748..8df96fb 100644 --- a/stockMate/src/main/webapp/WEB-INF/views/order/register.jsp +++ b/stockMate/src/main/webapp/WEB-INF/views/order/register.jsp @@ -474,7 +474,7 @@ closeModal(); } - + // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 수정 // 수량 유효성 검사(입력된 수량이 유효한지 확인) function validateQuantity(input) { // 현재 수량 입력이 속한 카드 요소 찾기