diff --git a/src/main/java/com/kiisoo/ic/config/ShiroConfig.java b/src/main/java/com/kiisoo/ic/config/ShiroConfig.java index cf61270..2a19bfb 100644 --- a/src/main/java/com/kiisoo/ic/config/ShiroConfig.java +++ b/src/main/java/com/kiisoo/ic/config/ShiroConfig.java @@ -56,6 +56,8 @@ public class ShiroConfig { filterChainDefinitionMap.put("/login/bind", "anon"); filterChainDefinitionMap.put("/user/qrCode", "anon"); filterChainDefinitionMap.put("/user/sync", "anon"); + filterChainDefinitionMap.put("/store/emp/download/store/code", "anon"); + filterChainDefinitionMap.put("/store/emp/download/store/seller/code", "anon"); filterChainDefinitionMap.put("/department/sync", "anon"); // 配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了 filterChainDefinitionMap.put("/logout", "logout"); diff --git a/src/main/java/com/kiisoo/ic/store/constant/Constants.java b/src/main/java/com/kiisoo/ic/store/constant/Constants.java index ed84441..e6fb087 100644 --- a/src/main/java/com/kiisoo/ic/store/constant/Constants.java +++ b/src/main/java/com/kiisoo/ic/store/constant/Constants.java @@ -18,6 +18,10 @@ public class Constants { * 数据库中的 code 字段 */ public static final String DATABASE_CODE_KEY = "code"; + /** + * 数据库中的 code 字段 + */ + public static final String DATABASE_TYPE_KEY = "type"; /** * 客户统计数据 0 @@ -44,6 +48,11 @@ public class Constants { */ public static final String STORE_DATA_TYPE_SELLER = "seller"; + /** + * 店铺人员类型-导购 + */ + public static final Integer TYPE_STAFF_SELLER = 4; + /** * 门店导购客户关系表Type 1.有效(去重)、2.无效 */ diff --git a/src/main/java/com/kiisoo/ic/store/controller/StoreEmployeeController.java b/src/main/java/com/kiisoo/ic/store/controller/StoreEmployeeController.java index 8ccfbfc..779acd6 100644 --- a/src/main/java/com/kiisoo/ic/store/controller/StoreEmployeeController.java +++ b/src/main/java/com/kiisoo/ic/store/controller/StoreEmployeeController.java @@ -78,4 +78,18 @@ public class StoreEmployeeController extends BaseController { log.error("批量下载店铺二维码失败", e); } } + + /** + * 批量下载导购二维码 + * @param response + */ + @RequestMapping(value = "download/store/seller/code",method = RequestMethod.GET) + @ResponseBody + public void downloadSellerCode(HttpServletResponse response) { + try { + storeEmployeeService.downloadStoreStaffCode(response); + } catch (Exception e) { + log.error("批量下载店铺二维码失败", e); + } + } } diff --git a/src/main/java/com/kiisoo/ic/store/service/StoreEmployeeService.java b/src/main/java/com/kiisoo/ic/store/service/StoreEmployeeService.java index 865ae41..74ebfd8 100644 --- a/src/main/java/com/kiisoo/ic/store/service/StoreEmployeeService.java +++ b/src/main/java/com/kiisoo/ic/store/service/StoreEmployeeService.java @@ -20,11 +20,13 @@ import com.kiisoo.ic.generalize.entity.PrivilageOrganizationalMember; import com.kiisoo.ic.generalize.mapper.RetailCompanyMapper; import com.kiisoo.ic.store.bean.PoiStoreStaffDTO; import com.kiisoo.ic.store.entity.PoiStore; +import com.kiisoo.ic.store.entity.PoiStoreStaff; import com.kiisoo.ic.store.entity.PrivilageCpUserStoreDO; import com.kiisoo.ic.store.entity.StoreUserDTO; import com.kiisoo.ic.store.mapper.PoiStoreDOMapper; import com.kiisoo.ic.store.mapper.PoiStoreStaffDOMapper; import com.kiisoo.ic.store.mapper.PrivilageCpUserStoreDOMapper; +import com.kiisoo.ic.utils.ZipUtils; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.poi.hssf.usermodel.HSSFWorkbook; @@ -86,6 +88,7 @@ public class StoreEmployeeService { @Autowired private RetailCompanyMapper retailCompanyMapper; + /** * 查询门店号 * @param storeId 门店id @@ -147,32 +150,30 @@ public class StoreEmployeeService { * @param response */ public void downloadStoreUserCode(HttpServletResponse response) throws IOException { - Map result = new HashMap<>(); - + //查询所有公司 List privilageOrganizationals = retailCompanyMapper.selectList(null); if (CollectionUtils.isNotEmpty(privilageOrganizationals)){ - - - - String fileUrl = UUID.randomUUID().toString().replace("-", ""); + //根文件夹用于存放公司 + String fileUrl = "门店码-"+UUID.randomUUID().toString().replace("-", ""); File file = new File(fileUrl); file.mkdir(); - - byte[] buffer = new byte[1024]; - // 生成的ZIP文件名为Demo.zip + // 生成的ZIP文件名 String strZipName = "store_qrCode_"+ fileUrl +".zip"; - ZipOutputStream out = new ZipOutputStream(new FileOutputStream(strZipName)); - + FileOutputStream out = new FileOutputStream(new File(strZipName)); + //遍历零售公司 for (PrivilageOrganizational privilageOrganizational:privilageOrganizationals) { if (privilageOrganizational == null || privilageOrganizational.getId() == null){ continue; } + //创建零售公司文件夹 File complayFile = new File(file.getPath()+"/"+privilageOrganizational.getName()); complayFile.mkdir(); + //查询店铺 List poiStores = poiStoreDOMapper.selectShopByCompany(privilageOrganizational.getId()); if (CollectionUtils.isNotEmpty(poiStores)){ + //遍历店铺查询门店码url for (PoiStore poiStore:poiStores){ String url = poiStoreDOMapper.selectStoreQrCode(poiStore.getId()); if (StringUtils.isBlank(url)){ @@ -196,34 +197,102 @@ public class StoreEmployeeService { } } } - File[] files = file.listFiles(); - if (files !=null && files.length>0){ - for (int i =0;i 0) { - out.write(buffer, 0, len); + + //将根文件转换为zip文件 + ZipUtils.toZip(file.getPath(),out,true); + + //将文件输入到response + ServletOutputStream outputStream = response.getOutputStream(); + byte[] buffer = new byte[1024]; + File zipFile = new File(strZipName); + FileInputStream inStream = new FileInputStream(zipFile); + int lenNew; + while ((lenNew = inStream.read(buffer)) > 0) { + outputStream.write(buffer, 0, lenNew); + } + //删除文件,清理空间 + file.delete(); + zipFile.delete(); + } + } + /** + * 批量下载店铺导购吗 + * @param response + */ + public void downloadStoreStaffCode(HttpServletResponse response) throws IOException { + //查询所有公司 + List privilageOrganizationals = retailCompanyMapper.selectList(null); + if (CollectionUtils.isNotEmpty(privilageOrganizationals)){ + //根文件夹用于存放公司 + String fileUrl = "导购码-"+UUID.randomUUID().toString().replace("-", ""); + File file = new File(fileUrl); + file.mkdir(); + // 生成的ZIP文件名 + String strZipName = "store_qrCode_"+ fileUrl +".zip"; + FileOutputStream out = new FileOutputStream(new File(strZipName)); + + //遍历零售公司 + for (PrivilageOrganizational privilageOrganizational:privilageOrganizationals) { + if (privilageOrganizational == null || privilageOrganizational.getId() == null){ + continue; + } + + //创建零售公司文件夹 + File complayFile = new File(file.getPath()+"/"+privilageOrganizational.getName()); + complayFile.mkdir(); + //查询店铺 + List poiStores = poiStoreDOMapper.selectShopByCompany(privilageOrganizational.getId()); + if (CollectionUtils.isNotEmpty(poiStores)){ + //遍历店铺查询门店码url + for (PoiStore poiStore:poiStores){ + //创建零售公司文件夹 + File storeFile = new File(complayFile.getPath()+"/"+poiStore.getName()); + storeFile.mkdir(); + + QueryWrapper staffQr = new QueryWrapper(); + staffQr.eq(DATABASE_STORE_ID_KEY,poiStore.getId()); + staffQr.eq(DATABASE_TYPE_KEY,TYPE_STAFF_SELLER); + List poiStoreStaffs = poiStoreStaffDOMapper.selectList(staffQr); + if (CollectionUtils.isNotEmpty(poiStoreStaffs)){ + for (PoiStoreStaff poiStoreStaff:poiStoreStaffs){ + String url = poiStoreStaff.getEpWechatQrCode(); + if (StringUtils.isBlank(url)){ + continue; + } + //下载图片 + BufferedInputStream in = new BufferedInputStream(employeeService.getInputStream(url)); + //字节流转图片对象 + Image bi = ImageIO.read(in); + //构建图片流 + BufferedImage tag = new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB); + //绘制改变尺寸后的图 + tag.getGraphics().drawImage(bi, 0, 0, 300, 300, null); + //输出流 + BufferedOutputStream image = new BufferedOutputStream(new FileOutputStream(storeFile.getPath() +"/" +poiStoreStaff.getStaffCode() + ".png")); + + ImageIO.write(tag, "PNG", image); + + in.close(); + image.close(); + } + } } - fileInputStream.close(); - out.closeEntry(); } } - out.flush(); - out.close(); + //将根文件转换为zip文件 + ZipUtils.toZip(file.getPath(),out,true); + + //将文件输入到response ServletOutputStream outputStream = response.getOutputStream(); - byte[] bufferNew = new byte[1024]; + byte[] buffer = new byte[1024]; File zipFile = new File(strZipName); FileInputStream inStream = new FileInputStream(zipFile); int lenNew; - while ((lenNew = inStream.read(bufferNew)) > 0) { - outputStream.write(bufferNew, 0, lenNew); + while ((lenNew = inStream.read(buffer)) > 0) { + outputStream.write(buffer, 0, lenNew); } + //删除文件,清理空间 file.delete(); zipFile.delete(); } diff --git a/src/main/java/com/kiisoo/ic/utils/ZipUtils.java b/src/main/java/com/kiisoo/ic/utils/ZipUtils.java new file mode 100644 index 0000000..aec1cf1 --- /dev/null +++ b/src/main/java/com/kiisoo/ic/utils/ZipUtils.java @@ -0,0 +1,131 @@ +package com.kiisoo.ic.utils; + +import java.io.*; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +public class ZipUtils { + private static final int BUFFER_SIZE = 2 * 1024; + + /** + * 压缩成ZIP 方法 * @param srcDir 压缩文件夹路径 + * @param out 压缩文件输出流 + * @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构; + * false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败) + * @throws RuntimeException 压缩失败会抛出运行时异常 + */ + public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure) + throws RuntimeException{ + + long start = System.currentTimeMillis(); + ZipOutputStream zos = null ; + try { + zos = new ZipOutputStream(out); + File sourceFile = new File(srcDir); + compress(sourceFile,zos,sourceFile.getName(),KeepDirStructure); + long end = System.currentTimeMillis(); + System.out.println("压缩完成,耗时:" + (end - start) +" ms"); + } catch (Exception e) { + throw new RuntimeException("zip error from ZipUtils",e); + }finally{ + if(zos != null){ + try { + zos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + + /** + * 压缩成ZIP 方法 * @param srcFiles 需要压缩的文件列表 + * @param out 压缩文件输出流 + * @throws RuntimeException 压缩失败会抛出运行时异常 + */ + public static void toZip(List srcFiles , OutputStream out)throws RuntimeException { + long start = System.currentTimeMillis(); + ZipOutputStream zos = null ; + try { + zos = new ZipOutputStream(out); + for (File srcFile : srcFiles) { + byte[] buf = new byte[BUFFER_SIZE]; + zos.putNextEntry(new ZipEntry(srcFile.getName())); + int len; + FileInputStream in = new FileInputStream(srcFile); + while ((len = in.read(buf)) != -1){ + zos.write(buf, 0, len); + } + zos.closeEntry(); + in.close(); + } + long end = System.currentTimeMillis(); + System.out.println("压缩完成,耗时:" + (end - start) +" ms"); + } catch (Exception e) { + throw new RuntimeException("zip error from ZipUtils",e); + }finally{ + if(zos != null){ + try { + zos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + + /** + * 递归压缩方法 + * @param sourceFile 源文件 + * @param zos zip输出流 + * @param name 压缩后的名称 + * @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构; + * false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败) + * @throws Exception + */ + private static void compress(File sourceFile, ZipOutputStream zos, String name, + boolean KeepDirStructure) throws Exception{ + byte[] buf = new byte[BUFFER_SIZE]; + if(sourceFile.isFile()){ + // 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字 + zos.putNextEntry(new ZipEntry(name)); + // copy文件到zip输出流中 + int len; + FileInputStream in = new FileInputStream(sourceFile); + while ((len = in.read(buf)) != -1){ + zos.write(buf, 0, len); + } + // Complete the entry + zos.closeEntry(); + in.close(); + } else { + //是文件夹 + File[] listFiles = sourceFile.listFiles(); + if(listFiles == null || listFiles.length == 0){ + // 需要保留原来的文件结构时,需要对空文件夹进行处理 + if(KeepDirStructure){ + // 空文件夹的处理 + zos.putNextEntry(new ZipEntry(name + "/")); + // 没有文件,不需要文件的copy + zos.closeEntry(); + } + + }else { + for (File file : listFiles) { + // 判断是否需要保留原来的文件结构 + if (KeepDirStructure) { + // 注意:file.getName()前面需要带上父文件夹的名字加一斜杠, + // 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了 + compress(file, zos, name + "/" + file.getName(),KeepDirStructure); + } else { + compress(file, zos, file.getName(),KeepDirStructure); + } + + } + } + } + } +}