Browse Source

归档已完成

Huanyi 3 months ago
parent
commit
43a9ec1b24
16 changed files with 285 additions and 28 deletions
  1. 1 1
      ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java
  2. 2 4
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/constant/QualityControlTaskStatusConst.java
  3. 22 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/controller/TaskCenterController.java
  4. 4 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/Document.java
  5. 4 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/DocumentBo.java
  6. 4 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/DocumentFilingBo.java
  7. 10 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/DocumentSendBo.java
  8. 16 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/TaskCenterFilingListBo.java
  9. 4 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/vo/DocumentVo.java
  10. 47 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/vo/TaskCenterFilingListVo.java
  11. 4 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/vo/TaskCenterSubmissionListVo.java
  12. 5 4
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/IDocumentService.java
  13. 45 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/CommonFolderService.java
  14. 19 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/CommonProjectService.java
  15. 63 4
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/DocumentServiceImpl.java
  16. 35 15
      script/sql/business/create.sql

+ 1 - 1
ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java

@@ -22,7 +22,7 @@ public class DromaraApplication {
         SpringApplication application = new SpringApplication(DromaraApplication.class);
         application.setApplicationStartup(new BufferingApplicationStartup(2048));
         application.run(args);
-        log.warn("(♥◠‿◠)ノ゙  智能eTMF系统 启动成功   ლ(´ڡ`ლ)゙");
+        log.info("(♥◠‿◠)ノ゙  智能eTMF系统 启动成功   ლ(´ڡ`ლ)゙");
     }
 
 }

+ 2 - 4
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/constant/QualityControlTaskStatusConst.java

@@ -2,10 +2,8 @@ package com.yingpaipay.business.constant;
 
 public interface QualityControlTaskStatusConst {
 
-    Integer NON_EXECUTION = 0;
+    Integer IN_EXECUTION = 0;
 
-    Integer IN_EXECUTION = 1;
-
-    Integer COMPLETE = 2;
+    Integer COMPLETE = 1;
 
 }

+ 22 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/controller/TaskCenterController.java

@@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
 import com.yingpaipay.business.domain.bo.*;
 import com.yingpaipay.business.domain.vo.DocumentAuditLogVo;
 import com.yingpaipay.business.domain.vo.TaskCenterAuditListVo;
+import com.yingpaipay.business.domain.vo.TaskCenterFilingListVo;
 import com.yingpaipay.business.domain.vo.TaskCenterSubmissionListVo;
 import com.yingpaipay.business.service.IDocumentService;
 import lombok.RequiredArgsConstructor;
@@ -13,6 +14,7 @@ import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.web.core.BaseController;
+import org.springframework.data.domain.Page;
 import org.springframework.web.bind.annotation.*;
 
 @RestController
@@ -35,6 +37,13 @@ public class TaskCenterController extends BaseController {
         return toAjax(documentService.submit(bo));
     }
 
+    @SaCheckPermission("taskCenter:submission:send")
+    @Log(title = "文档", businessType = BusinessType.UPDATE)
+    @PutMapping("/submission/send")
+    public R<Void> send(@RequestBody DocumentSendBo bo) {
+        return toAjax(documentService.send(bo));
+    }
+
     @SaCheckPermission("taskCenter:submission:logAudit")
     @GetMapping("/logAudit")
     public TableDataInfo<DocumentAuditLogVo> logAudit(DocumentAuditLogBo bo, PageQuery pageQuery) {
@@ -54,4 +63,17 @@ public class TaskCenterController extends BaseController {
         return toAjax(documentService.audit(bo));
     }
 
+    @SaCheckPermission("taskCenter:filing:list")
+    @GetMapping("/filing/list")
+    public TableDataInfo<TaskCenterFilingListVo> listFiling(TaskCenterFilingListBo bo, PageQuery pageQuery) {
+        return documentService.listOnFiling(bo, pageQuery);
+    }
+
+    @SaCheckPermission("taskCenter:filing:filing")
+    @Log(title = "任务中心", businessType = BusinessType.UPDATE)
+    @PutMapping("/filing/filing")
+    public R<Void> filing(@RequestBody DocumentFilingBo bo) {
+        return toAjax(documentService.filing(bo));
+    }
+
 }

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

