From 330f90fe25f054ddcdec4c3ce037ea1ea851be72 Mon Sep 17 00:00:00 2001
From: 吴羡 <16976746+Xian-TT3@user.noreply.gitee.com>
Date: 星期四, 15 十月 2026 11:42:20 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 cnas-process/src/main/resources/mapper/ProcessMethodVerifyWorkFileMapper.xml                  |   13 +++
 cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyWorkFileMapper.java    |    3 
 cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerify.java                    |   12 +++
 cnas-process/src/main/java/com/ruoyi/process/controller/ProcessMethodVerifyController.java    |    7 +
 cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java |  139 ++++++++++++++++++++++++++++++++++
 cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyService.java          |    4 +
 cnas-process/src/main/resources/mapper/ProcessMethodVerifyMapper.xml                          |    3 
 7 files changed, 180 insertions(+), 1 deletions(-)

diff --git a/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessMethodVerifyController.java b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessMethodVerifyController.java
index 6c04881..19def0e 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessMethodVerifyController.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessMethodVerifyController.java
@@ -7,6 +7,7 @@
 import com.ruoyi.process.dto.ProcessMethodVerifyDto;
 import com.ruoyi.process.pojo.ProcessMethodVerify;
 import com.ruoyi.process.pojo.ProcessMethodVerifyMethodFile;
+import com.ruoyi.process.pojo.ProcessMethodVerifyWorkFile;
 import com.ruoyi.process.service.ProcessMethodVerifyMethodFileService;
 import com.ruoyi.process.service.ProcessMethodVerifyService;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -74,6 +75,12 @@
         return Result.success(processMethodVerifyService.getMethodVerifyOne(methodVerifyId));
     }
 
+    @Operation(summary = "瀹炴椂鏌ョ湅妫�娴嬩汉鍛樹笂宀楄瘉")
+    @GetMapping("/getCurrentWorkFiles")
+    public Result<List<ProcessMethodVerifyWorkFile>> getCurrentWorkFiles(String userIds) {
+        return Result.success(processMethodVerifyService.getCurrentWorkFiles(userIds));
+    }
+
 
     /**
      * 淇敼鏍囧噯鏂规硶楠岃瘉
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyWorkFileMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyWorkFileMapper.java
index b103cb5..750702e 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyWorkFileMapper.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyWorkFileMapper.java
@@ -20,5 +20,8 @@
      * @return
      */
     String selectWorkFile(@Param("userId") Integer userId);
+
+    /** 璇诲彇浜哄憳鏈�鏂扮殑浠昏亴鎺堟潈璁板綍锛屼緵鏂规硶楠岃瘉瀹炴椂鏌ョ湅璇佷功銆� */
+    ProcessMethodVerifyWorkFile selectLatestAuthorization(@Param("userId") Integer userId);
 }
 
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerify.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerify.java
index b5558cb..fbe7fdb 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerify.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerify.java
@@ -27,6 +27,18 @@
     @Schema(description = "鏍囧噯鏂规硶")
     private String methodName;
 
+    @Schema(description = "鏂规硶楠岃瘉鐨勬爣鍑嗗悕绉�")
+    private String standardName;
+
+    @Schema(description = "鏂规硶楠岃瘉鐨勬爣鍑嗙紪鍙�")
+    private String standardCode;
+
+    @Schema(description = "鏂规硶楠岃瘉鐨勯獙璇侀」鐩�")
+    private String verifyItem;
+
+    @Schema(description = "鏂规硶楠岃瘉琛ㄦ牸鍐呭锛孞SON")
+    private String verificationContent;
+
     @Schema(description = "楠岃瘉鍘熷洜")
     private String verifyReason;
 
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyService.java b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyService.java
index 3433a14..b0aad2d 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyService.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyService.java
@@ -6,6 +6,7 @@
 import com.ruoyi.process.dto.ProcessMethodVerifyDto;
 import com.ruoyi.process.pojo.ProcessMethodVerify;
 import com.ruoyi.process.pojo.ProcessMethodVerifyMethodFile;
+import com.ruoyi.process.pojo.ProcessMethodVerifyWorkFile;
 import org.springframework.web.multipart.MultipartFile;
 
 import jakarta.servlet.http.HttpServletResponse;
@@ -41,6 +42,9 @@
      */
     ProcessMethodVerifyDto getMethodVerifyOne(Integer methodVerifyId);
 
