Просмотр исходного кода

- 关键词关联加上
- 修复部分bug

Huanyi 2 месяцев назад
Родитель
Сommit
159664e954
22 измененных файлов с 280 добавлено и 59 удалено
  1. 14 0
      ruoyi-common/ruoyi-common-mybatis/src/main/java/com/yingpaipay/common/mabatis/utils/WrapperUtils.java
  2. 2 2
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java
  3. 13 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/constant/DocumentNameConst.java
  4. 6 1
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/controller/FolderController.java
  5. 4 1
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/FolderKeyword.java
  6. 4 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/FolderBo.java
  7. 18 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/vo/DocumentNameVo.java
  8. 2 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/vo/FolderListVo.java
  9. 4 1
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/vo/FolderVo.java
  10. 2 2
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/mapper/FolderKeywordMapper.java
  11. 15 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/IFolderKeywordService.java
  12. 3 4
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/IFolderService.java
  13. 9 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/CommonProjectService.java
  14. 7 6
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/DocumentQcTaskDetailServiceImpl.java
  15. 61 14
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/DocumentServiceImpl.java
  16. 68 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/FolderKeywordServiceImpl.java
  17. 35 6
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/FolderServiceImpl.java
  18. 0 4
      ruoyi-modules/yingpaipay-setting/src/main/java/com/yingpaipay/setting/domain/vo/KeywordSettingVo.java
  19. 0 4
      ruoyi-modules/yingpaipay-setting/src/main/java/com/yingpaipay/setting/service/IFolderKeywordService.java
  20. 3 0
      ruoyi-modules/yingpaipay-setting/src/main/java/com/yingpaipay/setting/service/IKeywordSettingService.java
  21. 0 14
      ruoyi-modules/yingpaipay-setting/src/main/java/com/yingpaipay/setting/service/impl/FolderKeywordServiceImpl.java
  22. 10 0
      ruoyi-modules/yingpaipay-setting/src/main/java/com/yingpaipay/setting/service/impl/KeywordSettingServiceImpl.java

+ 14 - 0
ruoyi-common/ruoyi-common-mybatis/src/main/java/com/yingpaipay/common/mabatis/utils/WrapperUtils.java

@@ -0,0 +1,14 @@
+package com.yingpaipay.common.mabatis.utils;
+
+import java.util.List;
+
+public class WrapperUtils {
+
+    /**
+     * {@code IN} 和 {@code NOT IN} 不能使用空集合
+     */
+    public static List<Long> convertIds(List<Long> ids) {
+        return ids.isEmpty() ? List.of(-1L) : ids;
+    }
+
+}

+ 2 - 2
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java

