From e5d1fb3d5ce9468b92e79825bbcb38f05ea73aff Mon Sep 17 00:00:00 2001
From: 吴羡 <16976746+Xian-TT3@user.noreply.gitee.com>
Date: 星期一, 12 十月 2026 18:12:34 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodSearchNew.java                    |   14 +
 cnas-process/src/main/resources/mapper/ProcessMethodSearchNewFileSeqMapper.xml                   |   40 ++++
 cnas-process/src/main/resources/mapper/ProcessMethodSearchNewMapper.xml                          |   13 +
 basic-server/src/main/java/com/ruoyi/basic/event/StandardMethodSavedEvent.java                   |   27 ++
 cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodSearchNewMapper.java            |    3 
 cnas-process/src/main/java/com/ruoyi/process/listener/StandardMethodSearchNewListener.java       |   82 ++++++++
 ruoyi-admin/src/main/resources/application.yml                                                   |   74 -------
 basic-server/src/main/java/com/ruoyi/basic/pojo/StandardMethod.java                              |    9 
 basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardMethodServiceImpl.java           |   22 ++
 cnas-process/src/main/java/com/ruoyi/process/controller/ProcessMethodSearchNewController.java    |    8 
 ruoyi-admin/src/main/resources/application-xjxj.yml                                              |  150 +++++++++++++++
 cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodSearchNewFileSeqMapper.java     |   18 +
 cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodSearchNewService.java          |    4 
 ruoyi-admin/src/main/resources/application-druid.yml                                             |   54 +++++
 basic-server/src/main/resources/mapper/StandardMethodMapper.xml                                  |    3 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodSearchNewServiceImpl.java |   50 +++-
 16 files changed, 484 insertions(+), 87 deletions(-)

diff --git a/basic-server/src/main/java/com/ruoyi/basic/event/StandardMethodSavedEvent.java b/basic-server/src/main/java/com/ruoyi/basic/event/StandardMethodSavedEvent.java
new file mode 100644
index 0000000..0a3a329
--- /dev/null
+++ b/basic-server/src/main/java/com/ruoyi/basic/event/StandardMethodSavedEvent.java
@@ -0,0 +1,27 @@
+package com.ruoyi.basic.event;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+/** 鏍囧噯缁存姢淇濆瓨浜嬩欢銆� */
+@Data
+@AllArgsConstructor
+@Schema(description = "鏍囧噯缁存姢淇濆瓨浜嬩欢")
+public class StandardMethodSavedEvent {
+
+    @Schema(description = "鏍囧噯鏂规硶ID")
+    private Integer standardMethodId;
+
+    @Schema(description = "鏍囧噯缂栧彿")
+    private String code;
+
+    @Schema(description = "鏍囧噯鎻忚堪")
+    private String name;
+
+    @Schema(description = "鏄惁鏌ユ柊锛�0鍚︼紝1鏄級")
+    private Integer needSearchNew;
+
+    @Schema(description = "鏄惁涓虹紪杈戞搷浣�")
+    private boolean edit;
+}
diff --git a/basic-server/src/main/java/com/ruoyi/basic/pojo/StandardMethod.java b/basic-server/src/main/java/com/ruoyi/basic/pojo/StandardMethod.java
index ebb426b..ab699a7 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/pojo/StandardMethod.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/pojo/StandardMethod.java
@@ -15,27 +15,33 @@
  */
 @TableName(value ="standard_method")
 @Data