@@ -85,4 +85,8 @@ public class Document extends TenantEntity {
 
     private Integer specificationType;
 
+    private Boolean sendFlag;
+
+    private Boolean sendStatus;
+
 }

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

@@ -86,4 +86,8 @@ public class DocumentBo extends BaseEntity {
 
     private Long projectId;
 
+    private Boolean sendFlag;
+
+    private Boolean sendStatus;
+
 }

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

@@ -7,4 +7,8 @@ public class DocumentFilingBo {
 
     private Long documentId;
 
+    private Long folderId;
+
+    private Long projectId;
+
 }

+ 10 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/DocumentSendBo.java

@@ -0,0 +1,10 @@
+package com.yingpaipay.business.domain.bo;
+
+import lombok.Data;
+
+@Data
+public class DocumentSendBo {
+
+    private Long id;
+
+}

+ 16 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/TaskCenterFilingListBo.java

@@ -0,0 +1,16 @@
+package com.yingpaipay.business.domain.bo;
+
+import lombok.Data;
+
+@Data
+public class TaskCenterFilingListBo {
+
+    private String projectCode;
+
+    private String projectName;
+
+    private String centerName;
+
+    private String name;
+
+}

+ 4 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/vo/DocumentVo.java

@@ -116,4 +116,8 @@ public class DocumentVo implements Serializable {
 
     private Integer specificationType;
 
+    private Boolean sendFlag;
+
+    private Boolean sendStatus;
+
 }

+ 47 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/vo/TaskCenterFilingListVo.java

@@ -0,0 +1,47 @@
+package com.yingpaipay.business.domain.vo;
+
+import com.yingpaipay.business.domain.Document;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+import java.util.Date;
+
+@Data
+@AutoMapper(target = Document.class)
+public class TaskCenterFilingListVo {
+
+    private Long id;
+
+    private String name;
+
+    private Integer status;
+
+    @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "submitterId")
+    private String submitter;
+    private Long submitterId;
+
+    private Date deadline;
+
+    private Date submitTime;
+
+    @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy")
+    private String createBy;
+
+    private Date createTime;
+
+    private Long ossId;
+
+    private String ossUrl;
+
+    private Integer type;
+
+    private String documentType;
+
+    private Long projectId;
+
+    private Long folderId;
+    private String folderName;
+
+}

+ 4 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/vo/TaskCenterSubmissionListVo.java

@@ -35,4 +35,8 @@ public class TaskCenterSubmissionListVo {
 
     private Date createTime;
 
+    private Boolean sendFlag;
+
+    private Boolean sendStatus;
+
 }

+ 5 - 4
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/IDocumentService.java

@@ -1,10 +1,7 @@
 package com.yingpaipay.business.service;
 
 import com.yingpaipay.business.domain.bo.*;
-import com.yingpaipay.business.domain.vo.DocumentAuditLogVo;
-import com.yingpaipay.business.domain.vo.DocumentVo;
-import com.yingpaipay.business.domain.vo.TaskCenterAuditListVo;
-import com.yingpaipay.business.domain.vo.TaskCenterSubmissionListVo;
+import com.yingpaipay.business.domain.vo.*;
 import jakarta.servlet.http.HttpServletResponse;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
@@ -90,4 +87,8 @@ public interface IDocumentService {
     void download(Long ossId, HttpServletResponse response) throws IOException;
 
     TableDataInfo<DocumentVo> listOnSearch(DocumentSearchBo bo, PageQuery pageQuery);
+
+    boolean send(DocumentSendBo bo);
+
+    TableDataInfo<TaskCenterFilingListVo> listOnFiling(TaskCenterFilingListBo bo, PageQuery pageQuery);
 }

+ 45 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/CommonFolderService.java

@@ -99,4 +99,49 @@ public class CommonFolderService {
         }
         return baseMapper.selectByIds(folderIds);
     }
