This commit is contained in:
Paidax
2025-04-03 20:27:36 +08:00
parent 8b845877d7
commit e7d470c416
3 changed files with 134 additions and 202 deletions
@@ -1,10 +1,10 @@
package io.v.nutz.zhgh.activity.controller.school;
import cn.afterturn.easypoi.entity.ImageEntity;
import cn.wizzer.framework.base.Result;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.data.PictureType;
import com.deepoove.poi.policy.HackLoopTableRenderPolicy;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.dao.CndPlus;
@@ -18,16 +18,14 @@ import io.v.nutz.sys.models.Sys_file;
import io.v.nutz.sys.models.Sys_unit;
import io.v.nutz.sys.models.Sys_user;
import io.v.nutz.sys.services.SysUserService;
import io.v.nutz.web.commons.base.Globals;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.zhgh.activity.models.*;
import io.v.nutz.zhgh.activity.services.ActivitySchoolApplyService;
import io.v.nutz.zhgh.activity.services.ActivitySchoolService;
import io.v.nutz.zhgh.activity.services.ActivitySchoolTeamService;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.ddr.poi.html.HtmlRenderPolicy;
import org.nutz.aop.interceptor.async.Async;
import org.nutz.boot.starter.ftp.FtpService;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
@@ -46,15 +44,14 @@ import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
* @author: Aaron
@@ -62,6 +59,7 @@ import java.util.stream.Collectors;
* @description: 活动报名
**/
@Slf4j
@IocBean
@Ok("json:full")
@At("/platform/activity/apply")
@@ -70,23 +68,16 @@ public class ActivityApplyController {
@Inject
private ActivitySchoolService activitySchoolService;
@Inject
protected SysUserService sysUserService;
@Inject
private ActivitySchoolApplyService activitySchoolApplyService;
@Inject
private ActivitySchoolTeamService activitySchoolTeamService;
@Inject
private SimpleService simpleService;
@Inject("ActivitySchoolEvent")
private ViService<ActivitySchoolEvent> activitySchoolEventViService;
@Inject
private OfficeTemplateUtil officeTemplateUtil;
@Inject
@@ -888,6 +879,12 @@ public class ActivityApplyController {
return null;
}
/**
* 下载签名告知书
* @param activityId
* @param response
*/
@At
@Ok(("void"))
@RequiresPermissions("activity.apply")
@@ -896,26 +893,44 @@ public class ActivityApplyController {
ActivitySchool school = simpleService.dao().fetch(ActivitySchool.class, activityId);
List<ActivitySchoolApply> schoolApplyList = simpleService.dao().query(ActivitySchoolApply.class,
Cnd.where("activityId", "=", activityId)
.and("status", "=", 2)
.and("status", "=", 2).and("unionId", "=", Vi.getUnionId())
.and("applyUserSign", "is not", null));
List<NutMap> signList = new ArrayList<>();
for (int i = 0; i < schoolApplyList.size(); i++) {
ActivitySchoolApply apply = schoolApplyList.get(i);
ByteArrayOutputStream signOs = new ByteArrayOutputStream();
ftpService.download(apply.getApplyUserSign(), signOs);
ByteArrayInputStream bais = new ByteArrayInputStream(signOs.toByteArray());
BufferedImage bufferImg = ImageIO.read(bais);
/*byte[] bytes = Base64.getDecoder().decode(bufferImg.toByteArray());
signList.add(NutMap.NEW().addv("sign", new PictureRenderData(70, 30, ".png", bytes)));*/
}
List<NutMap> signList = schoolApplyList.stream().map(v -> {
try {
PictureRenderData image = getImage(v.getApplyUserSign());
return NutMap.NEW().setv("image", image);
} catch (IOException e) {
log.error("下载签名失败", e);
return null;
}
}).filter(Objects::nonNull).collect(Collectors.toList());
HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
Configure config = Configure.newBuilder().bind("signList", policy).build();
HashMap<String, Object> map = new HashMap<>();
// 平均分组签字
int totalSize = signList.size();
// 计算每个子列表的大小
int chunkSize = (int) Math.ceil(totalSize / 4.0);
List<List<NutMap>> collect = IntStream.range(0, 4)
.mapToObj(i -> {
int start = i * chunkSize;
int end = Math.min((i + 1) * chunkSize, totalSize);
return start < totalSize ? new ArrayList<>(signList.subList(start, end)) : List.of(NutMap.NEW());
}).collect(Collectors.toList());
for (int i = 0; i < collect.size(); i++) {
map.put("signList" + i, collect.get(i));
}
HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
Configure config = Configure.newBuilder().bind("signList0", policy).bind("signList1", policy)
.bind("signList2", policy).bind("signList3", policy).build();
// HtmlRenderPolicy policy = new HtmlRenderPolicy();
// Configure config = Configure.newBuilder().bind("signList", policy).build();
map.put("activityName", school.getName());
map.put("signList", signList);
map.put("dateTime", cn.hutool.core.date.DateUtil.format(new Date(), "yyyy年MM月dd日"));
response.addHeader("Content-Type", "application/octet-stream");
response.addHeader("Content-Disposition", "attachment; filename=\"" + new String((school.getName() + "自愿参赛责任及风险告知书").getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1) + "\".docx");
ServletOutputStream outputStream = response.getOutputStream();
@@ -923,8 +938,19 @@ public class ActivityApplyController {
} catch (Exception e) {
e.printStackTrace();
}
}
private PictureRenderData getImage(String base64) throws IOException {
if (base64.startsWith("data:")) {
String s = base64.split(",")[1];
byte[] bytes = Base64.getDecoder().decode(s);
return new PictureRenderData(70, 30, ".png", bytes);
} else {
ByteArrayOutputStream os = new ByteArrayOutputStream();
ftpService.download(base64, os);
os.close();
return new PictureRenderData(70, 30, PictureType.PNG, os.toByteArray());
}
}
}