|
|
@@ -3,6 +3,12 @@ package com.izouma.wenlvju.service.performance;
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
+import com.google.zxing.BarcodeFormat;
|
|
|
+import com.google.zxing.EncodeHintType;
|
|
|
+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.izouma.wenlvju.domain.performance.Participant;
|
|
|
import com.izouma.wenlvju.domain.performance.Programme;
|
|
|
import com.izouma.wenlvju.dto.PageQuery;
|
|
|
@@ -14,6 +20,7 @@ import com.izouma.wenlvju.service.storage.StorageService;
|
|
|
import com.izouma.wenlvju.utils.JpaUtils;
|
|
|
import com.izouma.wenlvju.utils.ObjUtils;
|
|
|
import lombok.AllArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
import net.coobird.thumbnailator.Thumbnails;
|
|
|
import org.springframework.data.domain.Page;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
@@ -24,10 +31,15 @@ import java.awt.image.BufferedImage;
|
|
|
import java.io.ByteArrayInputStream;
|
|
|
import java.io.ByteArrayOutputStream;
|
|
|
import java.io.IOException;
|
|
|
+import java.net.BindException;
|
|
|
import java.net.URL;
|
|
|
import java.util.ArrayList;
|
|
|
+import java.util.Hashtable;
|
|
|
import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
+@Slf4j
|
|
|
@Service
|
|
|
@AllArgsConstructor
|
|
|
public class ParticipantService {
|
|
|
@@ -75,9 +87,9 @@ public class ParticipantService {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- public String createAward(Participant participant, String award) throws IOException {
|
|
|
+ public String createAward(Participant participant, String programmeName) throws IOException, WriterException {
|
|
|
BufferedImage shareImg = ImageIO.read(this.getClass().getResourceAsStream("/static/certificate.jpeg"));
|
|
|
- BufferedImage result = new BufferedImage(1100, 778, BufferedImage.TYPE_INT_RGB);
|
|
|
+ BufferedImage result = new BufferedImage(2480, 1748, BufferedImage.TYPE_INT_RGB);
|
|
|
Graphics2D g = result.createGraphics();
|
|
|
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
|
|
|
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
|
|
|
@@ -85,40 +97,55 @@ public class ParticipantService {
|
|
|
g.setComposite(AlphaComposite.SrcOver);
|
|
|
g.drawImage(shareImg, 0, 0, null);
|
|
|
|
|
|
- // 头像
|
|
|
- if (ObjectUtil.isNotNull(participant.getImg())) {
|
|
|
- BufferedImage avatar = ImageIO.read(new URL(participant.getImg()));
|
|
|
-// int size = Math.min(avatar.getWidth(), avatar.getHeight());
|
|
|
-// BufferedImage subImg = avatar
|
|
|
-// .getSubimage((avatar.getWidth() - size) / 2, (avatar.getHeight() - size) / 2, size, size);
|
|
|
- BufferedImage avatarImg = new BufferedImage(68 * 2, 80 * 2, BufferedImage.TYPE_INT_ARGB);
|
|
|
- Graphics2D g2 = avatarImg.createGraphics();
|
|
|
- g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
|
|
|
- g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
|
|
|
- g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
|
|
|
- g2.setComposite(AlphaComposite.SrcOver);
|
|
|
- g2.setBackground(Color.GREEN);
|
|
|
-// g2.setClip(new Ellipse2D.Float(0, 0, 68 * 2, 76 * 2)); //椭圆
|
|
|
- g2.drawImage(avatar, 0, 0, 68 * 2, 160, null);
|
|
|
-
|
|
|
- g.drawImage(avatarImg, 420 * 2, 50 * 2, 68 * 2, 160, null);
|
|
|
- }
|
|
|
+ // 二维码
|
|
|
+ Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
|
|
|
+ hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
|
|
|
+ hints.put(EncodeHintType.MARGIN, 1);
|
|
|
+
|
|
|
+ BitMatrix bitMatrix = new MultiFormatWriter().encode("http://yskj.njlyw.cn:8081/h5?progremmeId=" + participant.getProgrammeId(),
|
|
|
+ BarcodeFormat.QR_CODE, 1000, 1000, hints);
|
|
|
+ BufferedImage code = MatrixToImageWriter.toBufferedImage(bitMatrix);
|
|
|
+
|
|
|
+ BufferedImage avatarImg = new BufferedImage(240, 240, BufferedImage.TYPE_INT_ARGB);
|
|
|
+ Graphics2D g2 = avatarImg.createGraphics();
|
|
|
+ g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
|
|
|
+ g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
|
|
|
+ g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
|
|
|
+ g2.setComposite(AlphaComposite.SrcOver);
|
|
|
+ g2.setBackground(Color.GREEN);
|
|
|
+ g2.drawImage(code, 0, 0, 240, 240, null);
|
|
|
+
|
|
|
+ g.drawImage(avatarImg, 1898, 253, 240, 240, null);
|
|
|
|
|
|
|
|
|
// 文字
|
|
|
- g.setColor(new Color(0, 0, 0)); //根据图片的背景设置水印颜色
|
|
|
- Font font = new Font("黑体", Font.PLAIN, 30);
|
|
|
- String content = participant.getName();
|
|
|
- // 加水印
|
|
|
+ g.setColor(new Color(48, 52, 82)); //根据图片的背景设置水印颜色
|
|
|
+ // 编号
|
|
|
+ String programmeId = participant.getProgrammeId().toString();
|
|
|
+ Font fontId = new Font("黑体", Font.PLAIN, 35);
|
|
|
+ g.setFont(fontId);
|
|
|
+ g.drawString(programmeId, 2000, 544);
|
|
|
+
|
|
|
+
|
|
|
+ // 姓名
|
|
|
+ Font font = new Font("黑体", Font.BOLD, 60);
|
|
|
+ String name = participant.getName();
|
|
|
g.setFont(font); //设置字体
|
|
|
//设置水印的坐标
|
|
|
- g.drawString(content, 160, 330); //画出水印
|
|
|
+ g.drawString(name, 400, 600);
|
|
|
|
|
|
- String content1 = "在2021“宁艺之星”社会艺术水平考级展演(览)中,表现优";
|
|
|
- //设置水印的坐标
|
|
|
- g.drawString(content1, 215, 390);
|
|
|
- String content2 = "秀,被评为“" + award + "”,特发此证,以资鼓励。";
|
|
|
- g.drawString(content2, 160, 450);
|
|
|
+
|
|
|
+ // 节目名称
|
|
|
+ if (programmeName.length() > 8) {
|
|
|
+ String body1 = programmeName.substring(0, 7);
|
|
|
+ String body2 = programmeName.substring(7);
|
|
|
+ Font title = new Font("黑体", Font.PLAIN, 40);
|
|
|
+ g.setFont(title);
|
|
|
+ g.drawString(body1, 1200, 795);
|
|
|
+ g.drawString(body2, 1200, 835);
|
|
|
+ } else {
|
|
|
+ g.drawString(programmeName, 1220, 825);
|
|
|
+ }
|
|
|
|
|
|
g.dispose();
|
|
|
ByteArrayOutputStream out = new ByteArrayOutputStream(1024);
|
|
|
@@ -139,14 +166,16 @@ public class ParticipantService {
|
|
|
}
|
|
|
|
|
|
Programme programme = programmeRepo.findById(programmeId).orElseThrow(new BusinessException("无节目"));
|
|
|
- String name = awardRepo.findById(programme.getAwardId()).orElseThrow(new BusinessException("无奖项")).getName();
|
|
|
+// String name = awardRepo.findById(programme.getAwardId()).orElseThrow(new BusinessException("无奖项")).getName();
|
|
|
List<Participant> result = new ArrayList<>();
|
|
|
participants.forEach(participant -> {
|
|
|
if (ObjectUtil.isNull(participant.getAwardImg())) {
|
|
|
try {
|
|
|
- participant.setAwardImg(this.createAward(participant, name));
|
|
|
+ participant.setAwardImg(this.createAward(participant, programme.getName()));
|
|
|
} catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
+ log.error("文件找不到", e);
|
|
|
+ } catch (WriterException e) {
|
|
|
+ log.error("生成二维码失败", e);
|
|
|
}
|
|
|
result.add(participant);
|
|
|
}
|
|
|
@@ -156,8 +185,8 @@ public class ParticipantService {
|
|
|
}
|
|
|
|
|
|
public void awardByAwardId(Long awardId, Long specialtyId, boolean parent) {
|
|
|
- String award = awardRepo.findById(awardId).orElseThrow(new BusinessException("无奖项")).getName();
|
|
|
- List<Long> programmes;
|
|
|
+// String award = awardRepo.findById(awardId).orElseThrow(new BusinessException("无奖项")).getName();
|
|
|
+ List<Programme> programmes;
|
|
|
if (ObjectUtil.isNull(specialtyId)) {
|
|
|
programmes = programmeRepo.findAllByAwardId(awardId);
|
|
|
} else if (parent) {
|
|
|
@@ -165,14 +194,18 @@ public class ParticipantService {
|
|
|
} else {
|
|
|
programmes = programmeRepo.findAllByAwardIdAndSpecialtyId(awardId, specialtyId);
|
|
|
}
|
|
|
- List<Participant> participants = participantRepo.findAllByProgrammeIdIn(programmes);
|
|
|
+ Map<Long, String> programmeMap = programmes.stream()
|
|
|
+ .collect(Collectors.toMap(Programme::getId, Programme::getName));
|
|
|
+ List<Participant> participants = participantRepo.findAllByProgrammeIdIn(programmeMap.keySet());
|
|
|
List<Participant> result = new ArrayList<>();
|
|
|
participants.forEach(participant -> {
|
|
|
if (ObjectUtil.isNull(participant.getAwardImg())) {
|
|
|
try {
|
|
|
- participant.setAwardImg(this.createAward(participant, award));
|
|
|
+ participant.setAwardImg(this.createAward(participant, programmeMap.get(participant.getProgrammeId())));
|
|
|
} catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
+ log.error("文件找不到", e);
|
|
|
+ } catch (WriterException e) {
|
|
|
+ log.error("生成二维码失败", e);
|
|
|
}
|
|
|
result.add(participant);
|
|
|
}
|