From 0f79bd8c70a6122794aafac0d9373613a75f3e4c Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期三, 01 四月 2026 11:24:20 +0800
Subject: [PATCH] 质检新增出库检验报告下载功能

---
 src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java |   79 ++++++++++++++++++++++++++
 src/main/java/com/ruoyi/quality/controller/QualityInspectController.java    |   10 +++
 src/main/resources/static/out-report-template.docx                          |    0 
 src/main/java/com/ruoyi/quality/service/IQualityInspectService.java         |    2 
 src/main/java/com/ruoyi/quality/mapper/QualityInspectMapper.java            |    2 
 src/main/java/com/ruoyi/quality/pojo/QualityInspect.java                    |   37 +++++++++++
 src/main/resources/mapper/quality/QualityInspectMapper.xml                  |   49 ++++++++++++++++
 7 files changed, 177 insertions(+), 2 deletions(-)

diff --git a/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java b/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
index dec3d1c..2dd2ace 100644
--- a/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
+++ b/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
@@ -140,4 +140,14 @@
     public void down(HttpServletResponse response,@RequestBody QualityInspect qualityInspect) {
         qualityInspectService.down(response, qualityInspect);
     }
+
+    /**
+     * 涓嬭浇鍑哄簱妫�楠屾姤鍛�
+     * @param response
+     * @param qualityInspect
+     */
+    @PostMapping("/downOutReport")
+    public void downOutReport(HttpServletResponse response, @RequestBody QualityInspect qualityInspect) {
+        qualityInspectService.downOutReport(response, qualityInspect);
+    }
 }
diff --git a/src/main/java/com/ruoyi/quality/mapper/QualityInspectMapper.java b/src/main/java/com/ruoyi/quality/mapper/QualityInspectMapper.java
index 388ebcc..75999d9 100644
--- a/src/main/java/com/ruoyi/quality/mapper/QualityInspectMapper.java
+++ b/src/main/java/com/ruoyi/quality/mapper/QualityInspectMapper.java
@@ -52,4 +52,6 @@
      * 鑾峰彇鐑偣妫�娴嬫寚鏍� Top 4 + 鍏朵粬
      */
     List<QualityParameterStatDto> getTopParameters(@Param("modelType") Integer modelType);
+
+    QualityInspect selectOneData(@Param("id") Long id);
 }
diff --git a/src/main/java/com/ruoyi/quality/pojo/QualityInspect.java b/src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
index 134c8db..590affb 100644
--- a/src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
+++ b/src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
@@ -6,10 +6,12 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Excel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import javax.validation.constraints.NotBlank;
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.Date;
 
@@ -39,6 +41,7 @@
      * 妫�娴嬫棩鏈�
      */
     @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
     @Excel(name = "妫�娴嬫棩鏈�", width = 30, dateFormat = "yyyy-MM-dd")
     private Date checkTime;
 
@@ -47,7 +50,7 @@
      */
     @JsonFormat(pattern = "yyyy-MM-dd")
     @Excel(name = "鐢熶骇鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
-    private Date productionDate;
+    private LocalDate productionDate;
 
     /**
      * 渚涘簲鍟嗗悕绉�(鍘熸潗鏂欐楠�)
@@ -124,7 +127,7 @@
      */
     @JsonFormat(pattern = "yyyy-MM-dd")
     @Excel(name = "鏈夋晥鏈�", width = 30, dateFormat = "yyyy-MM-dd")
-    private Date validityDate;
+    private LocalDate validityDate;
 
     /**
      * 妫�娴嬪崟浣�
@@ -187,4 +190,34 @@
 
     private String BatchNo;
     private String manufacturingTeam;
+
+    /**
+     * 妫�娴嬫棩鏈燂紙鏍煎紡鍖栧瓧绗︿覆锛岀敤浜嶹ord瀵煎嚭锛�
+     */
+    @TableField(exist = false)
+    private String checkTimeStr;
+
+    /**
+     * 鐢熶骇鏃ユ湡锛堟牸寮忓寲瀛楃涓诧紝鐢ㄤ簬Word瀵煎嚭锛�
+     */
+    @TableField(exist = false)
+    private String productionDateStr;
+
+    /**
+     * 鏈夋晥鏈燂紙鏍煎紡鍖栧瓧绗︿覆锛岀敤浜嶹ord瀵煎嚭锛�
+     */
+    @TableField(exist = false)
+    private String validityDateStr;
+
+    /**
+     * 鏈夋晥鏈燂紙鏍煎紡鍖栧瓧绗︿覆锛岀敤浜嶹ord瀵煎嚭锛�
+     */
+    @TableField(exist = false)
+    private String inspectMaterialConditionA;
+
+    /**
+     * 鏈夋晥鏈燂紙鏍煎紡鍖栧瓧绗︿覆锛岀敤浜嶹ord瀵煎嚭锛�
+     */
+    @TableField(exist = false)
+    private String inspectMaterialConditionB;
 }
diff --git a/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java b/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
index 92bc88f..a41fe2a 100644
--- a/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
+++ b/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
@@ -24,4 +24,6 @@
     int submit(QualityInspect qualityInspect);
 
     void down(HttpServletResponse response, QualityInspect qualityInspect);