+@Schema(description = "鏍囧噯鏂规硶")
 public class StandardMethod implements Serializable {
     /**
      *
      */
     @TableId(type = IdType.AUTO)
+    @Schema(description = "鏍囧噯鏂规硶ID")
     private Integer id;
 
+    @Schema(description = "棰嗗煙")
     private String field;
 
     @Schema(description = "妫�楠屽璞�")
     private String structureTestObjectId;
 
     /** 鏍囧噯搴撲竴绾ц涓欼D锛堜粎鎺ュ彛浜や簰锛屼笉钀絪tandard_method琛級 */
+    @Schema(description = "鏍囧噯搴撲竴绾ц涓欼D")
     @TableField(exist = false)
     private List<Integer> industryIds;
 
     /** 宸茬粦瀹氳涓氬悕绉帮紙鍒楄〃灞曠ず锛� */
+    @Schema(description = "宸茬粦瀹氳涓氬悕绉�")
     @TableField(exist = false)
     private String industryNames;
 
     /** 闄勪欢鏁伴噺锛堝垪琛ㄥ睍绀猴級 */
+    @Schema(description = "闄勪欢鏁伴噺")
     @TableField(exist = false)
     private Integer attachmentCount;
 
@@ -69,6 +75,9 @@
     @Schema(description = "鏄惁鍚敤")
     private Integer isUse;
 
+    @Schema(description = "鏄惁鏌ユ柊锛�0鍚︼紝1鏄級")
+    private Integer needSearchNew;
+
     @Schema(description = "鍒涘缓浜篿d")
     @TableField(fill = FieldFill.INSERT)
     private Integer createUser;
diff --git a/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardMethodServiceImpl.java b/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardMethodServiceImpl.java
index f14bb35..f38131e 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardMethodServiceImpl.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardMethodServiceImpl.java
@@ -8,6 +8,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.basic.pojo.StandardMethodList;
+import com.ruoyi.basic.event.StandardMethodSavedEvent;
 import com.ruoyi.common.utils.QueryWrappers;
 import com.ruoyi.basic.mapper.StandardMethodMapper;
 import com.ruoyi.basic.mapper.StandardProductListMapper;
@@ -31,6 +32,7 @@
 import com.ruoyi.basic.utils.StandardTreePath;
 import com.ruoyi.basic.utils.StandardTreePathParser;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
@@ -66,6 +68,7 @@
     private LaboratoryMapper laboratoryMapper;
     private StandardTreeMapper standardTreeMapper;
     private StandardTreeTemplateBindingMapper standardTreeTemplateBindingMapper;
+    private final ApplicationEventPublisher eventPublisher;
 
     @Value("${file.path}")
     private String filePath;
@@ -86,7 +89,8 @@
                                      StandardMethodAttachmentMapper standardMethodAttachmentMapper,
                                      LaboratoryMapper laboratoryMapper,
                                      StandardTreeMapper standardTreeMapper,
-                                     StandardTreeTemplateBindingMapper standardTreeTemplateBindingMapper) {
+                                     StandardTreeTemplateBindingMapper standardTreeTemplateBindingMapper,
+                                     ApplicationEventPublisher eventPublisher) {
         this.standardMethodMapper = standardMethodMapper;
         this.standardProductListMapper = standardProductListMapper;
         this.standardProductListService = standardProductListService;
@@ -97,6 +101,7 @@
         this.laboratoryMapper = laboratoryMapper;
         this.standardTreeMapper = standardTreeMapper;
         this.standardTreeTemplateBindingMapper = standardTreeTemplateBindingMapper;
+        this.eventPublisher = eventPublisher;
     }
 
     @Override
@@ -117,8 +122,12 @@
     @Transactional(rollbackFor = Exception.class)
     public Integer addStandardMethod(StandardMethod standardMethod) {
         standardMethod.setStructureTestObjectId(null);
+        if (standardMethod.getNeedSearchNew() == null) {
+            standardMethod.setNeedSearchNew(0);
+        }
         standardMethodMapper.insert(standardMethod);
         syncIndustries(standardMethod, Collections.<Integer>emptySet());
+        publishSavedEvent(standardMethod, false);
         return standardMethod.getId();
     }
 
@@ -149,11 +158,22 @@
         if (!oldStandardMethod.getCode().equals(standardMethod.getCode())) {
             CompletableFuture.supplyAsync(() -> replaceMethod(oldStandardMethod.getCode(), standardMethod.getCode()));
         }
+        if (standardMethod.getNeedSearchNew() == null) {
+            standardMethod.setNeedSearchNew(oldStandardMethod.getNeedSearchNew() == null
+                    ? 0 : oldStandardMethod.getNeedSearchNew());
+        }
         int i = standardMethodMapper.updateById(standardMethod);
         syncIndustries(standardMethod, new LinkedHashSet<>(selectIndustryIds(oldStandardMethod.getId())));
+        publishSavedEvent(standardMethodMapper.selectById(standardMethod.getId()), true);
         return i;
     }
 