+    /** 瀹炴椂璇诲彇鎵�閫夋娴嬩汉鍛樼殑浠昏亴鎺堟潈璇佷功銆� */
+    List<ProcessMethodVerifyWorkFile> getCurrentWorkFiles(String userIds);
+
     /**
      * 淇敼鏍囧噯鏂规硶楠岃瘉
      * @param methodVerifyDto
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 ca298cb..bd55586 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
@@ -2,6 +2,9 @@
 
 import  cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
@@ -29,6 +32,11 @@
 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.XWPFTable;
+import org.apache.poi.xwpf.usermodel.XWPFTableCell;
 
 import jakarta.annotation.Resource;
 import jakarta.servlet.http.HttpServletResponse;
@@ -41,6 +49,9 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.LinkedHashSet;
+import java.util.Objects;
+import java.util.Set;
 
 /**
  * 鏍囧噯鏂规硶楠岃瘉
@@ -103,6 +114,7 @@
         if (methodVerifyDto.getOperationType() == null) {
             throw new ErrorException("璇烽�夋嫨鏄彉鏇磋繕鏄獙璇�");
         }
+        validateWordVerification(methodVerifyDto);
         // 鏂板
         baseMapper.insert(methodVerifyDto);
 
@@ -148,6 +160,37 @@
         return processMethodVerifyDto;
     }
 
+    @Override
+    public List<ProcessMethodVerifyWorkFile> getCurrentWorkFiles(String userIds) {
+        List<ProcessMethodVerifyWorkFile> files = new ArrayList<>();
+        if (StringUtils.isBlank(userIds)) return files;
+
+        Set<Integer> ids = new LinkedHashSet<>();
+        for (String value : StrUtil.split(userIds, ",")) {
+            try {
+                ids.add(Integer.valueOf(value.trim()));
+            } catch (NumberFormatException e) {
+                throw new ErrorException("妫�娴嬩汉鍛業D鏃犳晥");
+            }
+        }
+        if (ids.size() > 5) throw new ErrorException("鏈�澶氶�夋嫨5鍚嶆娴嬩汉鍛�");
+
+        for (Integer userId : ids) {
+            ProcessMethodVerifyWorkFile file = processMethodVerifyWorkFileMapper.selectLatestAuthorization(userId);
+            if (file == null) continue;
+            file.setUserId(userId);
+            if (StringUtils.isBlank(file.getFileUrl())) {
+                file.setFileName("鏈笂浼犱笂宀楄瘉涔�");
+                file.setType(0);
+            } else {
+                file.setFileName(file.getFileUrl());
+                file.setType(file.getFileUrl().matches("(?i).*\\.(png|jpe?g|gif|bmp|webp)$") ? 1 : 2);
+            }
+            files.add(file);
+        }
+        return files;
+    }
+
     /**
      * 淇敼鏍囧噯鏂规硶楠岃瘉
      *
@@ -156,6 +199,7 @@
      */
     @Override
     public boolean updateMethodVerify(ProcessMethodVerifyDto methodVerifyDto) {
+        validateWordVerification(methodVerifyDto);
         baseMapper.updateById(methodVerifyDto);
 
         // 鍒犻櫎涓婂矖璇�
@@ -288,6 +332,14 @@
     public void exportMethodVerify(Integer methodVerifyId, HttpServletResponse response) {
         // 鑾峰彇鏍囧噯鏂规硶鏇存柊楠岃瘉鏁版嵁
         ProcessMethodVerify processMethodVerify = baseMapper.selectById(methodVerifyId);
+        if (processMethodVerify == null) {
+            throw new ErrorException("鏂规硶楠岃瘉璁板綍涓嶅瓨鍦�");
+        }
+        if (Objects.equals(processMethodVerify.getOperationType(), 1)
+                && StringUtils.isNotBlank(processMethodVerify.getVerificationContent())) {
+            exportWordVerification(processMethodVerify, response);
+            return;
+        }
 
         // 灏嗗唴閮ㄥ瓧娈佃浆鎹㈡垚灞曠ず鍒皐ord涓殑瀵硅薄
         ProcessMethodVerifyExportWordDto exportWordTemplate = getExportWordTemplate(processMethodVerify);
@@ -350,6 +402,91 @@
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
         }
+    }
+
+    /** 鏂扮増鏂规硶楠岃瘉涓昏〃瀵煎嚭锛涘師濮嬭褰曞拰楠岃瘉缁撴灉浠嶄綔涓洪檮浠朵繚瀛樸�� */
+    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("鏂规硶楠岃瘉璁板綍");
+
+            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]);
+                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 ? "鏄�" : "鍚�");
+            }
+
+            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");
+            document.write(response.getOutputStream());
+        } catch (Exception e) {
+            throw new RuntimeException("瀵煎嚭鏂规硶楠岃瘉璁板綍澶辫触", e);
+        }
+    }
+
+    private JSONObject findCheck(JSONArray entries, String key) {
+        if (entries == null) return null;
+        for (Object value : entries) {
+            JSONObject check = JSONUtil.parseObj(value);
+            if (key.equals(check.getStr("key"))) return check;
+        }
+        return null;
+    }
+
+    private String field(JSONObject object, String key) {
+        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 void validateWordVerification(ProcessMethodVerifyDto verify) {
+        // 娌℃湁 verificationContent 鐨勬棫璁板綍缁х画鐢辨棫琛ㄥ崟缁存姢銆�
+        if (!Objects.equals(verify.getOperationType(), 1)
+                || StringUtils.isBlank(verify.getVerificationContent())) return;
+        if (StringUtils.isBlank(verify.getStandardName())
+                || StringUtils.isBlank(verify.getStandardCode())
+                || StringUtils.isBlank(verify.getVerifyItem())) {
+            throw new ErrorException("璇峰~鍐欐爣鍑嗗悕绉般�佹爣鍑嗙紪鍙峰拰楠岃瘉椤圭洰");
+        }
+        try {
+            JSONUtil.parseObj(verify.getVerificationContent());
+        } catch (Exception e) {
+            throw new ErrorException("鏂规硶楠岃瘉鍐呭鏍煎紡閿欒");
+        }
+        // 淇濈暀鏃у垪渚涚幇鏈変緷璧� method_name 鐨勬煡璇娇鐢ㄣ��
+        verify.setMethodName(verify.getStandardName());
     }
 
     private ProcessMethodVerifyExportWordDto getExportWordTemplate(ProcessMethodVerify processMethodVerify) {
@@ -424,7 +561,7 @@
                 User user = userMapper.selectById(userId);
                 ProcessMethodVerifyWorkFile workFile = new ProcessMethodVerifyWorkFile();
                 workFile.setMethodVerifyId(methodVerifyDto.getMethodVerifyId());
-                workFile.setType(1);
+                workFile.setType(workName.matches("(?i).*\\.(png|jpe?g|gif|bmp|webp)$") ? 1 : 2);
                 workFile.setFileUrl(workName);
                 workFile.setFileName(workName);
                 workFile.setUserId(user.getId());
diff --git a/cnas-process/src/main/resources/mapper/ProcessMethodVerifyMapper.xml b/cnas-process/src/main/resources/mapper/ProcessMethodVerifyMapper.xml
index ff31958..d5e9d3d 100644
--- a/cnas-process/src/main/resources/mapper/ProcessMethodVerifyMapper.xml
+++ b/cnas-process/src/main/resources/mapper/ProcessMethodVerifyMapper.xml
@@ -7,6 +7,9 @@
         select * from (
         select method_verify_id,
         method_name,
+        coalesce(standard_name, method_name) as standard_name,
+        standard_code,
+        verify_item,
         verify_reason,
         technology_change,
         confirm_date,
diff --git a/cnas-process/src/main/resources/mapper/ProcessMethodVerifyWorkFileMapper.xml b/cnas-process/src/main/resources/mapper/ProcessMethodVerifyWorkFileMapper.xml
index f7dfffd..4c544bd 100644
--- a/cnas-process/src/main/resources/mapper/ProcessMethodVerifyWorkFileMapper.xml
+++ b/cnas-process/src/main/resources/mapper/ProcessMethodVerifyWorkFileMapper.xml
@@ -7,7 +7,20 @@
         select system_file_name
         from cnas_person_post_authorization_record
         where user_id = #{userId}
+          and system_file_name is not null
+          and system_file_name != ''
         order by create_time desc
         limit 1
     </select>
+
+    <select id="selectLatestAuthorization" resultType="com.ruoyi.process.pojo.ProcessMethodVerifyWorkFile">
+        select p.system_file_name as file_url,
+               u.id as user_id,
+               u.name as user_name
+        from cnas_person_post_authorization_record p
+        join user u on u.id = p.user_id
+        where p.user_id = #{userId}
+        order by p.create_time desc, p.id desc
+        limit 1
+    </select>
 </mapper>

--
Gitblit v1.9.3