Ver Fonte

质控流程初步跑完

Huanyi há 3 meses atrás
pai
commit
339b468f21
15 ficheiros alterados com 227 adições e 44 exclusões
  1. 1 1
      pom.xml
  2. 1 1
      ruoyi-admin/src/main/resources/application.yml
  3. 53 1
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/controller/DashboardController.java
  4. 18 4
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/controller/TaskCenterController.java
  5. 0 28
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/controller/WorkbenchController.java
  6. 12 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/TaskCenterQcSubmitBo.java
  7. 22 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/vo/TaskTodoCountVo.java
  8. 1 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/enumeration/DocumentQcStatusEnum.java
  9. 7 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/IDocumentQcTaskDetailService.java
  10. 3 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/IDocumentService.java
  11. 3 1
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/CommonFolderService.java
  12. 6 2
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/CommonProjectService.java
  13. 75 2
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/DocumentQcTaskDetailServiceImpl.java
  14. 21 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/DocumentServiceImpl.java
  15. 4 4
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/ProjectServiceImpl.java

+ 1 - 1
pom.xml

@@ -13,7 +13,7 @@
         <spring-boot.version>3.5.7</spring-boot.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-        <java.version>17</java.version>
+        <java.version>21</java.version>
         <mybatis.version>3.5.16</mybatis.version>
         <springdoc.version>2.8.13</springdoc.version>
         <therapi-javadoc.version>0.15.0</therapi-javadoc.version>

+ 1 - 1
ruoyi-admin/src/main/resources/application.yml

@@ -44,7 +44,7 @@ spring:
     threads:
         # 开启虚拟线程 仅jdk21可用
         virtual:
-            enabled: false
+            enabled: true
     task:
         execution:
             # 从 springboot 3.5 开始 spring自带线程池

+ 53 - 1
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/controller/DashboardController.java

@@ -1,12 +1,64 @@
 package com.yingpaipay.business.controller;
 
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.yingpaipay.business.domain.Document;
+import com.yingpaipay.business.domain.bo.ProjectListOnDashboardWorkbenchBo;
+import com.yingpaipay.business.domain.vo.ProjectInDashboardWorkbenchVo;
+import com.yingpaipay.business.domain.vo.TaskTodoCountVo;
+import com.yingpaipay.business.enumeration.DocumentStatusEnum;
+import com.yingpaipay.business.service.IDocumentQcTaskDetailService;
+import com.yingpaipay.business.service.IDocumentService;
+import com.yingpaipay.business.service.IProjectService;
 import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.web.core.BaseController;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 @RestController
-@RequestMapping("/dashboard")
+@RequestMapping("/home/dashboard")
 @RequiredArgsConstructor
 public class DashboardController extends BaseController {
+
+    private final IProjectService projectService;
+    private final IDocumentService documentService;
+    private final IDocumentQcTaskDetailService qcTaskDetailService;
+
+    @SaCheckPermission("home:dashboard:index")
+    @GetMapping("/list")
+    public TableDataInfo<ProjectInDashboardWorkbenchVo> listOnDashboardWorkbench(ProjectListOnDashboardWorkbenchBo bo, PageQuery pageQuery) {
+        return projectService.queryPageListOnDashboardWorkbench(bo, pageQuery);
+    }
+
+    @SaCheckPermission("home:dashboard:index")
+    @GetMapping("/countTodo")
+    public R<TaskTodoCountVo> countTodo() {
+        TaskTodoCountVo vo = new TaskTodoCountVo();
+        List<Document> documents = documentService.listOnWorkbench();
+        if (documents.isEmpty()) {
+            R.ok(vo);
+        }
+        vo.setToSubmit(documents.stream()
+            .filter(e -> e.getStatus().equals(DocumentStatusEnum.UN_UPLOAD.getValue()) || e.getStatus().equals(DocumentStatusEnum.AUDIT_REJECT.getValue()))
+            .filter(e -> e.getPlanSubmitter().equals(LoginHelper.getUserId()))
+            .count());
+        // FIXME 必须得是自己能够审核的文件才能算进去
+        vo.setToAudit(documents.stream()
+            .filter(e -> e.getStatus().equals(DocumentStatusEnum.UN_AUDIT.getValue()))
+            .filter(e -> e.getCreateBy().equals(LoginHelper.getUserId()))
+            .count());
+        vo.setToFiling(documents.stream()
+            .filter(e -> e.getStatus().equals(DocumentStatusEnum.UN_ARCHIEVED.getValue()))
+            .filter(e -> e.getCreateBy().equals(LoginHelper.getUserId()))
+            .count());
+        vo.setToQc((long) qcTaskDetailService.listOnWorkbench().size());
+        return R.ok(vo);
+    }
+
 }

