修改读取 CAD 桩点逻辑

This commit is contained in:
lcj
2025-12-16 16:08:23 +08:00
parent 76595c1510
commit 975d3e6f32
5 changed files with 129 additions and 20 deletions

View File

@ -79,6 +79,38 @@ public class JtsPointMatcher {
return matched; return matched;
} }
/**
* 计算多边形的中心点
*
* @param points 多边形的顶点坐标
* @return 中心点的坐标
*/
public static List<Double> polygonCentroid(List<List<Double>> points) {
double area = 0;
double cx = 0;
double cy = 0;
int size = points.size();
for (int i = 0; i < size - 1; i++) {
double x0 = points.get(i).get(0);
double y0 = points.get(i).get(1);
double x1 = points.get(i + 1).get(0);
double y1 = points.get(i + 1).get(1);
double cross = x0 * y1 - x1 * y0;
area += cross;
cx += (x0 + x1) * cross;
cy += (y0 + y1) * cross;
}
area *= 0.5;
cx /= (6 * area);
cy /= (6 * area);
return List.of(cx, cy);
}
public static void main(String[] args) { public static void main(String[] args) {
// A列表待匹配点 // A列表待匹配点
List<Coordinate> listA = List.of( List<Coordinate> listA = List.of(

View File

@ -4,6 +4,9 @@ import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
/** /**
* @author lilemy * @author lilemy
* @date 2025/4/24 17:38 * @date 2025/4/24 17:38
@ -11,7 +14,10 @@ import lombok.NoArgsConstructor;
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class FacFeature { public class FacFeature implements Serializable {
@Serial
private static final long serialVersionUID = -6103275857879306244L;
private String type; private String type;

View File

@ -4,6 +4,8 @@ import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.util.List; import java.util.List;
/** /**
@ -13,7 +15,10 @@ import java.util.List;
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class FacGeometry { public class FacGeometry implements Serializable {
@Serial
private static final long serialVersionUID = -2582318447932685848L;
private String type; private String type;

View File

@ -1,6 +1,7 @@
package org.dromara.facility.domain.dto.photovoltaicpanelparts; package org.dromara.facility.domain.dto.photovoltaicpanelparts;
import lombok.Data; import lombok.Data;
import org.dromara.facility.domain.dto.geojson.FacGeoJson;
import org.dromara.facility.domain.dto.geojson.FacGeoJsonByPoint; import org.dromara.facility.domain.dto.geojson.FacGeoJsonByPoint;
import java.io.Serial; import java.io.Serial;
@ -24,7 +25,7 @@ public class FacPhotovoltaicPanelPartsCreateByGeoJsonReq implements Serializable
/** /**
* 桩点、立柱、支架 GeoJson * 桩点、立柱、支架 GeoJson
*/ */
private FacGeoJsonByPoint locationGeoJson; private FacGeoJson locationGeoJson;
/** /**
* 批次上传标识 * 批次上传标识

View File

@ -24,7 +24,7 @@ import org.dromara.facility.domain.FacPhotovoltaicPanel;
import org.dromara.facility.domain.FacPhotovoltaicPanelColumn; import org.dromara.facility.domain.FacPhotovoltaicPanelColumn;
import org.dromara.facility.domain.FacPhotovoltaicPanelPoint; import org.dromara.facility.domain.FacPhotovoltaicPanelPoint;
import org.dromara.facility.domain.FacPhotovoltaicPanelSupport; import org.dromara.facility.domain.FacPhotovoltaicPanelSupport;
import org.dromara.facility.domain.dto.geojson.FacFeatureByPoint; import org.dromara.facility.domain.dto.geojson.FacFeature;
import org.dromara.facility.domain.dto.photovoltaicpanelparts.FacPhotovoltaicPanelPartsCreateByGeoJsonReq; import org.dromara.facility.domain.dto.photovoltaicpanelparts.FacPhotovoltaicPanelPartsCreateByGeoJsonReq;
import org.dromara.facility.domain.dto.photovoltaicpanelparts.FacPhotovoltaicPanelPartsCreateReq; import org.dromara.facility.domain.dto.photovoltaicpanelparts.FacPhotovoltaicPanelPartsCreateReq;
import org.dromara.facility.domain.dto.photovoltaicpanelparts.FacPhotovoltaicPanelPartsQueryReq; import org.dromara.facility.domain.dto.photovoltaicpanelparts.FacPhotovoltaicPanelPartsQueryReq;
@ -38,6 +38,7 @@ import org.dromara.progress.constant.PgsProgressCategoryConstant;
import org.dromara.progress.domain.PgsProgressCategory; import org.dromara.progress.domain.PgsProgressCategory;
import org.dromara.progress.domain.vo.progressplandetail.PgsProgressPlanDetailRecognizerVo; import org.dromara.progress.domain.vo.progressplandetail.PgsProgressPlanDetailRecognizerVo;
import org.dromara.progress.service.IPgsProgressCategoryService; import org.dromara.progress.service.IPgsProgressCategoryService;
import org.dromara.project.domain.BusProject;
import org.dromara.project.service.IBusProjectService; import org.dromara.project.service.IBusProjectService;
import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Coordinate;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
@ -146,12 +147,19 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
// 第一次接收请求,进行数据校验 // 第一次接收请求,进行数据校验
int batchNum = geoJson.getBatchNum(); int batchNum = geoJson.getBatchNum();
if (batchNum == 1) { if (batchNum == 1) {
if (projectService.getById(projectId) == null) { BusProject project = projectService.getById(projectId);
if (project == null) {
throw new ServiceException("项目不存在", HttpStatus.NOT_FOUND); throw new ServiceException("项目不存在", HttpStatus.NOT_FOUND);
} }
Long pId = project.getPId();
List<BusProject> subProject = projectService.lambdaQuery()
.eq(BusProject::getPId, pId)
.list();
List<Long> projectIds = subProject.stream().map(BusProject::getId).collect(Collectors.toList());
projectIds.add(projectId);
// 查询项目下光伏板 // 查询项目下光伏板
Long count = photovoltaicPanelService.lambdaQuery() Long count = photovoltaicPanelService.lambdaQuery()
.eq(FacPhotovoltaicPanel::getProjectId, projectId).count(); .in(FacPhotovoltaicPanel::getProjectId, projectIds).count();
if (count <= 0) { if (count <= 0) {
throw new ServiceException("项目下无光伏板信息,请先创建光伏板信息后再添加桩点、立柱、支架信息", HttpStatus.NOT_FOUND); throw new ServiceException("项目下无光伏板信息,请先创建光伏板信息后再添加桩点、立柱、支架信息", HttpStatus.NOT_FOUND);
} }
@ -159,7 +167,7 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
// 获取 redis key // 获取 redis key
String sessionId = geoJson.getSessionId(); String sessionId = geoJson.getSessionId();
int totalBatch = geoJson.getTotalBatch(); int totalBatch = geoJson.getTotalBatch();
List<FacFeatureByPoint> dataList = geoJson.getLocationGeoJson().getFeatures(); List<FacFeature> dataList = geoJson.getLocationGeoJson().getFeatures();
String redisKey = FacRedisKeyConstant.getBatchUploadPartsRedisKey(sessionId, batchNum); String redisKey = FacRedisKeyConstant.getBatchUploadPartsRedisKey(sessionId, batchNum);
// 存储到 Redis设置过期时间 30 分钟 // 存储到 Redis设置过期时间 30 分钟
redisTemplate.opsForValue().set(redisKey, dataList, 1800, TimeUnit.SECONDS); redisTemplate.opsForValue().set(redisKey, dataList, 1800, TimeUnit.SECONDS);
@ -172,13 +180,13 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
messageDto.setProjectId(projectId); messageDto.setProjectId(projectId);
// 如果是最后一批,开始合并 // 如果是最后一批,开始合并
if (batchNum == totalBatch) { if (batchNum == totalBatch) {
List<FacFeatureByPoint> allData = new ArrayList<>(); List<FacFeature> allData = new ArrayList<>();
for (int i = 1; i <= totalBatch; i++) { for (int i = 1; i <= totalBatch; i++) {
String batchKey = FacRedisKeyConstant.getBatchUploadPartsRedisKey(sessionId, i); String batchKey = FacRedisKeyConstant.getBatchUploadPartsRedisKey(sessionId, i);
Object batchObj = redisTemplate.opsForValue().get(batchKey); Object batchObj = redisTemplate.opsForValue().get(batchKey);
if (batchObj instanceof List<?>) { if (batchObj instanceof List<?>) {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
List<FacFeatureByPoint> batch = (List<FacFeatureByPoint>) batchObj; List<FacFeature> batch = (List<FacFeature>) batchObj;
allData.addAll(batch); allData.addAll(batch);
} }
} }
@ -222,11 +230,19 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
* @param features 数据 * @param features 数据
* @param userId 操作用户id * @param userId 操作用户id
*/ */
private void saveBatch(Long projectId, List<FacFeatureByPoint> features, Long userId) { private void saveBatch(Long projectId, List<FacFeature> features, Long userId) {
BusProject project = projectService.getById(projectId);
Long pId = project.getPId();
List<BusProject> subProject = projectService.lambdaQuery()
.eq(BusProject::getPId, pId)
.list();
List<Long> projectIds = subProject.stream().map(BusProject::getId).collect(Collectors.toList());
projectIds.add(projectId);
// 获取进度类别 Map // 获取进度类别 Map
List<PgsProgressCategory> progressCategoryList = progressCategoryService.lambdaQuery() List<PgsProgressCategory> progressCategoryList = progressCategoryService.lambdaQuery()
.select(PgsProgressCategory::getId, PgsProgressCategory::getName, PgsProgressCategory::getMatrixId, PgsProgressCategory::getWorkType) .select(PgsProgressCategory::getId, PgsProgressCategory::getName, PgsProgressCategory::getProjectId,
.eq(PgsProgressCategory::getProjectId, projectId) PgsProgressCategory::getMatrixId, PgsProgressCategory::getWorkType)
.in(PgsProgressCategory::getProjectId, projectIds)
.and(lqw -> lqw .and(lqw -> lqw
.likeRight(PgsProgressCategory::getWorkType, PgsProgressCategoryConstant.PHOTOVOLTAIC_PANEL_POINT_WORK_TYPE + "_") .likeRight(PgsProgressCategory::getWorkType, PgsProgressCategoryConstant.PHOTOVOLTAIC_PANEL_POINT_WORK_TYPE + "_")
.or() .or()
@ -241,7 +257,7 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
)); ));
// 查询项目下光伏板 // 查询项目下光伏板
List<FacPhotovoltaicPanel> photovoltaicPanelList = photovoltaicPanelService.lambdaQuery() List<FacPhotovoltaicPanel> photovoltaicPanelList = photovoltaicPanelService.lambdaQuery()
.eq(FacPhotovoltaicPanel::getProjectId, projectId) .in(FacPhotovoltaicPanel::getProjectId, projectIds)
.list(); .list();
Map<String, FacPhotovoltaicPanel> photovoltaicPanelMap = photovoltaicPanelList.stream() Map<String, FacPhotovoltaicPanel> photovoltaicPanelMap = photovoltaicPanelList.stream()
.collect(Collectors.toMap( .collect(Collectors.toMap(
@ -256,7 +272,7 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
FacPhotovoltaicPanelPoint::getFinishType, FacPhotovoltaicPanelPoint::getFinishType,
FacPhotovoltaicPanelPoint::getFinishDate, FacPhotovoltaicPanelPoint::getFinishDate,
FacPhotovoltaicPanelPoint::getStatus) FacPhotovoltaicPanelPoint::getStatus)
.eq(FacPhotovoltaicPanelPoint::getProjectId, projectId) .in(FacPhotovoltaicPanelPoint::getProjectId, projectIds)
.list(); .list();
Map<String, FacPhotovoltaicPanelPoint> oldPointMap = oldPointList.stream() Map<String, FacPhotovoltaicPanelPoint> oldPointMap = oldPointList.stream()
.collect(Collectors.toMap( .collect(Collectors.toMap(
@ -270,7 +286,7 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
FacPhotovoltaicPanelColumn::getFinishType, FacPhotovoltaicPanelColumn::getFinishType,
FacPhotovoltaicPanelColumn::getFinishDate, FacPhotovoltaicPanelColumn::getFinishDate,
FacPhotovoltaicPanelColumn::getStatus) FacPhotovoltaicPanelColumn::getStatus)
.eq(FacPhotovoltaicPanelColumn::getProjectId, projectId) .in(FacPhotovoltaicPanelColumn::getProjectId, projectIds)
.list(); .list();
Map<String, FacPhotovoltaicPanelColumn> oldColumnMap = oldColumnList.stream() Map<String, FacPhotovoltaicPanelColumn> oldColumnMap = oldColumnList.stream()
.collect(Collectors.toMap( .collect(Collectors.toMap(
@ -284,7 +300,7 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
FacPhotovoltaicPanelSupport::getFinishType, FacPhotovoltaicPanelSupport::getFinishType,
FacPhotovoltaicPanelSupport::getFinishDate, FacPhotovoltaicPanelSupport::getFinishDate,
FacPhotovoltaicPanelSupport::getStatus) FacPhotovoltaicPanelSupport::getStatus)
.eq(FacPhotovoltaicPanelSupport::getProjectId, projectId) .in(FacPhotovoltaicPanelSupport::getProjectId, projectIds)
.list(); .list();
Map<String, FacPhotovoltaicPanelSupport> oldSupportMap = oldSupportList.stream() Map<String, FacPhotovoltaicPanelSupport> oldSupportMap = oldSupportList.stream()
.collect(Collectors.toMap( .collect(Collectors.toMap(
@ -299,7 +315,15 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
try (ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors())) { try (ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors())) {
// 所有点列表 // 所有点列表
List<List<Double>> pointPositionList = new ArrayList<>(features.stream() List<List<Double>> pointPositionList = new ArrayList<>(features.stream()
.map(featureByPoint -> featureByPoint.getGeometry().getCoordinates()) .map(feature -> {
String type = feature.getProperties().getType();
List<Object> coordinates = feature.getGeometry().getCoordinates();
if (type.equalsIgnoreCase("CIRCLE")) {
return JtsPointMatcher.polygonCentroid(castToDoubleList(coordinates));
} else {
return toDoubleList(coordinates);
}
})
.toList()); .toList());
// 多线程处理 // 多线程处理
List<Future<?>> futures = new ArrayList<>(); List<Future<?>> futures = new ArrayList<>();
@ -324,7 +348,7 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
if (CollUtil.isNotEmpty(categoryList)) { if (CollUtil.isNotEmpty(categoryList)) {
for (PgsProgressCategory category : categoryList) { for (PgsProgressCategory category : categoryList) {
FacPhotovoltaicPanelPoint point = new FacPhotovoltaicPanelPoint(); FacPhotovoltaicPanelPoint point = new FacPhotovoltaicPanelPoint();
point.setProjectId(projectId); point.setProjectId(category.getProjectId());
point.setMatrixId(matrixId); point.setMatrixId(matrixId);
point.setName(name); point.setName(name);
point.setPositions(jsonStr); point.setPositions(jsonStr);
@ -349,7 +373,7 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
if (CollUtil.isNotEmpty(categoryList)) { if (CollUtil.isNotEmpty(categoryList)) {
for (PgsProgressCategory category : categoryList) { for (PgsProgressCategory category : categoryList) {
FacPhotovoltaicPanelColumn column = new FacPhotovoltaicPanelColumn(); FacPhotovoltaicPanelColumn column = new FacPhotovoltaicPanelColumn();
column.setProjectId(projectId); column.setProjectId(category.getProjectId());
column.setMatrixId(matrixId); column.setMatrixId(matrixId);
column.setName(name); column.setName(name);
column.setPositions(jsonStr); column.setPositions(jsonStr);
@ -374,7 +398,7 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
if (CollUtil.isNotEmpty(categoryList)) { if (CollUtil.isNotEmpty(categoryList)) {
for (PgsProgressCategory category : categoryList) { for (PgsProgressCategory category : categoryList) {
FacPhotovoltaicPanelSupport support = new FacPhotovoltaicPanelSupport(); FacPhotovoltaicPanelSupport support = new FacPhotovoltaicPanelSupport();
support.setProjectId(projectId); support.setProjectId(category.getProjectId());
support.setMatrixId(matrixId); support.setMatrixId(matrixId);
support.setName(name); support.setName(name);
support.setPositions(jsonStr); support.setPositions(jsonStr);
@ -941,4 +965,45 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
} }
} }
/**
* 将原始数据转换为List<List<Double>>
*
* @param rawList 原始数据
* @return 转换后的数据
*/
public static List<List<Double>> castToDoubleList(List<?> rawList) {
List<List<Double>> result = new ArrayList<>();
for (Object item : rawList) {
if (item instanceof List<?> innerList) {
List<Double> point = new ArrayList<>();
for (Object value : innerList) {
if (value instanceof Number num) {
point.add(num.doubleValue());
}
}
result.add(point);
}
}
return result;
}
/**
* 将原始数据转换为 List<Double>
*
* @param list 原始数据
* @return 转换后的数据
*/
public static List<Double> toDoubleList(List<Object> list) {
return list.stream()
.filter(Objects::nonNull)
.map(o -> {
if (o instanceof Number n) {
return n.doubleValue();
}
throw new IllegalArgumentException("非数字类型:" + o);
})
.toList();
}
} }