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