+
+    public Folder getById(Long folderId) {
+        return baseMapper.selectById(folderId);
+    }
+
+    public List<Long> selectIdsOnFiling(String centerName, List<Long> projectIds) {
+        if (projectIds.isEmpty()) {
+            return List.of();
+        }
+        List<Long> ids = new ArrayList<>();
+        List<Long> centerIds = new ArrayList<>();
+        List<Folder> allFolders = baseMapper.selectList(Wrappers.lambdaQuery(Folder.class).in(Folder::getProjectId, projectIds));
+        Map<Long, List<Folder>> childrenMap = allFolders
+            .stream()
+            .filter(e -> e.getParentId() != null)
+            .collect(Collectors.groupingBy(Folder::getParentId));
+        Map<Long, List<Folder>> folderProjectMap = allFolders.stream().filter(e -> e.getParentId() == null).collect(Collectors.groupingBy(Folder::getProjectId));
+        userFoldersMapper.selectList(
+            Wrappers.lambdaQuery(SysUserFolders.class)
+                .eq(SysUserFolders::getUserId, LoginHelper.getUserId())
+                .in(SysUserFolders::getProjectId, projectIds)
+        ).forEach(e -> {
+            if (e.getFolders().equals("*")) {
+                List<Folder> folders = folderProjectMap.get(e.getProjectId());
+                for (Folder folder : folders) {
+                    centerIds.add(folder.getId());
+                }
+            } else {
+                centerIds.addAll(Arrays.stream(e.getFolders().split(",")).map(Long::valueOf).toList());
+            }
+        });
+
+        for (Long centerId : centerIds) {
+            buildAuthrizedFolders(centerId, ids, childrenMap);
+        }
+
+        return ids;
+    }
+
+    public List<Folder> listByIds(List<Long> ids) {
+        if (ids.isEmpty()) {
+            return List.of();
+        }
+        return baseMapper.selectByIds(ids);
+    }
 }

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

@@ -53,4 +53,23 @@ public class CommonProjectService {
     public Project queryById(Long projectId) {
         return baseMapper.selectById(projectId);
     }
+
+    public List<Long> queryIdsOnFiling(String projectCode, String name) {
+        List<Long> ids = new ArrayList<>();
+        SysUserProjects userProjects = userProjectsMapper.selectOne(Wrappers.lambdaQuery(SysUserProjects.class).eq(SysUserProjects::getUserId, LoginHelper.getUserId()));
+        if (userProjects == null) {
+            return List.of();
+        }
+        LambdaQueryWrapper<Project> wrapper = Wrappers.lambdaQuery(Project.class)
+            .like(StringUtils.isNotBlank(projectCode), Project::getCode, projectCode)
+            .like(StringUtils.isNotBlank(name), Project::getName, name);
+
+        // 因为Arrays代码会前置执行,所以使用condition作为判断会抛出异常
+        if (!userProjects.getProjects().equals("*")) {
+            wrapper.in(Project::getId, Arrays.stream(userProjects.getProjects().split(",")).map(Long::valueOf).toList());
+        }
+
+        baseMapper.selectList(wrapper).forEach(e -> ids.add(e.getId()));
+        return ids;
+    }
 }

+ 63 - 4
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/DocumentServiceImpl.java

@@ -11,9 +11,7 @@ import com.yingpaipay.business.domain.DocumentAuditLog;
 import com.yingpaipay.business.domain.Folder;
 import com.yingpaipay.business.domain.Project;
 import com.yingpaipay.business.domain.bo.*;
-import com.yingpaipay.business.domain.vo.DocumentAuditLogVo;
-import com.yingpaipay.business.domain.vo.TaskCenterAuditListVo;
-import com.yingpaipay.business.domain.vo.TaskCenterSubmissionListVo;
+import com.yingpaipay.business.domain.vo.*;
 import com.yingpaipay.business.mapper.DocumentAuditLogMapper;
 import com.yingpaipay.common.file.util.WatermarkUtils;
 import jakarta.servlet.http.HttpServletResponse;
@@ -43,7 +41,6 @@ import org.dromara.system.service.ISysOssService;
 import org.dromara.system.service.ISysUserService;
 import org.springframework.http.MediaType;
 import org.springframework.stereotype.Service;
-import com.yingpaipay.business.domain.vo.DocumentVo;
 import com.yingpaipay.business.domain.Document;
 import com.yingpaipay.business.mapper.DocumentMapper;
 import com.yingpaipay.business.service.IDocumentService;
