Browse Source

主项目字段添加

ljy121 1 year ago
parent
commit
46a86d5686

+ 15 - 0
zjugis-business/src/main/java/com/zjugis/business/bean/dto/ParentDto.java

@@ -0,0 +1,15 @@
+package com.zjugis.business.bean.dto;
+
+import lombok.Data;
+
+/**
+ * @author ljy
+ * @version 1.0
+ * @date 2024/5/8 18:35
+ */
+@Data
+public class ParentDto {
+    private String id;
+
+    private String pid;
+}

+ 85 - 36
zjugis-business/src/main/java/com/zjugis/business/job/ProjectAmountJob.java

@@ -1,6 +1,8 @@
 package com.zjugis.business.job;
 
+import com.alibaba.excel.util.StringUtils;
 import com.xxl.job.core.handler.annotation.XxlJob;
+import com.zjugis.business.bean.dto.ParentDto;
 import com.zjugis.business.bean.dto.ProjectCostDto;
 import com.zjugis.business.bean.entity.ProjectAmount;
 import com.zjugis.business.bean.response.ProjectCostResponse;
@@ -37,12 +39,12 @@ public class ProjectAmountJob {
 
     @XxlJob("projectAmountJob")
     public void calcAllProject() {
-        List<String> insertIds = projectAmountService.selectInsertIds();
+        List<ParentDto> insertIds = projectAmountService.selectInsertIds();
         List<String> updateIds = projectAmountService.check();
         ForkJoinPool forkJoinPool= new ForkJoinPool();
         try {
-            ProjectAmountTask insertTask = new ProjectAmountTask(insertIds,true);
-            ProjectAmountTask updateTask = new ProjectAmountTask(updateIds,false);
+            ProjectAmountInsertTask insertTask = new ProjectAmountInsertTask(insertIds);
+            ProjectAmountUpdateTask updateTask = new ProjectAmountUpdateTask(updateIds);
             forkJoinPool.invoke(insertTask);
             forkJoinPool.invoke(updateTask);
             forkJoinPool.awaitTermination(2L, TimeUnit.HOURS);
@@ -53,13 +55,75 @@ public class ProjectAmountJob {
         }
     }
 
-    static class ProjectAmountTask extends RecursiveAction {
+    static class ProjectAmountInsertTask extends RecursiveAction {
+        private final int THRESHOLD = 800;
+
+        private final List<ParentDto> items;
+
+
+        ProjectService projectService;
+
+        ProjectAmountService projectAmountService;
+
+        ContractService contractService;
+
+        ProjectCostService projectCostService;
+
+
+        public ProjectAmountInsertTask(List<ParentDto> ids){
+            this.items = ids;
+            this.projectService = SpringUtils.getBean(ProjectService.class);
+            this.projectAmountService = SpringUtils.getBean(ProjectAmountService.class);
+            this.contractService = SpringUtils.getBean(ContractService.class);
+            this.projectCostService = SpringUtils.getBean(ProjectCostService.class);
+        }
+
+        @Override
+        protected void compute() {
+            if(items.size() < THRESHOLD){
+                if(items.isEmpty()){
+                    return;
+                }
+                List<String> ids = items.stream().map(ParentDto::getId).collect(Collectors.toList());
+                List<ProjectAmount> batch = projectAmountService.selectAmountList(ids);
+                ProjectCostDto costDto = new ProjectCostDto();
+                costDto.setProjectIds(ids);
+                Map<String, ProjectCostResponse> costMap = projectCostService.calculateCostMap(costDto);
+                LocalDateTime now = LocalDateTime.now();
+                for (ProjectAmount entity : batch) {
+                    fillCost(entity, costMap);
+                    entity.setUpdateTime(now);
+                }
+
+                List<String> exist = batch.stream().map(ProjectAmount::getProjectId).collect(Collectors.toList());
+                for (ParentDto item : items) {
+                    if(!exist.contains(item.getId())) {
+                        ProjectAmount projectAmount = new ProjectAmount();
+                        projectAmount.setProjectId(item.getId());
+                        projectAmount.setMainProjectId(StringUtils.isBlank(item.getPid())?item.getId():item.getPid());
+                        projectAmount.setUpdateTime(now);
+                        fillCost(projectAmount, costMap);
+                        batch.add(projectAmount);
+                    }
+                }
+                projectAmountService.insertBatch(batch);
+
+            } else {
+                int half = items.size()/2;
+                List<ParentDto> leftList = items.subList(0, half);
+                List<ParentDto> rightList = items.subList(half,items.size());
+                ProjectAmountInsertTask left = new ProjectAmountInsertTask(leftList);
+                ProjectAmountInsertTask right = new ProjectAmountInsertTask(rightList);
+                invokeAll(left,right);
+            }
+        }
+    }
+
+    static class ProjectAmountUpdateTask extends RecursiveAction {
         private final int THRESHOLD = 800;
 
         private final List<String> ids;
 
-        // 1-插入,0-更新
-        private final boolean insert;
 
         ProjectService projectService;
 
@@ -70,9 +134,8 @@ public class ProjectAmountJob {
         ProjectCostService projectCostService;
 
 
-        public ProjectAmountTask(List<String> ids,boolean insert){
+        public ProjectAmountUpdateTask(List<String> ids){
             this.ids = ids;
-            this.insert = insert;
             this.projectService = SpringUtils.getBean(ProjectService.class);
             this.projectAmountService = SpringUtils.getBean(ProjectAmountService.class);
             this.contractService = SpringUtils.getBean(ContractService.class);
@@ -94,41 +157,27 @@ public class ProjectAmountJob {
                     fillCost(entity, costMap);
                     entity.setUpdateTime(now);
                 }
-                if(insert){
-                    List<String> exist = batch.stream().map(ProjectAmount::getProjectId).collect(Collectors.toList());
-                    for (String id : ids) {
-                        if(!exist.contains(id)) {
-                            ProjectAmount projectAmount = new ProjectAmount();
-                            projectAmount.setProjectId(id);
-                            projectAmount.setUpdateTime(now);
-                            fillCost(projectAmount, costMap);
-                            batch.add(projectAmount);
-                        }
-                    }
-                    projectAmountService.insertBatch(batch);
-                } else {
-                    projectAmountService.updateBatch(batch);
-                }
+
+                projectAmountService.updateBatch(batch);
             } else {
                 int half = ids.size()/2;
                 List<String> leftList = ids.subList(0, half);
                 List<String> rightList = ids.subList(half,ids.size());
-                ProjectAmountTask left = new ProjectAmountTask(leftList,insert);
-                ProjectAmountTask right = new ProjectAmountTask(rightList,insert);
+                ProjectAmountUpdateTask left = new ProjectAmountUpdateTask(leftList);
+                ProjectAmountUpdateTask right = new ProjectAmountUpdateTask(rightList);
                 invokeAll(left,right);
             }
         }
-
-        private void fillCost(ProjectAmount entity, Map<String, ProjectCostResponse> costMap) {
-            ProjectCostResponse projectCostResponse = costMap.get(entity.getProjectId());
-            if(projectCostResponse != null){
-                entity.setProjectCost(projectCostResponse.getCost());
-                entity.setReimbursementCost(projectCostResponse.getReimbursementCost());
-                entity.setTravelCost(projectCostResponse.getTravelCost());
-                entity.setSubcontractCost(projectCostResponse.getSubcontractCost());
-                entity.setOutsourceCost(projectCostResponse.getOutsourceCost());
-                entity.setPaymentCost(projectCostResponse.getPaymentCost());
-            }
+    }
+    private static void fillCost(ProjectAmount entity, Map<String, ProjectCostResponse> costMap) {
+        ProjectCostResponse projectCostResponse = costMap.get(entity.getProjectId());
+        if(projectCostResponse != null){
+            entity.setProjectCost(projectCostResponse.getCost());
+            entity.setReimbursementCost(projectCostResponse.getReimbursementCost());
+            entity.setTravelCost(projectCostResponse.getTravelCost());
+            entity.setSubcontractCost(projectCostResponse.getSubcontractCost());
+            entity.setOutsourceCost(projectCostResponse.getOutsourceCost());
+            entity.setPaymentCost(projectCostResponse.getPaymentCost());
         }
     }
 }

+ 2 - 1
zjugis-business/src/main/java/com/zjugis/business/mapper/ProjectAmountMapper.java

@@ -1,5 +1,6 @@
 package com.zjugis.business.mapper;
 
+import com.zjugis.business.bean.dto.ParentDto;
 import com.zjugis.business.bean.entity.ProjectAmount;
 import com.zjugis.framework.mybatis.core.mapper.BaseMapperX;
 import org.apache.ibatis.annotations.Param;
@@ -15,7 +16,7 @@ import java.util.List;
 public interface ProjectAmountMapper extends BaseMapperX<ProjectAmount> {
     List<String> check(LocalDateTime oneDayBefore);
 
-    List<String> selectInsertIds();
+    List<ParentDto> selectInsertIds();
 
     List<ProjectAmount> selectAmountList(@Param("ids") List<String> projectIds);
 }

+ 2 - 1
zjugis-business/src/main/java/com/zjugis/business/service/ProjectAmountService.java

@@ -1,5 +1,6 @@
 package com.zjugis.business.service;
 
+import com.zjugis.business.bean.dto.ParentDto;
 import com.zjugis.business.bean.entity.ProjectAmount;
 
 import java.util.List;
@@ -26,7 +27,7 @@ public interface ProjectAmountService {
 
     List<String> check();
 
-    List<String> selectInsertIds();
+    List<ParentDto> selectInsertIds();
 
     List<ProjectAmount> selectAmountList(List<String> projectIds);
 }

+ 2 - 1
zjugis-business/src/main/java/com/zjugis/business/service/impl/ProjectAmountServiceImpl.java

@@ -1,5 +1,6 @@
 package com.zjugis.business.service.impl;
 
+import com.zjugis.business.bean.dto.ParentDto;
 import com.zjugis.business.bean.entity.ContractInvoiceRelation;
 import com.zjugis.business.bean.entity.ProjectAmount;
 import com.zjugis.business.mapper.ProjectAmountMapper;
@@ -81,7 +82,7 @@ public class ProjectAmountServiceImpl implements ProjectAmountService {
      * @return
      */
     @Override
-    public List<String> selectInsertIds() {
+    public List<ParentDto> selectInsertIds() {
         return projectAmountMapper.selectInsertIds();
     }
 

+ 4 - 3
zjugis-business/src/main/resources/mapper/oracle/ProjectAmountMapper.xml

@@ -6,9 +6,6 @@
         select PROJECT_ID FROM PROJECT_AMOUNT WHERE UPDATE_TIME &gt;= #{oneDayBefore,jdbcType=TIMESTAMP}
     </select>
 
-    <select id="selectInsertIds" resultType="java.lang.String">
-        SELECT ID FROM PROJECT WHERE ISVALID = 1 AND FLOW_STATUS IN (90,99) AND ID NOT IN (SELECT PROJECT_ID FROM PROJECT_AMOUNT)
-    </select>
 
     <select id="selectAmountList" resultType="com.zjugis.business.bean.entity.ProjectAmount">
         SELECT
@@ -35,4 +32,8 @@
         </foreach>
         GROUP BY t1.PROJECT_ID
     </select>
+
+    <select id="selectInsertIds" resultType="com.zjugis.business.bean.dto.ParentDto">
+        SELECT ID,PID FROM PROJECT WHERE ISVALID = 1 AND FLOW_STATUS IN (90,99) AND ID NOT IN (SELECT PROJECT_ID FROM PROJECT_AMOUNT)
+    </select>
 </mapper>