|
@@ -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());
|
|
|
}
|
|
|
}
|
|
|
}
|