lyhzzz 10 ماه پیش
والد
کامیت
b5def71a99
33فایلهای تغییر یافته به همراه1593 افزوده شده و 9 حذف شده
  1. 26 3
      pom.xml
  2. 8 0
      src/main/java/com/fdkankan/fusion/common/ResultCode.java
  3. 1 0
      src/main/java/com/fdkankan/fusion/common/util/DataUtil.java
  4. 22 0
      src/main/java/com/fdkankan/fusion/common/util/DateUtils.java
  5. 92 0
      src/main/java/com/fdkankan/fusion/controller/CaseExtractDetailController.java
  6. 87 0
      src/main/java/com/fdkankan/fusion/controller/CaseInquestController.java
  7. 80 0
      src/main/java/com/fdkankan/fusion/controller/CaseInquestCriminalController.java
  8. 81 0
      src/main/java/com/fdkankan/fusion/entity/CaseExtractDetail.java
  9. 153 0
      src/main/java/com/fdkankan/fusion/entity/CaseInquest.java
  10. 251 0
      src/main/java/com/fdkankan/fusion/entity/CaseInquestCriminal.java
  11. 5 5
      src/main/java/com/fdkankan/fusion/generate/AutoGenerate.java
  12. 18 0
      src/main/java/com/fdkankan/fusion/mapper/ICaseExtractDetailMapper.java
  13. 18 0
      src/main/java/com/fdkankan/fusion/mapper/ICaseInquestCriminalMapper.java
  14. 18 0
      src/main/java/com/fdkankan/fusion/mapper/ICaseInquestMapper.java
  15. 200 0
      src/main/java/com/fdkankan/fusion/response/CaseInquestCriminalVo.java
  16. 118 0
      src/main/java/com/fdkankan/fusion/response/CaseInquestVo.java
  17. 39 0
      src/main/java/com/fdkankan/fusion/response/WitnessVo.java
  18. 22 0
      src/main/java/com/fdkankan/fusion/service/ICaseExtractDetailService.java
  19. 23 0
      src/main/java/com/fdkankan/fusion/service/ICaseInquestCriminalService.java
  20. 22 0
      src/main/java/com/fdkankan/fusion/service/ICaseInquestService.java
  21. 75 0
      src/main/java/com/fdkankan/fusion/service/impl/CaseExtractDetailServiceImpl.java
  22. 81 0
      src/main/java/com/fdkankan/fusion/service/impl/CaseInquestCriminalServiceImpl.java
  23. 79 0
      src/main/java/com/fdkankan/fusion/service/impl/CaseInquestServiceImpl.java
  24. 55 0
      src/main/java/com/fdkankan/fusion/typehandle/JsonObjTypeHandler.java
  25. 2 0
      src/main/resources/application.yaml
  26. 2 1
      src/main/resources/logback-spring.xml
  27. 5 0
      src/main/resources/mapper/fusion/CaseExtractDetailMapper.xml
  28. 5 0
      src/main/resources/mapper/fusion/CaseInquestCriminalMapper.xml
  29. 5 0
      src/main/resources/mapper/fusion/CaseInquestMapper.xml
  30. BIN
      src/main/resources/template/extract-template.docx
  31. BIN
      src/main/resources/template/inquest-template.docx
  32. BIN
      src/main/resources/template/inquest_criminal-template.docx
  33. BIN
      src/main/resources/template/~$quest_criminal-template.docx

+ 26 - 3
pom.xml

@@ -21,7 +21,7 @@
         <dependency>
             <groupId>com.fdkankan</groupId>
             <artifactId>4dkankan-utils-redis</artifactId>
-            <version>2.0.0-SNAPSHOT</version>
+            <version>3.0.0-SNAPSHOT</version>
         </dependency>
 
         <dependency>
@@ -107,7 +107,7 @@
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>easyexcel</artifactId>
-            <version>3.1.0</version>
+            <version>4.0.0</version>
         </dependency>
 
         <dependency>
@@ -120,7 +120,7 @@
         <dependency>
             <groupId>com.aliyun.oss</groupId>
             <artifactId>aliyun-sdk-oss</artifactId>
-            <version>2.8.3</version>
+            <version>3.6.0</version>
         </dependency>
 
 
@@ -149,6 +149,29 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-websocket</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.deepoove</groupId>
+            <artifactId>poi-tl</artifactId>
+            <version>1.12.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>5.2.5</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>4.3.1</version>
+        </dependency>
+
+            <dependency>
+                <groupId>org.bytedeco</groupId>
+                <artifactId>javacv-platform</artifactId>
+                <version>1.5.9</version>
+            </dependency>
+
     </dependencies>
 
     <build>

+ 8 - 0
src/main/java/com/fdkankan/fusion/common/ResultCode.java