@@ -61,13 +61,13 @@ public class SysUserVo implements Serializable {
     /**
      * 用户邮箱
      */
-    @Sensitive(strategy = SensitiveStrategy.EMAIL, perms = "system:user:edit")
+//    @Sensitive(strategy = SensitiveStrategy.EMAIL, perms = "system:user:edit")
     private String email;
 
     /**
      * 手机号码
      */
-    @Sensitive(strategy = SensitiveStrategy.PHONE, perms = "system:user:edit")
+//    @Sensitive(strategy = SensitiveStrategy.PHONE, perms = "system:user:edit")
     private String phonenumber;
 
     /**

+ 13 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/constant/DocumentNameConst.java

@@ -0,0 +1,13 @@
+package com.yingpaipay.business.constant;
+
+public interface DocumentNameConst {
+
+    Integer PROJECT = 0;
+
+    Integer CENTER_ID = 1;
+
+    Integer SPECIFIC_NAME = 2;
+
+    Integer EFFECTIVE_DATE = 3;
+
+}

+ 6 - 1
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/controller/FolderController.java

@@ -1,9 +1,9 @@
 package com.yingpaipay.business.controller;
 
-
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import com.yingpaipay.business.domain.bo.FolderBo;
 import com.yingpaipay.business.domain.bo.ProjectOnDocumentBo;
+import com.yingpaipay.business.domain.vo.DocumentNameVo;
 import com.yingpaipay.business.domain.vo.FolderListVo;
 import com.yingpaipay.business.domain.vo.FolderVo;
 import com.yingpaipay.business.domain.vo.ProjectOnDocumentVo;
@@ -89,4 +89,9 @@ public class FolderController extends BaseController {
         return R.ok(folderService.queryById(id));
     }
 
+    @GetMapping("/getName")
+    public R<DocumentNameVo> getDocumentName(Long centerId) {
+        return R.ok(folderService.getDocumentName(centerId));
+    }
+
 }

+ 4 - 1
ruoyi-modules/yingpaipay-setting/src/main/java/com/yingpaipay/setting/domain/FolderKeyword.java → ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/FolderKeyword.java

@@ -1,5 +1,7 @@
-package com.yingpaipay.setting.domain;
+package com.yingpaipay.business.domain;
 
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
@@ -7,6 +9,7 @@ import lombok.Data;
 @TableName("folder_keyword")
 public class FolderKeyword {
 
+    @TableId(value = "folder_id", type = IdType.INPUT)
     private Long folderId;
 
     private Long keywordId;

+ 4 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/FolderBo.java

@@ -9,6 +9,8 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
 
+import java.util.List;
+
 /**
  * 文件夹管理业务对象 folder
  *
@@ -63,4 +65,6 @@ public class FolderBo extends BaseEntity {
 
     private Integer restrictionLevel;
 
+    private List<Long> keywords;
+
 }

+ 18 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/vo/DocumentNameVo.java

@@ -0,0 +1,18 @@
+package com.yingpaipay.business.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+public class DocumentNameVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private String projectName;
+
+    private Long centerId;
+
+}

+ 2 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/vo/FolderListVo.java

@@ -18,6 +18,8 @@ public class FolderListVo implements Serializable {
 
     private Integer type;
 
+    private Long parentId;
+
     private List<FolderListVo> children;
 
 }

+ 4 - 1
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/vo/FolderVo.java

@@ -3,13 +3,14 @@ package com.yingpaipay.business.domain.vo;
 import com.yingpaipay.business.domain.Folder;
 import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
 import cn.idev.excel.annotation.ExcelProperty;
+import com.yingpaipay.setting.domain.vo.KeywordSettingVo;
 import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
 import java.util.Date;
-
+import java.util.List;
 
 
 /**
@@ -67,4 +68,6 @@ public class FolderVo implements Serializable {
     private Date updateTime;
 
     private Integer restrictionLevel;
+
+    private List<Long> keywords;
 }

+ 2 - 2
ruoyi-modules/yingpaipay-setting/src/main/java/com/yingpaipay/setting/mapper/FolderKeywordMapper.java → ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/mapper/FolderKeywordMapper.java

@@ -1,6 +1,6 @@
-package com.yingpaipay.setting.mapper;
+package com.yingpaipay.business.mapper;
 
-import com.yingpaipay.setting.domain.FolderKeyword;
+import com.yingpaipay.business.domain.FolderKeyword;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 
 public interface FolderKeywordMapper extends BaseMapperPlus<FolderKeyword, FolderKeyword> {

+ 15 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/IFolderKeywordService.java

@@ -0,0 +1,15 @@
+package com.yingpaipay.business.service;
+
+import com.yingpaipay.business.domain.FolderKeyword;
+
+import java.util.List;
+
+public interface IFolderKeywordService {
+    boolean insertByFolderIdAndKeyewordIds(Long folderId, List<Long> keywords);
+
+    List<FolderKeyword> getByFolderId(Long folderId);
+
+    boolean updateByFolderId(List<Long> keywords, Long folderId);
+
+    Long getByKeywordAndFolderIds(List<Long> selected, Long keyword);
+}

+ 3 - 4
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/IFolderService.java

@@ -3,10 +3,7 @@ package com.yingpaipay.business.service;
 import com.yingpaipay.business.domain.bo.FolderBo;
 import com.yingpaipay.business.domain.bo.ProjectCenterListBo;
 import com.yingpaipay.business.domain.bo.ProjectCenterMemberListBo;
-import com.yingpaipay.business.domain.vo.FolderListVo;
-import com.yingpaipay.business.domain.vo.FolderVo;
-import com.yingpaipay.business.domain.vo.ProjectCenterListVo;
-import com.yingpaipay.business.domain.vo.ProjectCenterMemberListVo;
+import com.yingpaipay.business.domain.vo.*;
 import jakarta.validation.constraints.NotNull;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -37,4 +34,6 @@ public interface IFolderService {
     TableDataInfo<ProjectCenterListVo> queryCenterInfo(ProjectCenterListBo bo, PageQuery pageQuery);
 
     TableDataInfo<ProjectCenterMemberListVo> queryCenterMember(ProjectCenterMemberListBo bo, PageQuery pageQuery);
+
+    DocumentNameVo getDocumentName(Long centerId);
 }

+ 9 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/CommonProjectService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.yingpaipay.business.domain.Project;
+import com.yingpaipay.business.enumeration.ProjectStatusEnum;
 import com.yingpaipay.business.mapper.ProjectMapper;
 import com.yingpaipay.system.domain.SysUserFolders;
 import com.yingpaipay.system.domain.SysUserProjects;
@@ -31,6 +32,7 @@ public class CommonProjectService {
             return List.of();
         }
         LambdaQueryWrapper<Project> wrapper = Wrappers.lambdaQuery(Project.class)
+            .notIn(Project::getStatus, List.of(ProjectStatusEnum.UNPLAYED.getValue(), ProjectStatusEnum.PAUSED.getValue(), ProjectStatusEnum.FINISHED.getValue()))
             .like(StringUtils.isNotBlank(projectCode), Project::getCode, projectCode)
             .like(StringUtils.isNotBlank(name), Project::getName, name);
 
@@ -106,4 +108,11 @@ public class CommonProjectService {
                 .like(StringUtils.isNotBlank(name), Project::getName, name)
         );
     }
+
+    public List<Project> queryUnderway() {
+        return baseMapper.selectList(
+            Wrappers.lambdaQuery(Project.class)
+                .notIn(Project::getStatus, List.of(ProjectStatusEnum.UNPLAYED.getValue(), ProjectStatusEnum.PAUSED.getValue(), ProjectStatusEnum.FINISHED.getValue()))
+        );
+    }
 }

+ 7 - 6
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/DocumentQcTaskDetailServiceImpl.java

@@ -19,6 +19,7 @@ import com.yingpaipay.business.enumeration.DocumentStatusEnum;
 import com.yingpaipay.business.enumeration.MailTemplateEnum;
 import com.yingpaipay.business.mapper.DocumentQcTaskLogMapper;
 import com.yingpaipay.business.mapper.DocumentQcTaskMapper;
+import com.yingpaipay.common.mabatis.utils.WrapperUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.exception.BusinessException;
@@ -329,17 +330,17 @@ public class DocumentQcTaskDetailServiceImpl implements IDocumentQcTaskDetailSer
             .orderByDesc(DocumentQcTaskDetail::getId);
 
         if (StringUtils.isNotBlank(bo.getTaskName())) {
-            wrapper.in(DocumentQcTaskDetail::getTaskId, taskIds.isEmpty() ? List.of(-1L) : taskIds);
+            wrapper.in(DocumentQcTaskDetail::getTaskId, WrapperUtils.convertIds(taskIds));
         }
 
-        wrapper.in(StringUtils.isNotBlank(bo.getProjectName()), DocumentQcTaskDetail::getProjectId, projectIds.isEmpty() ? List.of(-1L) : projectIds);
+        wrapper.in(StringUtils.isNotBlank(bo.getProjectName()), DocumentQcTaskDetail::getProjectId, WrapperUtils.convertIds(projectIds));
 
         if (StringUtils.isNotBlank(bo.getDocumentName())) {
             List<Long> documentIds = documentService.selectByName(bo.getDocumentName(), projectIds).stream().map(Document::getId).toList();
-            wrapper.in(DocumentQcTaskDetail::getDocumentId, documentIds.isEmpty() ? List.of(-1L) : documentIds);
+            wrapper.in(DocumentQcTaskDetail::getDocumentId, WrapperUtils.convertIds(documentIds));
         }
 
-        List<Long> logIds = logMapper.selectList(Wrappers.lambdaQuery(DocumentQcTaskLog.class).in(DocumentQcTaskLog::getTaskId, taskIds.isEmpty() ? List.of(-1L) : taskIds).eq(DocumentQcTaskLog::getDesignatedDealer, LoginHelper.getUserId()))
+        List<Long> logIds = logMapper.selectList(Wrappers.lambdaQuery(DocumentQcTaskLog.class).in(DocumentQcTaskLog::getTaskId, WrapperUtils.convertIds(taskIds)).eq(DocumentQcTaskLog::getDesignatedDealer, LoginHelper.getUserId()))
             .stream().map(DocumentQcTaskLog::getDetailId).toList();
 
         /**
@@ -354,7 +355,7 @@ public class DocumentQcTaskDetailServiceImpl implements IDocumentQcTaskDetailSer
             // 使用 <code>.or().and(action)</code> 莫名奇妙 <code>OR</code> 会失效,最终结果会变成 <code>AND ((executor = 12 AND status = 0) AND (id IN (-1) AND status = 2))</code>
             // 即使使用 <code>.and(w -> w.and().or().and())</code> 结果也是错误的
             .or(bo.getStatus() == null || bo.getStatus().equals(DocumentQcStatusEnum.REJECT.getCode()), w -> w
-                .in(DocumentQcTaskDetail::getId, logIds.isEmpty() ? List.of(-1L) : logIds)
+                .in(DocumentQcTaskDetail::getId, WrapperUtils.convertIds(logIds))
                 .eq(DocumentQcTaskDetail::getStatus, DocumentQcStatusEnum.REJECT.getCode())
             );
 
@@ -365,7 +366,7 @@ public class DocumentQcTaskDetailServiceImpl implements IDocumentQcTaskDetailSer
 
         return Wrappers.lambdaQuery(DocumentQcTaskDetail.class)
             .eq(DocumentQcTaskDetail::getTaskId, bo.getTaskId())
-            .in(StringUtils.isNotBlank(bo.getDocumentName()), DocumentQcTaskDetail::getDocumentId, documentIds.isEmpty() ? List.of(-1L) : documentIds)
+            .in(StringUtils.isNotBlank(bo.getDocumentName()), DocumentQcTaskDetail::getDocumentId, WrapperUtils.convertIds(documentIds))
             .orderByDesc(DocumentQcTaskDetail::getId);
     }
 }

+ 61 - 14
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/DocumentServiceImpl.java

@@ -4,16 +4,18 @@ import cn.hutool.core.lang.Dict;
 import cn.hutool.core.util.IdUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yingpaipay.business.constant.*;
-import com.yingpaipay.business.domain.DocumentAuditLog;
-import com.yingpaipay.business.domain.Folder;
-import com.yingpaipay.business.domain.Project;
+import com.yingpaipay.business.domain.*;
 import com.yingpaipay.business.domain.bo.*;
 import com.yingpaipay.business.domain.excel.ProjectExcel;
 import com.yingpaipay.business.domain.vo.*;
 import com.yingpaipay.business.enumeration.DocumentStatusEnum;
 import com.yingpaipay.business.enumeration.MailTemplateEnum;
 import com.yingpaipay.business.mapper.DocumentAuditLogMapper;
+import com.yingpaipay.business.service.IFolderKeywordService;
+import com.yingpaipay.common.mabatis.utils.WrapperUtils;
 import com.yingpaipay.common.file.util.PdfUtils;
+import com.yingpaipay.setting.domain.vo.KeywordSettingVo;
+import com.yingpaipay.setting.service.IKeywordSettingService;
 import com.yingpaipay.system.mapper.SysUserFoldersMapper;
 import jakarta.servlet.http.HttpServletResponse;
 import org.apache.commons.io.FilenameUtils;
@@ -47,7 +49,6 @@ import org.dromara.system.service.ISysUserService;
 import org.springframework.context.i18n.LocaleContextHolder;
 import org.springframework.http.MediaType;
 import org.springframework.stereotype.Service;
-import com.yingpaipay.business.domain.Document;
 import com.yingpaipay.business.mapper.DocumentMapper;
 import com.yingpaipay.business.service.IDocumentService;
 import org.springframework.transaction.annotation.Transactional;
@@ -83,6 +84,8 @@ public class DocumentServiceImpl implements IDocumentService {
     private final ISysUserService userService;
     private final CommonFolderService folderService;
     private final CommonProjectService projectService;
+    private final IFolderKeywordService folderKeywordService;
+    private final IKeywordSettingService keywordSettingService;
 
     /**
      * 水印的锁
@@ -592,10 +595,12 @@ public class DocumentServiceImpl implements IDocumentService {
     @Override
     public AppletMineCountVo getCount() {
         AppletMineCountVo vo = new AppletMineCountVo();
+        List<Long> projects = projectService.queryUnderway().stream().map(Project::getId).toList();
         List<Document> documentList = baseMapper.selectList(
             Wrappers.lambdaQuery(Document.class)
                 .eq(Document::getPlanSubmitter, LoginHelper.getUserId())
                 .in(Document::getStatus, List.of(DocumentStatusEnum.UN_UPLOAD.getValue(), DocumentStatusEnum.UN_AUDIT.getValue(), DocumentStatusEnum.AUDIT_REJECT.getValue()))
+                .in(Document::getProjectId, WrapperUtils.convertIds(projects))
         );
         vo.setToSubmit(
             documentList
@@ -659,10 +664,12 @@ public class DocumentServiceImpl implements IDocumentService {
 
     @Override
     public TableDataInfo<AppletDocumentScanSubmitVo> listToSubmit(AppletDocumentScanSubmitBo bo, PageQuery pageQuery) {
+
         IPage<Document> page = baseMapper.selectPage(
             pageQuery.build(),
             Wrappers.lambdaQuery(Document.class)
                 .eq(Document::getPlanSubmitter, LoginHelper.getUserId())
+                .in(Document::getProjectId, WrapperUtils.convertIds(projectService.queryUnderway().stream().map(Project::getId).toList()))
                 .in(Document::getStatus, List.of(DocumentStatusEnum.UN_UPLOAD.getValue(), DocumentStatusEnum.AUDIT_REJECT.getValue()))
                 .like(StringUtils.isNotBlank(bo.getName()), Document::getName, bo.getName())
                 .orderByDesc(Document::getId)
@@ -836,24 +843,60 @@ public class DocumentServiceImpl implements IDocumentService {
         }
         SysOssVo ossVo = ossService.upload(file);
 
+        /**
+         * 先确认文件夹
+         */
         List<Folder> folders = folderService.queryByProjectIds(List.of(bo.getProjectId()));
-        Map<Long, Folder> folderMap = new HashMap<>();
-            folders.forEach(e -> folderMap.put(e.getId(), e));
+//        List<Long> folderIds = new ArrayList<>();
+//        Map<Long, Folder> folderMap = new HashMap<>();
+//        folders.forEach(e -> {
+//            folderMap.put(e.getId(), e);
+//            folderIds.add(e.getId());
+//        });
         Map<Long, List<Folder>> childrenMap = folders.stream().filter(e -> e.getParentId() != null).collect(Collectors.groupingBy(Folder::getParentId));
         List<Long> selected = new ArrayList<>();
+        // 确认层级 -> 项目、国家、中心
         if (bo.getCenter() != 0L) {
-            buildFolders(selected, folderMap.get(bo.getCenter()), childrenMap);
+            List<Folder> list = childrenMap.get(bo.getCenter());
+            for (Folder folder : list) {
+                buildFolders(selected, folder, childrenMap);
+            }
+        } else if (bo.getCountry() != 0L) {
+            List<Folder> list = childrenMap.get(bo.getCountry());
+            for (Folder folder : list) {
+                if (!folder.getType().equals(FolderTypeConst.CENTER)) {
+                    buildFolders(selected, folder, childrenMap);
+                }
+            }
         } else {
-            if (bo.getCountry() != 0L) {
-                buildFolders(selected, folderMap.get(bo.getCountry()), childrenMap);
-            } else {
-                selected = folders.stream().map(Folder::getId).toList();
+            List<Folder> list = folders.stream().filter(e -> e.getParentId() == null).filter(e -> e.getType().equals(FolderTypeConst.NORMAL)).toList();
+            for (Folder folder : list) {
+                if (!folder.getType().equals(FolderTypeConst.CENTER)) {
+                    buildFolders(selected, folder, childrenMap);
+                }
             }
         }
+        // 正式开始锁定
+        Long folderId, keyword = null;
+        String[] strs = bo.getName().split("-");
+        List<KeywordSettingVo> words = keywordSettingService.list();
+        for (KeywordSettingVo word : words) {
+            if (strs[DocumentNameConst.SPECIFIC_NAME].contains(word.getContent())) {
+                keyword = word.getId();
+                break;
+            }
+        }
+        folderId = folderKeywordService.getByKeywordAndFolderIds(selected, keyword);
+        if (folderId == null) {
+            folderId = bo.getCenter() != null ? bo.getCenter() : bo.getCountry() != null ? bo.getCountry() : 0L;
+        }
+
         List<Document> documents = baseMapper.selectList(
             Wrappers.lambdaQuery(Document.class)
-                .in(Document::getFolderId, selected)
+                .eq(Document::getFolderId, folderId)
         );
+
+        // 再锁定具体文件
         for (Document document : documents) {
             if (document.getName().equals(bo.getName())) {
                 document.setActualDocument(ossVo.getOssId());
@@ -866,7 +909,7 @@ public class DocumentServiceImpl implements IDocumentService {
         }
 
         Document document = new Document();
-        document.setFolderId(bo.getCenter() != 0L ? bo.getCenter() : bo.getCountry());
+        document.setFolderId(folderId);
         document.setName(bo.getName());
         document.setStatus(DocumentStatusEnum.UN_AUDIT.getValue());
         document.setActualDocument(ossVo.getOssId());
@@ -1090,6 +1133,10 @@ public class DocumentServiceImpl implements IDocumentService {
 
     private LambdaQueryWrapper<Document> buildListWrapperOnWorkbench() {
         LambdaQueryWrapper<Document> wrapper = Wrappers.lambdaQuery(Document.class);
+
+        List<Long> projects = projectService.queryUnderway().stream().map(Project::getId).toList();
+        wrapper.in(Document::getProjectId, WrapperUtils.convertIds(projects));
+
         wrapper.and(w -> w
             .eq(Document::getPlanSubmitter, LoginHelper.getUserId())
             .eq(Document::getStatus, DocumentStatusEnum.UN_UPLOAD.getValue())
@@ -1130,7 +1177,7 @@ public class DocumentServiceImpl implements IDocumentService {
 
     private LambdaQueryWrapper<Document> buildOnSearchWrapper(DocumentSearchBo bo, List<Long> projectIds) {
         return Wrappers.lambdaQuery(Document.class)
-            .in(StringUtils.isNotBlank(bo.getProjectName()) || StringUtils.isNotBlank(bo.getProjectCode()), Document::getProjectId, projectIds.isEmpty() ? List.of(-1L) : projectIds)
+            .in(StringUtils.isNotBlank(bo.getProjectName()) || StringUtils.isNotBlank(bo.getProjectCode()), Document::getProjectId, WrapperUtils.convertIds(projectIds))
             .like(StringUtils.isNotBlank(bo.getName()), Document::getName, bo.getName())
             .eq(bo.getStatus() != null, Document::getStatus, bo.getStatus())
             .eq(bo.getType() != null, Document::getPlanType, bo.getType())

+ 68 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/FolderKeywordServiceImpl.java

@@ -0,0 +1,68 @@
+package com.yingpaipay.business.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.yingpaipay.business.domain.FolderKeyword;
+import com.yingpaipay.business.mapper.FolderKeywordMapper;
+import com.yingpaipay.business.service.IFolderKeywordService;
+import com.yingpaipay.common.mabatis.utils.WrapperUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class FolderKeywordServiceImpl implements IFolderKeywordService {
+
+    private final FolderKeywordMapper baseMapper;
+
+    @Override
+    public boolean insertByFolderIdAndKeyewordIds(Long folderId, List<Long> keywords) {
+        return baseMapper.insertBatch(
+            keywords.stream().map(id -> {
+                FolderKeyword e = new FolderKeyword();
+                e.setFolderId(folderId);
+                e.setKeywordId(id);
+                return e;
+            }).toList()
+        );
+    }
+
+    @Override
+    public List<FolderKeyword> getByFolderId(Long folderId) {
+        return baseMapper.selectList(
+            Wrappers.lambdaQuery(FolderKeyword.class)
+                .eq(FolderKeyword::getFolderId, folderId)
+        );
+    }
+
+    @Override
+    public boolean updateByFolderId(List<Long> keywords, Long folderId) {
+        boolean deleteFlag = baseMapper.delete(
+            Wrappers.lambdaQuery(FolderKeyword.class)
+                .eq(FolderKeyword::getFolderId, folderId)
+        ) == 0;
+        if (deleteFlag) {
+            throw new RuntimeException("批量删除旧的失败");
+        }
+        return baseMapper.insertBatch(
+            keywords.stream().map(id -> {
+                FolderKeyword e = new FolderKeyword();
+                e.setFolderId(folderId);
+                e.setKeywordId(id);
+                return e;
+            }).toList()
+        );
+    }
+
+    @Override
+    public Long getByKeywordAndFolderIds(List<Long> selected, Long keyword) {
+        return baseMapper.selectOne(
+            Wrappers.lambdaQuery(FolderKeyword.class)
+                .in(FolderKeyword::getFolderId, WrapperUtils.convertIds(selected))
+                .eq(FolderKeyword::getKeywordId, keyword)
+                .last("LIMIT 1")
+        ).getFolderId();
+    }
+}

+ 35 - 6
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/FolderServiceImpl.java

@@ -7,13 +7,14 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.yingpaipay.business.constant.DocumentTypeConst;
 import com.yingpaipay.business.constant.FolderTypeConst;
 import com.yingpaipay.business.domain.Folder;
+import com.yingpaipay.business.domain.FolderKeyword;
+import com.yingpaipay.business.domain.Project;
 import com.yingpaipay.business.domain.bo.FolderBo;
 import com.yingpaipay.business.domain.bo.ProjectCenterListBo;
 import com.yingpaipay.business.domain.bo.ProjectCenterMemberListBo;
-import com.yingpaipay.business.domain.vo.FolderListVo;
-import com.yingpaipay.business.domain.vo.FolderVo;
-import com.yingpaipay.business.domain.vo.ProjectCenterListVo;
-import com.yingpaipay.business.domain.vo.ProjectCenterMemberListVo;
+import com.yingpaipay.business.domain.vo.*;
+import com.yingpaipay.business.service.IFolderKeywordService;
+import com.yingpaipay.setting.service.IKeywordSettingService;
 import com.yingpaipay.system.domain.SysUserFolders;
 import com.yingpaipay.system.mapper.SysUserFoldersMapper;
 import lombok.RequiredArgsConstructor;
@@ -57,6 +58,9 @@ public class FolderServiceImpl implements IFolderService {
 
     private final ISysUserService userService;
     private final ISysDeptService deptService;
+    private final IFolderKeywordService folderKeywordService;
+    private final IKeywordSettingService keywordSettingService;
+    private final CommonProjectService projectService;
 
     @Override
     public List<FolderListVo> selectList(Long projectId) {
@@ -142,6 +146,7 @@ public class FolderServiceImpl implements IFolderService {
         vo.setId(folder.getId());
         vo.setName(folder.getName());
         vo.setType(folder.getType());
+        vo.setParentId(folder.getParentId());
 
         List<Folder> children = childrenMap.get(folder.getId());
         if (children != null && !children.isEmpty()) {
@@ -167,6 +172,7 @@ public class FolderServiceImpl implements IFolderService {
             vo.setId(e.getId());
             vo.setName(e.getName());
             vo.setType(e.getType());
+            vo.setParentId(e.getParentId());
             vo.setChildren(buildChildren(e, childrenMap));
             vos.add(vo);
         });
@@ -184,6 +190,7 @@ public class FolderServiceImpl implements IFolderService {
             vo.setId(childFolder.getId());
             vo.setName(childFolder.getName());
             vo.setType(childFolder.getType());
+            vo.setParentId(childFolder.getParentId());
             vo.setChildren(buildChildren(childFolder, childrenMap));
             return vo;
         }).toList();
@@ -203,9 +210,15 @@ public class FolderServiceImpl implements IFolderService {
         Folder entity = MapstructUtils.convert(bo, Folder.class);
         boolean flag = baseMapper.insert(entity) == 0;
         if (flag) {
-            throw new RuntimeException("插入失败");
+            throw new RuntimeException("插入文件夹失败");
         }
         checkInsertIsValid(bo);
+
+        boolean keywordFlag = folderKeywordService.insertByFolderIdAndKeyewordIds(entity.getId(), bo.getKeywords());
+        if (!keywordFlag) {
+            throw new RuntimeException("批量插入文件夹关键词关联关系失败");
+        }
+
         return true;
     }
 
@@ -236,6 +249,10 @@ public class FolderServiceImpl implements IFolderService {
         if (flag) {
             throw new RuntimeException("更新操作失败");
         }
+        boolean keywordFlag = folderKeywordService.updateByFolderId(bo.getKeywords(), bo.getId());
+        if (!keywordFlag) {
+            throw new RuntimeException("更新关键词失败");
+        }
         checkInsertIsValid(bo);
         checkUpdateIsValid(bo);
         return true;
@@ -265,7 +282,9 @@ public class FolderServiceImpl implements IFolderService {
 
     @Override
     public FolderVo queryById(Long id) {
-        return baseMapper.selectVoById(id);
+        FolderVo vo = baseMapper.selectVoById(id);
+        vo.setKeywords(folderKeywordService.getByFolderId(id).stream().map(FolderKeyword::getKeywordId).toList());
+        return vo;
     }
 
     @Override
@@ -403,6 +422,16 @@ public class FolderServiceImpl implements IFolderService {
         }));
     }
 
+    @Override
+    public DocumentNameVo getDocumentName(Long centerId) {
+        Folder center = baseMapper.selectById(centerId);
+        Project project = projectService.queryById(center.getProjectId());
+        DocumentNameVo vo = new DocumentNameVo();
+        vo.setProjectName(project.getName());
+        vo.setCenterId(centerId);
+        return vo;
+    }
+
     private LambdaQueryWrapper<Folder> buildCenterQueryWrapper(ProjectCenterListBo bo) {
         return Wrappers.lambdaQuery(Folder.class)
             .eq(Folder::getType, FolderTypeConst.CENTER)

+ 0 - 4
ruoyi-modules/yingpaipay-setting/src/main/java/com/yingpaipay/setting/domain/vo/KeywordSettingVo.java

@@ -3,15 +3,11 @@ package com.yingpaipay.setting.domain.vo;
 import com.yingpaipay.setting.domain.KeywordSetting;
 import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
 import cn.idev.excel.annotation.ExcelProperty;
-import org.dromara.common.excel.annotation.ExcelDictFormat;
-import org.dromara.common.excel.convert.ExcelDictConvert;
 import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
-import java.util.Date;
-
 
 
 /**

+ 0 - 4
ruoyi-modules/yingpaipay-setting/src/main/java/com/yingpaipay/setting/service/IFolderKeywordService.java

@@ -1,4 +0,0 @@
-package com.yingpaipay.setting.service;
-
-public interface IFolderKeywordService {
-}

+ 3 - 0
ruoyi-modules/yingpaipay-setting/src/main/java/com/yingpaipay/setting/service/IKeywordSettingService.java

@@ -67,4 +67,7 @@ public interface IKeywordSettingService {
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
     List<KeywordSettingVo> list();
+
+    List<KeywordSettingVo> queryByIds(List<Long> keywords);
+
 }

+ 0 - 14
ruoyi-modules/yingpaipay-setting/src/main/java/com/yingpaipay/setting/service/impl/FolderKeywordServiceImpl.java

@@ -1,14 +0,0 @@
-package com.yingpaipay.setting.service.impl;
-
-import com.yingpaipay.setting.mapper.FolderKeywordMapper;
-import com.yingpaipay.setting.service.IFolderKeywordService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-
-@Service
-@RequiredArgsConstructor
-public class FolderKeywordServiceImpl implements IFolderKeywordService {
-
-    private final FolderKeywordMapper baseMapper;
-
-}

+ 10 - 0
ruoyi-modules/yingpaipay-setting/src/main/java/com/yingpaipay/setting/service/impl/KeywordSettingServiceImpl.java

@@ -22,6 +22,7 @@ import com.yingpaipay.setting.domain.KeywordSetting;
 import com.yingpaipay.setting.mapper.KeywordSettingMapper;
 import com.yingpaipay.setting.service.IKeywordSettingService;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Collection;
@@ -150,4 +151,13 @@ public class KeywordSettingServiceImpl implements IKeywordSettingService {
     public List<KeywordSettingVo> list() {
         return baseMapper.selectVoList();
     }
+
+    @Override
+    public List<KeywordSettingVo> queryByIds(List<Long> keywords) {
+        if (keywords.isEmpty()) {
+            return Collections.emptyList();
+        }
+        return baseMapper.selectVoByIds(keywords);
+    }
+
 }