@@ -305,9 +302,12 @@ public class DocumentServiceImpl implements IDocumentService {
 
     @Override
     public boolean filing(DocumentFilingBo bo) {
+        int type = folderService.getSpecificationType(bo.getFolderId(), bo.getProjectId());
         return baseMapper.update(
             Wrappers.lambdaUpdate(Document.class)
                 .eq(Document::getId, bo.getDocumentId())
+                .set(Document::getFolderId, bo.getFolderId())
+                .set(Document::getSpecificationType, type)
                 .set(Document::getStatus, DocumentStatusConst.FILING)
         ) > 0;
     }
@@ -332,6 +332,8 @@ public class DocumentServiceImpl implements IDocumentService {
             vo.setDeadline(e.getSubmitDeadline());
             vo.setSubmitTime(e.getSubmitTime());
             vo.setCreateTime(e.getCreateTime());
+            vo.setSendFlag(e.getSendFlag());
+            vo.setSendStatus(e.getSendStatus());
             return vo;
         }));
     }
@@ -427,6 +429,63 @@ public class DocumentServiceImpl implements IDocumentService {
         return TableDataInfo.build(page);
     }
 
+    @Override
+    public boolean send(DocumentSendBo bo) {
+        return baseMapper.update(
+            Wrappers.lambdaUpdate(Document.class)
+                .eq(Document::getId, bo.getId())
+                .set(Document::getSendStatus, true)
+        ) > 0;
+    }
+
+    @Override
+    public TableDataInfo<TaskCenterFilingListVo> listOnFiling(TaskCenterFilingListBo bo, PageQuery pageQuery) {
+        List<Long> projectIds = projectService.queryIdsOnFiling(bo.getProjectCode(), bo.getProjectName());
+        if (projectIds.isEmpty()) {
+            return TableDataInfo.build();
+        }
+        List<Long> folderIds = folderService.selectIdsOnFiling(bo.getCenterName(), projectIds);
+        LambdaQueryWrapper<Document> wrapper = buildFilingListWrapper(bo, folderIds);
+        IPage<Document> page = baseMapper.selectPage(pageQuery.build(), wrapper);
+        List<Long> ossIds = new ArrayList<>();
+        Map<Long, String> ossMap = new HashMap<>();
+        List<Long> folderIdsInDocument = new ArrayList<>();
+        Map<Long, String> folderMap = new HashMap<>();
+        page.getRecords().forEach(e -> {
+            ossIds.add(e.getOssId());
+            folderIdsInDocument.add(e.getFolderId());
+        });
+        folderService.listByIds(folderIdsInDocument).forEach(e -> folderMap.put(e.getId(), e.getName()));
+        ossService.queryListByIds(ossIds).forEach(e -> ossMap.put(e.getOssId(), e.getUrl()));
+        return TableDataInfo.build(page.convert(e -> {
+            TaskCenterFilingListVo vo = new TaskCenterFilingListVo();
+            vo.setId(e.getId());
+            vo.setName(e.getName());
+            vo.setStatus(e.getStatus());
+            vo.setDeadline(e.getSubmitDeadline());
+            vo.setSubmitterId(e.getSubmitterId());
+            vo.setSubmitTime(e.getSubmitTime());
+            vo.setCreateTime(e.getCreateTime());
+            vo.setOssId(e.getOssId());
+            vo.setOssUrl(ossMap.get(e.getOssId()));
+            vo.setType(e.getType());
+            vo.setDocumentType(e.getPlanType());
+            vo.setProjectId(e.getProjectId());
+            vo.setFolderId(e.getFolderId());
+            vo.setFolderName(folderMap.get(e.getFolderId()));
+            return vo;
+        }));
+    }
+
+    private LambdaQueryWrapper<Document> buildFilingListWrapper(TaskCenterFilingListBo bo, List<Long> folderIds) {
+        return Wrappers.lambdaQuery(Document.class)
+            .like(StringUtils.isNotBlank(bo.getName()), Document::getName, bo.getName())
+            .eq(Document::getCreateBy, LoginHelper.getUserId())
+            .in(!folderIds.isEmpty(), Document::getFolderId, folderIds)
+            .in(Document::getStatus, List.of(DocumentStatusConst.UN_FILING, DocumentStatusConst.FILING))
+            .orderByDesc(Document::getId);
+    }
+
     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)

