Browse Source

【图层】可视化- 1.将右侧资源的quantity查询改为多线程

master
wangxianzhang 3 years ago
parent
commit
b4a04e73d9
  1. 5
      epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/coverage/AnalysisResourceCategoriesResult.java
  2. 5
      epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/CoverageController.java
  3. 5
      epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/entity/govorg/IcCoverageCategoryDictEntity.java
  4. 2
      epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/CoverageService.java
  5. 123
      epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/impl/CoverageServiceImpl.java
  6. 4
      epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcCoverageCategoryDictEntity.java

5
epmet-module/data-aggregator/data-aggregator-client/src/main/java/com/epmet/dataaggre/dto/coverage/AnalysisResourceCategoriesResult.java

@ -6,6 +6,7 @@ import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 五大图层-可视化-右侧分类树列表
@ -26,7 +27,7 @@ public class AnalysisResourceCategoriesResult {
/**
* 个数
*/
private Integer quantity;
private AtomicInteger quantity = new AtomicInteger(0);
/**
* 没有placeTypeInAnalysis直接属于图层的
@ -61,7 +62,7 @@ public class AnalysisResourceCategoriesResult {
public static class PlaceType {
private String placeType;
private String placeTypeName;
private Integer quantity = 0;
private AtomicInteger quantity = new AtomicInteger(0);
private List<Category> categories;
}

5
epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/controller/CoverageController.java

@ -89,8 +89,9 @@ public class CoverageController {
* @return
*/
@PostMapping("analysis/resourceCategories")
public Result<List<AnalysisResourceCategoriesResult>> listAnalysisResourceCategories() {
List<AnalysisResourceCategoriesResult> r = coverageService.listAnalysisResourceCategories();
public Result<List<AnalysisResourceCategoriesResult>> listAnalysisResourceCategories(@RequestBody Map<String, String> input) {
String agencyId = input.get("agencyId");
List<AnalysisResourceCategoriesResult> r = coverageService.listAnalysisResourceCategories(agencyId);
return new Result<List<AnalysisResourceCategoriesResult>>().ok(r);
}

5
epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/entity/govorg/IcCoverageCategoryDictEntity.java

@ -60,11 +60,6 @@ public class IcCoverageCategoryDictEntity extends BaseEpmetEntity {
private String dataType;
/**
* 数量
*/
private Integer quantity;
/**
* 排序
*/

2
epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/CoverageService.java

@ -40,7 +40,7 @@ public interface CoverageService {
* 五大图层-可视化-右侧分类树列表
* @return
*/
List<AnalysisResourceCategoriesResult> listAnalysisResourceCategories();
List<AnalysisResourceCategoriesResult> listAnalysisResourceCategories(String agencyId);
List<AnalysisGovernedTargetsResult> listGovernedTargetCategories(String agencyId);

123
epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/impl/CoverageServiceImpl.java

@ -7,6 +7,7 @@ import com.epmet.commons.tools.enums.CoverageEnums;
import com.epmet.commons.tools.enums.CoveragePlaceTypeEnum;
import com.epmet.commons.tools.exception.EpmetErrorCode;
import com.epmet.commons.tools.exception.EpmetException;
import com.epmet.commons.tools.exception.ExceptionUtils;
import com.epmet.commons.tools.page.PageData;
import com.epmet.commons.tools.redis.common.CustomerOrgRedis;
import com.epmet.commons.tools.redis.common.CustomerStaffRedis;
@ -458,10 +459,11 @@ public class CoverageServiceImpl implements CoverageService {
return heartService.countCommunityOrgEntities(customerId, agencyId, staffOrgIds, search, categoryKey);
} else if (CoveragePlaceTypeEnum.PARTY_UNIT.getCode().equals(placeType)) {
// 机关直属部门(联建单位) 楼宇党建 0;两新组织 1;区域单位党建 2;机关直属部门 3;社会团体 4;民办非企业单位 5;基金会 6;其他 7
if (categoryKey.equals("pu_jgzsbm")) {
String partyUnitType = "3";
return heartService.countPartyUnitEntities(customerId, agencyId, staffOrgIds, partyUnitType, search);
}
// if (categoryKey.equals("pu_jgzsbm")) {
// String partyUnitType = "3";
// }
String[] parts = categoryKey.split("_");
return heartService.countPartyUnitEntities(customerId, agencyId, staffOrgIds, parts[1], search);
} else if (CoveragePlaceTypeEnum.DANGEROUS_CHEMICALS.getCode().equals(placeType)) {
// 危化企业
return orgCoverageService.countDangerousChemicalEntities(customerId, staffOrgIds, search, categoryKey);
@ -568,17 +570,16 @@ public class CoverageServiceImpl implements CoverageService {
} else if (CoveragePlaceTypeEnum.PARTY_UNIT.getCode().equals(placeType)) {
// 机关直属部门(联建单位) 楼宇党建 0;两新组织 1;区域单位党建 2;机关直属部门 3;社会团体 4;民办非企业单位 5;基金会 6;其他 7
if (categoryKey.equals("pu_jgzsbm")) {
String partyUnitType = "3";
// if (categoryKey.equals("pu_jgzsbm")) {
// String partyUnitType = "3";
// }
String[] parts = categoryKey.split("_");
List<IcPartyUnitEntity> l = heartService.searchPartyUnitEntities(
customerId, agencyId, staffOrgIds, partyUnitType, search, isPage, pageNo, pageSize);
customerId, agencyId, staffOrgIds, parts[1], search, isPage, pageNo, pageSize);
return l.stream()
.map(dc -> new CoverageAnalisisDataListResultDTO(dc.getId(), categoryKey,
isPage ? categoryDict.getCategoryName() : null, placeType, isPage ? dc.getUnitName() : null, dc.getLatitude(), dc.getLongitude()))
.collect(Collectors.toList());
}
return new ArrayList<>();
} else if (CoveragePlaceTypeEnum.DANGEROUS_CHEMICALS.getCode().equals(placeType)) {
// 危化企业
List<IcDangerousChemicalsEntity> l = orgCoverageService.searchDangerousChemicalEntities(
@ -680,7 +681,7 @@ public class CoverageServiceImpl implements CoverageService {
* @return
*/
@Override
public List<AnalysisResourceCategoriesResult> listAnalysisResourceCategories() {
public List<AnalysisResourceCategoriesResult> listAnalysisResourceCategories(String agencyId) {
// 获取所有菜单的url
List<String> menuUrls = new ArrayList<>(128);
@ -700,7 +701,7 @@ public class CoverageServiceImpl implements CoverageService {
continue;
}
AnalysisResourceCategoriesResult categoriesOfThisCoverage = new AnalysisResourceCategoriesResult();
AnalysisResourceCategoriesResult coverageResult = new AnalysisResourceCategoriesResult();
HashMap<String, AnalysisResourceCategoriesResult.PlaceType> placeTypeMap = new HashMap<>();
List<IcCoverageCategoryDictEntity> categoryDictEntities = govOrgCoverageService.listResourceCategoryEntities(coverage.getKey());
@ -714,9 +715,9 @@ public class CoverageServiceImpl implements CoverageService {
if (StringUtils.isBlank(category.getPlaceTypeInAnalysis())) {
// 没有placetype的
if ("all".equals(category.getMenuUrl()) || menuUrls.contains(category.getMenuUrl())) {
categoriesOfThisCoverage.getCategories()
coverageResult.getCategories()
.add(new AnalysisResourceCategoriesResult.Category(category.getCategoryKey(), category.getCategoryName(),
category.getCoverageType(), category.getPlaceType(), category.getQuantity()));
category.getCoverageType(), category.getPlaceType(), 0));
}
} else {
// 有placetype的
@ -725,33 +726,94 @@ public class CoverageServiceImpl implements CoverageService {
if (placeType == null) {
placeType = new AnalysisResourceCategoriesResult.PlaceType(
category.getPlaceTypeInAnalysis(), CoveragePlaceTypeEnum.getEnum(category.getPlaceTypeInAnalysis()).getName(), category.getQuantity(), new ArrayList<>());
category.getPlaceTypeInAnalysis(), CoveragePlaceTypeEnum.getEnum(category.getPlaceTypeInAnalysis()).getName(), new AtomicInteger(0), new ArrayList<>());
placeTypeMap.put(category.getPlaceTypeInAnalysis(), placeType);
}
placeType.getCategories().add(new AnalysisResourceCategoriesResult.Category(category.getCategoryKey(),
category.getCategoryName(), category.getCoverageType(), category.getPlaceType(), category.getQuantity()));
placeType.setQuantity(placeType.getQuantity() + category.getQuantity()); // todo 0改为category的count
category.getCategoryName(), category.getCoverageType(), category.getPlaceType(), 0));
}
}
});
AtomicReference<Integer> total = new AtomicReference<>(0);
placeTypeMap.forEach((placeTypeKey, placeType) -> {
categoriesOfThisCoverage.getPlaceTypesInAnalysis().add(placeType);
total.updateAndGet(v -> v + placeType.getQuantity());
coverageResult.getPlaceTypesInAnalysis().add(placeType);
});
categoriesOfThisCoverage.setCoverageType(coverage.getKey());
categoriesOfThisCoverage.setCoverageName(CoverageEnums.getEnum(coverage.getKey()).getCoverageName());
categoriesOfThisCoverage.setQuantity(total.get());
results.add(categoriesOfThisCoverage);
coverageResult.setCoverageType(coverage.getKey());
coverageResult.setCoverageName(CoverageEnums.getEnum(coverage.getKey()).getCoverageName());
results.add(coverageResult);
}
String customerId = EpmetRequestHolder.getLoginUserCustomerId();
String userId = EpmetRequestHolder.getLoginUserId();
Map<String,String> stafInfoMap=getStaffPidsFromStaffInfo(customerId, userId, agencyId,OrgConstant.AGENCY);
String staffOrgPath = stafInfoMap.get(OrgConstant.AGENC_PATH);
// 填充数量quantity字段
fillQuantities4ResourcesCoverages(results, customerId, agencyId, staffOrgPath);
return results;
}
private void fillQuantities4ResourcesCoverages(ArrayList<AnalysisResourceCategoriesResult> coverages, String customerId, String agencyId, String staffOrgIds) {
ArrayList<CompletableFuture<Void>> futures = new ArrayList<>();
coverages.forEach(coverage -> {
List<AnalysisResourceCategoriesResult.Category> categoriesInCoverage = coverage.getCategories();
List<AnalysisResourceCategoriesResult.PlaceType> placeTypesInCoverage = coverage.getPlaceTypesInAnalysis();
if (CollectionUtils.isNotEmpty(categoriesInCoverage)) {
// 直属于图层的category。异步提交计算任务
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> fillQuantities4ResourcesCategories(coverage, null, categoriesInCoverage, customerId, agencyId, staffOrgIds));
futures.add(future);
}
if (CollectionUtils.isNotEmpty(placeTypesInCoverage)) {
// placeType,需要拆开来算, 异步提交计算任务
placeTypesInCoverage.forEach(placeType -> {
List<AnalysisResourceCategoriesResult.Category> categoriesInPlaceType = placeType.getCategories();
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> fillQuantities4ResourcesCategories(coverage, placeType, categoriesInPlaceType, customerId, agencyId, staffOrgIds));
futures.add(future);
});
}
});
// 等待异步任务计算完成
futures.forEach(f -> {
try {
f.get();
} catch (InterruptedException e) {
log.error("【五大图层】可视化-右侧资源列表异步计算数量quantity失败,计算被中止,错误信息:{}", ExceptionUtils.getErrorStackTrace(e));
} catch (ExecutionException e) {
log.error("【五大图层】可视化-右侧资源列表异步计算数量quantity失败,错误信息:{}", ExceptionUtils.getErrorStackTrace(e));
}
});
}
private void fillQuantities4ResourcesCategories(AnalysisResourceCategoriesResult coverage,
AnalysisResourceCategoriesResult.PlaceType placeType,
List<AnalysisResourceCategoriesResult.Category> categories,
String customerId, String agencyId, String staffOrgIds) {
AtomicInteger total = new AtomicInteger();
categories.forEach(cat -> {
Integer quantity = doDataListCount(customerId, agencyId, staffOrgIds, cat.getPlaceType(), cat.getCategoryKey(), null);
cat.setQuantity(quantity);
total.getAndAdd(quantity);
});
// 分别给所属的coverage和placeType的quantity增加quantity
coverage.getQuantity().getAndAdd(total.get());
if (placeType != null) {
placeType.getQuantity().getAndAdd(total.get());
}
}
@Override
public List<AnalysisGovernedTargetsResult> listGovernedTargetCategories(String agencyId) {
@ -776,7 +838,6 @@ public class CoverageServiceImpl implements CoverageService {
List<AnalysisGovernedTargetsResult> results = new ArrayList<>();
HashMap<String, List<AnalysisGovernedTargetsResult>> placeTypeTargetMap = new HashMap<>();
HashMap<String, Integer> placeTypeQuantityMap = new HashMap<>();
targetCategories.forEach(rc -> {
String placeTypeInAnalysis = rc.getPlaceTypeInAnalysis();
@ -790,7 +851,7 @@ public class CoverageServiceImpl implements CoverageService {
// 只有一层,没有子级
if (menuUrls.contains(rc.getMenuUrl()) || "all".equals(rc.getMenuUrl())) {
results.add(new AnalysisGovernedTargetsResult(rc.getCategoryKey(), rc.getCategoryName(), rc.getCoverageType(),
rc.getPlaceType(), CoveragePlaceTypeEnum.getEnum(rc.getPlaceType()).getName(), rc.getQuantity(), new ArrayList<>()));
rc.getPlaceType(), CoveragePlaceTypeEnum.getEnum(rc.getPlaceType()).getName(), 0, new ArrayList<>()));
}
} else {
// 有子级,需要使用placeTypeInAnalysis分组
@ -799,12 +860,9 @@ public class CoverageServiceImpl implements CoverageService {
if (CollectionUtils.isEmpty(targets)) {
targets = new ArrayList<>();
placeTypeTargetMap.put(placeTypeInAnalysis, targets);
placeTypeQuantityMap.put(placeTypeInAnalysis, 0);
}
targets.add(new AnalysisGovernedTargetsResult(rc.getCategoryKey(), rc.getCategoryName(), rc.getCoverageType(),
rc.getPlaceType(), CoveragePlaceTypeEnum.getEnum(rc.getPlaceType()).getName(), rc.getQuantity(), new ArrayList<>()));
placeTypeQuantityMap.put(placeTypeInAnalysis, placeTypeQuantityMap.get(placeTypeInAnalysis) + rc.getQuantity());
rc.getPlaceType(), CoveragePlaceTypeEnum.getEnum(rc.getPlaceType()).getName(), 0, new ArrayList<>()));
}
}
});
@ -814,7 +872,6 @@ public class CoverageServiceImpl implements CoverageService {
placeTypeTargetMap.forEach((placeTypeInAnalysis, targetObjects) -> {
AnalysisGovernedTargetsResult tr = new AnalysisGovernedTargetsResult();
tr.setPlaceType(placeTypeInAnalysis);
tr.setQuantity(placeTypeQuantityMap.get(placeTypeInAnalysis));
tr.setPlaceTypeName(CoveragePlaceTypeEnum.getEnum(placeTypeInAnalysis).getName());
tr.setChildren(targetObjects);
results.add(tr);
@ -854,9 +911,9 @@ public class CoverageServiceImpl implements CoverageService {
try {
future.get();
} catch (InterruptedException e) {
e.printStackTrace();
log.error("【五大图层】可视化-左侧异步计算数量quantity失败,计算被中止,错误信息:{}", ExceptionUtils.getErrorStackTrace(e));
} catch (ExecutionException e) {
e.printStackTrace();
log.error("【五大图层】可视化-左侧异步计算数量quantity失败,错误信息:{}", ExceptionUtils.getErrorStackTrace(e));
}
});
}

4
epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/entity/IcCoverageCategoryDictEntity.java

@ -62,10 +62,6 @@ public class IcCoverageCategoryDictEntity extends BaseEpmetEntity {
private String coverageType;
private String dataType;
/**
* 数量
*/
private Integer quantity;
/**
* 排序
*/

Loading…
Cancel
Save