From 0fd551911bb5b0b2ed16db87fecc085c98e9a68d Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期五, 16 十月 2026 17:15:44 +0800
Subject: [PATCH] fix:1. 过程要求 - 样品接收:列表样式优化。 2. 过程要求 - 方法验证:点击详情还能修改,导出格式优化,按客户给的文档来。 3. 业务管理 - 检验任务:删除不合格相关的检测。 4. 业务管理 - 报告结果:按照发送日期倒序排列。 5. 基础配置 - 行业管理:删除印章管理。 6. 体系管理要求 - 客户满意度:附件上传报错,精简上传逻辑。
---
cnas-process/src/main/resources/mapper/ProcessReportMapper.xml | 1
cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ClientSatisfactionServiceImpl.java | 3 +
cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java | 99 +++++++++++++++++++++++++++++++------------------
cnas-process/src/main/resources/static/method-verification-customer.docx | 0
4 files changed, 66 insertions(+), 37 deletions(-)
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ClientSatisfactionServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ClientSatisfactionServiceImpl.java
index e61d9aa..8076ea0 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ClientSatisfactionServiceImpl.java
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ClientSatisfactionServiceImpl.java
@@ -216,7 +216,8 @@
*/
@Override
public ClientSatisfactionAttachment uploadAttachment(Integer clientSatisfactionId, MultipartFile file) {
- if (baseMapper.selectById(clientSatisfactionId) == null) {
+ if (baseMapper.selectCount(new QueryWrapper<ClientSatisfaction>()
+ .eq("client_satisfaction_id", clientSatisfactionId)) == 0) {
throw new BaseException("瀹㈡埛婊℃剰搴﹁皟鏌ヤ笉瀛樺湪");
}
if (file == null || file.isEmpty()) {
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java
index bd55586..af266b6 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java
@@ -32,9 +32,9 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
-import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
+import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
@@ -404,44 +404,39 @@
}
}
- /** 鏂扮増鏂规硶楠岃瘉涓昏〃瀵煎嚭锛涘師濮嬭褰曞拰楠岃瘉缁撴灉浠嶄綔涓洪檮浠朵繚瀛樸�� */
+ /** 鎸夊鎴锋彁渚涚殑妯悜鏂规硶楠岃瘉琛ㄥ鍑猴紱鍘熷璁板綍鍜岄獙璇佺粨鏋滀粛浣滀负闄勪欢淇濆瓨銆� */
private void exportWordVerification(ProcessMethodVerify verify, HttpServletResponse response) {
JSONObject content = JSONUtil.parseObj(verify.getVerificationContent());
- String[][] checks = {
- {"personnel", "1. 浜哄憳鑳藉姏"}, {"equipment", "2. 妫�娴嬭澶�"},
- {"reagents", "3. 璇曞墏瑕佹眰"}, {"conditions", "4. 璇曢獙鏉′欢"},
- {"sample", "5. 鏍峰搧澶勭疆"}, {"steps", "6. 璇曢獙姝ラ"},
- {"processing", "7. 鏁版嵁澶勭悊"}, {"qualityControl", "璐ㄩ噺鎺у埗鏂规硶"},
- {"result", "鏂规硶楠岃瘉缁撴灉"}
- };
- try (XWPFDocument document = new XWPFDocument()) {
- XWPFParagraph title = document.createParagraph();
- title.setAlignment(ParagraphAlignment.CENTER);
- title.createRun().setText("鏂规硶楠岃瘉璁板綍");
+ String[] checkKeys = {"personnel", "equipment", "reagents", "conditions", "sample", "steps",
+ "processing", "qualityControl", "result"};
+ InputStream templateStream = getClass().getResourceAsStream("/static/method-verification-customer.docx");
+ if (templateStream == null) throw new IllegalStateException("鏂规硶楠岃瘉瀵煎嚭妯℃澘涓嶅瓨鍦�");
+ try (InputStream inputStream = templateStream; XWPFDocument document = new XWPFDocument(inputStream)) {
+ XWPFTable table = document.getTables().get(0);
+ setTemplateCell(table, 0, 1, verify.getStandardName());
+ setTemplateCell(table, 0, 3, verify.getStandardCode());
+ setTemplateCell(table, 1, 1, verify.getVerifyItem());
- XWPFTable basic = document.createTable(2, 4);
- setCells(basic, 0, "鏍囧噯鍚嶇О", verify.getStandardName(), "鏍囧噯缂栧彿", verify.getStandardCode());
- setCells(basic, 1, "楠岃瘉椤圭洰", verify.getVerifyItem(), "", "");
-
- XWPFTable table = document.createTable(checks.length + 1, 4);
- setCells(table, 0, "楠岃瘉鍐呭", "鏂规硶瑕佹眰", "瀹為獙瀹よ兘鍔�", "鏄惁婊¤冻");
JSONArray entries = content.getJSONArray("checks");
- for (int i = 0; i < checks.length; i++) {
- JSONObject entry = findCheck(entries, checks[i][0]);
+ for (int i = 0; i < checkKeys.length; i++) {
+ JSONObject entry = findCheck(entries, checkKeys[i]);
Integer satisfied = entry == null ? null : entry.getInt("satisfied");
- setCells(table, i + 1, checks[i][1], field(entry, "requirement"),
- field(entry, "capability"), satisfied == null ? "" : satisfied == 1 ? "鏄�" : "鍚�");
+ int row = i + 3;
+ if (row <= 8) {
+ setTemplateCell(table, row, 1, field(entry, "requirement"));
+ setTemplateCell(table, row, 2, field(entry, "capability"));
+ setTemplateCell(table, row, 3, satisfiedText(satisfied));
+ } else {
+ setTemplateCell(table, row, 1, mergedCheckText(entry));
+ setTemplateCell(table, row, 2, satisfiedText(satisfied));
+ }
}
+ setTemplateCell(table, 12, 1, field(content, "conclusion"));
+ setTemplateCell(table, 13, 1, decisionText(field(content, "reviewDecision"),
+ "璇勫浜哄憳", field(content, "reviewer"), field(content, "reviewDate")));
+ setTemplateCell(table, 14, 1, decisionText(field(content, "approvalDecision"),
+ "鎶�鏈礋璐d汉", field(content, "approver"), field(content, "approvalDate")));
- XWPFTable conclusion = document.createTable(1, 2);
- setCells(conclusion, 0, "楠岃瘉缁撹", field(content, "conclusion"));
- XWPFTable decisions = document.createTable(2, 4);
- setCells(decisions, 0, "璇勫鎰忚", field(content, "reviewDecision"),
- "璇勫浜哄憳锛�" + field(content, "reviewer"), field(content, "reviewDate"));
- setCells(decisions, 1, "瀹℃壒鎰忚", field(content, "approvalDecision"),
- "鎶�鏈礋璐d汉锛�" + field(content, "approver"), field(content, "approvalDate"));
-
- document.createParagraph().createRun().setText("闄勪欢1 鍘熷璁板綍锛涢檮浠�2 楠岃瘉缁撴灉锛堥檮浠跺湪绯荤粺涓煡鐪嬶級");
response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
String fileName = URLEncoder.encode("鏂规硶楠岃瘉璁板綍", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".docx");
@@ -464,10 +459,42 @@
return object == null ? "" : StrUtil.nullToEmpty(object.getStr(key));
}
- private void setCells(XWPFTable table, int row, String... values) {
- for (int i = 0; i < values.length; i++) {
- XWPFTableCell cell = table.getRow(row).getCell(i);
- cell.setText(StrUtil.nullToEmpty(values[i]));
+ private String satisfiedText(Integer satisfied) {
+ return satisfied == null ? "" : satisfied == 1 ? "鏄�" : "鍚�";
+ }
+
+ private String mergedCheckText(JSONObject entry) {
+ String requirement = field(entry, "requirement").trim();
+ String capability = field(entry, "capability").trim();
+ if (requirement.isEmpty()) return capability;
+ if (capability.isEmpty() || requirement.equals(capability)) return requirement;
+ return "鏂规硶瑕佹眰锛�" + requirement + "\n瀹為獙瀹よ兘鍔涳細" + capability;
+ }
+
+ private String decisionText(String decision, String personLabel, String person, String date) {
+ StringBuilder value = new StringBuilder();
+ for (String choice : new String[]{"鍚屾剰浣跨敤", "涓嶈兘浣跨敤", "闄愬埗浣跨敤"}) {
+ if (value.length() > 0) value.append(" ");
+ value.append(choice.equals(decision) ? "鈽�" : "鈻�").append(choice);
+ }
+ value.append("\n").append(personLabel).append("锛�").append(person);
+ if (StringUtils.isNotBlank(date)) {
+ String[] parts = date.split("-");
+ value.append(" 鏃ユ湡锛�");
+ value.append(parts.length == 3 ? parts[0] + "骞�" + parts[1] + "鏈�" + parts[2] + "鏃�" : date);
+ }
+ return value.toString();
+ }
+
+ private void setTemplateCell(XWPFTable table, int row, int cellIndex, String value) {
+ XWPFTableCell cell = table.getRow(row).getCell(cellIndex);
+ XWPFParagraph paragraph = cell.getParagraphs().get(0);
+ XWPFRun run = paragraph.getRuns().get(0);
+ String[] lines = StrUtil.nullToEmpty(value).replace("\r\n", "\n").split("\n", -1);
+ run.setText(lines[0], 0);
+ for (int i = 1; i < lines.length; i++) {
+ run.addBreak();
+ run.setText(lines[i]);
}
}
diff --git a/cnas-process/src/main/resources/mapper/ProcessReportMapper.xml b/cnas-process/src/main/resources/mapper/ProcessReportMapper.xml
index d40c71a..a9fd8c4 100644
--- a/cnas-process/src/main/resources/mapper/ProcessReportMapper.xml
+++ b/cnas-process/src/main/resources/mapper/ProcessReportMapper.xml
@@ -47,6 +47,7 @@
<if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
${ew.customSqlSegment}
</if>
+ order by A.send_time desc, A.id desc
</select>
<select id="exportProcessReport" resultType="com.ruoyi.process.dto.ProcessReportDto">
select ROW_NUMBER() OVER (ORDER BY cpr.id) AS indexs,
diff --git a/cnas-process/src/main/resources/static/method-verification-customer.docx b/cnas-process/src/main/resources/static/method-verification-customer.docx
new file mode 100644
index 0000000..0f49f6a
--- /dev/null
+++ b/cnas-process/src/main/resources/static/method-verification-customer.docx
Binary files differ
--
Gitblit v1.9.3