diff --git a/stockMate/pom.xml b/stockMate/pom.xml index 0b68114..d2e547c 100644 --- a/stockMate/pom.xml +++ b/stockMate/pom.xml @@ -15,7 +15,6 @@ 1.6.6 - org.springframework @@ -230,43 +229,56 @@ - com.fasterxml.jackson.core - jackson-databind - 2.12.3 + com.fasterxml.jackson.core + jackson-databind + 2.12.3 - + - com.google.protobuf - protobuf-java - 3.21.12 + com.google.protobuf + protobuf-java + 3.21.12 - - + + + + com.google.zxing + core + 3.5.1 + + + + com.google.zxing + javase + 3.5.1 + + + - com.google.zxing - core - 3.5.1 + org.aspectj + aspectjrt + 1.9.7 - - com.google.zxing - javase - 3.5.1 + org.aspectj + aspectjweaver + 1.9.7 - + - com.fasterxml.jackson.core - jackson-databind - 2.18.2 + org.springframework + spring-aspects + ${org.springframework-version} - + com.google.code.gson gson 2.10.1 - + + diff --git a/stockMate/src/main/java/com/stockm8/config/WebConfig.java b/stockMate/src/main/java/com/stockm8/config/WebConfig.java index 7e0e644..35eeea9 100644 --- a/stockMate/src/main/java/com/stockm8/config/WebConfig.java +++ b/stockMate/src/main/java/com/stockm8/config/WebConfig.java @@ -69,7 +69,7 @@ public class WebConfig implements WebMvcConfigurer { public void addInterceptors(InterceptorRegistry registry) { // Intercepter 적용 registry.addInterceptor(authorizationInterceptor) - .addPathPatterns("/dashboard", "/business", "/category/**", "/product/**", "/warehouse/**", "/stock/**" ) // 인터셉터를 적용할 경로 + .addPathPatterns("/dashboard", "/business", "/category/**", "/product/**", "/warehouse/**", "/stock/**", "/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 02f97d3..4ebd212 100644 --- a/stockMate/src/main/java/com/stockm8/controller/OrderController.java +++ b/stockMate/src/main/java/com/stockm8/controller/OrderController.java @@ -6,6 +6,8 @@ import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -19,7 +21,9 @@ 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; import com.stockm8.service.UserService; @@ -42,18 +46,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"; } /** @@ -71,12 +91,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(); @@ -86,7 +124,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<>(); @@ -105,9 +143,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); } /** @@ -122,4 +169,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/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/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 a35672d..e315ca6 100644 --- a/stockMate/src/main/java/com/stockm8/domain/vo/OrderVO.java +++ b/stockMate/src/main/java/com/stockm8/domain/vo/OrderVO.java @@ -10,6 +10,11 @@ @Data public class OrderVO { + + public enum OrderType { + INBOUND, // 수주 + OUTBOUND // 발주 + } private int orderId; // 주문 고유 ID private String orderNumber; // 주문 번호 (예: ORD-YYYYMMDD-001) @@ -17,11 +22,13 @@ public class OrderVO { private int createdBy; // 주문을 생성한 사용자 ID private Timestamp createdAt; // 주문 생성 날짜 private Timestamp updatedAt; // 주문 수정 날짜 + private OrderType orderType; // 주문 유형 (INBOUND/OUTBOUND) private String status; // 주문 상태 (pending, confirmed, cancelled) - private OrderType orderType; - 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 c9ebab0..4fca4fc 100644 --- a/stockMate/src/main/java/com/stockm8/domain/vo/StockVO.java +++ b/stockMate/src/main/java/com/stockm8/domain/vo/StockVO.java @@ -24,4 +24,4 @@ public class StockVO { private WarehouseVO warehouse; // 창고 정보 private String warehouseName; // 창고명 -} \ No newline at end of file +} 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..6643ed0 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/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 3895331..2891526 100644 --- a/stockMate/src/main/java/com/stockm8/persistence/StockDAO.java +++ b/stockMate/src/main/java/com/stockm8/persistence/StockDAO.java @@ -21,14 +21,4 @@ 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 ad1f9f5..4b28ac0 100644 --- a/stockMate/src/main/java/com/stockm8/persistence/StockDAOImpl.java +++ b/stockMate/src/main/java/com/stockm8/persistence/StockDAOImpl.java @@ -51,45 +51,15 @@ public List selectFilteredStocks(FilterCriteria criteria, String sortOr public List selectOnlyStockByBusinessId(int businessId) throws Exception { return sqlSession.selectList(NAMESPACE + "selectOnlyStockByBusinessId", businessId); } - // 카테고리 목록 조회 @Override public List selectAllCategories() throws Exception { return sqlSession.selectList(NAMESPACE + "selectAllCategories"); } - // 바코드로 재고 조회 - @Override - public List selectQuantityCheckByBarcode(int businessId, String barcode) throws Exception { - logger.info("selectQuantityCheckByBarcode() 호출"); - 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("updateIncreseStock() 호출"); - // 매개변수 묶기 - 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); - } + @Override + public List selectAllCategories() throws Exception { + return sqlSession.selectList(NAMESPACE + "selectAllCategories"); + } } diff --git a/stockMate/src/main/java/com/stockm8/service/OrderService.java b/stockMate/src/main/java/com/stockm8/service/OrderService.java index da1c567..37ac9d2 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..428d95d 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/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/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 ae0560f..4f713a7 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.product_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,16 +98,18 @@ #{unitPrice}, #{remarks}, NOW() + ) - + UPDATE stocks SET reserved_quantity = reserved_quantity + #{quantity} WHERE stock_id = #{stockId} - + + + + + + + + + + + + + + + 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 9084d26..38dd884 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,31 @@ 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 f474583..62a0601 100644 --- a/stockMate/src/main/resources/mappers/stockMapper.xml +++ b/stockMate/src/main/resources/mappers/stockMapper.xml @@ -181,32 +181,5 @@ FROM test_warehouses 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 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 1589309..44723ac 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,13 +445,27 @@ // 재고 선택 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 + // 사용자 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); // 단가 // 표시 필드 업데이트 card.find('.product-name').val(stock.product.productName); card.find('.warehouse-name').val(stock.warehouseName); @@ -441,38 +476,45 @@ card.find('.base-unit').val(stock.product.baseUnit); card.find('.unit-price').val(stock.product.productPrice); - // 주문 수량 최대값 설정 - 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 +533,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 +581,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 +622,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]; @@ -594,4 +646,4 @@ - \ No newline at end of file + 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 e088114..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" %> --%> - - - - - -<%-- --%> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<%-- --%> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// $(document).ready(function() { -// // 현재 날짜 설정 -// document.getElementById('createdAt').value = new Date().toISOString().split('T')[0]; - -// // 폼 제출 이벤트 리스너 -// $('#orderForm').on('submit', function(e) { -// e.preventDefault(); -// if (!validateForm()) return false; -// /* submitOrder(); */ -// }); -// }); - -// function validateForm() { -// if (!$('#stockId').val()) { -// alert('재고를 선택해주세요.'); -// return false; -// } -// return true; -// } - -// function openModal() { -// $('#stockListModal').addClass('show'); -// loadAvailableStocks(); -// } - -// function closeModal() { -// $('#stockListModal').removeClass('show'); -// } - -// function loadAvailableStocks() { -// $.ajax({ -// url: '/order/findAvailableStocks', -// type: 'GET', -// dataType: 'json', -// success: function(data) { -// const tbody = $('#stockListBody'); -// tbody.empty(); - -// if (data && data.length > 0) { -// data.forEach(function(stock) { -// const tr = document.createElement('tr'); -// const tds = [ -// stock.stockId, -// stock.product.name, -// stock.product.barcode || '-', -// stock.warehouseName, -// stock.warehouseId, -// stock.totalQuantity, -// stock.reservedQuantity, -// stock.availableStock, -// stock.product.price, -// stock.product.baseUnit -// ].map(text => { -// const td = document.createElement('td'); -// td.textContent = text; -// return td; -// }); - -// // 선택 버튼 생성 -// const button = document.createElement('button'); -// button.className = 'btn btn-success'; -// button.textContent = '선택'; -// button.addEventListener('click', () => selectStock(stock)); - -// const actionTd = document.createElement('td'); -// actionTd.appendChild(button); - -// // 모든 요소를 tr에 추가 -// tr.append(...tds, actionTd); -// tbody.append(tr); -// }); -// } else { -// tbody.html('가용 재고가 없습니다.'); -// } -// }, -// error: function(xhr, status, error) { -// console.error('Error:', error); -// const tbody = $('#stockListBody'); -// tbody.html('재고 목록을 불러오는데 실패했습니다.'); -// } -// }); -// } - -// function selectStock(stock) { -// console.log("Selected stock warehouseId: ", stock.warehouseId); -// $('#stockId').val(stock.stockId); -// $('#productId').val(stock.product.productId); -// $('#productName').val(stock.product.name); -// $('#warehouseName').val(stock.warehouseName); -// $('#warehouseId').val(stock.warehouseId); -// $('#barcode').val(stock.product.barcode); -// $('#totalQuantity').val(stock.totalQuantity); -// $('#reservedQuantity').val(stock.reservedQuantity); -// $('#availableStock').val(stock.availableStock); -// $('#baseUnit').val(stock.product.baseUnit); -// $('#unitPrice').val(stock.product.price); -// $('#quantity').attr('max', stock.availableStock); -// calculateSubtotal(); -// closeModal(); -// } - -// function validateQuantity() { -// const quantity = parseInt($('#quantity').val()); -// const available = parseInt($('#availableStock').val()); - -// if (quantity > available) { -// alert('주문 수량이 가용 재고를 초과할 수 없습니다.'); -// $('#quantity').val(available); -// } -// calculateSubtotal(); -// } - - -// function calculateSubtotal() { -// const quantity = parseInt($('#quantity').val()) || 0; -// const unitPrice = parseFloat($('#unitPrice').val()) || 0; -// const subtotal = quantity * unitPrice; -// $('#subtotalPrice').val(subtotal.toFixed(2)); -// $('#totalPrice').val(subtotal.toFixed(2)); -// } - -// function generateNewOrderNumber() { -// console.log('주문번호 생성 시작'); -// $.ajax({ -// url: '/order/generateOrderNumber', -// type: 'GET', -// dataType: 'text', // JSON 대신 text로 변경 -// success: function(orderNumber) { -// console.log('받은 주문번호:', orderNumber); -// if (orderNumber) { -// $('#orderNumber').val(orderNumber.trim()); -// } else { -// console.error('주문번호가 생성되지 않았습니다'); -// } -// }, -// error: function(xhr, status, error) { -// console.error('주문번호 생성 실패:', { -// status: xhr.status, -// error: error, -// responseText: xhr.responseText -// }); -// } -// }); -// } - -// // 페이지 로드시 바로 호출 -// $(document).ready(function() { -// // 현재 날짜 설정 -// document.getElementById('createdAt').value = new Date().toISOString().split('T')[0]; - -// // 주문번호 생성 호출 -// generateNewOrderNumber(); - -// // 폼 제출 이벤트 리스너 -// $('#orderForm').on('submit', function(e) { -// e.preventDefault(); -// if (!validateForm()) return false; -// submitOrder(); -// }); -// }); - - -// function submitOrder() { -// const formData = { -// // orderNumber 제거 - 서버에서 생성 -// warehouseId: $('#warehouseId').val(), -// totalPrice: $('#totalPrice').val(), -// createdBy: $('#createdBy').val(), -// orderItems: [{ -// stockId: $('#stockId').val(), -// productId: $('#productId').val(), -// warehouseId: $('#warehouseId').val(), -// quantity: $('#quantity').val(), -// unitPrice: $('#unitPrice').val(), -// remarks: $('#remarks').val() -// }] -// }; - -// $.ajax({ -// url: '/order/register', -// type: 'POST', -// contentType: 'application/json', -// data: JSON.stringify(formData), -// success: function(response) { -// if (response.status === 'success') { -// alert(response.message); -// resetForm(); -// // 서버에서 반환한 주문번호로 설정 -// $('#orderNumber').val(response.orderNumber); -// } else { -// alert('주문 등록에 실패했습니다.'); -// } -// }, -// error: function(xhr, status, error) { -// alert('주문 등록에 실패했습니다.'); -// console.error('Error:', error); -// } -// }); -// } - -// function resetForm() { -// $('#orderForm')[0].reset(); -// $('#stockId').val(''); -// $('#productId').val(''); -// $('#warehouseId').val(''); -// $('#totalPrice').val(''); -// document.getElementById('createdAt').value = new Date().toISOString().split('T')[0]; -// // 주문번호 필드를 비움 -// $('#orderNumber').val(''); -// } - - - \ 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 cffd046..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" %> --%> - - - - - - -<%-- --%> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<%-- --%> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// // 주문 항목 관리를 위한 객체 -// const OrderManager = { -// // 상태 관리 -// state: { -// items: new Map(), // 주문 항목 저장 -// nextId: 1, // 다음 항목 ID -// currentItemId: null, // 현재 선택된 항목 ID -// isModalOpen: false // 모달 상태 -// }, - -// // 초기화 -// init() { -// console.log('OrderManager 초기화'); -// this.state = { -// items: new Map(), -// nextId: 1, -// currentItemId: null, -// isModalOpen: false -// }; -// console.log('초기 상태:', this.state); -// this.initEventListeners(); -// this.setInitialDate(); -// this.generateNewOrderNumber(); -// this.addStockInfo(); -// console.log('OrderManager 초기화 완료'); -// }, - -// // 이벤트 리스너 설정 -// initEventListeners() { -// // 폼 제출 -// $('#orderForm').on('submit', (e) => { -// e.preventDefault(); -// if (this.validateForm()) { -// this.submitOrder(); -// } -// }); - -// // 주문 추가 버튼 -// $('#addOrderBtn').on('click', () => this.addStockInfo()); - -// // 초기화 버튼 -// $('#resetBtn').on('click', () => { -// if (confirm('모든 입력을 초기화하시겠습니까?')) { -// this.resetForm(); -// } -// }); - -// // 모달 관련 이벤트 -// // 모달 닫기 버튼 -// // $('.btn-close').on('click', () => this.closeModal()); -// $(document).on('click', '.btn-close', () => this.closeModal()); - -// // 모달 외부 클릭 -// $(document).on('click', '#stockListModal', (e) => { -// if ($(e.target).is('#stockListModal')) { -// this.closeModal(); -// } -// }); - -// // 재고 선택 버튼 이벤트 -// $(document).on('click', '.stock-select-btn', (e) => { -// e.preventDefault(); -// e.stopPropagation(); -// const card = $(e.target).closest('.stock-info-card'); -// // data-item-id 속성을 직접 가져오기 -// const itemId = parseInt(card.attr('data-item-id')); - -// console.log('Stock select clicked - Button:', e.target); -// console.log('Stock select clicked - Card:', card[0]); -// console.log('Stock select clicked - Data Attribute:', card.attr('data-item-id')); -// console.log('Stock select clicked - ItemId:', itemId); - -// if (!isNaN(itemId)) { -// this.openModal(itemId); -// } else { -// console.error('Invalid itemId for stock selection'); -// } -// }); - -// // 삭제 버튼 이벤트 -// $(document).on('click', '.delete-btn', (e) => { -// e.preventDefault(); -// e.stopPropagation(); -// const card = $(e.target).closest('.stock-info-card'); -// // data-item-id 속성을 직접 가져오기 -// const itemId = parseInt(card.attr('data-item-id')); - -// console.log('Delete clicked - Button:', e.target); -// console.log('Delete clicked - Card:', card[0]); -// console.log('Delete clicked - Data Attribute:', card.attr('data-item-id')); -// console.log('Delete clicked - ItemId:', itemId); - -// if (!isNaN(itemId)) { -// this.removeStockInfo(itemId); -// } else { -// console.error('Invalid itemId for deletion'); -// } -// }); - -// // 수량 변경 이벤트 -// $(document).on('change', '.quantity-input', (e) => { -// const itemId = $(e.target).closest('.stock-info-card').data('item-id'); -// this.validateQuantity(itemId); -// }); -// }, - -// // 초기 날짜 설정 -// setInitialDate() { -// $('#createdAt').val(new Date().toISOString().split('T')[0]); -// }, - -// // 주문번호 생성 -// generateNewOrderNumber() { -// $.ajax({ -// url: '/order/generateOrderNumber', -// type: 'GET', -// dataType: 'text', -// success: (orderNumber) => { -// if (orderNumber) { -// $('#orderNumber').val(orderNumber.trim()); -// } else { -// console.error('주문번호 생성 실패'); -// alert('주문번호 생성에 실패했습니다.'); -// } -// }, -// error: (xhr, status, error) => { -// console.error('주문번호 생성 오류:', error); -// alert('주문번호 생성에 실패했습니다.'); -// } -// }); -// }, - -// // 재고 정보 카드 HTML 생성 -// createStockInfoHtml(itemId) { -// console.log('Creating HTML for itemId:', itemId); -// const template = `
-//
-//
-// 주문 항목 #${itemId} -// -//
-//
-//
-//
-//
-// -//
-//
- -// -// -// - -//
-//
-//
-// -// -//
-//
-//
-//
-// -// -//
-//
-//
- -//
-//
-//
-// -// -//
-//
-//
-//
-// -// -//
-//
-//
-//
-// -// -//
-//
-//
-//
-// -// -//
-//
-//
-//
-//
-//
-// -// -//
-//
-//
-//
-// -// -//
-//
-//
-//
-// -// -//
-//
-//
-//
-// -// -//
-//
-//
- -//
-//
-//
-// -// -//
-//
-//
-//
-//
`; - -// // 생성된 HTML 확인 -// console.log('Generated HTML template with itemId:', itemId); - -// return template; -// }, -// // 상태검증 메서드 -// checkItemExists(itemId) { -// const exists = this.state.items.has(itemId); -// const cardExists = $(`.stock-info-card[data-item-id="${itemId}"]`).length > 0; -// console.log(`Item check - ID: ${itemId}, State: ${exists}, DOM: ${cardExists}`); -// return exists && cardExists; -// }, - -// validateItemId(itemId) { -// console.log('Validating itemId:', itemId); -// console.log('Type of itemId:', typeof itemId); -// console.log('Item exists in state:', this.state.items.has(itemId)); -// console.log('DOM element exists:', $(`.stock-info-card[data-item-id="${itemId}"]`).length > 0); - -// return !isNaN(itemId) && -// this.state.items.has(itemId) && -// $(`.stock-info-card[data-item-id="${itemId}"]`).length > 0; -// }, - -// // 재고 정보 추가 -// addStockInfo() { -// const itemId = this.state.nextId++; -// console.log('Adding stock info - ItemId:', itemId); - -// const stockInfoHtml = this.createStockInfoHtml(itemId); -// $('#stockInfoContainer').append(stockInfoHtml); - -// // DOM에 추가된 요소 검증 -// const addedCard = $(`.stock-info-card[data-item-id="${itemId}"]`); -// console.log('Added card:', addedCard.length > 0); -// console.log('Added card itemId:', addedCard.attr('data-item-id')); - -// this.state.items.set(itemId, { -// id: itemId, -// selected: false, -// quantity: 1, -// unitPrice: 0, -// subtotal: 0 -// }); - -// this.updateDeleteButtons(); -// }, - -// // 상태 확인을 위한 디버그 메서드 추가 -// debugState() { -// console.log('Current State:', { -// items: Array.from(this.state.items.entries()), -// nextId: this.state.nextId, -// currentItemId: this.state.currentItemId, -// isModalOpen: this.state.isModalOpen -// }); -// }, - -// // 모달 창 열기 -// openModal(itemId) { -// if (!this.validateItemId(itemId)) { -// console.error('Invalid itemId:', itemId); -// return; -// } - -// console.log('Opening modal for itemId:', itemId); -// this.state.currentItemId = itemId; - -// const modal = $('#stockListModal'); -// console.log('Modal before show:', modal[0]?.outerHTML); - -// modal.addClass('show').css('display', 'block'); -// console.log('Modal after show:', modal[0]?.outerHTML); - -// this.loadAvailableStocks(); -// }, - -// // 모달 창 닫기 -// closeModal() { -// console.log('Closing modal'); -// const modal = $('#stockListModal'); -// modal.removeClass('show'); -// this.state.currentItemId = null; -// }, - -// // 가용 재고 로드 -// loadAvailableStocks() { -// $.ajax({ -// url: '/order/findAvailableStocks', -// type: 'GET', -// dataType: 'json', -// success: (data) => { -// const tbody = $('#stockListBody'); -// tbody.empty(); - -// if (data && data.length > 0) { -// data.forEach((stock) => { -// const tr = $(''); -// [ -// stock.stockId, -// stock.product.name, -// stock.product.barcode || '-', -// stock.warehouseName, -// stock.warehouseId, -// stock.totalQuantity, -// stock.reservedQuantity, -// stock.availableStock, -// stock.product.price, -// stock.product.baseUnit -// ].forEach(text => { -// tr.append($('').text(text)); -// }); - -// const selectBtn = $('