فهرست منبع

audit result render; fix IDE warnings

dengjia 1 ماه پیش
والد
کامیت
59dc94e392

+ 1 - 1
.style/eclipse-codestyle.xml

@@ -568,7 +568,7 @@
         <setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
         <!--Java:<Programmatic>-->
         <setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
-        <setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="false"/>
 
         <!--统一为end_of_lint,IDEA默认一致-->
         <setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>

+ 9 - 4
easier-report-biz/src/main/java/com/yaoyicloud/config/SessionInterceptor.java

@@ -1,5 +1,7 @@
 package com.yaoyicloud.config;
 
+import org.springframework.lang.NonNull;
+import org.springframework.lang.Nullable;
 import org.springframework.web.servlet.HandlerInterceptor;
 import org.springframework.web.servlet.ModelAndView;
 import javax.servlet.http.HttpServletRequest;
@@ -13,7 +15,8 @@ public class SessionInterceptor implements HandlerInterceptor {
     private static final Map<String, HttpSession> SESSION_MAP = new HashMap<>();
 
     @Override
-    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
+    public boolean preHandle(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response,
+        @NonNull Object handler)
         throws Exception {
         String relationId = request.getParameter("relationId");
         String mysession = request.getHeader("X-Session-Id");
@@ -25,13 +28,15 @@ public class SessionInterceptor implements HandlerInterceptor {
     }
 
     @Override
-    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
-        ModelAndView modelAndView) throws Exception {
+    public void postHandle(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response,
+        @NonNull Object handler,
+        @Nullable ModelAndView modelAndView) throws Exception {
         // 这里可以添加请求处理后的逻辑,目前示例中没有具体操作
     }
 
     @Override
-    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
+    public void afterCompletion(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response,
+        @NonNull Object handler, @Nullable Exception ex)
         throws Exception {
         // 这里可以添加请求完成后的逻辑,目前示例中没有具体操作
     }

+ 2 - 1
easier-report-biz/src/main/java/com/yaoyicloud/config/WebMvcConfig.java

@@ -1,6 +1,7 @@
 package com.yaoyicloud.config;
 
 import org.springframework.context.annotation.Configuration;
+import org.springframework.lang.NonNull;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
@@ -8,7 +9,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 public class WebMvcConfig implements WebMvcConfigurer {
 
     @Override
-    public void addInterceptors(InterceptorRegistry registry) {
+    public void addInterceptors(@NonNull InterceptorRegistry registry) {
         registry.addInterceptor(new SessionInterceptor()).addPathPatterns("/**"); // 拦截所有请求
     }
 }

+ 1 - 0
easier-report-biz/src/main/java/com/yaoyicloud/controller/ReportController.java

@@ -58,6 +58,7 @@ public class ReportController {
             //后续 session.removeAttribute清理数据。
             HttpSession session = request.getSession();
             String relationId = String.valueOf(resource.getRelationId());
+            @SuppressWarnings("unchecked")
             List<String> reportPaths = (List<String>) session.getAttribute(relationId);
 
             if (reportPaths == null) {

+ 1 - 2
easier-report-biz/src/main/java/com/yaoyicloud/render/AbstractRender.java

@@ -48,13 +48,12 @@ public abstract class AbstractRender {
      * @return 本地文件目录
      * @throws IOException
      */
-    public final String renderDocx(String jsonStr, byte[] templateFileContent, String outputPath) throws IOException {
+    public final String renderDocx(String jsonStr, byte[] templateFileContent, ConfigureBuilder builder, String outputPath) throws IOException {
 
         // 注: 报告模板的模板变量按照json序列化的结果命名
         ObjectMapper objectMapper = new ObjectMapper();
         Map<String, Object> data = objectMapper.readValue(jsonStr, new TypeReference<Map<String, Object>>() {});
 
-        ConfigureBuilder builder = Configure.builder();
         Configure config = builder.build();
         XWPFTemplate template =
             XWPFTemplate.compile(new ByteArrayInputStream(templateFileContent), config).render(data);

+ 26 - 0
easier-report-biz/src/main/java/com/yaoyicloud/render/AuditResult.java

@@ -0,0 +1,26 @@
+package com.yaoyicloud.render;
+
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * 审核结果类
+ */
+@Data
+public class AuditResult {
+    private final String auditResultScore; // ${审核结果:评分}
+    private final String opinion; // ${审核结果:审核意见}
+    private final String serviceProviderName; // ${审核结果:服务商名称}
+    private final LocalDate auditDate; // ${审核结果:审核日期}
+    private final String reportVersion; // ${审核结果:报告版本}
+    private final String riskAlert; // ${风险概述:风险提示}
+    private final String auditResultSuggestion; // ${风险概述:建议}
+
+    // 基础信息评分
+    // 公共记录评分
+    // 财务信息评分
+    // 项目情况评分
+    private final List<CheckItemScore> checkItemScores;
+}

+ 87 - 0
easier-report-biz/src/main/java/com/yaoyicloud/render/AuditResultRender.java

@@ -0,0 +1,87 @@
+package com.yaoyicloud.render;
+
+import java.io.IOException;
+import java.nio.file.Paths;
+import java.time.format.DateTimeFormatter;
+import java.util.UUID;
+
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+
+import cn.hutool.core.date.DatePattern;
+
+/**
+ * AuditResult渲染器
+ *
+ */
+public final class AuditResultRender extends AbstractRender {
+
+    public AuditResultRender(String cwd) {
+        super(cwd);
+    }
+
+    /**
+     * Docx 渲染
+     *
+     * @param info 数据
+     * @param templateFileContent 模板内容
+     * @return 本地文件目录
+     * @throws IOException
+     */
+    public String renderDocx(AuditResult info, byte[] templateFileContent) throws IOException {
+        ObjectMapper mapper = new ObjectMapper();
+        SimpleModule module = new SimpleModule();
+        module.addSerializer(new AuditResultSerializer(AuditResult.class));
+        mapper.registerModule(module);
+
+        String jsonStr = mapper.writeValueAsString(info);
+
+        // 注: 报告模板的模板变量按照json序列化的结果命名
+        // 注: 目前的实现假设:一个session对应一个cwd目录
+        ConfigureBuilder builder = Configure.builder();
+        builder.bind("checkItemScores", new LoopRowTableRenderPolicy());
+        this.docxResultPath = this.renderDocx(jsonStr, templateFileContent, builder,
+            Paths.get(cwd, UUID.randomUUID().toString() + ".docx").toString());
+        return this.docxResultPath;
+    }
+
+    /*
+     * 通过序列化和反序列化
+     * 1. 默认显示规则的数据转换
+     * 2. 避免TL处理模板面对复杂数据类型
+     */
+    public class AuditResultSerializer extends StdSerializer<AuditResult> {
+
+        public AuditResultSerializer() {
+            this(null);
+        }
+
+        public AuditResultSerializer(Class<AuditResult> t) {
+            super(t);
+        }
+
+        @Override
+        public void serialize(AuditResult value, JsonGenerator jgen, SerializerProvider provider)
+            throws IOException, JsonProcessingException {
+
+            jgen.writeStartObject();
+            jgen.writeStringField("auditResultScore", value.getAuditResultScore());
+            jgen.writeStringField("opinion", value.getOpinion() == null ? "-" : value.getOpinion());
+            jgen.writeStringField("serviceProviderName", value.getServiceProviderName());
+            // Note: ignore reportVersion
+            jgen.writeStringField("auditDate", value.getAuditDate() == null ? ""
+                : value.getAuditDate().format(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN)));
+            jgen.writeStringField("riskAlert", value.getRiskAlert() == null ? "-" : value.getRiskAlert());
+            jgen.writeStringField("auditResultSuggestion", value.getAuditResultSuggestion() == null ? "-" : value.getAuditResultSuggestion());
+            jgen.writeObjectField("checkItemScores", value.getCheckItemScores());
+            jgen.writeEndObject();
+        }
+    }
+}

+ 19 - 0
easier-report-biz/src/main/java/com/yaoyicloud/render/CheckItemScore.java

@@ -0,0 +1,19 @@
+package com.yaoyicloud.render;
+
+import lombok.Data;
+
+/**
+ *
+ */
+@Data
+public class CheckItemScore {
+    private final Long itemId;
+    private final String category;
+    private final String itemName;
+    private final Long score;
+
+    public int compareTo(CheckItemScore o) {
+        String cates = "基础信息,公共记录,财务信息,项目情况";
+        return cates.indexOf(this.category) - cates.indexOf(o.category);
+    }
+}

+ 3 - 1
easier-report-biz/src/main/java/com/yaoyicloud/render/ServiceProviderInfoRender.java

@@ -5,6 +5,7 @@ import java.nio.file.Paths;
 import java.time.format.DateTimeFormatter;
 import java.util.UUID;
 
+import com.deepoove.poi.config.Configure;
 import com.fasterxml.jackson.core.JsonGenerator;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -43,7 +44,8 @@ public final class ServiceProviderInfoRender extends AbstractRender {
         // 注: 报告模板的模板变量按照json序列化的结果命名
         // 注: 目前的实现假设:一个session对应一个cwd目录
         this.docxResultPath =
-            this.renderDocx(jsonStr, templateFileContent, Paths.get(cwd,  UUID.randomUUID().toString() + ".docx").toString());
+            this.renderDocx(jsonStr, templateFileContent, Configure.builder(),
+                Paths.get(cwd, UUID.randomUUID().toString() + ".docx").toString());
         return this.docxResultPath;
     }
 

+ 38 - 0
easier-report-biz/src/test/java/com/yaoyicloud/render/test/TestAuditResultRender.java

@@ -0,0 +1,38 @@
+package com.yaoyicloud.render.test;
+
+import static org.junit.Assert.assertTrue;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+
+import com.yaoyicloud.render.AuditResult;
+import com.yaoyicloud.render.AuditResultRender;
+import com.yaoyicloud.render.CheckItemScore;
+
+public class TestAuditResultRender {
+
+    @Test
+    public void testRenderDocx() throws IOException {
+
+        byte[] content = Files
+            .readAllBytes(Paths.get(getClass().getClassLoader().getResource("docx/check_overview.docx").getFile()));
+        AuditResultRender render = new AuditResultRender("../temp/");
+        String retPath = render.renderDocx(
+            new AuditResult("30", "my opinion", "whoami", LocalDate.now(), "",
+                "high risk", "accept it",
+                new ArrayList<CheckItemScore>(List.of(
+                    new CheckItemScore(1L, "cate1", "name1", 1L),
+                    new CheckItemScore(2L, "cate2", "name2", 2L)
+                ))
+            ),
+            content);
+
+        assertTrue(retPath.length() > 0);
+    }
+
+}

BIN
easier-report-biz/src/test/resources/docx/check_overview.docx


BIN
easier-report-biz/src/test/resources/docx/promotion_template.docx