From d2af147c7b534cd43aa6ef0a8b91bbae3978833f Mon Sep 17 00:00:00 2001
From: cwchen <1048842385@qq.com>
Date: Tue, 20 Aug 2024 20:24:28 +0800
Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E6=B5=8B=E9=97=AE=E9=A2=98=E4=BF=AE?=
=?UTF-8?q?=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
bonus-common/bonus-common-core/pom.xml | 6 +
.../com/bonus/common/core/utils/PicUtils.java | 163 ++++++++++++++++++
.../controller/PersonMgeController.java | 13 +-
.../bracelet/service/IPersonMgeService.java | 3 +-
.../service/impl/PersonMgeServiceImpl.java | 47 +++--
.../mapper/bracelet/PersonMgeMapper.xml | 2 +-
6 files changed, 213 insertions(+), 21 deletions(-)
create mode 100644 bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/PicUtils.java
diff --git a/bonus-common/bonus-common-core/pom.xml b/bonus-common/bonus-common-core/pom.xml
index 65f2ae9..9dd91bf 100644
--- a/bonus-common/bonus-common-core/pom.xml
+++ b/bonus-common/bonus-common-core/pom.xml
@@ -131,6 +131,12 @@
hibernate-validator
6.0.18.Final
+
+
+ net.coobird
+ thumbnailator
+ 0.4.8
+
org.freemarker
diff --git a/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/PicUtils.java b/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/PicUtils.java
new file mode 100644
index 0000000..70e8f2f
--- /dev/null
+++ b/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/PicUtils.java
@@ -0,0 +1,163 @@
+package com.bonus.common.core.utils;
+
+import net.coobird.thumbnailator.Thumbnails;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.util.Base64;
+
+
+/**
+ * @author cwchen
+ */
+public class PicUtils {
+ //以下是常量,按照阿里代码开发规范,不允许代码中出现魔法值
+ private static final Logger logger = LoggerFactory.getLogger(PicUtils.class);
+ private static final Integer ZERO = 0;
+ private static final Integer ONE_ZERO_TWO_FOUR = 1024;
+ private static final Integer NINE_ZERO_ZERO = 900;
+ private static final Integer THREE_TWO_SEVEN_FIVE = 3275;
+ private static final Integer TWO_ZERO_FOUR_SEVEN = 2047;
+ private static final Double ZERO_EIGHT_FIVE = 0.85;
+ private static final Double ZERO_SIX = 0.6;
+ private static final Double ZERO_FOUR_FOUR = 0.44;
+ private static final Double ZERO_FOUR = 0.4;
+
+ /**
+ * 根据指定大小压缩图片
+ *
+ * @param imageBytes 源图片字节数组
+ * @param desFileSize 指定图片大小,单位kb
+ * @return 压缩质量后的图片字节数组
+ */
+ public static byte[] compressPicForScale(byte[] imageBytes, long desFileSize) {
+ if (imageBytes == null || imageBytes.length <= ZERO || imageBytes.length < desFileSize * ONE_ZERO_TWO_FOUR) {
+ return imageBytes;
+ }
+ long srcSize = imageBytes.length;
+ double accuracy = getAccuracy(srcSize / ONE_ZERO_TWO_FOUR);
+ try {
+ while (imageBytes.length > desFileSize * ONE_ZERO_TWO_FOUR) {
+ ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);
+ Thumbnails.of(inputStream)
+ .scale(accuracy)
+ .outputQuality(accuracy)
+ .toOutputStream(outputStream);
+ imageBytes = outputStream.toByteArray();
+ }
+ logger.info("图片原大小={}kb | 压缩后大小={}kb",
+ srcSize / ONE_ZERO_TWO_FOUR, imageBytes.length / ONE_ZERO_TWO_FOUR);
+ } catch (Exception e) {
+ logger.error("【图片压缩】msg=图片压缩失败!", e);
+ }
+ return imageBytes;
+ }
+
+ /**
+ * 自动调节精度(经验数值)
+ *
+ * @param size 源图片大小
+ * @return 图片压缩质量比
+ */
+ private static double getAccuracy(long size) {
+ double accuracy;
+ if (size < NINE_ZERO_ZERO) {
+ accuracy = ZERO_EIGHT_FIVE;
+ } else if (size < TWO_ZERO_FOUR_SEVEN) {
+ accuracy = ZERO_SIX;
+ } else if (size < THREE_TWO_SEVEN_FIVE) {
+ accuracy = ZERO_FOUR_FOUR;
+ } else {
+ accuracy = ZERO_FOUR;
+ }
+ return accuracy;
+ }
+
+ public static byte[] FileTobyte(File file) {
+ FileInputStream fileInputStream = null;
+ byte[] imgData = null;
+
+ try {
+ imgData = new byte[(int) file.length()];
+
+ //read file into bytes[]
+ fileInputStream = new FileInputStream(file);
+ fileInputStream.read(imgData);
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ if (fileInputStream != null) {
+ try {
+ fileInputStream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ }
+ return imgData;
+ }
+
+ /**
+ * 压缩base64编码图片,并返回base64
+ *
+ * @param base64Image 需要压缩的图片
+ * @param compressSize 压缩大小,传入多少就压缩到该值范围内 (例:524,288 等于 512kb)
+ * @return 返回base64编码
+ * @throws Exception 异常处理
+ */
+ public static String compressBase64Image(String base64Image, Integer compressSize) throws Exception {
+ try {
+ String newBase64;
+ // 判断格式
+ if (base64Image.startsWith("data:image")) {
+ int index = base64Image.indexOf("base64,");
+ if (index == -1) {
+ throw new Exception("无效base64照片格式");
+ }
+ newBase64 = base64Image.substring(index + 7);
+ } else {
+ newBase64 = base64Image;
+ }
+ // replace(" ", "+")
+ newBase64 = newBase64.replace(" ", "+");
+ // 解码Base64字符串为字节数组
+ byte[] imageBytes = Base64.getDecoder().decode(newBase64);
+ // 缓冲图像
+ BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(imageBytes));
+ // 根据指定的图像及宽、高按比例缩放并进行压缩质量90%新建缓冲图像缩略图
+ BufferedImage image = Thumbnails.of(bufferedImage).size(bufferedImage.getWidth() / 2,
+ bufferedImage.getHeight() / 2).outputQuality(0.9).asBufferedImage();
+ // 创建输出流对象
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ // 根据传入图像,图像类型,写入指定的输出流中
+ ImageIO.write(image, "jpg", outputStream);
+ // 输出流转换成字节数组
+ imageBytes = outputStream.toByteArray();
+ // 使用 Base64 编码方案将指定的字节数组转为 String
+ String base64 = Base64.getEncoder().encodeToString(imageBytes);
+ // 根据String对象长度判断是否需要进行压缩
+ if (base64.length() - base64.length() / 8 * 2 > compressSize) {
+ // 设置图像的缩放系数并创建图像 (默认1.0 代表缩略100%)
+ image = Thumbnails.of(image).scale(1.0 / base64.length() / compressSize).asBufferedImage();
+ // 根据传入图像,图像类型,写入指定的输出流中
+ ImageIO.write(image, "jpg", outputStream);
+ // 使用 Base64 编码方案将指定的字节数组转为 String
+ base64 = Base64.getEncoder().encodeToString(outputStream.toByteArray());
+ }
+ // 关闭流
+ outputStream.flush();
+ outputStream.close();
+ // 返回Base64编码图片
+ return "data:image/jpeg;base64," + base64;
+ } catch (Exception e) {
+ logger.error("图片压缩异常", e);
+ }
+ return null;
+ }
+}
diff --git a/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/controller/PersonMgeController.java b/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/controller/PersonMgeController.java
index 43ff0d2..292f5a1 100644
--- a/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/controller/PersonMgeController.java
+++ b/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/controller/PersonMgeController.java
@@ -1,22 +1,21 @@
package com.bonus.bracelet.controller;
-import com.alibaba.fastjson2.JSON;
import com.bonus.bracelet.mapper.PersonMgeMapper;
import com.bonus.bracelet.service.IPersonMgeService;
-import com.bonus.common.core.constant.BusinessConstants;
+import com.bonus.common.core.constant.HttpStatus;
import com.bonus.common.core.constant.SecurityConstants;
+import com.bonus.common.core.utils.DateTimeHelper;
import com.bonus.common.core.utils.UploadCheckUtils;
import com.bonus.common.core.web.controller.BaseController;
import com.bonus.common.core.web.domain.AjaxResult;
import com.bonus.common.core.web.page.TableDataInfo;
import com.bonus.common.entity.bracelet.BraceletParamsDto;
-import com.bonus.common.entity.bracelet.vo.BaseProject;
import com.bonus.common.entity.bracelet.vo.PersonVo;
import com.bonus.common.log.annotation.SysLog;
import com.bonus.common.log.enums.OperaType;
import com.bonus.common.security.annotation.RequiresPermissions;
-import com.bonus.common.security.utils.SecurityUtils;
import com.bonus.system.api.RemoteFileService;
+import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.*;
@@ -52,9 +51,11 @@ public class PersonMgeController extends BaseController {
@GetMapping("list")
@SysLog(title = "人员管理", businessType = OperaType.QUERY,logType = 0,module = "基础管理->人员管理",details ="查询人员列表")
public TableDataInfo list(BraceletParamsDto dto) {
+ System.err.println("开始"+DateTimeHelper.getNowTime());
startPage();
- List list = service.getPersonLists(dto);
- return getDataTable(list);
+ TableDataInfo tableDataInfo = service.getPersonLists(dto);
+ System.err.println("结束"+DateTimeHelper.getNowTime());
+ return tableDataInfo;
}
// @RequiresPermissions("basic:person:add")
diff --git a/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/service/IPersonMgeService.java b/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/service/IPersonMgeService.java
index 0e0f904..7e58d14 100644
--- a/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/service/IPersonMgeService.java
+++ b/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/service/IPersonMgeService.java
@@ -1,6 +1,7 @@
package com.bonus.bracelet.service;
import com.bonus.common.core.web.domain.AjaxResult;
+import com.bonus.common.core.web.page.TableDataInfo;
import com.bonus.common.entity.bracelet.BraceletParamsDto;
import com.bonus.common.entity.bracelet.vo.PersonVo;
import org.springframework.web.bind.annotation.RequestBody;
@@ -68,7 +69,7 @@ public interface IPersonMgeService {
* @author cwchen
* @date 2024/7/17 9:19
*/
- List getPersonLists(BraceletParamsDto dto);
+ TableDataInfo getPersonLists(BraceletParamsDto dto);
/**
* 人员导入
diff --git a/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/service/impl/PersonMgeServiceImpl.java b/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/service/impl/PersonMgeServiceImpl.java
index b6babe5..265997f 100644
--- a/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/service/impl/PersonMgeServiceImpl.java
+++ b/bonus-modules/bonus-bracelet/src/main/java/com/bonus/bracelet/service/impl/PersonMgeServiceImpl.java
@@ -12,14 +12,12 @@ import com.bonus.common.core.constant.BusinessConstants;
import com.bonus.common.core.constant.HttpStatus;
import com.bonus.common.core.constant.SecurityConstants;
import com.bonus.common.core.domain.R;
-import com.bonus.common.core.utils.BytesToMultipartFileUtil;
-import com.bonus.common.core.utils.FaceCodeUtil;
-import com.bonus.common.core.utils.ImportExcelUtils;
-import com.bonus.common.core.utils.UploadCheckUtils;
+import com.bonus.common.core.utils.*;
import com.bonus.common.core.utils.encryption.Sm4Utils;
import com.bonus.common.core.utils.global.SystemGlobal;
import com.bonus.common.core.utils.uuid.IdUtils;
import com.bonus.common.core.web.domain.AjaxResult;
+import com.bonus.common.core.web.page.TableDataInfo;
import com.bonus.common.entity.bracelet.BraceletParamsDto;
import com.bonus.common.entity.bracelet.exportVo.PersonExportVo;
import com.bonus.common.entity.bracelet.importVo.PersonImportVo;
@@ -30,6 +28,7 @@ import com.bonus.common.entity.file.ResourceFileVo;
import com.bonus.common.security.utils.ValidatorsUtils;
import com.bonus.system.api.RemoteFileService;
import com.bonus.system.api.domain.SysFile;
+import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
@@ -88,20 +87,42 @@ public class PersonMgeServiceImpl implements IPersonMgeService {
private String tempFilePath;
@Override
- public List getPersonLists(BraceletParamsDto dto) {
+ public TableDataInfo getPersonLists(BraceletParamsDto dto) {
dto.setSourceType(BusinessConstants.RESOURCE_TYPE_USER);
List list = new ArrayList<>();
+ List futureList = new ArrayList<>();
+ List newList = new ArrayList<>();
try {
list = mapper.getPersonLists(dto);
for (PersonVo vo : list) {
- vo = handleData(vo);
- int num = mapper.getCertificateNum(vo.getId());
- vo.setCertificateNum(num);
+ Future future = testTaskExecutor.submit(new Callable() {
+ @Override
+ public PersonVo call() throws Exception {
+ System.err.println("执行了");
+ vo.setIdCard(Sm4Utils.decode(vo.getIdCard()));
+ vo.setPhone(Sm4Utils.decode(vo.getPhone()));
+ String imageBase64 = getImageBase64(vo.getFilePath());
+ vo.setBase64Url(imageBase64);
+ int num = mapper.getCertificateNum(vo.getId());
+ vo.setCertificateNum(num);
+ return vo;
+ }
+ });
+ futureList.add(future);
+ }
+ for (Future future : futureList) {
+ PersonVo vo = future.get();
+ newList.add(vo);
}
} catch (Exception e) {
log.error("查询人员列表", e);
}
- return list;
+ TableDataInfo rspData = new TableDataInfo();
+ rspData.setCode(HttpStatus.SUCCESS);
+ rspData.setRows(newList);
+ rspData.setMsg("查询成功");
+ rspData.setTotal(new PageInfo(list).getTotal());
+ return rspData;
}
@Override
@@ -632,16 +653,16 @@ public class PersonMgeServiceImpl implements IPersonMgeService {
public ResourceFileVo setCertificateResourceFileData(JSONObject item, CertificateVo vo) {
ResourceFileVo fileVo = new ResourceFileVo();
String fileType = null;
- if(item.get("suffix").equals(".pdf") || item.get("suffix").equals(".doc") || item.get("suffix").equals(".docx")){
+ if (item.get("suffix").equals(".pdf") || item.get("suffix").equals(".doc") || item.get("suffix").equals(".docx")) {
fileType = "0";
- }else{
+ } else {
fileType = String.valueOf(vo.getCertificateType() + 1);
}
String resourceId = IdUtils.simpleUUID();
- if(fileType.equals("0")){
+ if (fileType.equals("0")) {
fileVo.setFileType(0);
fileVo.setSourceType(String.valueOf(vo.getCertificateType() + 1));
- }else{
+ } else {
fileVo.setFileType(1);
fileVo.setSourceType(fileType);
}
diff --git a/bonus-modules/bonus-bracelet/src/main/resources/mapper/bracelet/PersonMgeMapper.xml b/bonus-modules/bonus-bracelet/src/main/resources/mapper/bracelet/PersonMgeMapper.xml
index f3e68d7..0cf8ec6 100644
--- a/bonus-modules/bonus-bracelet/src/main/resources/mapper/bracelet/PersonMgeMapper.xml
+++ b/bonus-modules/bonus-bracelet/src/main/resources/mapper/bracelet/PersonMgeMapper.xml
@@ -267,7 +267,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"