From 2eb261814a2407b3481dfe7b995c58d413a18cff Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 20 十月 2026 16:28:17 +0800
Subject: [PATCH] feat(quality): 质量监督/质量监控流程对齐程序文件并完善导入

---
 cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseServiceImpl.java |  143 ++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 121 insertions(+), 22 deletions(-)

diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseServiceImpl.java
index 6219c17..87f9a83 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseServiceImpl.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseServiceImpl.java
@@ -56,6 +56,8 @@
 import java.time.YearMonth;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.Base64;
 import java.util.HashMap;
 import java.util.LinkedHashSet;
@@ -178,8 +180,8 @@
                         throw new ErrorException("鏈壘鍒拌鐩戠潱鍛橈細" + superviseDetails.getSupervisee());
                     }
                     superviseDetails.setSupervisedUserId(user.getId());
-                    // 鏍煎紡鍖栨椂闂�
-                    superviseDetails.setSuperviseTime(detailsUpload.getSuperviseTime());
+                    // 缁熶竴鏃ユ湡鏍煎紡锛岄伩鍏� Excel 鎶� 2026-03-15 瀛樻垚 2026/3/15 鍚庢棤娉曡В鏋�
+                    superviseDetails.setSuperviseTime(normalizeSuperviseTime(detailsUpload.getSuperviseTime()));
 
                     detailsUploadList.add(superviseDetails);
                 }
@@ -432,6 +434,59 @@
     }
 
     /**
+     * 缁熶竴鐩戠潱鏃ユ湡鏍煎紡涓� yyyy.M锛�
+     * 2026-03-15 / 2026/3/15 / 2026.3.15 / 2026骞�3鏈�15鏃� -> 2026.3锛�
+     * 宸茬粡鏄� 2026.3 鎴� "3鏈堛��12鏈�" 绛夊啓娉曚繚鎸佸師鏍枫��
+     */
+    private static String normalizeSuperviseTime(String superviseTime) {
+        if (StringUtils.isBlank(superviseTime)) {
+            return superviseTime;
+        }
+        String text = superviseTime.trim();
+        Matcher matcher = Pattern.compile("^(\\d{4})\\s*[./骞�-]\\s*(\\d{1,2})(?:\\s*[./鏈�-]\\s*(\\d{1,2})\\s*鏃�?)?$")
+                .matcher(text);
+        if (matcher.matches()) {
+            int month = Integer.parseInt(matcher.group(2));
+            if (month >= 1 && month <= 12) {
+                return matcher.group(1) + "." + month;
+            }
+        }
+        return text;
+    }
+
+    /**
+     * 瑙f瀽鐩戠潱鏃ユ湡瀵瑰簲鐨勫勾鏈堬紝鍏煎鍘嗗彶鏁版嵁涓殑瀹屾暣鏃ユ湡鍐欐硶銆�
+     */
+    private static YearMonth parseSuperviseYearMonth(String superviseTime, String fallbackYear) {
+        if (StringUtils.isNotBlank(superviseTime)) {
+            String first = superviseTime.split("[銆�,锛�;锛沒+")[0].trim();
+            Matcher fullDate = Pattern.compile("(\\d{4})\\s*[./骞�-]\\s*(\\d{1,2})").matcher(first);
+            if (fullDate.find()) {
+                int month = Integer.parseInt(fullDate.group(2));
+                if (month >= 1 && month <= 12) {
+                    return YearMonth.of(Integer.parseInt(fullDate.group(1)), month);
+                }
+            }
+            // "3鏈堛��12鏈�" 杩欑被娌℃湁骞翠唤鐨勫啓娉曪紝浣跨敤璁″垝骞村害
+            Matcher monthOnly = Pattern.compile("^(\\d{1,2})").matcher(first);
+            if (monthOnly.find()) {
+                int month = Integer.parseInt(monthOnly.group(1));
+                if (month >= 1 && month <= 12) {
+                    int year = LocalDate.now().getYear();
+                    if (StringUtils.isNotBlank(fallbackYear)) {
+                        Matcher yearMatcher = Pattern.compile("(\\d{4})").matcher(fallbackYear);
+                        if (yearMatcher.find()) {
+                            year = Integer.parseInt(yearMatcher.group(1));
+                        }
+                    }
+                    return YearMonth.of(year, month);
+                }
+            }
+        }
+        return YearMonth.now();
+    }
+
+    /**
      * 鐩戠潱棰戞: 鎸夌洃鐫f椂闂翠腑鐨勬湀浠戒釜鏁拌绠�, 濡� "2026.3" -> "1娆�/骞�", "3鏈堛��12鏈�" -> "2娆�/骞�"
      */
     private static String buildSuperviseFrequency(String superviseTime) {
@@ -439,7 +494,7 @@
             return "";
         }
         int count = 0;
