diff --git a/build.gradle b/build.gradle index 6948fcb..b6ee991 100644 --- a/build.gradle +++ b/build.gradle @@ -53,7 +53,8 @@ dependencies { // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop implementation group: 'org.springframework.boot', name: 'spring-boot-starter-aop', version: '2.5.0' - + implementation group: 'com.google.zxing', name: 'javase', version: '3.5.0' + implementation group: 'com.google.zxing', name: 'core', version: '3.5.0' } tasks.named('test') { diff --git a/src/main/java/com/no1/wms/planin/PlanInController.java b/src/main/java/com/no1/wms/planin/PlanInController.java index c07b6c2..08e0650 100644 --- a/src/main/java/com/no1/wms/planin/PlanInController.java +++ b/src/main/java/com/no1/wms/planin/PlanInController.java @@ -8,6 +8,9 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; +import com.no1.wms.account.AccountDto; +import com.no1.wms.utils.ConstantValues; +import com.no1.wms.utils.Utils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; @@ -16,6 +19,8 @@ import org.springframework.web.servlet.ModelAndView; import com.no1.wms.product.ProductDto; import com.no1.wms.product.ProductService; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; @Controller @@ -42,6 +47,17 @@ public class PlanInController { //스톡서비스로 재고 리스트 출력 메서트 작성 List list = planinservice.selectAll(searchn, search, startRow, perPage); + HashMap map = new HashMap<>(); + for( int i = 0 ; i < list.size(); ++i){ + PlanInDto obj = list.get(i); + String name = obj.getProductDto().getName(); + if(map.containsKey(name)){ + map.put(name, map.get(name)+1); + }else{ + map.put(name, 1); + } + } + int begin = (page - 1) / pageNum * pageNum + 1; int end = begin + pageNum - 1; @@ -49,6 +65,7 @@ public class PlanInController { end = totalPages; } mav.addObject("list", list); + mav.addObject("map", map); mav.addObject("end", end); mav.addObject("searchn", searchn); mav.addObject("search", search); @@ -67,29 +84,43 @@ public class PlanInController { System.out.println(list.get(0).toString()); mav.addObject("list", list); mav.addObject("groupNum", dto.getGroupNumber()); - mav.setViewName("planin/read"); return mav; } - + @PostMapping("/update") public ModelAndView update(PlanInDto dto, ModelAndView mav){ List list = planinservice.selectById(dto); mav.addObject("list", list); - + mav.addObject("groupNumber", dto.getGroupNumber()); + mav.addObject("viewGroupNumber", list.get(0).getViewGroupNumber()); mav.setViewName("/planin/update"); return mav; } - + + @PostMapping("/create") + public ModelAndView create(ModelAndView mav){ + mav.addObject("groupNumber",UUID.randomUUID().toString() ); + mav.setViewName("/planin/create"); + + return mav; + } + + // 엑셀 다운로드 @GetMapping("/qr/{id}") - public String qr(@PathVariable("id")String id) + @ResponseBody + public String qr(@PathVariable("id")String id, HttpServletResponse response) { - - - return ""; + List list = planinservice.selectByUrl(id); + + Utils.makePlanInExcel(list, response); + + + + return "s"; } // 입고예정추가 @@ -122,31 +153,66 @@ public class PlanInController { return mav; } + @PostMapping("/delete") + public ModelAndView delete(ModelAndView mav, PlanInDto dto) + { + + + planinservice.delete(dto); + List list = planinservice.selectAll(0,"",0,10000 ); + + mav.addObject("list", list); + mav.setViewName("planin/list"); + + return mav; + } + @PostMapping("/planin_update_process") @ResponseBody - public String updateProcess(@RequestBody List> list, Gson gson, PlanInDto dto) throws JsonProcessingException, ParseException { + public String updateProcess(@RequestBody List> list, Gson gson, PlanInDto dto, HttpServletRequest request) throws ParseException { + + if(list.isEmpty()) + return gson.toJson("f"); + + AccountDto aDto =(AccountDto)request.getSession().getAttribute("userData"); dto.setGroupNumber((String) list.get(0).get("groupNumber")); + Integer viewGroupNumber = null; + try { + viewGroupNumber = Integer.parseInt((String) list.get(0).get("viewGroupNumber")); + }catch (NumberFormatException e){ + viewGroupNumber = null; + } + String uuid; planinservice.deleteById(dto); - - + if(dto.getGroupNumber() == null){ + uuid = UUID.randomUUID().toString(); + }else{ + uuid = dto.getGroupNumber(); + } SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); - for(int i = 0; i < list.size(); ++i){ Map data = list.get(i); PlanInDto newDto = new PlanInDto(); + newDto.setGroupNumber(uuid); newDto.setGroupNumber((String) data.get("groupNumber")); newDto.setDate( format.parse((String) data.get("date"))); - newDto.setQuantity((Integer) data.get("quantity")); + newDto.setQuantity(Integer.parseInt((String) data.get("quantity"))); newDto.setProductId((String)data.get("productId")); + newDto.setManagerId(aDto.getId()); + newDto.setWarehouseId("5d201e83-b102-11ee-935d-0242ac110006"); + newDto.setViewGroupNumber(viewGroupNumber); + newDto.setActivation(true); + planinservice.insert(newDto); } + + return gson.toJson("s"); } - } diff --git a/src/main/java/com/no1/wms/planin/PlanInDto.java b/src/main/java/com/no1/wms/planin/PlanInDto.java index 2af9db0..aeec4de 100644 --- a/src/main/java/com/no1/wms/planin/PlanInDto.java +++ b/src/main/java/com/no1/wms/planin/PlanInDto.java @@ -31,9 +31,8 @@ public class PlanInDto { private String warehouseId; private String qrHash; private String url; - private Boolean clear; - @DateTimeFormat(pattern = "yyyy-MM-dd") - private Date vendorDate; + @Builder.Default + private Boolean clear = false; private String other; private Boolean activation; private Integer viewGroupNumber; diff --git a/src/main/java/com/no1/wms/planin/PlanInMapper.java b/src/main/java/com/no1/wms/planin/PlanInMapper.java index 9eae396..5175b53 100644 --- a/src/main/java/com/no1/wms/planin/PlanInMapper.java +++ b/src/main/java/com/no1/wms/planin/PlanInMapper.java @@ -16,7 +16,11 @@ public interface PlanInMapper { List selectById(PlanInDto dto); + List selectByUrl(String id); + int deleteById(PlanInDto dto); void insert(PlanInDto dto); + + int delete(PlanInDto dto); } diff --git a/src/main/java/com/no1/wms/planin/PlanInService.java b/src/main/java/com/no1/wms/planin/PlanInService.java index 81a408a..a11b287 100644 --- a/src/main/java/com/no1/wms/planin/PlanInService.java +++ b/src/main/java/com/no1/wms/planin/PlanInService.java @@ -40,4 +40,16 @@ public class PlanInService { void insert(PlanInDto dto){ mapper.insert(dto); } + + int delete(PlanInDto dto){ + return mapper.delete(dto); + } + + List selectByUrl(String id) { + + return mapper.selectByUrl(id); + } + + + } diff --git a/src/main/java/com/no1/wms/utils/ConstantValues.java b/src/main/java/com/no1/wms/utils/ConstantValues.java index 11af54c..8d7236e 100644 --- a/src/main/java/com/no1/wms/utils/ConstantValues.java +++ b/src/main/java/com/no1/wms/utils/ConstantValues.java @@ -2,4 +2,8 @@ package com.no1.wms.utils; public class ConstantValues { public static final int PER_PAGE = 1000; + + public static final String PNG_TYPE = "img/png"; + + public static final String EXCEL_TYPE= "ms-vnd/excel"; } diff --git a/src/main/java/com/no1/wms/utils/Utils.java b/src/main/java/com/no1/wms/utils/Utils.java index 9cf385b..e7efc4e 100644 --- a/src/main/java/com/no1/wms/utils/Utils.java +++ b/src/main/java/com/no1/wms/utils/Utils.java @@ -1,7 +1,175 @@ package com.no1.wms.utils; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.MultiFormatWriter; +import com.google.zxing.WriterException; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import com.no1.wms.category.CategoryDto; +import com.no1.wms.planin.PlanInDto; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.*; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.List; import java.util.UUID; public class Utils { + public static byte[] makeQr(String url) { + // QR 정보 + int width = 200; + int height = 200; + BitMatrix encode = null; + try { + // QR Code - BitMatrix: qr code 정보 생성 + encode = new MultiFormatWriter() + .encode(url, BarcodeFormat.QR_CODE, width, height); + }catch (Exception e){ + e.printStackTrace(); + } + if(encode == null) + return null; + // QR Code - Image 생성. : 1회성으로 생성해야 하기 때문에 + // stream으로 Generate(1회성이 아니면 File로 작성 가능.) + try { + //output Stream + ByteArrayOutputStream out = new ByteArrayOutputStream(); + + //Bitmatrix, file.format, outputStream + MatrixToImageWriter.writeToStream(encode, "PNG", out); + + return out.toByteArray(); + + } catch (Exception e) { + System.err.println("QR Code OutputStream 도중 Excpetion 발생, " + e.getMessage()); + } + + return null; + } + + public static void download(String fileName, byte[] data, String contentType, HttpServletResponse response ) { + + try { + fileName = new String((fileName).getBytes("utf-8"), "iso-8859-1"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + response.setContentType(contentType); + response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\";"); + + try(ServletOutputStream os = response.getOutputStream();) { + os.write(data); + response.flushBuffer(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static void makePlanInExcel(List list, HttpServletResponse response){ + XSSFWorkbook xssfWorkbook = new XSSFWorkbook(); + + int rowNum = 0; + XSSFCellStyle cellStyle = null; + cellStyle = xssfWorkbook.createCellStyle(); + cellStyle.setAlignment(HorizontalAlignment.CENTER); + cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyle.setFillBackgroundColor(IndexedColors.BLACK.getIndex()); + XSSFFont font = xssfWorkbook.createFont(); + font.setColor(IndexedColors.WHITE.getIndex()); + font.setBold(true); + + cellStyle.setFont(font); + XSSFSheet sheet = xssfWorkbook.createSheet("자료"); + Row topRow = sheet.createRow(0); + Cell cell = null; + cell = topRow.createCell(0); + cell.setCellValue("카테고리"); + cell.setCellStyle(cellStyle); + cell = topRow.createCell(1); + cell.setCellValue("제품명"); + cell.setCellStyle(cellStyle); + cell = topRow.createCell(2); + cell.setCellValue("수량"); + cell.setCellStyle(cellStyle); + cell = topRow.createCell(3); + cell.setCellValue("공급업체"); + cell.setCellStyle(cellStyle); + cell = topRow.createCell(4); + cell.setCellValue("날짜"); + cell.setCellStyle(cellStyle); + + cell = topRow.createCell(5); + cell.setCellValue("QR"); + cell.setCellStyle(cellStyle); + + + XSSFCreationHelper helper = xssfWorkbook.getCreationHelper(); + XSSFCellStyle dataCellStyle = xssfWorkbook.createCellStyle(); + dataCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + dataCellStyle.setDataFormat(helper.createDataFormat().getFormat("yy-MM-dd")); + sheet.setColumnWidth(5,(short)6000); + + for( int i = 0 ; i < list.size(); ++i){ + + XSSFDrawing drawing = sheet.createDrawingPatriarch(); + XSSFClientAnchor anchor = helper.createClientAnchor(); + PlanInDto dto = list.get(i); + System.out.println(dto); + Row row = sheet.createRow(i+1); + int cellNum = 0; + row.setHeight((short) 3000); + + row.createCell(cellNum++).setCellValue(dto.getCaName()); + setColumnSize(sheet, 0, dto.getCaName()); + row.createCell(cellNum++).setCellValue(dto.getProductDto().getName()); + setColumnSize(sheet, 1, dto.getProductDto().getName()); + row.createCell(cellNum++).setCellValue(dto.getQuantity()); + setColumnSize(sheet, 2, dto.getQuantity().toString()); + row.createCell(cellNum++).setCellValue(dto.getVendorDto().getName()); + setColumnSize(sheet, 3, dto.getVendorDto().getName()); + + Cell dateCell = row.createCell(cellNum); + dateCell.setCellValue(dto.getDate()); + dateCell.setCellStyle(dataCellStyle); + + anchor.setCol1(5); + anchor.setRow1(i+1); + String url = "http://localhost:8080/qr/"+dto.getUrl(); + int picIdx = xssfWorkbook.addPicture(Utils.makeQr(url), XSSFWorkbook.PICTURE_TYPE_PNG); + XSSFPicture pic = drawing.createPicture(anchor,picIdx ); + pic.resize(); + + } + try(ByteArrayOutputStream baos = new ByteArrayOutputStream();){ + xssfWorkbook.write(baos); + download("QR데이터.xlsx", baos.toByteArray(), ConstantValues.EXCEL_TYPE, response); + }catch(Exception e){ + e.printStackTrace(); + } + + + } + + static void setColumnSize(XSSFSheet sheet, int index, String value) { + int defaultColumnWidth = 2048; + int maxLength = 70; + int characterWidth = 256; + double lengthWeight = 1.14388; + int len = Math.min(value.length(), maxLength); + int adjust = (((int)(len * lengthWeight) )* characterWidth) + defaultColumnWidth; + + int columnWidth = sheet.getColumnWidth(index); + if (columnWidth > adjust) return; + + try { + sheet.setColumnWidth(index, adjust); + } catch (Exception e) { + // ignore + } + } } diff --git a/src/main/resources/mappers/PlainInMapper.xml b/src/main/resources/mappers/PlainInMapper.xml index b5c191d..41bdc32 100644 --- a/src/main/resources/mappers/PlainInMapper.xml +++ b/src/main/resources/mappers/PlainInMapper.xml @@ -12,7 +12,6 @@ - @@ -37,7 +36,7 @@ + insert into plan_In ( - group_number, product_id, quantity, date, - manager_id, warehouse_id, qr_hash, - url, clear, vendor_date, other, activation, view_group_number + group_number, product_id, quantity, date, + manager_id, warehouse_id, qr_hash, + url, clear, other, activation, view_group_number ) - VALUES - ( - UUID(), #{productId}, #{quantity}, + VALUES (#{groupNumber}, #{productId}, #{quantity}, #{date}, - #{managerId},#{warehouseId},#{qrHash}, - #{url},#{clear}, #{vendor_date}, - #{other},#{activation}, (select MAX(c.group_number)+1 as cnt - from ( select group_number,MAX(group_number) from plan_In group by group_number ) as c) - ) + #{managerId}, #{warehouseId}, #{qrHash}, + #{groupNumber}, #{clear}, + #{other}, true, + CASE + WHEN #{viewGroupNumber} IS NOT NULL + THEN #{viewGroupNumber} + WHEN (SELECT count(p1.group_number) + from plan_In p1 + WHERE p1.group_number = #{groupNumber} > 0) + THEN (SELECT p2.view_group_number + FROM plan_In p2 + WHERE p2.group_number = #{groupNumber} LIMIT 1) + ELSE + (select count(c.group_number) + 1 as cnt + from (select p3.group_number, MAX(p3.group_number) + from plan_In p3 + group by p3.group_number) as c) + END + ) + @@ -91,7 +114,6 @@ qr_hash = #{qrHash}, url = #{url}, clear = #{clear}, - vendor_date = #{vendorDate}, other = #{other}, activation = #{activation}, product_id = #{productId} @@ -101,9 +123,6 @@ update plan_In SET activation = false WHERE group_number = #{groupNumber} - - update plan_In SET activation = false WHERE group_number = #{groupNumber} and product_id = #{productId} - - delete from plan_In WHERE group_number = #{groupNumber} + SET foreign_key_checks = 0; + delete from plan_In WHERE group_number = #{groupNumber}; + SET foreign_key_checks = 1; + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/planin/create.jsp b/src/main/webapp/WEB-INF/views/planin/create.jsp new file mode 100644 index 0000000..54b4e6f --- /dev/null +++ b/src/main/webapp/WEB-INF/views/planin/create.jsp @@ -0,0 +1,212 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + + +
+
+
+
+

입고 예정 관리 생성

+
+
+
+
+
+
+
+
+ +
+
+ + + + + + + + + + + + + + +
제품 카테고리제품명수량공급업체날짜수정/삭제
+
+
+
+
+ +
+ +
+
+
+
+
+ + + + + + + + +
+ + + +
+
+
+ + +
\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/planin/list.jsp b/src/main/webapp/WEB-INF/views/planin/list.jsp index 348328f..4ceb2a0 100644 --- a/src/main/webapp/WEB-INF/views/planin/list.jsp +++ b/src/main/webapp/WEB-INF/views/planin/list.jsp @@ -25,6 +25,13 @@ $form.trigger("submit"); } + function goCreate(){ + const $form = $("
"); + $(".att").after($form); + $form.trigger("submit"); + + } +
diff --git a/src/main/webapp/WEB-INF/views/planin/read.jsp b/src/main/webapp/WEB-INF/views/planin/read.jsp index e55b402..248dd8d 100644 --- a/src/main/webapp/WEB-INF/views/planin/read.jsp +++ b/src/main/webapp/WEB-INF/views/planin/read.jsp @@ -3,9 +3,6 @@ <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
@@ -39,13 +60,17 @@
- qr : link - + 다운 : 엑셀 다운로드 + +
+ + +
- + diff --git a/src/main/webapp/WEB-INF/views/planin/update.jsp b/src/main/webapp/WEB-INF/views/planin/update.jsp index 3d214fd..b304f4a 100644 --- a/src/main/webapp/WEB-INF/views/planin/update.jsp +++ b/src/main/webapp/WEB-INF/views/planin/update.jsp @@ -3,8 +3,18 @@ <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> @@ -142,9 +167,6 @@
-
- -
제품 카테고리제품명수량공급업체날짜수정/삭제
제품 카테고리제품명수량공급업체날짜