diff --git a/eladmin-system/pom.xml b/eladmin-system/pom.xml index 85a1471a..4c7b7ef9 100644 --- a/eladmin-system/pom.xml +++ b/eladmin-system/pom.xml @@ -113,6 +113,21 @@ mybatis-plus-boot-starter 3.5.3.1 + + + + com.google.zxing + core + 3.5.3 + + + + com.google.zxing + javase + 3.5.3 + + + @@ -145,5 +160,12 @@ + + + maven_central + Maven Central + https://repo.maven.apache.org/maven2/ + + diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/controller/shop/TbDeviceStockController.java b/eladmin-system/src/main/java/cn/ysk/cashier/controller/shop/TbDeviceStockController.java new file mode 100644 index 00000000..446baaa0 --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/controller/shop/TbDeviceStockController.java @@ -0,0 +1,121 @@ +package cn.ysk.cashier.controller.shop; + +import cn.hutool.core.util.ZipUtil; +import cn.ysk.cashier.dto.shop.TbDeviceStockDownloadDto; +import cn.ysk.cashier.dto.shop.TbShopInfoDto; +import cn.ysk.cashier.pojo.TbDeviceStock; +import cn.ysk.cashier.pojo.shop.TbShopTable; +import cn.ysk.cashier.service.shop.TbDeviceStockService; +import cn.ysk.cashier.service.shop.TbShopInfoService; +import cn.ysk.cashier.service.shop.TbShopTableService; +import cn.ysk.cashier.utils.FileUtil; +import cn.ysk.cashier.utils.QrCodeUtils; +import cn.ysk.cashier.utils.ZipUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author GYJ + */ +@RestController +@RequiredArgsConstructor +@Api(tags = "/device/台桌码管理") +@RequestMapping("/api/deviceStock") +public class TbDeviceStockController { + + private final TbDeviceStockService tbDeviceStockService; + private final TbShopTableService shopTableService; + private final TbShopInfoService shopInfoService; + + @ApiOperation("批量下载二维码") + @PostMapping(value = "/batchDownload") + public void batchDownload(HttpServletRequest request, HttpServletResponse response, @RequestBody TbDeviceStockDownloadDto downloadDto) { + TbShopInfoDto shop = shopInfoService.findById(Integer.valueOf(downloadDto.getShopId())); + if (shop == null) { + throw new RuntimeException("店铺不存在"); + } + + // 查询shop下面有多少台桌 + List shopTables = shopTableService.queryListByShopId(Integer.valueOf(downloadDto.getShopId())); + if (shopTables.isEmpty()) { + throw new RuntimeException("请先添加台桌"); + } + + if (downloadDto.getCount() > (shopTables.size() * 2)) { + throw new RuntimeException("最多可获取台桌数量的2倍"); + } + + TbDeviceStock lastRecord = tbDeviceStockService.findLastRecord(); + + long startCode = 4000000000L; + if (lastRecord != null) { + startCode = Long.parseLong(lastRecord.getSnNo()) + 1; + } + + List list = new ArrayList<>(); + for (int i = 0; i < downloadDto.getCount(); i++) { + TbDeviceStock stock = new TbDeviceStock(); + stock.setCreateTime(new Date()); + stock.setSnNo(String.valueOf(startCode + i)); + stock.setPrice(BigDecimal.ZERO); + stock.setStatus("1"); + stock.setCode("zm"); + stock.setType("1张"); + stock.setGroupNo("111"); + stock.setDelFlag("1"); + list.add(stock); + } + + try { + tbDeviceStockService.saveBatch(list); + } catch (Exception e) { + throw new RuntimeException("设备编号重复"); + } + + // 根据code拼接前缀,生成二维码存在本地 + + // 二维码存放路径 + String basePath = "/usr/local/tmp/qrCode/" + shop.getShopName(); + + String baseUrl = "https://kysh.sxczgkj.cn/codeplate?code="; + File codeImgFileSaveDir = new File(basePath); + if (codeImgFileSaveDir.exists()) { + // 先删除内部的文件 + File[] files = codeImgFileSaveDir.listFiles(); + for (File file : files) { + file.delete(); + } + // 删除文件夹 + codeImgFileSaveDir.delete(); + } + for (TbDeviceStock stock : list) { + // 生成二维码 + QrCodeUtils.createCodeToFile(baseUrl + stock.getSnNo(), codeImgFileSaveDir, stock.getSnNo() + ".png"); + } + + try { + String zipPath = basePath + ".zip"; + File zipFile = new File(zipPath); + if (zipFile.exists()) { + zipFile.delete(); + } + ZipUtils.zipDirectory(codeImgFileSaveDir, zipFile); + System.out.println(basePath + ".zip"); + + FileUtil.downloadFile(request, response, zipFile, true); + } catch (Exception e) { + throw new RuntimeException("压缩文件失败"); + } + } +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/dto/shop/TbDeviceStockDownloadDto.java b/eladmin-system/src/main/java/cn/ysk/cashier/dto/shop/TbDeviceStockDownloadDto.java new file mode 100644 index 00000000..6a53b00f --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/dto/shop/TbDeviceStockDownloadDto.java @@ -0,0 +1,12 @@ +package cn.ysk.cashier.dto.shop; + +import lombok.Data; + +/** + * @author GYJ + */ +@Data +public class TbDeviceStockDownloadDto { + private String shopId; + private Integer count; +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/dto/shop/TbDeviceStockDto.java b/eladmin-system/src/main/java/cn/ysk/cashier/dto/shop/TbDeviceStockDto.java new file mode 100644 index 00000000..98611d51 --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/dto/shop/TbDeviceStockDto.java @@ -0,0 +1,35 @@ +package cn.ysk.cashier.dto.shop; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class TbDeviceStockDto implements Serializable { + + private Integer id; + + private String name; + + private Integer shopId; + + private Integer maxCapacity; + + private Integer sort; + + private Integer areaId; + + private Integer isPredate; + + private String status; + + private Integer type; + + private String view; + + private Long createdAt; + + private Long updatedAt; + + private String qrcode; +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/mapper/shop/TbDeviceStockMapper.java b/eladmin-system/src/main/java/cn/ysk/cashier/mapper/shop/TbDeviceStockMapper.java new file mode 100644 index 00000000..61d32e29 --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/mapper/shop/TbDeviceStockMapper.java @@ -0,0 +1,14 @@ +package cn.ysk.cashier.mapper.shop; + +import cn.ysk.cashier.base.BaseMapper; +import cn.ysk.cashier.dto.shop.TbDeviceStockDto; +import cn.ysk.cashier.pojo.TbDeviceStock; +import org.mapstruct.Mapper; +import org.mapstruct.ReportingPolicy; + +/** + * @author GYJ + */ +@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface TbDeviceStockMapper extends BaseMapper { +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/pojo/TbDeviceStock.java b/eladmin-system/src/main/java/cn/ysk/cashier/pojo/TbDeviceStock.java new file mode 100644 index 00000000..5a73f571 --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/pojo/TbDeviceStock.java @@ -0,0 +1,205 @@ +package cn.ysk.cashier.pojo; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.SqlCondition; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.persistence.*; +import java.math.BigDecimal; +import java.util.Date; + +/** + * @author GYJ + */ +@Entity +@Data +@Table(name="tb_device_stock") +public class TbDeviceStock { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "`id`") + @ApiModelProperty(value = "自增id") + private Integer id; + + /** + * code + */ + @TableField(value = "code", whereStrategy = FieldStrategy.NOT_EMPTY) + @Column(name = "`code`") + private String code; + + + /** + * 设备唯一编码,码牌即为二维码编号 + */ + @TableField(value = "sn_no",whereStrategy = FieldStrategy.NOT_EMPTY) + @Column(name = "`sn_no`") + private String snNo; + + /** + * 设备购买单号 + */ + @TableField(value = "order_no",whereStrategy = FieldStrategy.NOT_EMPTY) + @Column(name = "`order_no`") + private String orderNo; + + /** + * 设备购买价格 + */ + @TableField("price") + @Column(name = "`price`") + private BigDecimal price; + + /** + * 设备版本 + */ + @TableField(value = "type",whereStrategy = FieldStrategy.NOT_EMPTY) + @Column(name = "`type`") + private String type; + + /** + * 库存分组 + */ + @TableField(value = "group_no",whereStrategy = FieldStrategy.NOT_EMPTY) + @Column(name = "`group_no`") + private String groupNo; + + /** + * 购买商家名称 + */ + @TableField(value = "buy_merc_name",whereStrategy = FieldStrategy.NOT_EMPTY,condition = SqlCondition.LIKE) + @Column(name = "`buy_merc_name`") + private String buyMercName; + + + /** + * 购买商家ID + */ + @TableField(value = "buy_merc_id",whereStrategy = FieldStrategy.NOT_EMPTY) + @Column(name = "`buy_merc_id`") + private String buyMercId; + + + + /** + * 激活商家名称 + */ + @TableField(value = "act_merc_ame",whereStrategy = FieldStrategy.NOT_EMPTY,condition = SqlCondition.LIKE) + @Column(name = "`act_merc_ame`") + private String actMercName; + + + /** + * 激活商家ID + */ + @TableField(value = "act_merc_d",whereStrategy = FieldStrategy.NOT_EMPTY) + @Column(name = "act_merc_d") + private String actMercId; + + /** + * 二维码状态1:未出售,2:已出售 3:已激活 + */ + @TableField(value = "status",whereStrategy = FieldStrategy.NOT_EMPTY) + @Column(name = "`status`") + private String status; + + /** + * 创建时间 + */ + @TableField(value = "create_time", fill = FieldFill.INSERT) + @Column(name = "`create_time`") + private Date createTime; + + /** + * 创建人 + */ + @TableField("create_by") + @Column(name = "`create_by`") + private String createBy; + + /** + * 删除标记1:正常2:删除 + */ + @TableField("del_flag") + @Column(name = "`del_flag`") + private String delFlag; + + /** + * 备注 + */ + @TableField("remarks") + @Column(name = "`remarks`") + private String remarks; + + /** + * 更新时间 + */ + @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) + @Column(name = "`update_time`") + private Date updateTime; + + /** + * 厂家设备编号,音箱播报需要 + */ + @TableField(value = "device_no") + @Column(name = "`device_no`") + private String deviceNo; + + /** + * 归属用户ID 如果是商户直接从设备商城购买的问题 + * 就显示当前使用用户ID + * 如果是直营团队那边的 就归属于上级ID + */ + @TableField("belong_user_id") + @Column(name = "`belong_user_id`") + private Long belongUserId; + + /** + * 提货人用户ID + */ + @TableField("extract_user_id") + @Column(name = "`extract_user_id`") + private Long extractUserId; + + /** + * 所属角色 + */ + @TableField("role_code") + @Column(name = "`role_code`") + private String roleCode; + + /** + * 入库时间 + */ + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + @TableField("in_stock_time") + @Column(name = "`in_stock_time`") + private Date inStockTime; + + + /** + * 划拨状态 划拨状态 01:待接收 其他表示已接收 + */ + @TableField("transfer_status") + @Column(name = "`transfer_status`") + private String transferStatus; + + /** + * 绑定时间 + */ + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + @TableField("bind_time") + @Column(name = "`bind_time`") + private Date bindTime; + + +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/repository/shop/TbDeviceStockRepository.java b/eladmin-system/src/main/java/cn/ysk/cashier/repository/shop/TbDeviceStockRepository.java new file mode 100644 index 00000000..51ef6d78 --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/repository/shop/TbDeviceStockRepository.java @@ -0,0 +1,12 @@ +package cn.ysk.cashier.repository.shop; + +import cn.ysk.cashier.pojo.TbDeviceStock; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +/** + * @author GYJ + */ +public interface TbDeviceStockRepository extends JpaRepository, JpaSpecificationExecutor { + +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/repository/shop/TbShopTableRepository.java b/eladmin-system/src/main/java/cn/ysk/cashier/repository/shop/TbShopTableRepository.java index a5a3def0..efe6d201 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/repository/shop/TbShopTableRepository.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/repository/shop/TbShopTableRepository.java @@ -21,6 +21,8 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; +import java.util.List; + /** * @website https://eladmin.vip * @author lyf @@ -33,4 +35,7 @@ public interface TbShopTableRepository extends JpaRepository findByQrcode(@Param("qrcode") Integer shopId); -} \ No newline at end of file + + @Query("select table from TbShopTable table where table.shopId = :shopId") + List findByShopId(@Param("shopId") Integer shopId); +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbDeviceStockServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbDeviceStockServiceImpl.java new file mode 100644 index 00000000..72c4649d --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbDeviceStockServiceImpl.java @@ -0,0 +1,38 @@ +package cn.ysk.cashier.service.impl.shopimpl; + +import cn.ysk.cashier.pojo.TbDeviceStock; +import cn.ysk.cashier.repository.shop.TbDeviceStockRepository; +import cn.ysk.cashier.service.shop.TbDeviceStockService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author GYJ + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class TbDeviceStockServiceImpl implements TbDeviceStockService { + + private final TbDeviceStockRepository deviceStockRepository; + + @Override + public TbDeviceStock findLastRecord() { + List list = deviceStockRepository.findAll(PageRequest.of(0, 1, Sort.by(Sort.Direction.DESC, "id"))).getContent(); + if (list.isEmpty()) { + return null; + } + + return list.get(0); + } + + @Override + public void saveBatch(List list) { + deviceStockRepository.saveAll(list); + } +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopTableServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopTableServiceImpl.java index e73e87c7..8cd07472 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopTableServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopTableServiceImpl.java @@ -94,6 +94,11 @@ public class TbShopTableServiceImpl implements TbShopTableService { return tbShopTableMapper.toDto(tbShopTableRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder))); } + @Override + public List queryListByShopId(Integer shopId) { + return tbShopTableRepository.findByShopId(shopId); + } + @Override @Transactional public TbShopTableDto findById(Integer id) { @@ -167,4 +172,4 @@ public class TbShopTableServiceImpl implements TbShopTableService { } FileUtil.downloadExcel(list, response); } -} \ No newline at end of file +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/shop/TbDeviceStockService.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/shop/TbDeviceStockService.java new file mode 100644 index 00000000..fe699bef --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/shop/TbDeviceStockService.java @@ -0,0 +1,14 @@ +package cn.ysk.cashier.service.shop; + +import cn.ysk.cashier.pojo.TbDeviceStock; + +import java.util.List; + +/** + * @author GYJ + */ +public interface TbDeviceStockService { + TbDeviceStock findLastRecord(); + + void saveBatch(List list); +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/shop/TbShopTableService.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/shop/TbShopTableService.java index 33f23ecd..93a9b367 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/shop/TbShopTableService.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/shop/TbShopTableService.java @@ -49,6 +49,13 @@ public interface TbShopTableService { */ List queryAll(TbShopTableQueryCriteria criteria); + /** + * 根据shopId查询台桌列表 + * @param shopId 店铺id + * @return 台桌列表 + */ + List queryListByShopId(Integer shopId); + /** * 根据ID查询 * @param id ID @@ -85,4 +92,4 @@ public interface TbShopTableService { * @throws IOException / */ void download(List all, HttpServletResponse response) throws IOException; -} \ No newline at end of file +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/utils/QrCodeUtils.java b/eladmin-system/src/main/java/cn/ysk/cashier/utils/QrCodeUtils.java new file mode 100644 index 00000000..08021701 --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/utils/QrCodeUtils.java @@ -0,0 +1,114 @@ +package cn.ysk.cashier.utils; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.MultiFormatWriter; +import com.google.zxing.WriterException; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; + +import javax.imageio.ImageIO; +import javax.swing.filechooser.FileSystemView; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * 二维码工具类 + * + * @author GYJ + */ +public class QrCodeUtils { + + //CODE_WIDTH:二维码宽度,单位像素 + private static final int CODE_WIDTH = 400; + //CODE_HEIGHT:二维码高度,单位像素 + private static final int CODE_HEIGHT = 400; + //FRONT_COLOR:二维码前景色,0x000000 表示黑色 + private static final int FRONT_COLOR = 0x000000; + //BACKGROUND_COLOR:二维码背景色,0xFFFFFF 表示白色 + //演示用 16 进制表示,和前端页面 CSS 的取色是一样的,注意前后景颜色应该对比明显,如常见的黑白 + private static final int BACKGROUND_COLOR = 0xFFFFFF; + + public static void createCodeToFile(String content, File codeImgFileSaveDir, String fileName) { + try { + if (StringUtils.isBlank(content) || StringUtils.isBlank(fileName)) { + return; + } + content = content.trim(); + if (codeImgFileSaveDir==null || codeImgFileSaveDir.isFile()) { + //二维码图片存在目录为空,默认放在桌面... + codeImgFileSaveDir = FileSystemView.getFileSystemView().getHomeDirectory(); + } + if (!codeImgFileSaveDir.exists()) { + //二维码图片存在目录不存在,开始创建... + codeImgFileSaveDir.mkdirs(); + } + + //核心代码-生成二维码 + BufferedImage bufferedImage = getBufferedImage(content); + + File codeImgFile = new File(codeImgFileSaveDir, fileName); + ImageIO.write(bufferedImage, "png", codeImgFile); + + System.out.println("二维码图片生成成功:" + codeImgFile.getPath()); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 生成二维码并输出到输出流, 通常用于输出到网页上进行显示,输出到网页与输出到磁盘上的文件中,区别在于最后一句 ImageIO.write + * write(RenderedImage im,String formatName,File output):写到文件中 + * write(RenderedImage im,String formatName,OutputStream output):输出到输出流中 + * @param content :二维码内容 + * @param outputStream :输出流,比如 HttpServletResponse 的 getOutputStream + */ + public static void createCodeToOutputStream(String content, OutputStream outputStream) { + try { + if (StringUtils.isBlank(content)) { + return; + } + content = content.trim(); + //核心代码-生成二维码 + BufferedImage bufferedImage = getBufferedImage(content); + + //区别就是这一句,输出到输出流中,如果第三个参数是 File,则输出到文件中 + ImageIO.write(bufferedImage, "png", outputStream); + + System.out.println("二维码图片生成到输出流成功..."); + } catch (Exception e) { + e.printStackTrace(); + } + } + + //核心代码-生成二维码 + private static BufferedImage getBufferedImage(String content) throws WriterException { + + //com.google.zxing.EncodeHintType:编码提示类型,枚举类型 + Map hints = new HashMap(); + + //EncodeHintType.CHARACTER_SET:设置字符编码类型 + hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); + + //EncodeHintType.ERROR_CORRECTION:设置误差校正 + //ErrorCorrectionLevel:误差校正等级,L = ~7% correction、M = ~15% correction、Q = ~25% correction、H = ~30% correction + //不设置时,默认为 L 等级,等级不一样,生成的图案不同,但扫描的结果是一样的 + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); + + //EncodeHintType.MARGIN:设置二维码边距,单位像素,值越小,二维码距离四周越近 + hints.put(EncodeHintType.MARGIN, 1); + + MultiFormatWriter multiFormatWriter = new MultiFormatWriter(); + BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, CODE_WIDTH, CODE_HEIGHT, hints); + BufferedImage bufferedImage = new BufferedImage(CODE_WIDTH, CODE_HEIGHT, BufferedImage.TYPE_INT_BGR); + for (int x = 0; x < CODE_WIDTH; x++) { + for (int y = 0; y < CODE_HEIGHT; y++) { + bufferedImage.setRGB(x, y, bitMatrix.get(x, y) ? FRONT_COLOR : BACKGROUND_COLOR); + } + } + return bufferedImage; + } +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/utils/ZipUtils.java b/eladmin-system/src/main/java/cn/ysk/cashier/utils/ZipUtils.java new file mode 100644 index 00000000..7196356a --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/utils/ZipUtils.java @@ -0,0 +1,46 @@ +package cn.ysk.cashier.utils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * zip工具类 + * + * @author GYJ + */ +public class ZipUtils { + public static void zipDirectory(File directoryToZip, File zipFile) throws IOException { + FileOutputStream fos = new FileOutputStream(zipFile); + ZipOutputStream zos = new ZipOutputStream(fos); + compressDirectoryToZipfile(directoryToZip, directoryToZip, zos); + zos.close(); + fos.close(); + } + + private static void compressDirectoryToZipfile(File rootDir, File currentDir, ZipOutputStream zos) throws IOException { + File[] files = currentDir.listFiles(); + if (files != null) { + for (File file : files) { + if (file.isDirectory()) { + compressDirectoryToZipfile(rootDir, file, zos); + } else { + ZipEntry zipEntry = new ZipEntry(rootDir.toURI().relativize(file.toURI()).getPath()); + zos.putNextEntry(zipEntry); + FileInputStream fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int len; + while ((len = fis.read(buffer)) > 0) { + zos.write(buffer, 0, len); + } + fis.close(); + zos.closeEntry(); + } + } + } + } + +}