From e7d470c416a3eb62b65784abf9da7c7f23569ce7 Mon Sep 17 00:00:00 2001 From: Paidax Date: Thu, 3 Apr 2025 20:27:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../school/ActivityApplyController.java | 86 ++++--- .../activity/school/ActivityApply.html | 15 +- .../activity/school/ActivityReading.html | 235 +++++------------- 3 files changed, 134 insertions(+), 202 deletions(-) diff --git a/src/main/java/io/v/nutz/zhgh/activity/controller/school/ActivityApplyController.java b/src/main/java/io/v/nutz/zhgh/activity/controller/school/ActivityApplyController.java index 1d8a4fb..7b2a4f9 100644 --- a/src/main/java/io/v/nutz/zhgh/activity/controller/school/ActivityApplyController.java +++ b/src/main/java/io/v/nutz/zhgh/activity/controller/school/ActivityApplyController.java @@ -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 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 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 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 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 map = new HashMap<>(); + // 平均分组签字 + int totalSize = signList.size(); + // 计算每个子列表的大小 + int chunkSize = (int) Math.ceil(totalSize / 4.0); + + List> 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()); + } + } } diff --git a/src/main/resources/views/platform/activity/school/ActivityApply.html b/src/main/resources/views/platform/activity/school/ActivityApply.html index a22f470..74d5d4c 100644 --- a/src/main/resources/views/platform/activity/school/ActivityApply.html +++ b/src/main/resources/views/platform/activity/school/ActivityApply.html @@ -235,12 +235,19 @@ layout("/layouts/platform.html"){ .format('YYYY/MM/DD HH:mm')}} 至 {{moment(item.applyEndTime).format('YYYY/MM/DD HH:mm')}} -
-
+
+
+ + 下载风险告知书(签名) + +
+
- 上传风险告知书 + 上传风险告知书(盖章)
- + - +
{{tabIdx + 1}} {{pageForm.year}} - - {{isDisPlayCode?'('+app.unioncode+')':null}}{{app.unionname}} - + {{isDisPlayCode?'('+app.unioncode+')':null}}{{app.unionname}} {{pageForm.activityName || '暂无'}} - {{app.num |money}} 人({{(app.promiseBookFiles&&app.promiseBookFiles.length>0)?'已上传承诺书':'未上传'}}) - 查看承诺书 - - + {{app.num |money}} 人({{(app.promiseBookFiles&&app.promiseBookFiles.length>0)?'已上传风险告知书':'未上传'}}) + + + 查看风险告知书 + {{app.show?'折叠':'展开'}}
-
+
- + {{ row.team }} 暂无 - --> - --> -