From 1cdcb6cfb8101e6431d8392a7a7ef8c8b30f5d99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E4=B8=80=E9=B8=A3?= Date: Mon, 22 Mar 2021 15:34:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 15 ++++++ .../web/controller/CategoryController.java | 27 +++++++++++ .../web/controller/StockController.java | 45 +++++++++++++----- .../com/zhehekeji/web/entity/Category.java | 2 + .../java/com/zhehekeji/web/entity/Stock.java | 2 + .../zhehekeji/web/service/StockService.java | 31 +++++++----- web/src/main/resources/品规模板.xlsx | Bin 0 -> 10151 bytes web/src/main/resources/库存模板.xlsx | Bin 0 -> 10748 bytes 8 files changed, 98 insertions(+), 24 deletions(-) create mode 100644 web/src/main/resources/品规模板.xlsx create mode 100644 web/src/main/resources/库存模板.xlsx diff --git a/pom.xml b/pom.xml index 25b1f63..fd39473 100644 --- a/pom.xml +++ b/pom.xml @@ -137,6 +137,21 @@ true + + org.apache.maven.plugins + maven-resources-plugin + + + xlsx + xls + zip + cer + pfx + py + keystore + + + diff --git a/web/src/main/java/com/zhehekeji/web/controller/CategoryController.java b/web/src/main/java/com/zhehekeji/web/controller/CategoryController.java index b115b49..db68c7a 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/CategoryController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/CategoryController.java @@ -7,11 +7,16 @@ import com.zhehekeji.web.pojo.category.PageSearch; import com.zhehekeji.web.service.CategoryService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.springframework.core.io.ClassPathResource; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URLEncoder; import java.util.List; @Api(value = "category",tags = "分类管理") @@ -62,4 +67,26 @@ public class CategoryController { categoryService.del(id); return Result.success(); } + + @GetMapping("/export/model") + @ApiOperation(value = "品规模板下载") + public void download(HttpServletResponse response) throws IOException { + OutputStream os = response.getOutputStream(); + byte[] buffer = new byte[4096]; + int n; + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding("utf-8"); + // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 + String fileName = URLEncoder.encode("品规模板", "UTF-8"); + response.setHeader("Content-disposition", "attachment;filename="+fileName+".xlsx"); + ClassPathResource classPathResource = new ClassPathResource("品规模板.xlsx"); + InputStream in = classPathResource.getInputStream(); + while ((n = in.read(buffer)) > 0) { + os.write(buffer, 0, n); + } + os.flush(); + os.close(); + response.flushBuffer(); + + } } diff --git a/web/src/main/java/com/zhehekeji/web/controller/StockController.java b/web/src/main/java/com/zhehekeji/web/controller/StockController.java index feff60b..46dd5ec 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/StockController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/StockController.java @@ -13,20 +13,21 @@ import com.zhehekeji.web.pojo.stock.StockExportExcel; import com.zhehekeji.web.service.StockService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.springframework.core.io.ClassPathResource; +import org.springframework.util.ResourceUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.OutputStream; +import java.io.*; import java.net.URLEncoder; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Map; -@Api(value = "Stock",tags = "库存管理") +@Api(value = "Stock", tags = "库存管理") @RestController @RequestMapping("/stock") public class StockController { @@ -38,20 +39,42 @@ public class StockController { @PostMapping("/import") @ApiOperation(value = "库存导入") - public Result upload(MultipartFile file){ + public Result upload(MultipartFile file) { stockService.importExcel(file); return Result.success(); } + @GetMapping("/export/model") + @ApiOperation(value = "库存模板下载") + public void download(HttpServletResponse response) throws IOException { + OutputStream os = response.getOutputStream(); + byte[] buffer = new byte[4096]; + int n; + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding("utf-8"); + // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 + String fileName = URLEncoder.encode("库存模板", "UTF-8"); + response.setHeader("Content-disposition", "attachment;filename="+fileName+".xlsx"); + ClassPathResource classPathResource = new ClassPathResource("库存模板.xlsx"); + InputStream in = classPathResource.getInputStream(); + while ((n = in.read(buffer)) > 0) { + os.write(buffer, 0, n); + } + os.flush(); + os.close(); + response.flushBuffer(); + + } + @GetMapping("/list") @ApiOperation(value = "盘点页面 返回map key:货架号 value:库存信息") - public Result>> stockByStreet(@RequestParam(required = true) Integer streetId){ + public Result>> stockByStreet(@RequestParam(required = true) Integer streetId) { return Result.success(stockService.stocksByStreetId(streetId)); } @PostMapping("/page") @ApiOperation(value = "库存列表") - public Result> page(@RequestBody PageSearch pageSearch){ + public Result> page(@RequestBody PageSearch pageSearch) { return Result.success(stockService.page(pageSearch)); } @@ -70,29 +93,29 @@ public class StockController { @ApiOperation(value = "复核页面的核对信息") @RequestMapping(value = "/info", method = RequestMethod.POST) - public Result stockInfo(@RequestBody StockCheck stockCheck){ + public Result stockInfo(@RequestBody StockCheck stockCheck) { validatorUtil.validate(stockCheck); return Result.success(stockService.stockInfo(stockCheck)); } @ApiOperation(value = "复核正确") @RequestMapping(value = "/checkCorrect", method = RequestMethod.POST) - public Result check(@RequestBody StockCheck stockCheck){ + public Result check(@RequestBody StockCheck stockCheck) { validatorUtil.validate(stockCheck); return Result.success(stockService.checkCorrect(stockCheck)); } @ApiOperation(value = "人工复核") @RequestMapping(value = "/checkByMan", method = RequestMethod.POST) - public Result checkByMan(@RequestBody CheckByMan checkByMan){ + public Result checkByMan(@RequestBody CheckByMan checkByMan) { validatorUtil.validate(checkByMan); return Result.success(stockService.checkByMan(checkByMan)); } @ApiOperation(value = "slow") @RequestMapping(value = "/slow", method = RequestMethod.GET) - public Result slow(Integer ptzId,Integer cameraId){ - PtzControlModule.toPtzSlow(ptzId,cameraId); + public Result slow(Integer ptzId, Integer cameraId) { + PtzControlModule.toPtzSlow(ptzId, cameraId); return Result.success(); } } diff --git a/web/src/main/java/com/zhehekeji/web/entity/Category.java b/web/src/main/java/com/zhehekeji/web/entity/Category.java index ce1679e..9baca87 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/Category.java +++ b/web/src/main/java/com/zhehekeji/web/entity/Category.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import org.springframework.util.CollectionUtils; @@ -21,6 +22,7 @@ public class Category { private String name; + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") private LocalDateTime updateTime; } diff --git a/web/src/main/java/com/zhehekeji/web/entity/Stock.java b/web/src/main/java/com/zhehekeji/web/entity/Stock.java index 13a47a6..5df24a1 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/Stock.java +++ b/web/src/main/java/com/zhehekeji/web/entity/Stock.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -45,6 +46,7 @@ public class Stock { @ApiModelProperty("操作后的图片") private String overoperationPic; + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") private LocalDateTime exportTime; diff --git a/web/src/main/java/com/zhehekeji/web/service/StockService.java b/web/src/main/java/com/zhehekeji/web/service/StockService.java index 4b21d0e..b1f93c9 100644 --- a/web/src/main/java/com/zhehekeji/web/service/StockService.java +++ b/web/src/main/java/com/zhehekeji/web/service/StockService.java @@ -41,19 +41,24 @@ public class StockService { public void importExcel(MultipartFile file) { log.info("import excel stock"); - Thread thread = new Thread( - new Runnable() { - @Override - public void run() { - try { - EasyExcel.read(file.getInputStream(), StockExcel.class, new StockImport(stockMapper)).sheet().doRead(); - } catch (IOException e) { - log.error("库存导入error:{}", e); - } - } - } - ); - thread.start(); + try { + EasyExcel.read(file.getInputStream(), StockExcel.class, new StockImport(stockMapper)).sheet().doRead(); + }catch (Exception e){ + Assert.isTrue(false,"导入出错"); + } +// +// Thread thread = new Thread( +// new Runnable() { +// @Override +// public void run() { +// try { +// } catch (IOException e) { +// log.error("库存导入error:{}", e); +// } +// } +// } +// ); +// thread.start(); } /** diff --git a/web/src/main/resources/品规模板.xlsx b/web/src/main/resources/品规模板.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c379a2461506ac3601c83119e9f03fa65765d16e GIT binary patch literal 10151 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 DA3Sko literal 0 HcmV?d00001 diff --git a/web/src/main/resources/库存模板.xlsx b/web/src/main/resources/库存模板.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7bb54145ba5ed7cdcd38d808063f6d5f161c5d98 GIT binary patch literal 10748 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