@@ -70,6 +70,14 @@ public enum ResultCode {
 
     CASE_REMOVE_SCENE(7023,"场景被移除"),
 
+    CAMERA_SPACE_ERROR(8022, "相机容量不足"),
+    INQUEST_ERROR(8023, "该案件已有勘验笔录"),
+    INQUEST_ERROR2(8024, "该案件未有勘验笔录"),
+    CAMERA_VERSION_EXIT(8025, "相机版本号已存在"),
+    CAMERA_VERSION_NOTEXIT(8026, "相机版本号不存在"),
+    CAMERA_VERSION_STATUS_ERROR(8027, "相机版本状态错误"),
+
+
     ;
 
 

+ 1 - 0
src/main/java/com/fdkankan/fusion/common/util/DataUtil.java

@@ -4,4 +4,5 @@ public class DataUtil {
 
     public static String[] firePlace = {"非建构筑物","交通工具","建构筑物","垃圾及废弃物"};
     public static String[] fireReason = {"放火","电气火灾","产作业","用火不慎","吸烟","玩火","燃放烟花爆竹","自燃","雷击","静电","遗留火种","其他","不排除原因"};
+    public static String[] CN_NUM = {"〇","一","二","三","四","五","六","七","八","九"};
 }

+ 22 - 0
src/main/java/com/fdkankan/fusion/common/util/DateUtils.java

@@ -1,6 +1,7 @@
 package com.fdkankan.fusion.common.util;
 
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.NumberUtil;
 
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
@@ -66,6 +67,27 @@ public class DateUtils {
         return dateList;
     }
 
+    public static String getCnDateStr(String time){
+        StringBuilder result = new StringBuilder();
+        char[] charArray = time.toCharArray();
+        for (char c : charArray) {
+            String s = String.valueOf(c);
+            switch (s){
+                case "0": s = "〇";break;
+                case "1": s = "一";break;
+                case "2": s = "二";break;
+                case "3": s = "三";break;
+                case "4": s = "四";break;
+                case "5": s = "五";break;
+                case "6": s = "六";break;
+                case "7": s = "七";break;
+                case "8": s = "八";break;
+                case "9": s = "九";break;
+            }
+            result.append(s);
+        }
+        return result.toString();
+    }
 
 
     public static void main(String[] args) {

+ 92 - 0
src/main/java/com/fdkankan/fusion/controller/CaseExtractDetailController.java

@@ -0,0 +1,92 @@
+package com.fdkankan.fusion.controller;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.data.TextRenderData;
+import com.deepoove.poi.data.style.Style;
+import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
+import com.deepoove.poi.util.PoitlIOUtils;
+import com.fdkankan.fusion.common.ResultCode;
+import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.entity.CaseExtractDetail;
+import com.fdkankan.fusion.entity.CaseInquest;
+import com.fdkankan.fusion.exception.BusinessException;
+import com.fdkankan.fusion.response.CaseInquestVo;
+import com.fdkankan.fusion.response.WitnessVo;
+import com.fdkankan.fusion.service.ICaseExtractDetailService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-05
+ */
+@RestController
+@RequestMapping("/caseExtractDetail")
+public class CaseExtractDetailController {
+
+    @Autowired
+    ICaseExtractDetailService caseExtractDetailService;
+
+
+    @GetMapping("/info")
+    public ResultData info(@RequestParam(required = false) Integer caseId){
+        return ResultData.ok(caseExtractDetailService.getByCaseId(caseId));
+    }
+
+    @PostMapping("/saveOrUpdate")
+    public ResultData saveOrUpdate(@RequestBody CaseExtractDetail caseExtractDetail){
+        caseExtractDetailService.saveByParam(caseExtractDetail);
+        return ResultData.ok();
+    }
+
+    @GetMapping("/downDocx")
+    public void downDocx(@RequestParam(required = false) Integer caseId,
+                         HttpServletResponse res, HttpServletRequest req) throws IOException {
+
+        if(caseId == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        CaseExtractDetail caseExtractDetail = caseExtractDetailService.getByCaseId(caseId);
+        if(caseExtractDetail == null){
+            throw new BusinessException(ResultCode.INQUEST_ERROR2);
+        }
+
+        XWPFTemplate template = caseExtractDetailService.getWordByTemplate(caseExtractDetail);
+
+        // 设置响应头,指定文件类型和内容长度
+        res.setContentType("application/octet-stream");
+        res.setHeader("Content-Disposition", "attachment; filename=output.docx");
+
+        try {
+            // 返回网络流
+            OutputStream out = res.getOutputStream();
+            BufferedOutputStream bos = new BufferedOutputStream(out);
+            template.write(bos);
+            bos.flush();
+            out.flush();
+            // 关闭流
+            PoitlIOUtils.closeQuietlyMulti(template, bos, out);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+
+    }
+
+}
+

+ 87 - 0
src/main/java/com/fdkankan/fusion/controller/CaseInquestController.java

@@ -0,0 +1,87 @@
+package com.fdkankan.fusion.controller;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.data.*;
+import com.deepoove.poi.data.style.Style;
+import com.deepoove.poi.util.PoitlIOUtils;
+import com.fdkankan.fusion.common.ResultCode;
+import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.entity.CaseInquest;
+import com.fdkankan.fusion.exception.BusinessException;
+import com.fdkankan.fusion.response.CaseInquestVo;
+import com.fdkankan.fusion.response.WitnessVo;
+import com.fdkankan.fusion.service.ICaseInquestService;
+import org.apache.poi.xwpf.usermodel.UnderlinePatterns;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+import static java.nio.file.Files.newOutputStream;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-04
+ */
+@RestController
+@RequestMapping("/caseInquest")
+public class CaseInquestController {
+
+    @Autowired
+    ICaseInquestService caseInquestService;
+
+    @GetMapping("/info")
+    public ResultData info(@RequestParam(required = false) Integer caseId){
+        return ResultData.ok(caseInquestService.getByCaseId(caseId));
+    }
+
+    @PostMapping("/saveOrUpdate")
+    public ResultData saveOrUpdate(@RequestBody CaseInquest caseInquest){
+        caseInquestService.saveByParam(caseInquest);
+        return ResultData.ok();
+    }
+
+    @GetMapping("/downDocx")
+    public void downDocx(@RequestParam(required = false) Integer caseId,
+                         HttpServletResponse res, HttpServletRequest req) throws IOException {
+
+        if(caseId == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        CaseInquest caseInquest = caseInquestService.getByCaseId(caseId);
+        if(caseInquest == null){
+            throw new BusinessException(ResultCode.INQUEST_ERROR2);
+        }
+        XWPFTemplate template = caseInquestService.getWordByTemplate(caseInquest);
+
+        // 设置响应头,指定文件类型和内容长度
+        res.setContentType("application/octet-stream");
+        res.setHeader("Content-Disposition", "attachment; filename=output.docx");
+
+        try {
+            // 返回网络流
+            OutputStream out = res.getOutputStream();
+            BufferedOutputStream bos = new BufferedOutputStream(out);
+            template.write(bos);
+            bos.flush();
+            out.flush();
+            // 关闭流
+            PoitlIOUtils.closeQuietlyMulti(template, bos, out);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+
+    }
+}
+

+ 80 - 0
src/main/java/com/fdkankan/fusion/controller/CaseInquestCriminalController.java

@@ -0,0 +1,80 @@
+package com.fdkankan.fusion.controller;
+
+
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.util.PoitlIOUtils;
+import com.fdkankan.fusion.common.ResultCode;
+import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.entity.CaseInquest;
+import com.fdkankan.fusion.entity.CaseInquestCriminal;
+import com.fdkankan.fusion.exception.BusinessException;
+import com.fdkankan.fusion.service.ICaseInquestCriminalService;
+import com.fdkankan.fusion.service.ICaseInquestService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-04
+ */
+@RestController
+@RequestMapping("/caseInquest")
+public class CaseInquestCriminalController {
+
+    @Autowired
+    ICaseInquestCriminalService caseInquestCriminalService;
+
+    @GetMapping("/info")
+    public ResultData info(@RequestParam(required = false) Integer caseId){
+        return ResultData.ok(caseInquestCriminalService.getByCaseId(caseId));
+    }
+
+    @PostMapping("/saveOrUpdate")
+    public ResultData saveOrUpdate(@RequestBody CaseInquestCriminal caseInquestCriminal){
+        caseInquestCriminalService.saveByParam(caseInquestCriminal);
+        return ResultData.ok();
+    }
+
+    @GetMapping("/downDocx")
+    public void downDocx(@RequestParam(required = false) Integer caseId,
+                         HttpServletResponse res, HttpServletRequest req) throws IOException {
+
+        if(caseId == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        CaseInquestCriminal caseInquest = caseInquestCriminalService.getByCaseId(caseId);
+        if(caseInquest == null){
+            throw new BusinessException(ResultCode.INQUEST_ERROR2);
+        }
+        XWPFTemplate template = caseInquestCriminalService.getWordByTemplate(caseInquest);
+
+        // 设置响应头,指定文件类型和内容长度
+        res.setContentType("application/octet-stream");
+        res.setHeader("Content-Disposition", "attachment; filename=output.docx");
+
+        try {
+            // 返回网络流
+            OutputStream out = res.getOutputStream();
+            BufferedOutputStream bos = new BufferedOutputStream(out);
+            template.write(bos);
+            bos.flush();
+            out.flush();
+            // 关闭流
+            PoitlIOUtils.closeQuietlyMulti(template, bos, out);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+
+    }
+}
+

+ 81 - 0
src/main/java/com/fdkankan/fusion/entity/CaseExtractDetail.java

@@ -0,0 +1,81 @@
+package com.fdkankan.fusion.entity;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fdkankan.fusion.typehandle.JsonArrayTypeHandler;
+import com.fdkankan.fusion.typehandle.JsonObjTypeHandler;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-05
+ */
+@Getter
+@Setter
+@TableName(value = "t_case_extract_detail",autoResultMap = true)
+public class CaseExtractDetail implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+
+    @TableField("case_id")
+    private Integer caseId;
+
+    /**
+     * 地址
+     */
+    @TableField("address")
+    private String address;
+
+    /**
+     * 提取时间
+     */
+    @TableField(typeHandler = JsonObjTypeHandler.class)
+    private JSONObject time;
+
+    /**
+     * 提取清单
+     */
+    @TableField(typeHandler = JsonArrayTypeHandler.class)
+    private JSONArray detail;
+
+    /**
+     * 提取人信息
+     */
+    @TableField(typeHandler = JsonArrayTypeHandler.class)
+    private JSONArray extractUser;
+
+    /**
+     * 证人信息
+     */
+    @TableField(typeHandler = JsonArrayTypeHandler.class)
+    private JSONArray witnessInfo;
+
+    @TableField("tb_status")
+    @TableLogic
+    private Integer tbStatus;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+
+}

+ 153 - 0
src/main/java/com/fdkankan/fusion/entity/CaseInquest.java

@@ -0,0 +1,153 @@
+package com.fdkankan.fusion.entity;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.deepoove.poi.data.TableRenderData;
+import com.fdkankan.fusion.typehandle.JsonArrayTypeHandler;
+import com.fdkankan.fusion.typehandle.JsonObjTypeHandler;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-04
+ */
+@Getter
+@Setter
+@TableName(value = "t_case_inquest",autoResultMap = true)
+public class CaseInquest implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("case_id")
+    private Integer caseId;
+
+    /**
+     * 勘验次数
+     */
+    @TableField("count")
+    private String count;
+
+    /**
+     * 勘验开始时间
+     */
+    @TableField(typeHandler = JsonObjTypeHandler.class)
+    private JSONObject startTime;
+
+    /**
+     * 勘验结束时间
+     */
+    @TableField(typeHandler = JsonObjTypeHandler.class)
+    private JSONObject endTime;
+
+    /**
+     * 勘验地点
+     */
+    @TableField("address")
+    private String address;
+
+    /**
+     * 勘验人员信息
+     */
+    @TableField("user_info")
+    private String userInfo;
+
+    /**
+     * 勘验气象条件
+     */
+    @TableField("weather")
+    private String weather;
+
+    /**
+     * 勘验情况
+     */
+    @TableField("situation")
+    private String situation;
+
+    /**
+     * 环境勘验
+     */
+    @TableField("environment")
+    private String environment;
+
+    /**
+     * 初步勘验
+     */
+    @TableField("first_inquest")
+    private String firstInquest;
+
+    /**
+     * 细项勘验
+     */
+    @TableField("careful_inquest")
+    private String carefulInquest;
+
+    /**
+     * 专项勘验
+     */
+    @TableField("special_inquest")
+    private String specialInquest;
+
+    /**
+     * 提取物品描述
+     */
+    @TableField("item_description")
+    private String itemDescription;
+
+    /**
+     * 现场拍照制图描述
+     */
+    @TableField("img_description")
+    private String imgDescription;
+
+    /**
+     * 负责人
+     */
+    @TableField("leader")
+    private String leader;
+
+    /**
+     * 记录人
+     */
+    @TableField("recorder")
+    private String recorder;
+
+    /**
+     * 勘验人
+     */
+    @TableField("inspector")
+    private String inspector;
+
+    /**
+     * 证人信息数组
+     */
+    @TableField(typeHandler = JsonArrayTypeHandler.class)
+    private JSONArray witnessInfo;
+
+    @TableField("tb_status")
+    @TableLogic
+    private Integer tbStatus;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+
+}

+ 251 - 0
src/main/java/com/fdkankan/fusion/entity/CaseInquestCriminal.java

@@ -0,0 +1,251 @@
+package com.fdkankan.fusion.entity;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fdkankan.fusion.common.util.DateUtils;
+import com.fdkankan.fusion.typehandle.JsonArrayTypeHandler;
+import com.fdkankan.fusion.typehandle.JsonObjTypeHandler;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2024-10-18
+ */
+@Getter
+@Setter
+@TableName("t_case_inquest_criminal")
+public class CaseInquestCriminal implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("case_id")
+    private Integer caseId;
+
+    /**
+     * 现场勘验号
+     */
+    @TableField("inquest_num")
+    private String inquestNum;
+
+    /**
+     * 单位名称
+     */
+    @TableField("dept_name")
+    private String deptName;
+
+    /**
+     * 标题
+     */
+    @TableField("title")
+    private String title;
+
+    /**
+     * 发送单位
+     */
+    @TableField("send_dept")
+    private String sendDept;
+
+    /**
+     * 笔录人
+     */
+    @TableField("recorder")
+    private String recorder;
+
+    /**
+     * 绘图人
+     */
+    @TableField("painter")
+    private String painter;
+
+    /**
+     * 照相人
+     */
+    @TableField("photographer")
+    private String photographer;
+
+    /**
+     * 份数
+     */
+    @TableField("issuance_count")
+    private Integer issuanceCount;
+
+    /**
+     * 制作时间
+     */
+    @TableField("make_time")
+    private Date makeTime;
+
+    /**
+     * 签发意见
+     */
+    @TableField("issuance_opinion")
+    private String issuanceOpinion;
+
+    /**
+     * 签名
+     */
+    @TableField("signature")
+    private String signature;
+
+    /**
+     * 签名时间
+     */
+    @TableField("signature_time")
+    private Date signatureTime;
+
+    /**
+     * 报告单位
+     */
+    @TableField("report_dept")
+    private String reportDept;
+
+    /**
+     * 时间
+     */
+    @TableField("inquest_time")
+    private Date inquestTime;
+
+    /**
+     * 勘验开始时间
+     */
+    @TableField("start_time")
+    private Date startTime;
+
+    /**
+     * 勘验结束时间
+     */
+    @TableField("end_time")
+    private Date endTime;
+
+    /**
+     * 勘验地址
+     */
+    @TableField("address")
+    private String address;
+
+    /**
+     * 现场保护情况
+     */
+    @TableField("protection_situation")
+    private String protectionSituation;
+
+    /**
+     * 现场保护人
+     */
+    @TableField("protector")
+    private String protector;
+
+    /**
+     * 现场保护措施
+     */
+    @TableField("protection_measures")
+    private String protectionMeasures;
+
+    /**
+     * 现场情况
+     */
+    @TableField("situation")
+    private String situation;
+
+    /**
+     * 变动原因
+     */
+    @TableField("change_reason")
+    private String changeReason;
+
+    /**
+     * 天气情况
+     */
+    @TableField(typeHandler = JsonObjTypeHandler.class)
+    private JSONObject weatherInfo;
+
+    /**
+     * 光线
+     */
+    @TableField("light")
+    private String light;
+
+    /**
+     * 勘验指挥人
+     */
+    @TableField("inquest_commander")
+    private String inquestCommander;
+
+    /**
+     * 勘验情况
+     */
+    @TableField("inquest_situation")
+    private String inquestSituation;
+
+    /**
+     * 现场勘验制图数量
+     */
+    @TableField("image_num")
+    private Integer imageNum;
+
+    /**
+     * 照相数量
+     */
+    @TableField("photograph_num")
+    private Integer photographNum;
+
+    /**
+     * 摄影数量
+     */
+    @TableField("photography_num")
+    private Integer photographyNum;
+
+    /**
+     * 现场勘验纪录人员数组
+     */
+    @TableField(typeHandler = JsonArrayTypeHandler.class)
+    private JSONArray recorderInfo;
+
+    /**
+     * 现场勘验人员签名数组
+     */
+    @TableField(typeHandler = JsonArrayTypeHandler.class)
+    private JSONArray signatureInfo;
+
+    /**
+     * 现场勘验见证人数组
+     */
+    @TableField(typeHandler = JsonArrayTypeHandler.class)
+    private JSONArray witnessInfo;
+
+    /**
+     * 备注
+     */
+    @TableField("remark")
+    private String remark;
+
+    @TableField("tb_status")
+    @TableLogic
+    private Integer tbStatus;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+
+}

+ 5 - 5
src/main/java/com/fdkankan/fusion/generate/AutoGenerate.java

@@ -18,7 +18,7 @@ public class AutoGenerate {
         String path =System.getProperty("user.dir") ;
 
         generate(path,"fusion", getTables(new String[]{
-               "t_camera","t_camera_detail"
+               "t_case_inquest_criminal"
         }));
 
 //        generate(path,"goods", getTables(new String[]{
@@ -46,10 +46,10 @@ public class AutoGenerate {
 
 
     public static void  generate(String path,String moduleName,  List<String> tables){
-//        FastAutoGenerator.create("jdbc:mysql://120.25.146.52:13306/fd_fusion",
-//                "root","JK123456%JIK")
-        FastAutoGenerator.create("jdbc:mysql://120.24.144.164:3306/4dkankan_v4",
-                "root","4Dage@4Dage#@168")
+        FastAutoGenerator.create("jdbc:mysql://120.25.146.52:13306/fd_fusion",
+                "root","JK123456%JIK")
+//        FastAutoGenerator.create("jdbc:mysql://120.24.144.164:3306/4dkankan_v4",
+//                "root","4Dage@4Dage#@168")
                 .globalConfig(builder -> {
                     builder.author("")               //作者
                             .outputDir(path+"\\src\\main\\java")    //输出路径(写到java目录)

+ 18 - 0
src/main/java/com/fdkankan/fusion/mapper/ICaseExtractDetailMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.fusion.mapper;
+
+import com.fdkankan.fusion.entity.CaseExtractDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-05
+ */
+@Mapper
+public interface ICaseExtractDetailMapper extends BaseMapper<CaseExtractDetail> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/fusion/mapper/ICaseInquestCriminalMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.fusion.mapper;
+
+import com.fdkankan.fusion.entity.CaseInquestCriminal;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2024-10-18
+ */
+@Mapper
+public interface ICaseInquestCriminalMapper extends BaseMapper<CaseInquestCriminal> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/fusion/mapper/ICaseInquestMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.fusion.mapper;
+
+import com.fdkankan.fusion.entity.CaseInquest;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-04
+ */
+@Mapper
+public interface ICaseInquestMapper extends BaseMapper<CaseInquest> {
+
+}

+ 200 - 0
src/main/java/com/fdkankan/fusion/response/CaseInquestCriminalVo.java

@@ -0,0 +1,200 @@
+package com.fdkankan.fusion.response;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.deepoove.poi.data.TextRenderData;
+import com.fdkankan.fusion.common.util.DateUtils;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class CaseInquestCriminalVo {
+    /**
+     * 案件id
+     */
+    private Integer caseId;
+
+    /**
+     * 现场勘验号
+     */
+    private String inquestNum;
+
+    /**
+     * 单位名称
+     */
+    private String deptName;
+
+    /**
+     * 标题
+     */
+    private String title;
+
+    /**
+     * 发送单位
+     */
+    private String sendDept;
+
+    /**
+     * 笔录人
+     */
+    private String recorder;
+
+    /**
+     * 绘图人
+     */
+    private String painter;
+
+    /**
+     * 照相人
+     */
+    private String photographer;
+
+    /**
+     * 份数
+     */
+    private Integer issuanceCount;
+
+    /**
+     * 制作时间
+     */
+    private Date makeTime;
+
+    /**
+     * 签发意见
+     */
+    private String issuanceOpinion;
+
+    /**
+     * 签名
+     */
+    private String signature;
+
+    /**
+     * 签名时间
+     */
+    private Date signatureTime;
+
+    /**
+     * 报告单位
+     */
+    private String reportDept;
+
+    /**
+     * 时间
+     */
+    private Date inquestTime;
+
+    /**
+     * 勘验开始时间
+     */
+    private Date startTime;
+
+    /**
+     * 勘验结束时间
+     */
+    private Date endTime;
+
+    /**
+     * 勘验地址
+     */
+    private String address;
+
+    /**
+     * 现场保护情况
+     */
+    private String protectionSituation;
+
+    /**
+     * 现场保护人
+     */
+    private String protector;
+
+    /**
+     * 现场保护措施
+     */
+    private String protectionMeasures;
+
+    /**
+     * 现场情况
+     */
+    private String situation;
+
+    /**
+     * 变动原因
+     */
+    private String changeReason;
+
+    /**
+     * 天气情况
+     */
+    private JSONObject weatherInfo;
+
+    /**
+     * 光线
+     */
+    private String light;
+
+    /**
+     * 勘验指挥人
+     */
+    private String inquestCommander;
+
+    /**
+     * 勘验情况
+     */
+    private String inquestSituation;
+
+    /**
+     * 现场勘验制图数量
+     */
+    private Integer imageNum;
+
+    /**
+     * 照相数量
+     */
+    private Integer photographNum;
+
+    /**
+     * 摄影数量
+     */
+    private Integer photographyNum;
+
+    /**
+     * 现场勘验纪录人员数组
+     */
+    private JSONArray recorderInfo;
+
+    /**
+     * 现场勘验人员签名数组
+     */
+    private JSONArray signatureInfo;
+
+    /**
+     * 现场勘验见证人数组
+     */
+    private JSONArray witnessInfo;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    private Integer tbStatus;
+
+    private Date createTime;
+
+    private Date updateTime;
+
+    private String inquestTimeStr;
+
+    private TextRenderData text;
+
+    public String getInquestTimeStr() {
+        return DateUtils.getCnDateStr(DateUtil.format(inquestTime, DatePattern.CHINESE_DATE_FORMAT));
+    }
+}

+ 118 - 0
src/main/java/com/fdkankan/fusion/response/CaseInquestVo.java

@@ -0,0 +1,118 @@
+package com.fdkankan.fusion.response;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.deepoove.poi.data.TableRenderData;
+import com.deepoove.poi.data.TextRenderData;
+import com.fdkankan.fusion.typehandle.JsonArrayTypeHandler;
+import com.fdkankan.fusion.typehandle.JsonObjTypeHandler;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class CaseInquestVo {
+
+    private Integer id;
+
+    private Integer caseId;
+
+    /**
+     * 勘验次数
+     */
+    private String count;
+
+    /**
+     * 勘验开始时间
+     */
+    private JSONObject startTime;
+
+    /**
+     * 勘验结束时间
+     */
+    private JSONObject endTime;
+
+    /**
+     * 勘验地点
+     */
+    private String address;
+
+    /**
+     * 勘验人员信息
+     */
+    private String userInfo;
+
+    /**
+     * 勘验气象条件
+     */
+    private String weather;
+
+    /**
+     * 勘验情况
+     */
+    private String situation;
+
+    /**
+     * 环境勘验
+     */
+    private String environment;
+
+    /**
+     * 初步勘验
+     */
+    private String firstInquest;
+
+    /**
+     * 细项勘验
+     */
+    private String carefulInquest;
+
+    /**
+     * 专项勘验
+     */
+    private String specialInquest;
+
+    /**
+     * 提取物品描述
+     */
+    private String itemDescription;
+
+    /**
+     * 现场拍照制图描述
+     */
+    private String imgDescription;
+
+    /**
+     * 负责人
+     */
+    private String leader;
+
+    /**
+     * 记录人
+     */
+    private String recorder;
+
+    /**
+     * 勘验人
+     */
+    private String inspector;
+
+    /**
+     * 证人信息数组
+     */
+    private JSONArray witnessInfo;
+
+    private Integer tbStatus;
+
+    private Date createTime;
+
+    private Date updateTime;
+
+    private TextRenderData text;
+
+    private String page = " ";
+}

+ 39 - 0
src/main/java/com/fdkankan/fusion/response/WitnessVo.java

@@ -0,0 +1,39 @@
+package com.fdkankan.fusion.response;
+
+import lombok.Data;
+
+@Data
+public class WitnessVo {
+    //[{"name":"","year":"","month":"","day":"","id":""},{"name":"","year":"","month":"","day":"","id":""}]
+
+    private String name;
+    private String year;
+    private String month;
+    private String day;
+    private String id;
+    private String address;
+
+    public String getName() {
+        return name == null?"":name;
+    }
+
+    public String getYear() {
+        return year== null?"":year;
+    }
+
+    public String getMonth() {
+        return month== null?"":month;
+    }
+
+    public String getDay() {
+        return day== null?"":day;
+    }
+
+    public String getId() {
+        return id== null?"":id;
+    }
+
+    public String getAddress() {
+        return address== null?"":address;
+    }
+}

+ 22 - 0
src/main/java/com/fdkankan/fusion/service/ICaseExtractDetailService.java

@@ -0,0 +1,22 @@
+package com.fdkankan.fusion.service;
+
+import com.deepoove.poi.XWPFTemplate;
+import com.fdkankan.fusion.entity.CaseExtractDetail;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-05
+ */
+public interface ICaseExtractDetailService extends IService<CaseExtractDetail> {
+
+    CaseExtractDetail getByCaseId(Integer caseId);
+
+    void saveByParam(CaseExtractDetail caseExtractDetail);
+
+    XWPFTemplate getWordByTemplate(CaseExtractDetail caseExtractDetail);
+}

+ 23 - 0
src/main/java/com/fdkankan/fusion/service/ICaseInquestCriminalService.java

@@ -0,0 +1,23 @@
+package com.fdkankan.fusion.service;
+
+import com.deepoove.poi.XWPFTemplate;
+import com.fdkankan.fusion.entity.CaseInquest;
+import com.fdkankan.fusion.entity.CaseInquestCriminal;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2024-10-18
+ */
+public interface ICaseInquestCriminalService extends IService<CaseInquestCriminal> {
+
+    CaseInquestCriminal getByCaseId(Integer caseId);
+
+    void saveByParam(CaseInquestCriminal caseInquestCriminal);
+
+    XWPFTemplate getWordByTemplate(CaseInquestCriminal caseInquestCriminal);
+}

+ 22 - 0
src/main/java/com/fdkankan/fusion/service/ICaseInquestService.java

@@ -0,0 +1,22 @@
+package com.fdkankan.fusion.service;
+
+import com.deepoove.poi.XWPFTemplate;
+import com.fdkankan.fusion.entity.CaseInquest;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-04
+ */
+public interface ICaseInquestService extends IService<CaseInquest> {
+
+    CaseInquest getByCaseId(Integer caseId);
+
+    void saveByParam(CaseInquest caseInquest);
+
+    XWPFTemplate getWordByTemplate(CaseInquest caseInquest);
+}

+ 75 - 0
src/main/java/com/fdkankan/fusion/service/impl/CaseExtractDetailServiceImpl.java

@@ -0,0 +1,75 @@
+package com.fdkankan.fusion.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
+import com.fdkankan.fusion.common.ResultCode;
+import com.fdkankan.fusion.entity.CaseExtractDetail;
+import com.fdkankan.fusion.entity.CaseInquest;
+import com.fdkankan.fusion.exception.BusinessException;
+import com.fdkankan.fusion.mapper.ICaseExtractDetailMapper;
+import com.fdkankan.fusion.service.ICaseExtractDetailService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.io.InputStream;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-05
+ */
+@Service
+public class CaseExtractDetailServiceImpl extends ServiceImpl<ICaseExtractDetailMapper, CaseExtractDetail> implements ICaseExtractDetailService {
+
+    @Override
+    public CaseExtractDetail getByCaseId(Integer caseId) {
+        LambdaQueryWrapper<CaseExtractDetail> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(CaseExtractDetail::getCaseId,caseId);
+        return this.getOne(wrapper);
+    }
+
+    @Override
+    public void saveByParam(CaseExtractDetail caseExtractDetail) {
+        if(caseExtractDetail.getCaseId() == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        CaseExtractDetail dbCaseExtractDetail = this.getByCaseId(caseExtractDetail.getCaseId());
+        if(dbCaseExtractDetail != null){
+            caseExtractDetail.setId(dbCaseExtractDetail.getId());
+        }
+        this.saveOrUpdate(caseExtractDetail);
+    }
+
+    @Override
+    public XWPFTemplate getWordByTemplate(CaseExtractDetail caseExtractDetail) {
+        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template/extract-template.docx");
+        // 渲染模板
+
+        // 定义行循环插件
+        LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
+        /**
+         * [{"num":"331","part":"3131","name":"222","id":"1","spec":"222","desc":"313"},{"num":"22","part":"1","name":"222","id":"2","spec":"33","desc":"vvvv "}]
+         * [{"address":"222","name":"111","id":"","workplace":"222"},{"address":"22222","name":"333","id":"","workplace":"444"}]
+         * [{"name":"2221","address":"222","phone":"2221","id":"2221"},{"name":"222","address":"2111122","phone":"2","id":"222"}]
+         */
+        JSONArray detail = caseExtractDetail.getDetail();
+        Integer index = 0;
+        for (Object object : detail) {
+            index ++;
+            JSONObject jsonObject = (JSONObject) object;
+            jsonObject.put("index",index);
+
+        }
+        Configure config = Configure.builder()
+                .bind("detail", policy).bind("extractUser", policy).bind("witnessInfo", policy).build();
+
+        return XWPFTemplate.compile(inputStream,config).render(caseExtractDetail);
+    }
+}

+ 81 - 0
src/main/java/com/fdkankan/fusion/service/impl/CaseInquestCriminalServiceImpl.java

@@ -0,0 +1,81 @@
+package com.fdkankan.fusion.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.data.TextRenderData;
+import com.deepoove.poi.data.style.Style;
+import com.fdkankan.fusion.common.ResultCode;
+import com.fdkankan.fusion.entity.CaseInquest;
+import com.fdkankan.fusion.entity.CaseInquestCriminal;
+import com.fdkankan.fusion.exception.BusinessException;
+import com.fdkankan.fusion.mapper.ICaseInquestCriminalMapper;
+import com.fdkankan.fusion.response.CaseInquestCriminalVo;
+import com.fdkankan.fusion.response.CaseInquestVo;
+import com.fdkankan.fusion.response.WitnessVo;
+import com.fdkankan.fusion.service.ICaseInquestCriminalService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.poi.xwpf.usermodel.UnderlinePatterns;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import java.io.InputStream;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2024-10-18
+ */
+@Service
+public class CaseInquestCriminalServiceImpl extends ServiceImpl<ICaseInquestCriminalMapper, CaseInquestCriminal> implements ICaseInquestCriminalService {
+
+
+    @Override
+    public CaseInquestCriminal getByCaseId(Integer caseId) {
+        LambdaQueryWrapper<CaseInquestCriminal> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(CaseInquestCriminal::getCaseId,caseId);
+        return this.getOne(wrapper);
+    }
+
+    @Override
+    public void saveByParam(CaseInquestCriminal caseInquestCriminal) {
+        if(caseInquestCriminal.getCaseId() == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        CaseInquestCriminal dbCaseInquest = this.getByCaseId(caseInquestCriminal.getCaseId());
+        if(dbCaseInquest != null){
+            caseInquestCriminal.setId(dbCaseInquest.getId());
+        }
+        this.saveOrUpdate(caseInquestCriminal);
+
+    }
+
+    @Override
+    public XWPFTemplate getWordByTemplate(CaseInquestCriminal caseInquest) {
+
+        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template/inquest_criminal-template.docx");
+        // 渲染模板
+
+        CaseInquestCriminalVo vo = new CaseInquestCriminalVo();
+        BeanUtils.copyProperties(caseInquest,vo);
+        String info = "证人或当事人(签名):%s  %s年 %s月 %s日 身份证件号码:%s\n"
+                +"   单位或住址:%s\n";
+        StringBuilder msg = new StringBuilder();
+        for (Object object : vo.getWitnessInfo()) {
+            JSONObject obj = (JSONObject) object;
+            WitnessVo witnessVo = JSONObject.toJavaObject(obj,WitnessVo.class);
+            String format = String.format(info, witnessVo.getName(), witnessVo.getYear(), witnessVo.getMonth(), witnessVo.getDay(), witnessVo.getId(), witnessVo.getAddress());
+            msg.append(format);
+        }
+        TextRenderData text = new TextRenderData("000000",msg.toString());
+        Style style = text.getStyle();
+        style.setUnderlinePatterns(UnderlinePatterns.SINGLE);
+        vo.setText(text);
+
+        XWPFTemplate template = XWPFTemplate.compile(inputStream).render(vo);
+        return template;
+    }
+}

+ 79 - 0
src/main/java/com/fdkankan/fusion/service/impl/CaseInquestServiceImpl.java

@@ -0,0 +1,79 @@
+package com.fdkankan.fusion.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.data.TextRenderData;
+import com.deepoove.poi.data.style.Style;
+import com.fdkankan.fusion.common.ResultCode;
+import com.fdkankan.fusion.entity.CaseInquest;
+import com.fdkankan.fusion.exception.BusinessException;
+import com.fdkankan.fusion.mapper.ICaseInquestMapper;
+import com.fdkankan.fusion.response.CaseInquestVo;
+import com.fdkankan.fusion.response.WitnessVo;
+import com.fdkankan.fusion.service.ICaseInquestService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.poi.xwpf.usermodel.UnderlinePatterns;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import java.io.InputStream;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-04
+ */
+@Service
+public class CaseInquestServiceImpl extends ServiceImpl<ICaseInquestMapper, CaseInquest> implements ICaseInquestService {
+
+
+    @Override
+    public CaseInquest getByCaseId(Integer caseId) {
+        LambdaQueryWrapper<CaseInquest> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(CaseInquest::getCaseId,caseId);
+        return this.getOne(wrapper);
+    }
+
+    @Override
+    public void saveByParam(CaseInquest caseInquest) {
+        if(caseInquest.getCaseId() == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        CaseInquest dbCaseInquest = this.getByCaseId(caseInquest.getCaseId());
+        if(dbCaseInquest != null){
+            caseInquest.setId(dbCaseInquest.getId());
+        }
+        this.saveOrUpdate(caseInquest);
+
+    }
+
+    @Override
+    public XWPFTemplate getWordByTemplate(CaseInquest caseInquest) {
+
+        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template/inquest-template.docx");
+        // 渲染模板
+
+        CaseInquestVo vo = new CaseInquestVo();
+        BeanUtils.copyProperties(caseInquest,vo);
+        String info = "证人或当事人(签名):%s  %s年 %s月 %s日 身份证件号码:%s\n"
+                +"   单位或住址:%s\n";
+        StringBuilder msg = new StringBuilder();
+        for (Object object : vo.getWitnessInfo()) {
+            JSONObject obj = (JSONObject) object;
+            WitnessVo witnessVo = JSONObject.toJavaObject(obj,WitnessVo.class);
+            String format = String.format(info, witnessVo.getName(), witnessVo.getYear(), witnessVo.getMonth(), witnessVo.getDay(), witnessVo.getId(), witnessVo.getAddress());
+            msg.append(format);
+        }
+        TextRenderData text = new TextRenderData("000000",msg.toString());
+        Style style = text.getStyle();
+        style.setUnderlinePatterns(UnderlinePatterns.SINGLE);
+        vo.setText(text);
+
+        XWPFTemplate template = XWPFTemplate.compile(inputStream).render(vo);
+        return template;
+    }
+}

+ 55 - 0
src/main/java/com/fdkankan/fusion/typehandle/JsonObjTypeHandler.java

@@ -0,0 +1,55 @@
+package com.fdkankan.fusion.typehandle;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.MappedJdbcTypes;
+import org.apache.ibatis.type.MappedTypes;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+/**
+ *  存储到数据库, 将JSON数组对象转换成字符串;
+ *  从数据库获取数据, 将字符串转为JSON数组对象.
+ */
+@MappedTypes({JSONObject.class})
+@MappedJdbcTypes({JdbcType.VARCHAR})
+public class JsonObjTypeHandler extends BaseTypeHandler<JSONObject> {
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter,
+                                    JdbcType jdbcType) throws SQLException {
+        ps.setString(i, JSONObject.toJSONString(parameter));
+    }
+    @Override
+    public JSONObject getNullableResult(ResultSet rs, String columnName)
+            throws SQLException {
+        return JSONObject.parseObject(rs.getString(columnName));
+    }
+    @Override
+    public JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        return parseArray(rs.getString(columnIndex));
+    }
+    @Override
+    public JSONObject getNullableResult(CallableStatement cs, int columnIndex)
+            throws SQLException {
+        return parseArray(cs.getString(columnIndex));
+    }
+
+    public static JSONObject parseArray(String content) {
+        if(StringUtils.isBlank(content)){
+            return new JSONObject();
+        }
+        try {
+            return JSONObject.parseObject(content);
+        } catch (Exception e) {
+            return new JSONObject();
+        }
+    }
+
+}
+

+ 2 - 0
src/main/resources/application.yaml

@@ -17,6 +17,8 @@ server:
 
 logging:
   config: classpath:logback-spring.xml
+  path: /home/backend/4dkankan_v4
+
 mybatis-plus:
   configuration:
     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启sql日志

+ 2 - 1
src/main/resources/logback-spring.xml

@@ -4,10 +4,11 @@
 <!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
 <!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
 <configuration scan="true" scanPeriod="10 seconds">
+	<springProperty scope="context" name="LOG_PATH" source="logging.path"/>
 
 	<contextName>logback</contextName>
 	<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
-	<property name="log.path" value="/home/tomcat/jar-fusion-8808/logs" />
+	<property name="log.path" value="${LOG_PATH}/fusion/logs" />
 
 	<!-- 彩色日志 -->
 	<!-- 彩色日志依赖的渲染类 -->

+ 5 - 0
src/main/resources/mapper/fusion/CaseExtractDetailMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.fusion.mapper.ICaseExtractDetailMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/fusion/CaseInquestCriminalMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.fusion.mapper.ICaseInquestCriminalMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/fusion/CaseInquestMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.fusion.mapper.ICaseInquestMapper">
+
+</mapper>

BIN
src/main/resources/template/extract-template.docx


BIN
src/main/resources/template/inquest-template.docx


BIN
src/main/resources/template/inquest_criminal-template.docx


BIN
src/main/resources/template/~$quest_criminal-template.docx