@ -24,7 +24,7 @@ import org.dromara.facility.domain.FacPhotovoltaicPanel;
import org.dromara.facility.domain.FacPhotovoltaicPanelColumn ;
import org.dromara.facility.domain.FacPhotovoltaicPanelPoint ;
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.FacPhotovoltaicPanelPartsCreateReq ;
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.vo.progressplandetail.PgsProgressPlanDetailRecognizerVo ;
import org.dromara.progress.service.IPgsProgressCategoryService ;
import org.dromara.project.domain.BusProject ;
import org.dromara.project.service.IBusProjectService ;
import org.locationtech.jts.geom.Coordinate ;
import org.springframework.beans.BeanUtils ;
@ -146,12 +147,19 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
// 第一次接收请求,进行数据校验
int batchNum = geoJson . getBatchNum ( ) ;
if ( batchNum = = 1 ) {
if ( projectService . getById ( projectId ) = = null ) {
BusProject project = projectService . getById ( projectId ) ;
if ( project = = null ) {
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 ( )
. eq ( FacPhotovoltaicPanel : : getProjectId , projectId ) . count ( ) ;
. in ( FacPhotovoltaicPanel : : getProjectId , projectIds ) . count ( ) ;
if ( count < = 0 ) {
throw new ServiceException ( " 项目下无光伏板信息,请先创建光伏板信息后再添加桩点、立柱、支架信息 " , HttpStatus . NOT_FOUND ) ;
}
@ -159,7 +167,7 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
// 获取 redis key
String sessionId = geoJson . getSessionId ( ) ;
int totalBatch = geoJson . getTotalBatch ( ) ;
List < FacFeatureByPoint > dataList = geoJson . getLocationGeoJson ( ) . getFeatures ( ) ;
List < FacFeature > dataList = geoJson . getLocationGeoJson ( ) . getFeatures ( ) ;
String redisKey = FacRedisKeyConstant . getBatchUploadPartsRedisKey ( sessionId , batchNum ) ;
// 存储到 Redis, 设置过期时间 30 分钟
redisTemplate . opsForValue ( ) . set ( redisKey , dataList , 1800 , TimeUnit . SECONDS ) ;
@ -172,13 +180,13 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
messageDto . setProjectId ( projectId ) ;
// 如果是最后一批,开始合并
if ( batchNum = = totalBatch ) {
List < FacFeatureByPoint > allData = new ArrayList < > ( ) ;
List < FacFeature > allData = new ArrayList < > ( ) ;
for ( int i = 1 ; i < = totalBatch ; i + + ) {
String batchKey = FacRedisKeyConstant . getBatchUploadPartsRedisKey ( sessionId , i ) ;
Object batchObj = redisTemplate . opsForValue ( ) . get ( batchKey ) ;
if ( batchObj instanceof List < ? > ) {
@SuppressWarnings ( " unchecked " )
List < FacFeatureByPoint > batch = ( List < FacFeatureByPoint > ) batchObj ;
List < FacFeature > batch = ( List < FacFeature > ) batchObj ;
allData . addAll ( batch ) ;
}
}
@ -222,11 +230,19 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
* @param features 数据
* @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
List < PgsProgressCategory > progressCategoryList = progressCategoryService . lambdaQuery ( )
. select ( PgsProgressCategory : : getId , PgsProgressCategory : : getName , PgsProgressCategory : : getMatrixId , PgsProgressCategory : : getWorkType )
. eq ( PgsProgressCategory : : getProject Id , projectId )
. select ( PgsProgressCategory : : getId , PgsProgressCategory : : getName , PgsProgressCategory : : getProjectId ,
PgsProgressCategory : : getMatrix Id , PgsProgressCategory : : getWorkType )
. in ( PgsProgressCategory : : getProjectId , projectIds )
. and ( lqw - > lqw
. likeRight ( PgsProgressCategory : : getWorkType , PgsProgressCategoryConstant . PHOTOVOLTAIC_PANEL_POINT_WORK_TYPE + " _ " )
. or ( )
@ -241,7 +257,7 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
) ) ;
// 查询项目下光伏板
List < FacPhotovoltaicPanel > photovoltaicPanelList = photovoltaicPanelService . lambdaQuery ( )
. eq ( FacPhotovoltaicPanel : : getProjectId , projectId )
. in ( FacPhotovoltaicPanel : : getProjectId , projectIds )
. list ( ) ;
Map < String , FacPhotovoltaicPanel > photovoltaicPanelMap = photovoltaicPanelList . stream ( )
. collect ( Collectors . toMap (
@ -256,7 +272,7 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
FacPhotovoltaicPanelPoint : : getFinishType ,
FacPhotovoltaicPanelPoint : : getFinishDate ,
FacPhotovoltaicPanelPoint : : getStatus )
. eq ( FacPhotovoltaicPanelPoint : : getProjectId , projectId )
. in ( FacPhotovoltaicPanelPoint : : getProjectId , projectIds )
. list ( ) ;
Map < String , FacPhotovoltaicPanelPoint > oldPointMap = oldPointList . stream ( )
. collect ( Collectors . toMap (
@ -270,7 +286,7 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
FacPhotovoltaicPanelColumn : : getFinishType ,
FacPhotovoltaicPanelColumn : : getFinishDate ,
FacPhotovoltaicPanelColumn : : getStatus )
. eq ( FacPhotovoltaicPanelColumn : : getProjectId , projectId )
. in ( FacPhotovoltaicPanelColumn : : getProjectId , projectIds )
. list ( ) ;
Map < String , FacPhotovoltaicPanelColumn > oldColumnMap = oldColumnList . stream ( )
. collect ( Collectors . toMap (
@ -284,7 +300,7 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
FacPhotovoltaicPanelSupport : : getFinishType ,
FacPhotovoltaicPanelSupport : : getFinishDate ,
FacPhotovoltaicPanelSupport : : getStatus )
. eq ( FacPhotovoltaicPanelSupport : : getProjectId , projectId )
. in ( FacPhotovoltaicPanelSupport : : getProjectId , projectIds )
. list ( ) ;
Map < String , FacPhotovoltaicPanelSupport > oldSupportMap = oldSupportList . stream ( )
. collect ( Collectors . toMap (
@ -299,7 +315,15 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
try ( ExecutorService executor = Executors . newFixedThreadPool ( Runtime . getRuntime ( ) . availableProcessors ( ) ) ) {
// 所有点列表
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 ( ) ) ;
// 多线程处理
List < Future < ? > > futures = new ArrayList < > ( ) ;
@ -324,7 +348,7 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
if ( CollUtil . isNotEmpty ( categoryList ) ) {
for ( PgsProgressCategory category : categoryList ) {
FacPhotovoltaicPanelPoint point = new FacPhotovoltaicPanelPoint ( ) ;
point . setProjectId ( p rojectId) ;
point . setProjectId ( category . getP rojectId( ) );
point . setMatrixId ( matrixId ) ;
point . setName ( name ) ;
point . setPositions ( jsonStr ) ;
@ -349,7 +373,7 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
if ( CollUtil . isNotEmpty ( categoryList ) ) {
for ( PgsProgressCategory category : categoryList ) {
FacPhotovoltaicPanelColumn column = new FacPhotovoltaicPanelColumn ( ) ;
column . setProjectId ( p rojectId) ;
column . setProjectId ( category . getP rojectId( ) );
column . setMatrixId ( matrixId ) ;
column . setName ( name ) ;
column . setPositions ( jsonStr ) ;
@ -374,7 +398,7 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
if ( CollUtil . isNotEmpty ( categoryList ) ) {
for ( PgsProgressCategory category : categoryList ) {
FacPhotovoltaicPanelSupport support = new FacPhotovoltaicPanelSupport ( ) ;
support . setProjectId ( p rojectId) ;
support . setProjectId ( category . getP rojectId( ) );
support . setMatrixId ( matrixId ) ;
support . setName ( name ) ;
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 ( ) ;
}
}