+
+    void downOutReport(HttpServletResponse response, QualityInspect qualityInspect);
 }
diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
index b4156c3..5ba5685 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -33,7 +33,10 @@
 import javax.servlet.http.HttpServletResponse;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.math.BigDecimal;
 import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.time.format.DateTimeFormatter;
 import java.util.HashMap;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -207,5 +210,81 @@
 
     }
 
+    @Override
+    public void downOutReport(HttpServletResponse response, QualityInspect qualityInspect) {
+        QualityInspect inspect = qualityInspectMapper.selectOneData(qualityInspect.getId());
+
+        // 鏍煎紡鍖栨棩鏈熷瓧娈�
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        inspect.setCheckTimeStr(inspect.getCheckTime() != null ? sdf.format(inspect.getCheckTime()) : "");
+        inspect.setProductionDateStr(inspect.getProductionDate() != null ? inspect.getProductionDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) : "");
+        inspect.setValidityDateStr(inspect.getValidityDate() != null ? inspect.getValidityDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) : "");
+
+        // 鑾峰彇妫�楠屽弬鏁板垪琛�
+        List<QualityInspectParam> paramList = qualityInspectParamService.list(
+                Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, inspect.getId()));
+        int index = 1;
+        for (QualityInspectParam detail : paramList) {
+            detail.setIndex(index);
+            index++;
+        }
+
+        // 鑾峰彇浜у搧鍨嬪彿淇℃伅锛堝寘鍚湁鏁堟湡锛�
+        ProductModel productModel = null;
+        BigDecimal validityPeriod = null;
+        if (inspect.getProductModelId() != null) {
+            productModel = productModelMapper.selectById(inspect.getProductModelId());
+            if (productModel != null) {
+                validityPeriod = productModel.getValidityPeriod();
+            }
+        }
+        /*String calculatedValidityDate = "";
+        if (inspect.getProductionDate() != null && validityPeriod != null) {
+            LocalDate productionDate = inspect.getProductionDate();
+            int years = validityPeriod.intValue();
+            int months = validityPeriod
+                    .subtract(new BigDecimal(years))
+                    .multiply(new BigDecimal(12))
+                    .setScale(0, RoundingMode.HALF_UP)
+                    .intValue();
+            LocalDate calculatedDate = productionDate
+                    .plusYears(years)
+                    .plusMonths(months);
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            calculatedValidityDate = calculatedDate.format(formatter);
+        }*/
+
+        // 妫�楠屼緷鎹細浜у搧鍚嶇О + 鍑哄巶妫�楠屾搷浣滄祦绋�
+        String checkBasis = (inspect.getProductName() != null ? inspect.getProductName() : "") + "鍑哄巶妫�楠屾搷浣滄祦绋�";
+
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/out-report-template.docx");
+        Configure configure = Configure.builder()
+                .bind("paramList", new HackLoopTableRenderPolicy())
+                .build();
+//        final String finalCalculatedValidityDate = calculatedValidityDate;
+        final String finalCheckBasis = checkBasis;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("inspect", inspect);
+                    put("checkBasis", finalCheckBasis);
+//                    put("calculatedValidityDate", finalCalculatedValidityDate);
+                    put("paramList", paramList);
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode("鍑哄簱妫�楠屾姤鍛�", "UTF-8");
+            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
+            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
 
 }
diff --git a/src/main/resources/mapper/quality/QualityInspectMapper.xml b/src/main/resources/mapper/quality/QualityInspectMapper.xml
index 27a69ce..c2bcab9 100644
--- a/src/main/resources/mapper/quality/QualityInspectMapper.xml
+++ b/src/main/resources/mapper/quality/QualityInspectMapper.xml
@@ -443,6 +443,55 @@
         ORDER BY rn;
 
     </select>
+    <select id="selectOneData" resultType="com.ruoyi.quality.pojo.QualityInspect">
+        select id,
+               inspect_type,
+               check_time,
+               production_date,
+               supplier,
+               customer,
+               process,
+               check_name,
+               product_id,
+               product_name,
+               model,
+               unit,
+               quantity,
+               check_company,
+               check_result,
+               create_time,
+               create_user,
+               update_time,
+               update_user,
+               tenant_id,
+               inspect_state,
+               purchase_ledger_id,
+               product_main_id,
+               defective_phenomena,
+               product_model_id,
+               test_standard_id,
+               inspected_quantity,
+
+               case
+                   when inspect_material_condition = '妫�楠岀敤娑插墏鎯呭喌' then
+                       '鈽�'
+                   else
+                       '鈽�'
+                   end as inspect_material_condition_a,
+               case
+                   when inspect_material_condition = '妫�楠岀敤绮夊墏鎯呭喌' then
+                       '鈽�'
+                   else
+                       '鈽�'
+                   end as inspect_material_condition_b,
+
+               validity_date,
+               manufacturing_team,
+               batch_no
+
+        from quality_inspect
+        where id = #{id};
+    </select>
 
 
 </mapper>
diff --git a/src/main/resources/static/out-report-template.docx b/src/main/resources/static/out-report-template.docx
new file mode 100644
index 0000000..d01b54d
--- /dev/null
+++ b/src/main/resources/static/out-report-template.docx
Binary files differ

--
Gitblit v1.9.3