+ 35 - 15
script/sql/business/create.sql

@@ -121,23 +121,43 @@ CREATE TABLE `document_quality_control_task`
 
 CREATE TABLE `document_quality_control_task_detail`
 (
-    `id`                bigint unsigned PRIMARY KEY NOT NULL AUTO_INCREMENT COMMENT '序号',
-    `task_id`           bigint unsigned             NOT NULL COMMENT '所属任务',
-    `executor_id`       bigint unsigned             NOT NULL COMMENT '执行人',
-    `plan_execute_time` bigint COMMENT '预期执行时间',
-    `execute_time`      datetime COMMENT '执行时间',
-    `status`            tinyint(1)                  NOT NULL DEFAULT 0 COMMENT '状态',
-    `note`              varchar(255) COMMENT '备注',
-    `create_dept`       bigint(20) COMMENT '创建部门',
-    `create_by`         bigint(20) COMMENT '创建者',
-    `create_time`       datetime COMMENT '创建时间',
-    `update_by`         bigint(20) COMMENT '更新者',
-    `update_time`       datetime COMMENT '更新时间',
-    `del_flag`          char(1)                              DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
-    `tenant_id`         varchar(40) COMMENT '租户id'
+    `id`          bigint unsigned PRIMARY KEY NOT NULL AUTO_INCREMENT COMMENT '序号',
+    `task_id`     bigint unsigned             NOT NULL COMMENT '所属任务',
+    `document_id` bigint unsigned             NOT NULL COMMENT '指控文件',
+    `status`      tinyint(1)                  NOT NULL DEFAULT 0 COMMENT '状态',
+    `note`        varchar(255) COMMENT '备注',
+    `create_dept` bigint(20) COMMENT '创建部门',
+    `create_by`   bigint(20) COMMENT '创建者',
+    `create_time` datetime COMMENT '创建时间',
+    `update_by`   bigint(20) COMMENT '更新者',
+    `update_time` datetime COMMENT '更新时间',
+    `del_flag`    char(1)                              DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+    `tenant_id`   varchar(40) COMMENT '租户id'
 ) ENGINE = InnoDB
   DEFAULT CHARSET = utf8mb4 COMMENT ='文档质控细节';
 
+CREATE TABLE `document_quality_control_task_log`
+(
+    `id`            bigint unsigned PRIMARY KEY NOT NULL AUTO_INCREMENT COMMENT '序号',
+    `task_id`       bigint unsigned             NOT NULL COMMENT '质控任务',
+    `detail_id`     bigint unsigned             NOT NULL COMMENT '指控环节',
+    `executor_id`   bigint unsigned             NOT NULL COMMENT '执行人',
+    `execute_time`  datetime COMMENT '执行时间',
+    `result`        tinyint(1) unsigned COMMENT '质控结果',
+    `question_type` char(1) COMMENT '问题分类',
+    `option`        varchar(255) COMMENT '质控意见',
+    `dealer_id`     bigint COMMENT '指定处理人',
+    `deadline`      date COMMENT '处理截止日期',
+    `create_dept`   bigint(20) COMMENT '创建部门',
+    `create_by`     bigint(20) COMMENT '创建者',
+    `create_time`   datetime COMMENT '创建时间',
+    `update_by`     bigint(20) COMMENT '更新者',
+    `update_time`   datetime COMMENT '更新时间',
+    `del_flag`      char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+    `tenant_id`     varchar(40) COMMENT '租户id'
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4 COMMENT ='文档质控日志';
+
 CREATE TABLE `applet_setting`
 (
     `id`                bigint unsigned PRIMARY KEY NOT NULL AUTO_INCREMENT COMMENT '序号',
@@ -151,7 +171,7 @@ CREATE TABLE `applet_setting`
     `del_flag`          char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
     `tenant_id`         varchar(40) COMMENT '租户id'
 ) ENGINE = InnoDB
-  DEFAULT CHARSET = utf8mb4 COMMENT ='微信小程序设置';
+  DEFAULT CHARSET = utf8mb4 COMMENT ='协议设置';
 
 CREATE TABLE `ai_setting`
 (