-        for (String part : superviseTime.split("[銆�,锛�;锛�/\\s]+")) {
+        for (String part : normalizeSuperviseTime(superviseTime).split("[銆�,锛�;锛�/\\s]+")) {
             if (part.matches(".*\\d.*")) {
                 count++;
             }
@@ -456,7 +511,7 @@
         }
         StringBuilder sb = new StringBuilder();
         for (String part : superviseTime.split("[銆�,锛�;锛沒+")) {
-            String s = part.trim();
+            String s = normalizeSuperviseTime(part.trim());
             if (s.isEmpty()) {
                 continue;
             }
@@ -491,9 +546,11 @@
         if (detailsRecord == null) {
             // 鏌ヨ璇︽儏淇℃伅
             QualitySuperviseDetails qualitySuperviseDetails = qualitySuperviseDetailsMapper.selectById(superviseDetailsId);
+            QualitySupervise qualitySupervise = baseMapper.selectById(qualitySuperviseDetails.getSuperviseId());
             // 鏌ヨ涓婁竴涓湀绗竴鏉$殑璁板綍淇℃伅, 鍒ゆ柇琚洃鐫d汉鍘诲彟澶栦竴涓�
-            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.M");
-            YearMonth yearMonth = YearMonth.parse(qualitySuperviseDetails.getSuperviseTime(), formatter);
+            // 鐩戠潱鏃ユ湡鍏煎 2026.3 / 2026-03-15 / 2026/3/15 / 2026骞�3鏈�15鏃� 绛夊啓娉�
+            YearMonth yearMonth = parseSuperviseYearMonth(qualitySuperviseDetails.getSuperviseTime(),
+                    qualitySupervise == null ? null : qualitySupervise.getSuperviseYear());
             YearMonth previousYearMonth = yearMonth.minusMonths(1);
 
             LocalDate startDate = previousYearMonth.atDay(1);
@@ -515,21 +572,17 @@
 
             String supervisor = null;
 
-            if (laseRecord != null) {
-                // 鏌ヨ璁″垝鑾峰彇鍙︿竴涓洃鐫e憳
-                QualitySupervise qualitySupervise = baseMapper.selectById(qualitySuperviseDetails.getSuperviseId());
-                if (StringUtils.isNotBlank(qualitySupervise.getRecordUserIds())) {
-                    List<String> recordUserIds = StrUtil.split(qualitySupervise.getRecordUserIds(), ',');
-                    List<User> users = userMapper.selectList(Wrappers.<User>lambdaQuery()
-                            .in(User::getId, recordUserIds));
-                    if (CollectionUtils.isNotEmpty(users) && users.size() == 2) {
-                        // 鍒ゆ柇鏄惁涓�鏍�, 涓�鏍疯幏鍙栧彟澶栦竴涓�
-                        if (users.get(0).getName().equals(laseRecord.getSupervisor())) {
-                            supervisor = users.get(1).getName();
-                        } else {
-                            supervisor = users.get(0).getName();
-                        }
-
+            // 璁″垝鎸囧畾鐨勭洃鐫e憳锛氶娆″~鍐欐椂榛樿甯﹀嚭绗竴浣嶏紱鏈変笂鏈堣褰曟椂涓や綅鐩戠潱鍛樹氦鏇�
+            if (qualitySupervise != null && StringUtils.isNotBlank(qualitySupervise.getRecordUserIds())) {
+                List<String> recordUserIds = StrUtil.split(qualitySupervise.getRecordUserIds(), ',');
+                List<User> users = userMapper.selectList(Wrappers.<User>lambdaQuery()
+                        .in(User::getId, recordUserIds));
+                if (CollectionUtils.isNotEmpty(users)) {
+                    if (laseRecord != null && users.size() > 1
+                            && users.get(0).getName().equals(laseRecord.getSupervisor())) {
+                        supervisor = users.get(1).getName();
+                    } else {
+                        supervisor = users.get(0).getName();
                     }
                 }
             }
@@ -643,6 +696,47 @@
     }
 
     /**
+     * 琚洃鐫d汉鍛樼‘璁ょ洃鐫h褰�(绋嬪簭4.2.5: 琚洃鐫e璞″鐩戠潱璁板綍鐪熷疄鎬ф彁鍑虹‘璁ゆ剰瑙�)
+     */
+    @Override
+    public boolean confirmSuperviseRecord(QualitySuperviseDetailsRecord input) {
+        if (input == null || input.getSuperviseDetailsId() == null) {
+            throw new ErrorException("缂哄皯鐩戠潱璇︾粏淇℃伅id");
+        }
+        QualitySuperviseDetailsRecord record = qualitySuperviseDetailsRecordMapper.selectOne(
+                Wrappers.<QualitySuperviseDetailsRecord>lambdaQuery()
+                        .eq(QualitySuperviseDetailsRecord::getSuperviseDetailsId, input.getSuperviseDetailsId())
+                        .last("limit 1"));
+        if (record == null) {
+            throw new ErrorException("鐩戠潱鍛樺皻鏈彁浜ょ洃鐫h褰曪紝鏃犳硶纭");
+        }
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        if (user == null) {
+            throw new ErrorException("褰撳墠鐢ㄦ埛涓嶅瓨鍦�");
+        }
+        // 鍙湁琚洃鐫d汉鍛樻湰浜烘墠鍙互纭
+        boolean isSupervisee = StrUtil.split(record.getTestMember(), '銆�').stream()
+                .map(String::trim)
+                .anyMatch(name -> name.equals(user.getName()));
+        if (!isSupervisee) {
+            QualitySuperviseDetails detail = qualitySuperviseDetailsMapper.selectById(input.getSuperviseDetailsId());
+            isSupervisee = detail != null && userId.equals(detail.getSupervisedUserId());
+        }
+        if (!isSupervisee) {
+            throw new ErrorException("鍙湁琚洃鐫d汉鍛樺彲浠ョ‘璁ょ洃鐫h褰�");
+        }
+        String opinion = StringUtils.isBlank(input.getConfirmOpinion())
+                ? "瀵圭洃鐫h褰曠湡瀹炴�ц〃绀鸿鍙��" : input.getConfirmOpinion().trim();
+        qualitySuperviseDetailsRecordMapper.update(null,
+                Wrappers.<QualitySuperviseDetailsRecord>lambdaUpdate()
+                        .eq(QualitySuperviseDetailsRecord::getSuperviseDetailsRecordId,
+                                record.getSuperviseDetailsRecordId())
+                        .set(QualitySuperviseDetailsRecord::getConfirmOpinion, opinion));
+        return true;
+    }
+
+    /**
      * 瀵煎嚭鐩戠潱璁板綍琛�(鏃ュ父鐩戠潱妫�鏌ヨ褰曡〃)
      * @param superviseDetailsId
      * @param response
@@ -670,6 +764,11 @@
                     put("qualityUrl", signatureOrTransparent(recordDto.getRatifyUserId()));
                     put("qualityDateStr", recordDto.getRatifyTime() != null ?
                             recordDto.getRatifyTime().format(RECORD_DATE_FORMATTER) : "");
+                    // 绋嬪簭4.2.5: 琚洃鐫d汉鍛樺鐩戠潱璁板綍鐪熷疄鎬х殑纭鎰忚, 鏈‘璁ゆ椂娌跨敤绾稿紶琛ㄧ殑榛樿琛ㄨ堪
+                    put("confirmOpinionText", StringUtils.isNotBlank(recordDto.getConfirmOpinion())
+                            ? recordDto.getConfirmOpinion() : "瀵圭洃鐫h褰曠湡瀹炴�ц〃绀鸿鍙��");
+                    put("superviseMethodText", StringUtils.isNotBlank(recordDto.getSuperviseMethod())
+                            ? recordDto.getSuperviseMethod() : "");
                 }});
 
         try {
@@ -690,7 +789,7 @@
     }
 
     /**
-     * 鐩戠潱鍐呭(9椤�, 鎸夌焊寮犺〃妯帓椤哄簭)
+     * 鐩戠潱鍐呭(9椤�, 涓庡彈鎺ц褰曡〃 LMSY-CX29-JL02 鐨勬í鎺掗『搴忋�佹枃瀛楀畬鍏ㄤ竴鑷�)
      */
     private static final String[] SUPERVISE_CONTENT_ITEMS = {
             "浜哄憳鎸佽瘉鍙婂煿璁�", "璁炬柦鍙婄幆澧冩潯浠�", "妫�娴嬫柟娉�",

--
Gitblit v1.9.3