+ 18 - 4
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/controller/TaskCenterController.java

@@ -33,14 +33,14 @@ public class TaskCenterController extends BaseController {
     @SaCheckPermission("taskCenter:submission:submit")
     @Log(title = "文档", businessType = BusinessType.UPDATE)
     @PutMapping("/submission/submit")
-    public R<Void> submit(@RequestBody DocumentSubmitBo bo) {
+    public R<Void> submitssionSubmit(@RequestBody DocumentSubmitBo bo) {
         return toAjax(documentService.submit(bo));
     }
 
     @SaCheckPermission("taskCenter:submission:send")
     @Log(title = "文档", businessType = BusinessType.UPDATE)
     @PutMapping("/submission/send")
-    public R<Void> send(@RequestBody DocumentSendBo bo) {
+    public R<Void> submissionSend(@RequestBody DocumentSendBo bo) {
         return toAjax(documentService.send(bo));
     }
 
@@ -59,7 +59,7 @@ public class TaskCenterController extends BaseController {
     @SaCheckPermission("taskCenter:audit:audit")
     @Log(title = "任务中心", businessType = BusinessType.UPDATE)
     @PutMapping("/audit/audit")
-    public R<Void> audit(@RequestBody DocumentAuditBo bo) {
+    public R<Void> auditAudit(@RequestBody DocumentAuditBo bo) {
         return toAjax(documentService.audit(bo));
     }
 
@@ -72,7 +72,7 @@ public class TaskCenterController extends BaseController {
     @SaCheckPermission("taskCenter:filing:filing")
     @Log(title = "任务中心", businessType = BusinessType.UPDATE)
     @PutMapping("/filing/filing")
-    public R<Void> filing(@RequestBody DocumentFilingBo bo) {
+    public R<Void> filingFiling(@RequestBody DocumentFilingBo bo) {
         return toAjax(documentService.filing(bo));
     }
 
@@ -82,4 +82,18 @@ public class TaskCenterController extends BaseController {
         return qcTaskDetailService.listOnTaskCenter(bo, pageQuery);
     }
 
+    @SaCheckPermission("taskCenter:qc:submit")
+    @Log(title = "任务中心", businessType = BusinessType.UPDATE)
+    @PutMapping("/qc/submit")
+    public R<Void> qcSubmit(@RequestBody TaskCenterQcSubmitBo bo) {
+        return toAjax(qcTaskDetailService.submit(bo));
+    }
+
+    @SaCheckPermission("taskCenter:qc:audit")
+    @Log(title = "任务中心", businessType = BusinessType.UPDATE)
+    @PutMapping("/qc/audit")
+    public R<Void> qcAudit(@RequestBody DocumentQcAuditBo bo) {
+        return toAjax(qcTaskDetailService.audit(bo));
+    }
+
 }

+ 0 - 28
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/controller/WorkbenchController.java

@@ -1,28 +0,0 @@
-package com.yingpaipay.business.controller;
-
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import com.yingpaipay.business.domain.bo.ProjectListOnDashboardWorkbenchBo;
-import com.yingpaipay.business.domain.vo.ProjectInDashboardWorkbenchVo;
-import com.yingpaipay.business.service.IProjectService;
-import lombok.RequiredArgsConstructor;
-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.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-@RequestMapping("/home/workbench")
-@RequiredArgsConstructor
-public class WorkbenchController extends BaseController {
-
-    private final IProjectService projectService;
-
-    @SaCheckPermission("home:workbench:index")
-    @GetMapping("/list")
-    public TableDataInfo<ProjectInDashboardWorkbenchVo> listOnDashboardWorkbench(ProjectListOnDashboardWorkbenchBo bo, PageQuery pageQuery) {
-        return projectService.queryPageListOnDashboardWorkbench(bo, pageQuery);
-    }
-
-}

+ 12 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/TaskCenterQcSubmitBo.java

@@ -0,0 +1,12 @@
+package com.yingpaipay.business.domain.bo;
+
+import lombok.Data;
+
+@Data
+public class TaskCenterQcSubmitBo {
+
+    private Long detailId;
+
+    private Long document;
+
+}

+ 22 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/vo/TaskTodoCountVo.java

@@ -0,0 +1,22 @@
+package com.yingpaipay.business.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+public class TaskTodoCountVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long toSubmit;
+
+    private Long toAudit;
+
+    private Long toFiling;
+
+    private Long toQc;
+
+}

+ 1 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/enumeration/DocumentQcStatusEnum.java

@@ -13,6 +13,7 @@ public enum DocumentQcStatusEnum {
     UN_AUDIT(0, "未审核", "Unreviewed"),
     PASS(1, "通过", "Pass"),
     REJECT(2, "驳回", "Reject"),
+    TO_AUDIT(3, "未审核", "Unreviewed"),
     ;
 
     private final Integer code;

+ 7 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/IDocumentQcTaskDetailService.java

@@ -1,8 +1,10 @@
 package com.yingpaipay.business.service;
 
+import com.yingpaipay.business.domain.DocumentQcTaskDetail;
 import com.yingpaipay.business.domain.bo.DocumentQcAuditBo;
 import com.yingpaipay.business.domain.bo.DocumentQcTaskDetailListBo;
 import com.yingpaipay.business.domain.bo.TaskCenterQcListBo;
+import com.yingpaipay.business.domain.bo.TaskCenterQcSubmitBo;
 import com.yingpaipay.business.domain.vo.DocumentQcGenerateVo;
 import com.yingpaipay.business.domain.vo.DocumentQcTaskDetailListVo;
 import com.yingpaipay.business.domain.vo.TaskCenterQcListVo;
@@ -27,4 +29,9 @@ public interface IDocumentQcTaskDetailService {
     boolean audit(DocumentQcAuditBo bo);
 
     TableDataInfo<TaskCenterQcListVo> listOnTaskCenter(TaskCenterQcListBo bo, PageQuery pageQuery);
+
+    boolean submit(TaskCenterQcSubmitBo bo);
+
+    List<DocumentQcTaskDetail> listOnWorkbench();
+
 }

+ 3 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/IDocumentService.java

@@ -1,5 +1,6 @@
 package com.yingpaipay.business.service;
 
+import com.yingpaipay.business.domain.Document;
 import com.yingpaipay.business.domain.bo.*;
 import com.yingpaipay.business.domain.excel.ProjectExcel;
 import com.yingpaipay.business.domain.vo.*;
@@ -118,4 +119,6 @@ public interface IDocumentService {
     TableDataInfo<DocumentListOnSpecifyVo> listOnSpecify(DocumentListOnSpecifyBo bo, PageQuery pageQuery);
 
     List<ProjectExcel> getListByProjectId(Long projectId);
+
+    List<Document> listOnWorkbench();
 }

+ 3 - 1
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/CommonFolderService.java

@@ -122,7 +122,9 @@ public class CommonFolderService {
                 .eq(SysUserFolders::getUserId, LoginHelper.getUserId())
                 .in(SysUserFolders::getProjectId, projectIds)
         ).forEach(e -> {
-            if (e.getFolders().equals("*")) {
+            // 有可能将权限全部收回
+            if (e.getFolders().isEmpty()) {
+            } else if (e.getFolders().equals("*")) {
                 List<Folder> folders = folderProjectMap.get(e.getProjectId());
                 for (Folder folder : folders) {
                     centerIds.add(folder.getId());

+ 6 - 2
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/CommonProjectService.java

@@ -94,11 +94,15 @@ public class CommonProjectService {
             return Collections.emptyList();
         }
 
-        List<Long> projectIds = Arrays.stream(projects.getProjects().split(",")).map(Long::valueOf).toList();
+        // 因为Arrays代码会前置执行,所以使用condition作为判断会抛出异常
+        List<Long> projectIds = new ArrayList<>();
+        if (!projects.getProjects().equals("*")) {
+            projectIds = Arrays.stream(projects.getProjects().split(",")).map(Long::valueOf).toList();
+        }
 
         return baseMapper.selectList(
             Wrappers.lambdaQuery(Project.class)
-                .in(Project::getId, projectIds)
+                .in(!projects.getProjects().equals("*"), Project::getId, projectIds)
                 .like(StringUtils.isNotBlank(name), Project::getName, name)
         );
     }

+ 75 - 2
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/DocumentQcTaskDetailServiceImpl.java

@@ -10,6 +10,7 @@ import com.yingpaipay.business.domain.*;
 import com.yingpaipay.business.domain.bo.DocumentQcAuditBo;
 import com.yingpaipay.business.domain.bo.DocumentQcTaskDetailListBo;
 import com.yingpaipay.business.domain.bo.TaskCenterQcListBo;
+import com.yingpaipay.business.domain.bo.TaskCenterQcSubmitBo;
 import com.yingpaipay.business.domain.vo.DocumentQcGenerateVo;
 import com.yingpaipay.business.domain.vo.DocumentQcTaskDetailListVo;
 import com.yingpaipay.business.domain.vo.TaskCenterQcListVo;
@@ -154,6 +155,7 @@ public class DocumentQcTaskDetailServiceImpl implements IDocumentQcTaskDetailSer
         log.setTenantId(TenantHelper.getTenantId());
 
         detail.setStatus(bo.getResult());
+        detail.setNote(bo.getOpinion());
         detail.setExecutionTime(new Date());
 
         if (DocumentQcStatusEnum.pass(bo.getResult())) {
@@ -229,6 +231,59 @@ public class DocumentQcTaskDetailServiceImpl implements IDocumentQcTaskDetailSer
         }));
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean submit(TaskCenterQcSubmitBo bo) {
+
+        DocumentQcTaskDetail detail = baseMapper.selectById(bo.getDetailId());
+        DocumentQcTaskLog log = logMapper.selectOne(
+            Wrappers.lambdaQuery(DocumentQcTaskLog.class)
+                .eq(DocumentQcTaskLog::getDetailId, bo.getDetailId())
+                .orderByDesc(DocumentQcTaskLog::getId)
+                .last("LIMIT 1")
+        );
+        Document document = documentService.getById(detail.getDocumentId());
+
+        detail.setStatus(DocumentQcStatusEnum.TO_AUDIT.getCode());
+        log.setActualDealer(LoginHelper.getUserId());
+        log.setDealTime(new Date());
+        document.setStatus(DocumentStatusEnum.UN_QC.getValue());
+        document.setActualDocument(bo.getDocument());
+
+        boolean detailFlag = baseMapper.updateById(detail) == 0;
+        if (detailFlag) {
+            throw new RuntimeException("修改质控细节失败");
+        }
+        boolean logFlag = logMapper.updateById(log) == 0;
+        if (logFlag) {
+            throw new RuntimeException("修改质控记录失败");
+        }
+        boolean documentFlag = documentService.updateById(document);
+        if (!documentFlag) {
+            throw new RuntimeException("修改文档失败");
+        }
+
+        return true;
+    }
+
+    @Override
+    public List<DocumentQcTaskDetail> listOnWorkbench() {
+        List<Long> pendingIds = logMapper.selectList(
+            Wrappers.lambdaQuery(DocumentQcTaskLog.class)
+                .eq(DocumentQcTaskLog::getDesignatedDealer, LoginHelper.getUserId())
+                .isNull(DocumentQcTaskLog::getActualDealer)
+        ).stream().map(DocumentQcTaskLog::getDetailId).toList();
+
+        LambdaQueryWrapper<DocumentQcTaskDetail> wrapper = Wrappers.lambdaQuery(DocumentQcTaskDetail.class)
+            .in(!pendingIds.isEmpty(), DocumentQcTaskDetail::getId, pendingIds)
+            .or(w -> w
+                .eq(DocumentQcTaskDetail::getStatus, List.of(DocumentQcStatusEnum.UN_AUDIT.getCode(), DocumentQcStatusEnum.TO_AUDIT.getCode()))
+                .eq(DocumentQcTaskDetail::getExecutor, LoginHelper.getUserId())
+            );
+
+        return baseMapper.selectList(wrapper);
+    }
+
     private LambdaQueryWrapper<DocumentQcTaskDetail> buildListOnTaskCenterWrapper(TaskCenterQcListBo bo, List<Long> taskIds, List<Long> projectIds) {
 
         LambdaQueryWrapper<DocumentQcTaskDetail> wrapper = Wrappers.lambdaQuery(DocumentQcTaskDetail.class)
@@ -242,11 +297,29 @@ public class DocumentQcTaskDetailServiceImpl implements IDocumentQcTaskDetailSer
         wrapper.in(StringUtils.isNotBlank(bo.getProjectName()), DocumentQcTaskDetail::getProjectId, projectIds.isEmpty() ? List.of(-1L) : projectIds);
 
         if (StringUtils.isNotBlank(bo.getDocumentName())) {
-            List<Long> documentIds = new ArrayList<>();
-            documentService.selectByName(bo.getDocumentName(), projectIds).forEach(e -> documentIds.add(e.getId()));
+            List<Long> documentIds = documentService.selectByName(bo.getDocumentName(), projectIds).stream().map(Document::getId).toList();
             wrapper.in(DocumentQcTaskDetail::getDocumentId, documentIds.isEmpty() ? List.of(-1L) : documentIds);
         }
 
+        List<Long> logIds = logMapper.selectList(Wrappers.lambdaQuery(DocumentQcTaskLog.class).in(DocumentQcTaskLog::getTaskId, taskIds.isEmpty() ? List.of(-1L) : taskIds).eq(DocumentQcTaskLog::getDesignatedDealer, LoginHelper.getUserId()))
+            .stream().map(DocumentQcTaskLog::getDetailId).toList();
+
+        /**
+         * 1、质控执行人应该看到未审核的
+         * 2、指定处理人应该看到指控驳回的
+         */
+        wrapper
+            .and(bo.getStatus() == null || bo.getStatus().equals(DocumentQcStatusEnum.UN_AUDIT.getCode()), w -> w
+                .eq(DocumentQcTaskDetail::getExecutor, LoginHelper.getUserId())
+                .in(DocumentQcTaskDetail::getStatus, List.of(DocumentQcStatusEnum.UN_AUDIT.getCode(), DocumentQcStatusEnum.TO_AUDIT.getCode()))
+            )
+            // 使用 <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)
+                .eq(DocumentQcTaskDetail::getStatus, DocumentQcStatusEnum.REJECT.getCode())
+            );
+
         return wrapper;
     }
 

+ 21 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/DocumentServiceImpl.java

@@ -358,6 +358,9 @@ public class DocumentServiceImpl implements IDocumentService {
         }));
     }
 
+    /**
+     * FIXME 必须得是自己有这个审核权限,才能看到这个文件的审核
+     */
     @Override
     public TableDataInfo<TaskCenterAuditListVo> listOnAudit(TaskCenterAuditListBo bo, PageQuery pageQuery) {
         List<Long> projectIds = projectService.queryIds(bo.getProjectCode(), bo.getProjectName());
@@ -1012,6 +1015,24 @@ public class DocumentServiceImpl implements IDocumentService {
         return list;
     }
 
+    @Override
+    public List<Document> listOnWorkbench() {
+        return baseMapper.selectList(buildListWrapperOnWorkbench());
+    }
+
+    private LambdaQueryWrapper<Document> buildListWrapperOnWorkbench() {
+        LambdaQueryWrapper<Document> wrapper = Wrappers.lambdaQuery(Document.class);
+        wrapper.and(w -> w
+            .eq(Document::getPlanSubmitter, LoginHelper.getUserId())
+            .eq(Document::getStatus, DocumentStatusEnum.UN_UPLOAD.getValue())
+        );
+        wrapper.or(w -> w
+            .eq(Document::getCreateBy, LoginHelper.getUserId())
+            .in(Document::getStatus, List.of(DocumentStatusEnum.UN_AUDIT.getValue(), DocumentStatusEnum.UN_ARCHIEVED.getValue()))
+        );
+        return wrapper;
+    }
+
     private LambdaQueryWrapper<Document> buildSpecifyListWrapper(DocumentListOnSpecifyBo bo, List<Long> folderIds) {
         return Wrappers.lambdaQuery(Document.class)
             .eq(Document::getCreateBy, LoginHelper.getUserId())

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

@@ -361,13 +361,14 @@ public class ProjectServiceImpl implements IProjectService {
             vo.setName(e.getName());
             long total = 1L, onTimeSubmit = 0L, lateSubmit = 0L, notSubmit = 0L;
             if (documentList != null) {
-                total = documentList.size();
                 List<Document> planDocuments = documentList.stream()
                     .filter(item -> item.getType().equals(DocumentTypeConst.PLAN))
                     .toList();
+                total = planDocuments.size();
                 if (total > 0L) {
                     onTimeSubmit = planDocuments.stream()
-                        .filter(item -> item.getActualDocument() != null && item.getSubmitTime().before(item.getSubmitDeadline()))
+                        .filter(item -> item.getActualDocument() != null)
+                        .filter(item -> item.getSubmitTime().before(item.getSubmitDeadline()))
                         .count();
                     lateSubmit = planDocuments.stream()
                         .filter(item -> item.getActualDocument() != null)
@@ -375,7 +376,6 @@ public class ProjectServiceImpl implements IProjectService {
                         .count();
                     notSubmit = planDocuments.stream()
                         .filter(item -> item.getActualDocument() == null)
-                        .filter(item -> item.getSubmitDeadline().before(new Date()))
                         .count();
                 }
             }
@@ -384,7 +384,7 @@ public class ProjectServiceImpl implements IProjectService {
             total = total > 0L ? total : 1L;
             vo.setOnTimeSubmissionRate(Double.valueOf(String.format("%.2f", (double) onTimeSubmit / total * 100L)));
             vo.setLateSubmissionCount(lateSubmit);
-            vo.setSubmissionProgress(Double.valueOf(String.format("%.2f", (double) notSubmit / total * 100L)));
+            vo.setSubmissionProgress(Double.valueOf(String.format("%.2f", (double) (total - notSubmit) / total * 100L)));
             vo.setPdGpd(e.getPdGpd());
             vo.setPmGpm(e.getPmGpm());
             vo.setCtaGcta(e.getCtaGcta());