+    private void publishSavedEvent(StandardMethod standardMethod, boolean edit) {
+        eventPublisher.publishEvent(new StandardMethodSavedEvent(
+                standardMethod.getId(), standardMethod.getCode(), standardMethod.getName(),
+                standardMethod.getNeedSearchNew(), edit));
+    }
+
     private List<Integer> selectIndustryIds(Integer methodId) {
         List<StandardMethodIndustry> list = standardMethodIndustryMapper.selectList(
                 Wrappers.<StandardMethodIndustry>lambdaQuery()
diff --git a/basic-server/src/main/resources/mapper/StandardMethodMapper.xml b/basic-server/src/main/resources/mapper/StandardMethodMapper.xml
index b48f4d0..82bfa6c 100644
--- a/basic-server/src/main/resources/mapper/StandardMethodMapper.xml
+++ b/basic-server/src/main/resources/mapper/StandardMethodMapper.xml
@@ -13,6 +13,7 @@
         <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
         <result property="updateUser" column="update_user" jdbcType="INTEGER"/>
         <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+        <result property="needSearchNew" column="need_search_new" jdbcType="INTEGER"/>
     </resultMap>
 
     <select id="selectStandardMethodList" resultType="com.ruoyi.basic.pojo.StandardMethod">
@@ -30,6 +31,7 @@
                 sm.field,
                 sm.name_en,
                 sm.is_use,
+                sm.need_search_new,
                 sm.qualification_id,
                 COALESCE((SELECT GROUP_CONCAT(l.laboratory_name ORDER BY COALESCE(l.sort, 0), l.id SEPARATOR '銆�')
                           FROM standard_method_industry smi JOIN laboratory l ON l.id = smi.industry_id
@@ -59,6 +61,7 @@
                sm.field,
                sm.name_en,
                sm.is_use,
+               sm.need_search_new,
                sm.qualification_id
         from standard_method sm
                  left join user u1 on sm.create_user = u1.id
diff --git a/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessMethodSearchNewController.java b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessMethodSearchNewController.java
index 70e3cb5..dc137e8 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessMethodSearchNewController.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessMethodSearchNewController.java
@@ -55,7 +55,7 @@
     @Operation(summary = "淇敼鏍囧噯鏌ユ柊")
     @PostMapping("/updateMethodSearchNew")
     public Result updateMethodSearchNew(@RequestBody ProcessMethodSearchNew processMethodSearchNew ) {
-        return Result.success(processMethodSearchNewService.updateById(processMethodSearchNew));
+        return Result.success(processMethodSearchNewService.updateMethodSearchNew(processMethodSearchNew));
     }
 
     /**
@@ -67,6 +67,12 @@
         return Result.success(processMethodSearchNewService.pageMethodSearchNew(page, processMethodSearchNew));
     }
 
+    @Operation(summary = "鑷姩褰掓。璁板綍鍒楄〃")
+    @GetMapping("/pageAutoArchived")
+    public Result<IPage<ProcessMethodSearchNew>> pageAutoArchived(ProcessMethodSearchNew processMethodSearchNew, Page page) {
+        return Result.success(processMethodSearchNewService.pageAutoArchived(page, processMethodSearchNew));
+    }
+
     @Operation(summary = "鏍囧噯鏌ユ柊瀵煎嚭")
     @GetMapping("/exportMethodSearchNew")
     public void exportMethodSearchNew(Integer archivedId, HttpServletResponse response) throws Exception {
diff --git a/cnas-process/src/main/java/com/ruoyi/process/listener/StandardMethodSearchNewListener.java b/cnas-process/src/main/java/com/ruoyi/process/listener/StandardMethodSearchNewListener.java
new file mode 100644
index 0000000..0ce0eee
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/listener/StandardMethodSearchNewListener.java
@@ -0,0 +1,82 @@
+package com.ruoyi.process.listener;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.basic.event.StandardMethodSavedEvent;
+import com.ruoyi.basic.mapper.StandardMethodMapper;
+import com.ruoyi.basic.pojo.StandardMethod;
+import com.ruoyi.process.mapper.ProcessMethodSearchNewFileSeqMapper;
+import com.ruoyi.process.mapper.ProcessMethodSearchNewMapper;
+import com.ruoyi.process.pojo.ProcessMethodSearchNew;
+import lombok.RequiredArgsConstructor;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+
+/** 鏍规嵁鏍囧噯缁存姢淇濆瓨鍔ㄤ綔鍚屾鐢熸垚銆佸綊妗f爣鍑嗘煡鏂拌褰曘�� */
+@Component
+@RequiredArgsConstructor
+public class StandardMethodSearchNewListener {
+
+    private static final ZoneId CHINA_ZONE = ZoneId.of("Asia/Shanghai");
+    private static final DateTimeFormatter FILE_DATE = DateTimeFormatter.BASIC_ISO_DATE;
+
+    private final StandardMethodMapper standardMethodMapper;
+    private final ProcessMethodSearchNewMapper searchNewMapper;
+    private final ProcessMethodSearchNewFileSeqMapper fileSeqMapper;
+
+    @EventListener
+    public void onStandardMethodSaved(StandardMethodSavedEvent event) {
+        if (!Integer.valueOf(1).equals(event.getNeedSearchNew())) {
+            return;
+        }
+
+        StandardMethod standard = standardMethodMapper.selectOne(Wrappers.<StandardMethod>lambdaQuery()
+                .eq(StandardMethod::getId, event.getStandardMethodId())
+                .last("FOR UPDATE"));
+        if (standard == null) {
+            return;
+        }
+
+        ProcessMethodSearchNew current = searchNewMapper.selectOne(Wrappers.<ProcessMethodSearchNew>lambdaQuery()
+                .eq(ProcessMethodSearchNew::getCurrentAutoStandardId, event.getStandardMethodId())
+                .last("FOR UPDATE"));
+        if (!event.isEdit() && current != null) {
+            return;
+        }
+
+        LocalDateTime now = LocalDateTime.now(CHINA_ZONE);
+        if (current != null) {
+            searchNewMapper.update(null, Wrappers.<ProcessMethodSearchNew>lambdaUpdate()
+                    .eq(ProcessMethodSearchNew::getMethodSearchNewId, current.getMethodSearchNewId())
+                    .set(ProcessMethodSearchNew::getIsNewStandard, 0)
+                    .set(ProcessMethodSearchNew::getIsAutoArchived, 1)
+                    .set(ProcessMethodSearchNew::getCurrentAutoStandardId, null)
+                    .set(ProcessMethodSearchNew::getAutoArchivedTime, now));
+        }
+
+        ProcessMethodSearchNew created = new ProcessMethodSearchNew();
+        created.setMethodName(event.getName());
+        created.setStandardNo(event.getCode());
+        created.setFileNo(nextFileNo(now.toLocalDate()));
+        created.setIsNewStandard(1);
+        created.setSearchNewSource(null);
+        created.setStandardMethodId(event.getStandardMethodId());
+        created.setCurrentAutoStandardId(event.getStandardMethodId());
+        created.setIsAutoArchived(0);
+        searchNewMapper.insert(created);
+    }
+
+    private String nextFileNo(LocalDate date) {
+        String prefix = date.format(FILE_DATE);
+        fileSeqMapper.insertIfAbsent(date);
+        Integer stored = fileSeqMapper.selectForUpdate(date);
+        Integer existing = fileSeqMapper.selectMaxExisting(prefix);
+        int next = Math.max(stored == null ? 0 : stored, existing == null ? 0 : existing) + 1;
+        fileSeqMapper.updateValue(date, next);
+        return prefix + String.format("%03d", next);
+    }
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodSearchNewFileSeqMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodSearchNewFileSeqMapper.java
new file mode 100644
index 0000000..ea4019e
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodSearchNewFileSeqMapper.java
@@ -0,0 +1,18 @@
+package com.ruoyi.process.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.time.LocalDate;
+
+@Mapper
+public interface ProcessMethodSearchNewFileSeqMapper {
+
+    int insertIfAbsent(@Param("seqDate") LocalDate seqDate);
+
+    Integer selectForUpdate(@Param("seqDate") LocalDate seqDate);
+
+    Integer selectMaxExisting(@Param("prefix") String prefix);
+
+    int updateValue(@Param("seqDate") LocalDate seqDate, @Param("value") Integer value);
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodSearchNewMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodSearchNewMapper.java
index e82cfc7..c415bca 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodSearchNewMapper.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodSearchNewMapper.java
@@ -28,5 +28,8 @@
      */
     IPage<ProcessMethodSearchNew> pageMethodSearchNew(@Param("page") Page page, @Param("ew") QueryWrapper<ProcessMethodSearchNewBackupsDto> processMethodSearchNewDtoQueryWrapper, @Param("beginDate") String beginDate, @Param("endDate") String endDate);
 
+    IPage<ProcessMethodSearchNew> pageAutoArchived(@Param("page") Page page,
+                                                    @Param("ew") QueryWrapper<ProcessMethodSearchNew> queryWrapper);
+
 }
 
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodSearchNew.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodSearchNew.java
index a5aaec6..0d19b3d 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodSearchNew.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodSearchNew.java
@@ -19,6 +19,7 @@
 public class ProcessMethodSearchNew {
 
     @TableId(type = IdType.AUTO)
+    @Schema(description = "鏍囧噯鏌ユ柊璁板綍ID")
     private Integer methodSearchNewId;
 
     @Schema(description = "鏍囧噯鏂规硶楠岃瘉id")
@@ -48,6 +49,19 @@
     @Schema(description = "澶囨敞,0浣滃簾, 1鏇挎崲")
     private Integer remark;
 
+    @Schema(description = "鏉ユ簮鏍囧噯缁存姢ID锛岃嚜鍔ㄧ敓鎴愯褰曚娇鐢�")
+    private Integer standardMethodId;
+
+    @Schema(description = "褰撳墠鑷姩璁板綍瀵瑰簲鐨勬爣鍑嗙淮鎶D锛涘綊妗e悗涓虹┖")
+    private Integer currentAutoStandardId;
+
+    @Schema(description = "鏄惁鑷姩褰掓。锛�0鍚︼紝1鏄級")
+    private Integer isAutoArchived;
+
+    @Schema(description = "鑷姩褰掓。鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime autoArchivedTime;
+
     @Schema(description = "鍒涘缓浜�")
     @TableField(fill = FieldFill.INSERT)
     private Integer createUser;
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodSearchNewService.java b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodSearchNewService.java
index 3aa46ce..9e6f120 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodSearchNewService.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodSearchNewService.java
@@ -28,6 +28,8 @@
      */
     boolean addMethodSearchNew(List<ProcessMethodSearchNew> processMethodSearchNewList);
 
+    boolean updateMethodSearchNew(ProcessMethodSearchNew processMethodSearchNew);
+
     /**
      * 鏍囧噯鏌ユ柊鍒楄〃
      * @param processMethodSearchNew
@@ -35,6 +37,8 @@
      */
     IPage<ProcessMethodSearchNew> pageMethodSearchNew(Page page, ProcessMethodSearchNewBackupsDto processMethodSearchNew);
 
+    IPage<ProcessMethodSearchNew> pageAutoArchived(Page page, ProcessMethodSearchNew processMethodSearchNew);
+
     /**
      * 鏍囧噯鏌ユ柊瀵煎嚭
      * @param archivedId
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodSearchNewServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodSearchNewServiceImpl.java
index b257cff..c7f13bb 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodSearchNewServiceImpl.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodSearchNewServiceImpl.java
@@ -73,10 +73,36 @@
     public boolean addMethodSearchNew(List<ProcessMethodSearchNew> processMethodSearchNewList) {
         for (ProcessMethodSearchNew processMethodSearchNew : processMethodSearchNewList) {
             processMethodSearchNew.setIsNewStandard(1);
+            processMethodSearchNew.setIsAutoArchived(0);
+            processMethodSearchNew.setStandardMethodId(null);
+            processMethodSearchNew.setCurrentAutoStandardId(null);
+            processMethodSearchNew.setAutoArchivedTime(null);
         }
         // 鏂板
         this.saveBatch(processMethodSearchNewList);
         return true;
+    }
+
+    @Override
+    public boolean updateMethodSearchNew(ProcessMethodSearchNew processMethodSearchNew) {
+        ProcessMethodSearchNew old = getById(processMethodSearchNew.getMethodSearchNewId());
+        if (old == null) {
+            throw new ErrorException("鏍囧噯鏌ユ柊璁板綍涓嶅瓨鍦�");
+        }
+        if (Integer.valueOf(1).equals(old.getIsAutoArchived())) {
+            throw new ErrorException("鑷姩褰掓。璁板綍涓嶅厑璁镐慨鏀�");
+        }
+        return update(Wrappers.<ProcessMethodSearchNew>lambdaUpdate()
+                .eq(ProcessMethodSearchNew::getMethodSearchNewId, old.getMethodSearchNewId())
+                .set(ProcessMethodSearchNew::getVerifyId, processMethodSearchNew.getVerifyId())
+                .set(ProcessMethodSearchNew::getMethodName, processMethodSearchNew.getMethodName())
+                .set(ProcessMethodSearchNew::getStandardNo, processMethodSearchNew.getStandardNo())
+                .set(ProcessMethodSearchNew::getFileNo, processMethodSearchNew.getFileNo())
+                .set(ProcessMethodSearchNew::getNewMethodName, processMethodSearchNew.getNewMethodName())
+                .set(ProcessMethodSearchNew::getNewStandardNo, processMethodSearchNew.getNewStandardNo())
+                .set(ProcessMethodSearchNew::getSearchNewSource, processMethodSearchNew.getSearchNewSource())
+                .set(ProcessMethodSearchNew::getRemark, processMethodSearchNew.getRemark())
+                .set(ProcessMethodSearchNew::getIsNewStandard, 1));
     }
 
     /**
@@ -92,6 +118,12 @@
         processMethodSearchNew.setBeginDate(null);
         processMethodSearchNew.setEndDate(null);
         return baseMapper.pageMethodSearchNew(page, QueryWrappers.queryWrappers(processMethodSearchNew), beginDate, endDate);
+    }
+
+    @Override
+    public IPage<ProcessMethodSearchNew> pageAutoArchived(Page page, ProcessMethodSearchNew processMethodSearchNew) {
+        processMethodSearchNew.setIsAutoArchived(null);
+        return baseMapper.pageAutoArchived(page, QueryWrappers.queryWrappers(processMethodSearchNew));
     }
 
     /**
@@ -136,7 +168,7 @@
                     searchNewBackupsDto.setRemarkString("浣滃簾");
                 }
             }
-            switch (methodSearchNew.getSearchNewSource()) {
+            if (methodSearchNew.getSearchNewSource() != null) switch (methodSearchNew.getSearchNewSource()) {
                 case 0:
                     searchNewBackupsDto.setStandardNet("鈭�");
                     break;
@@ -257,20 +289,14 @@
             List<ProcessMethodSearchNew> collect = searchNewDtoList.stream().map(searchNewDto -> {
                 ProcessMethodSearchNew searchNew = new ProcessMethodSearchNew();
                 BeanUtils.copyProperties(searchNewDto, searchNew);
-                // 鏄惁鏄洿鏂�
-                if (StringUtils.isNotBlank(searchNewDto.getIsNewStandardString())) {
-                    if (searchNewDto.getIsNewStandardString().equals("鏄�")) {
-                        searchNew.setIsNewStandard(1);
-                    } else {
-                        searchNew.setIsNewStandard(0);
-                    }
-                }
+                searchNew.setIsNewStandard(1);
+                searchNew.setIsAutoArchived(0);
                 // 鏌ユ柊璁板綍
                 if (StringUtils.isNotBlank(searchNewDto.getStandardNet())) {
                     searchNew.setSearchNewSource(0);
                 } else if (StringUtils.isNotBlank(searchNewDto.getInformationOffices())) {
                     searchNew.setSearchNewSource(1);
-                } else if (StringUtils.isNotBlank(searchNewDto.getIsNewStandardString())) {
+                } else if (StringUtils.isNotBlank(searchNewDto.getStandardBookstore())) {
                     searchNew.setSearchNewSource(2);
                 } else if (StringUtils.isNotBlank(searchNewDto.getOther())) {
                     searchNew.setSearchNewSource(3);
@@ -309,12 +335,14 @@
         processMethodSearchNewArchivedMapper.insert(archived);
 
         // 鏌ヨ鎵�鏈夌殑鏍囧噯鏌ユ柊
-        List<ProcessMethodSearchNew> searchNewList = this.list();
+        List<ProcessMethodSearchNew> searchNewList = this.list(Wrappers.<ProcessMethodSearchNew>lambdaQuery()
+                .eq(ProcessMethodSearchNew::getIsAutoArchived, 0));
 
         // 鏂板澶嶅埗
         List<ProcessMethodSearchNewBackups> methodSearchNewBackups = searchNewList.stream().map(processMethodSearchNew -> {
             ProcessMethodSearchNewBackups backups = new ProcessMethodSearchNewBackups();
             BeanUtils.copyProperties(processMethodSearchNew, backups);
+            backups.setIsNewStandard(0);
             backups.setArchivedId(archived.getArchivedId());
             return backups;
         }).collect(Collectors.toList());
diff --git a/cnas-process/src/main/resources/mapper/ProcessMethodSearchNewFileSeqMapper.xml b/cnas-process/src/main/resources/mapper/ProcessMethodSearchNewFileSeqMapper.xml
new file mode 100644
index 0000000..39116e2
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/ProcessMethodSearchNewFileSeqMapper.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.process.mapper.ProcessMethodSearchNewFileSeqMapper">
+
+    <insert id="insertIfAbsent">
+        INSERT IGNORE INTO cnas_process_method_search_new_file_seq
+            (seq_date, sequence_value)
+        VALUES
+            (#{seqDate}, 0)
+    </insert>
+
+    <select id="selectForUpdate" resultType="java.lang.Integer">
+        SELECT sequence_value
+        FROM cnas_process_method_search_new_file_seq
+        WHERE seq_date = #{seqDate}
+        FOR UPDATE
+    </select>
+
+    <select id="selectMaxExisting" resultType="java.lang.Integer">
+        SELECT COALESCE(MAX(seq_value), 0)
+        FROM (
+            SELECT CAST(SUBSTRING(file_no, 9) AS UNSIGNED) AS seq_value
+            FROM cnas_process_method_search_new
+            WHERE file_no REGEXP CONCAT('^', #{prefix}, '[0-9]+$')
+            UNION ALL
+            SELECT CAST(SUBSTRING(file_no, 9) AS UNSIGNED) AS seq_value
+            FROM cnas_process_method_search_new_backups
+            WHERE file_no REGEXP CONCAT('^', #{prefix}, '[0-9]+$')
+        ) numbers
+    </select>
+
+    <update id="updateValue">
+        UPDATE cnas_process_method_search_new_file_seq
+        SET sequence_value = #{value}
+        WHERE seq_date = #{seqDate}
+    </update>
+
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/ProcessMethodSearchNewMapper.xml b/cnas-process/src/main/resources/mapper/ProcessMethodSearchNewMapper.xml
index 7be9498..d446e4d 100644
--- a/cnas-process/src/main/resources/mapper/ProcessMethodSearchNewMapper.xml
+++ b/cnas-process/src/main/resources/mapper/ProcessMethodSearchNewMapper.xml
@@ -8,6 +8,7 @@
         from (select *
         from cnas_process_method_search_new
         <where>
+            and is_auto_archived = 0
             <if test="beginDate != null and beginDate != '' and endDate != null and endDate != ''">
                 and create_time between #{beginDate} and #{endDate}
             </if>
@@ -18,4 +19,16 @@
             ${ew.customSqlSegment}
         </if>
     </select>
+
+    <select id="pageAutoArchived" resultType="com.ruoyi.process.pojo.ProcessMethodSearchNew">
+        select *
+        from (
+            select * from cnas_process_method_search_new
+            where is_auto_archived = 1
+            order by auto_archived_time desc, method_search_new_id desc
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
 </mapper>
diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml
index e0e9109..d36a314 100644
--- a/ruoyi-admin/src/main/resources/application-druid.yml
+++ b/ruoyi-admin/src/main/resources/application-druid.yml
@@ -6,7 +6,7 @@
         druid:
             # 涓诲簱鏁版嵁婧�
             master:
-                url: jdbc:mysql://192.168.0.24:3307/lims-xjxj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                url: jdbc:mysql://127.0.0.1:3307/lims-xjxj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                 username: root
                 password: 123456
             # 浠庡簱鏁版嵁婧�
@@ -60,6 +60,56 @@
                     config:
                         multi-statement-allow: true
 
+    # Redis 杩炴帴閰嶇疆
+    data:
+        redis:
+            host: 127.0.0.1
+            port: 6379
+            database: 0
+            password:
+            timeout: 10s
+            lettuce:
+              pool:
+                # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+                min-idle: 0
+                # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+                max-idle: 8
+                # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+                max-active: 8
+                # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+                max-wait: -1ms
+
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  name: RuoYi
+  version: 3.9.2
+  copyrightYear: 2026
+  profile: D:/ruoyi/uploadPath
+  addressEnabled: false
+
+# 鐢ㄦ埛瀵嗙爜閰嶇疆
+user:
+  password:
+    maxRetryCount: 5
+    lockTime: 10
+
+# 浠ょ墝閰嶇疆
+token:
+  header: Authorization
+  secret: awertgbadrtawetfgfbsdfawerghbfdsftreagd
+  expireTime: 450
+
+# 闃茬洍閾鹃厤缃�
+referer:
+  enabled: false
+  allowed-domains: localhost,127.0.0.1,ruoyi.vip,www.ruoyi.vip
+
+# XSS 杩囨护閰嶇疆
+xss:
+  enabled: true
+  excludes: /system/notice
+  urlPatterns: /system/*,/monitor/*,/tool/*
+
 # 鐓х墖瀛樺偍璺緞+++++++++++++++++++++++++++杩愮淮闇�瑕侀厤缃�+++++++++++++++++++++++++++
 file:
   path: D:\椤圭洰鏂囦欢瀛樺偍\image
@@ -67,4 +117,4 @@
   allowed: png,jpg,jpeg,gif
 
 # 鎶ュ憡 word 瀛樺偍璺緞
-wordUrl: D:\椤圭洰鏂囦欢瀛樺偍\word
\ No newline at end of file
+wordUrl: D:\椤圭洰鏂囦欢瀛樺偍\word
diff --git a/ruoyi-admin/src/main/resources/application-xjxj.yml b/ruoyi-admin/src/main/resources/application-xjxj.yml
new file mode 100644
index 0000000..33f720b
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/application-xjxj.yml
@@ -0,0 +1,150 @@
+# 瑁呭娴嬭瘯搴撻厤缃�
+
+# 鏁版嵁婧愰厤缃�
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://172.17.0.1:11101/lims-xjxj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+
+  # redis 閰嶇疆
+  data:
+    # redis 閰嶇疆
+    redis:
+      # 鍦板潃
+      host: 172.17.0.1
+      # 绔彛锛岄粯璁や负6379
+      port: 11102
+      # 鏁版嵁搴撶储寮�
+      database: 6
+      # 瀵嗙爜
+      password:
+      # 杩炴帴瓒呮椂鏃堕棿
+      timeout: 10s
+      lettuce:
+        pool:
+          # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+          min-idle: 0
+          # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+          max-idle: 8
+          # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+          max-active: 8
+          # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+          max-wait: -1ms
+
+# mybatis-plus閰嶇疆
+mybatis-plus:
+  configuration:
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+
+# 鏃ュ織閰嶇疆
+logging:
+  file-location: /center-lims/Java
+  level:
+    root: info
+    com.ruoyi: debug
+    org.springframework.web: debug
+    org.springframework.security: info
+    org.mybatis: debug
+    com.baomidou.mybatisplus: debug
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  name: RuoYi
+  version: 3.9.2
+  copyrightYear: 2026
+  profile: D:/ruoyi/uploadPath
+  addressEnabled: false
+
+# 鐢ㄦ埛瀵嗙爜閰嶇疆
+user:
+  password:
+    maxRetryCount: 5
+    lockTime: 10
+
+# 浠ょ墝閰嶇疆
+token:
+  header: Authorization
+  secret: awertgbadrtawetfgfbsdfawerghbfdsftreagd
+  expireTime: 450
+
+# 闃茬洍閾鹃厤缃�
+referer:
+  enabled: false
+  allowed-domains: localhost,127.0.0.1,ruoyi.vip,www.ruoyi.vip
+
+# XSS 杩囨护閰嶇疆
+xss:
+  enabled: true
+  excludes: /system/notice
+  urlPatterns: /system/*,/monitor/*,/tool/*
+
+
+# 鐓х墖瀛樺偍璺緞+++++++++++++++++++++++++++杩愮淮闇�瑕侀厤缃�+++++++++++++++++++++++++++
+file:
+  path: /center-lims/Work/img
+  # 涓婁紶鏂囦欢鍏佽鐨勬墿灞曞悕
+  allowed: png,jpg,jpeg,gif
+# 鎶ュ憡鍦板潃
+wordUrl: /center-lims/Work/word
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 6818aec..a5af357 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -1,20 +1,7 @@
-# 椤圭洰鐩稿叧閰嶇疆
-ruoyi:
-  # 鍚嶇О
-  name: RuoYi
-  # 鐗堟湰
-  version: 3.9.2
-  # 鐗堟潈骞翠唤
-  copyrightYear: 2026
-  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
-  profile: D:/ruoyi/uploadPath
-  # 鑾峰彇ip鍦板潃寮�鍏�
-  addressEnabled: false
-
 # 寮�鍙戠幆澧冮厤缃�
 server:
-  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
-  port: 8002
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080锛屾湇鍔″櫒鏂拌仛鍚庣涓�9509
+  port: 9509
   servlet:
     # 搴旂敤鐨勮闂矾寰�
     context-path: /
@@ -34,14 +21,6 @@
   level:
     com.ruoyi: debug
     org.springframework: warn
-
-# 鐢ㄦ埛閰嶇疆
-user:
-  password:
-    # 瀵嗙爜鏈�澶ч敊璇鏁�
-    maxRetryCount: 5
-    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
-    lockTime: 10
 
 # Spring閰嶇疆
 spring:
@@ -70,39 +49,6 @@
     restart:
       # 鐑儴缃插紑鍏�
       enabled: true
-  data:
-    # redis 閰嶇疆
-    redis:
-      # 鍦板潃
-      host: 192.168.0.24
-      # 绔彛锛岄粯璁や负6379
-      port: 6379
-      # 鏁版嵁搴撶储寮�
-      database: 0
-      # 瀵嗙爜
-      password:
-      # 杩炴帴瓒呮椂鏃堕棿
-      timeout: 10s
-      lettuce:
-        pool:
-          # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
-          min-idle: 0
-          # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
-          max-idle: 8
-          # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
-          max-active: 8
-          # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
-          max-wait: -1ms
-
-# token閰嶇疆
-token:
-  # 浠ょ墝鑷畾涔夋爣璇�
-  header: Authorization
-  # 浠ょ墝瀵嗛挜
-  secret: abcdefghijklmnopqrstuvwxyz
-  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
-  expireTime: 30
-
 # MyBatis-Plus閰嶇疆
 mybatis-plus:
   # 鎼滅储鎸囧畾鍖呭埆鍚�
@@ -136,19 +82,3 @@
       display-name: '娴嬭瘯妯″潡'
       paths-to-match: '/**'
       packages-to-scan: com.ruoyi
-
-# 闃茬洍閾鹃厤缃�
-referer:
-  # 闃茬洍閾惧紑鍏�
-  enabled: false
-  # 鍏佽鐨勫煙鍚嶅垪琛�
-  allowed-domains: localhost,127.0.0.1,ruoyi.vip,www.ruoyi.vip
-
-# 闃叉XSS鏀诲嚮
-xss:
-  # 杩囨护寮�鍏�
-  enabled: true
-  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
-  excludes: /system/notice
-  # 鍖归厤閾炬帴
-  urlPatterns: /system/*,/monitor/*,/tool/*

--
Gitblit v1.9.3