diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/constant/FacPhotovoltaicPanelPartsConstant.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/constant/FacPhotovoltaicPanelPartsConstant.java new file mode 100644 index 00000000..90e2cc88 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/constant/FacPhotovoltaicPanelPartsConstant.java @@ -0,0 +1,15 @@ +package org.dromara.facility.constant; + +/** + * @author lcj + * @date 2025/5/23 11:29 + */ +public interface FacPhotovoltaicPanelPartsConstant { + + String POINT = "钻孔"; + + String COLUMN = "桩基"; + + String SUPPORT = "支架"; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/controller/FacBoxTransformerController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/controller/FacBoxTransformerController.java index a8169484..5ad2b4e5 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/controller/FacBoxTransformerController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/controller/FacBoxTransformerController.java @@ -15,6 +15,7 @@ import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; +import org.dromara.facility.domain.dto.boxtransformer.FacBoxTransformerCreateByGeoJsonReq; import org.dromara.facility.domain.dto.boxtransformer.FacBoxTransformerCreateReq; import org.dromara.facility.domain.dto.boxtransformer.FacBoxTransformerQueryReq; import org.dromara.facility.domain.dto.boxtransformer.FacBoxTransformerUpdateReq; @@ -82,6 +83,17 @@ public class FacBoxTransformerController extends BaseController { return R.ok(facBoxTransformerService.insertByBo(req)); } + /** + * 通过GeoJson新增设施-箱变 + */ + @SaCheckPermission("facility:boxTransformer:add") + @Log(title = "设施-箱变", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/geoJson") + public R insertByGeoJson(@RequestBody FacBoxTransformerCreateByGeoJsonReq req) { + return toAjax(facBoxTransformerService.insertByGeoJson(req)); + } + /** * 修改设施-箱变 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/controller/FacInverterController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/controller/FacInverterController.java index 7e71ef96..718ce71a 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/controller/FacInverterController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/controller/FacInverterController.java @@ -15,6 +15,7 @@ import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; +import org.dromara.facility.domain.dto.inverter.FacInverterCreateByGeoJsonReq; import org.dromara.facility.domain.dto.inverter.FacInverterCreateReq; import org.dromara.facility.domain.dto.inverter.FacInverterQueryReq; import org.dromara.facility.domain.dto.inverter.FacInverterUpdateReq; @@ -82,6 +83,17 @@ public class FacInverterController extends BaseController { return R.ok(facInverterService.insertByBo(req)); } + /** + * 通过GeoJson新增设施-逆变器 + */ + @SaCheckPermission("facility:inverter:add") + @Log(title = "设施-逆变器", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/geoJson") + public R insertByGeoJson(@RequestBody FacInverterCreateByGeoJsonReq req) { + return toAjax(facInverterService.insertByGeoJson(req)); + } + /** * 修改设施-逆变器 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/FacBoxTransformer.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/FacBoxTransformer.java index 7a4e41e1..0b6c30c8 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/FacBoxTransformer.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/FacBoxTransformer.java @@ -71,6 +71,11 @@ public class FacBoxTransformer extends BaseEntity { */ private Long progressCategoryId; + /** + * 进度类别名称 + */ + private String progressCategoryName; + /** * 备注 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/FacInverter.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/FacInverter.java index 17f73edd..1025104f 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/FacInverter.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/FacInverter.java @@ -71,6 +71,11 @@ public class FacInverter extends BaseEntity { */ private Long progressCategoryId; + /** + * 进度类别名称 + */ + private String progressCategoryName; + /** * 备注 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/FacPhotovoltaicPanel.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/FacPhotovoltaicPanel.java index 057a9fbb..0cf2c0c0 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/FacPhotovoltaicPanel.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/FacPhotovoltaicPanel.java @@ -69,6 +69,11 @@ public class FacPhotovoltaicPanel extends BaseEntity { */ private Long progressCategoryId; + /** + * 进度类别名称 + */ + private String progressCategoryName; + /** * 备注 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/FacPhotovoltaicPanelColumn.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/FacPhotovoltaicPanelColumn.java index 45636963..5b205081 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/FacPhotovoltaicPanelColumn.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/FacPhotovoltaicPanelColumn.java @@ -69,6 +69,11 @@ public class FacPhotovoltaicPanelColumn extends BaseEntity { */ private Long progressCategoryId; + /** + * 进度类别名称 + */ + private String progressCategoryName; + /** * 备注 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/FacPhotovoltaicPanelPoint.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/FacPhotovoltaicPanelPoint.java index 015d6964..1119938e 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/FacPhotovoltaicPanelPoint.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/FacPhotovoltaicPanelPoint.java @@ -69,6 +69,11 @@ public class FacPhotovoltaicPanelPoint extends BaseEntity { */ private Long progressCategoryId; + /** + * 进度类别名称 + */ + private String progressCategoryName; + /** * 备注 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/FacPhotovoltaicPanelSupport.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/FacPhotovoltaicPanelSupport.java index bffdf19b..5198f3e9 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/FacPhotovoltaicPanelSupport.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/FacPhotovoltaicPanelSupport.java @@ -69,6 +69,11 @@ public class FacPhotovoltaicPanelSupport extends BaseEntity { */ private Long progressCategoryId; + /** + * 进度类别名称 + */ + private String progressCategoryName; + /** * 备注 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/boxtransformer/FacBoxTransformerCreateByGeoJsonReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/boxtransformer/FacBoxTransformerCreateByGeoJsonReq.java new file mode 100644 index 00000000..d4e2aa46 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/boxtransformer/FacBoxTransformerCreateByGeoJsonReq.java @@ -0,0 +1,40 @@ +package org.dromara.facility.domain.dto.boxtransformer; + +import lombok.Data; +import org.dromara.facility.domain.dto.geojson.FacGeoJsonByPoint; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author lcj + * @date 2025/5/23 18:12 + */ +@Data +public class FacBoxTransformerCreateByGeoJsonReq implements Serializable { + + @Serial + private static final long serialVersionUID = -5887138349157048252L; + + /** + * 项目id + */ + private Long projectId; + + /** + * 地理位置 + */ + private FacGeoJsonByPoint locationGeoJson; + + /** + * 名称 + */ + private FacGeoJsonByPoint nameGeoJson; + + /** + * 进度类别id列表 + */ + private List progressCategoryIdList; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/inverter/FacInverterCreateByGeoJsonReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/inverter/FacInverterCreateByGeoJsonReq.java new file mode 100644 index 00000000..8a79f1f3 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/inverter/FacInverterCreateByGeoJsonReq.java @@ -0,0 +1,40 @@ +package org.dromara.facility.domain.dto.inverter; + +import lombok.Data; +import org.dromara.facility.domain.dto.geojson.FacGeoJsonByPoint; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author lcj + * @date 2025/5/23 18:15 + */ +@Data +public class FacInverterCreateByGeoJsonReq implements Serializable { + + @Serial + private static final long serialVersionUID = 924709230113144983L; + + /** + * 项目id + */ + private Long projectId; + + /** + * 地理位置 + */ + private FacGeoJsonByPoint locationGeoJson; + + /** + * 名称 + */ + private FacGeoJsonByPoint nameGeoJson; + + /** + * 进度类别id列表 + */ + private List progressCategoryIdList; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/IFacBoxTransformerService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/IFacBoxTransformerService.java index 3c684845..2cd75704 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/IFacBoxTransformerService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/IFacBoxTransformerService.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.facility.domain.FacBoxTransformer; +import org.dromara.facility.domain.dto.boxtransformer.FacBoxTransformerCreateByGeoJsonReq; import org.dromara.facility.domain.dto.boxtransformer.FacBoxTransformerCreateReq; import org.dromara.facility.domain.dto.boxtransformer.FacBoxTransformerQueryReq; import org.dromara.facility.domain.dto.boxtransformer.FacBoxTransformerUpdateReq; @@ -55,6 +56,14 @@ public interface IFacBoxTransformerService extends IService { */ Long insertByBo(FacBoxTransformerCreateReq req); + /** + * 新增设施-箱变 + * + * @param geoJson GeoJson格式 + * @return 是否新增成功 + */ + Boolean insertByGeoJson(FacBoxTransformerCreateByGeoJsonReq geoJson); + /** * 修改设施-箱变 * diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/IFacInverterService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/IFacInverterService.java index 660ecfcf..f02e67d5 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/IFacInverterService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/IFacInverterService.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.facility.domain.FacInverter; +import org.dromara.facility.domain.dto.inverter.FacInverterCreateByGeoJsonReq; import org.dromara.facility.domain.dto.inverter.FacInverterCreateReq; import org.dromara.facility.domain.dto.inverter.FacInverterQueryReq; import org.dromara.facility.domain.dto.inverter.FacInverterUpdateReq; @@ -55,6 +56,14 @@ public interface IFacInverterService extends IService { */ Long insertByBo(FacInverterCreateReq req); + /** + * 新增设施-逆变器 + * + * @param geoJson GeoJson格式 + * @return 是否新增成功 + */ + Boolean insertByGeoJson(FacInverterCreateByGeoJsonReq geoJson); + /** * 修改设施-逆变器 * diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/IFacMatrixService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/IFacMatrixService.java index 292663f0..d0a88fc8 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/IFacMatrixService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/IFacMatrixService.java @@ -7,8 +7,8 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.facility.domain.FacMatrix; import org.dromara.facility.domain.dto.matrix.*; -import org.dromara.facility.domain.vo.matrix.FacMatrixVo; import org.dromara.facility.domain.vo.matrix.FacMatrixDetailGisVo; +import org.dromara.facility.domain.vo.matrix.FacMatrixVo; import java.util.Collection; import java.util.List; @@ -111,4 +111,22 @@ public interface IFacMatrixService extends IService { */ Page getVoPage(Page matrixPage); + /** + * 根据坐标获取符合的方阵 + * + * @param matrixList 方阵集合 + * @param coordinates 坐标 + * @return 符合的方阵 + */ + FacMatrix getMatrixIdByCoordinates(List matrixList, List coordinates); + + /** + * 根据二维坐标获取符合的方阵 + * + * @param matrixList 方阵集合 + * @param coordinates 坐标 + * @return 符合的方阵 + */ + FacMatrix getMatrixIdBy2Coordinates(List matrixList, List> coordinates); + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacBoxTransformerServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacBoxTransformerServiceImpl.java index 133dde5b..465f2608 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacBoxTransformerServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacBoxTransformerServiceImpl.java @@ -14,20 +14,31 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.facility.domain.FacBoxTransformer; +import org.dromara.facility.domain.FacMatrix; +import org.dromara.facility.domain.dto.boxtransformer.FacBoxTransformerCreateByGeoJsonReq; import org.dromara.facility.domain.dto.boxtransformer.FacBoxTransformerCreateReq; import org.dromara.facility.domain.dto.boxtransformer.FacBoxTransformerQueryReq; import org.dromara.facility.domain.dto.boxtransformer.FacBoxTransformerUpdateReq; +import org.dromara.facility.domain.dto.geojson.FacFeatureByPoint; +import org.dromara.facility.domain.dto.geojson.FacGeometryByPoint; import org.dromara.facility.domain.vo.boxtransformer.FacBoxTransformerVo; import org.dromara.facility.mapper.FacBoxTransformerMapper; import org.dromara.facility.service.IFacBoxTransformerService; import org.dromara.facility.service.IFacMatrixService; +import org.dromara.progress.domain.PgsProgressCategory; +import org.dromara.progress.service.IPgsProgressCategoryService; import org.dromara.project.service.IBusProjectService; +import org.dromara.utils.JSTUtils; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; /** * 设施-箱变Service业务层处理 @@ -45,6 +56,9 @@ public class FacBoxTransformerServiceImpl extends ServiceImpl matrixList = matrixService.lambdaQuery() + .eq(FacMatrix::getProjectId, projectId).list(); + if (CollUtil.isEmpty(matrixList)) { + throw new ServiceException("项目下无方阵数据,请先创建方阵消息后再添加光伏板信息", HttpStatus.NOT_FOUND); + } + // 获取箱变信息 + List oldBoxTransformerList = this.lambdaQuery() + .eq(FacBoxTransformer::getProjectId, projectId).list(); + Map boxTransformerMap = oldBoxTransformerList.stream().collect(Collectors.toMap( + boxTransformer -> boxTransformer.getName() + "_" + boxTransformer.getProgressCategoryId(), + Function.identity(), + (boxTransformer1, boxTransformer2) -> boxTransformer1 + )); + List locationGeoJson = geoJson.getLocationGeoJson().getFeatures(); + List nameGeoJson = geoJson.getNameGeoJson().getFeatures(); + // 获取进度类别信息 + List progressCategoryIdList = geoJson.getProgressCategoryIdList(); + Map progressCategoryMap = progressCategoryService.lambdaQuery() + .in(PgsProgressCategory::getId, progressCategoryIdList).list() + .stream() + .collect(Collectors.toMap( + PgsProgressCategory::getId, + Function.identity(), + (existing, replacement) -> existing + )); + List boxTransformerList = new ArrayList<>(); + for (FacFeatureByPoint locationFeature : locationGeoJson) { + FacGeometryByPoint geometry = locationFeature.getGeometry(); + List coordinates = geometry.getCoordinates(); + // 判断箱变在哪个方阵里 + FacMatrix matrix = matrixService.getMatrixIdByCoordinates(matrixList, coordinates); + if (matrix == null) { + continue; + } + // 获取箱变名称 + String name = JSTUtils.findNearestText(coordinates, nameGeoJson); + if (name == null) { + continue; + } + // 根据进度类别创建 + for (Long progressCategoryId : progressCategoryIdList) { + FacBoxTransformer boxTransformer = new FacBoxTransformer(); + boxTransformer.setMatrixId(matrix.getId()); + boxTransformer.setName(name); + boxTransformer.setProjectId(projectId); + boxTransformer.setPositions(JSONUtil.toJsonStr(coordinates)); + String mapKey = name + "_" + progressCategoryId; + // 如果有同名同类别箱变,则获取该箱变完成状态 + if (CollUtil.isNotEmpty(boxTransformerMap) && boxTransformerMap.containsKey(mapKey)) { + FacBoxTransformer oldBoxTransformer = boxTransformerMap.get(name); + boxTransformer.setFinishType(oldBoxTransformer.getFinishType()); + boxTransformer.setFinishDate(oldBoxTransformer.getFinishDate()); + boxTransformer.setProgressCategoryId(oldBoxTransformer.getProgressCategoryId()); + boxTransformer.setProgressCategoryName(oldBoxTransformer.getProgressCategoryName()); + boxTransformer.setStatus(oldBoxTransformer.getStatus()); + } else { + boxTransformer.setProgressCategoryId(progressCategoryId); + boxTransformer.setProgressCategoryName(progressCategoryMap.get(progressCategoryId).getName()); + } + boxTransformerList.add(boxTransformer); + } + } + // 删除旧数据 + if (CollUtil.isNotEmpty(oldBoxTransformerList)) { + boolean result = this.removeBatchByIds(oldBoxTransformerList); + if (!result) { + throw new ServiceException("删除箱变失败,数据库异常", HttpStatus.ERROR); + } + } + // 批量保存 + if (CollUtil.isNotEmpty(boxTransformerList)) { + boolean result = this.saveBatch(boxTransformerList); + if (!result) { + throw new ServiceException("新增箱变失败,数据库异常", HttpStatus.ERROR); + } + } + return true; + } + /** * 修改设施-箱变 * diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacInverterServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacInverterServiceImpl.java index b148c5ca..e3cfc2c6 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacInverterServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacInverterServiceImpl.java @@ -14,6 +14,10 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.facility.domain.FacInverter; +import org.dromara.facility.domain.FacMatrix; +import org.dromara.facility.domain.dto.geojson.FacFeatureByPoint; +import org.dromara.facility.domain.dto.geojson.FacGeometryByPoint; +import org.dromara.facility.domain.dto.inverter.FacInverterCreateByGeoJsonReq; import org.dromara.facility.domain.dto.inverter.FacInverterCreateReq; import org.dromara.facility.domain.dto.inverter.FacInverterQueryReq; import org.dromara.facility.domain.dto.inverter.FacInverterUpdateReq; @@ -21,13 +25,20 @@ import org.dromara.facility.domain.vo.inverter.FacInverterVo; import org.dromara.facility.mapper.FacInverterMapper; import org.dromara.facility.service.IFacInverterService; import org.dromara.facility.service.IFacMatrixService; +import org.dromara.progress.domain.PgsProgressCategory; +import org.dromara.progress.service.IPgsProgressCategoryService; import org.dromara.project.service.IBusProjectService; +import org.dromara.utils.JSTUtils; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; /** * 设施-逆变器Service业务层处理 @@ -45,6 +56,9 @@ public class FacInverterServiceImpl extends ServiceImpl matrixList = matrixService.lambdaQuery() + .eq(FacMatrix::getProjectId, projectId).list(); + if (CollUtil.isEmpty(matrixList)) { + throw new ServiceException("项目下无方阵数据,请先创建方阵消息后再添加光伏板信息", HttpStatus.NOT_FOUND); + } + // 获取箱变信息 + List oldInverterList = this.lambdaQuery() + .eq(FacInverter::getProjectId, projectId).list(); + Map inverterMap = oldInverterList.stream().collect(Collectors.toMap( + inverter -> inverter.getName() + "_" + inverter.getProgressCategoryId(), + Function.identity(), + (inverter1, inverter2) -> inverter1 + )); + List locationGeoJson = geoJson.getLocationGeoJson().getFeatures(); + List nameGeoJson = geoJson.getNameGeoJson().getFeatures(); + // 获取进度类别信息 + List progressCategoryIdList = geoJson.getProgressCategoryIdList(); + Map progressCategoryMap = progressCategoryService.lambdaQuery() + .in(PgsProgressCategory::getId, progressCategoryIdList).list() + .stream() + .collect(Collectors.toMap( + PgsProgressCategory::getId, + Function.identity(), + (existing, replacement) -> existing + )); + List inverterList = new ArrayList<>(); + for (FacFeatureByPoint locationFeature : locationGeoJson) { + FacGeometryByPoint geometry = locationFeature.getGeometry(); + List coordinates = geometry.getCoordinates(); + // 判断箱变在哪个方阵里 + FacMatrix matrix = matrixService.getMatrixIdByCoordinates(matrixList, coordinates); + if (matrix == null) { + continue; + } + // 获取逆变器名称 + String name = JSTUtils.findNearestText(coordinates, nameGeoJson); + if (name == null) { + continue; + } + // 根据进度类别创建 + for (Long progressCategoryId : progressCategoryIdList) { + FacInverter inverter = new FacInverter(); + inverter.setMatrixId(matrix.getId()); + inverter.setName(name); + inverter.setProjectId(projectId); + inverter.setPositions(JSONUtil.toJsonStr(coordinates)); + String mapKey = name + "_" + progressCategoryId; + // 如果有同名同类别箱变,则获取该箱变完成状态 + if (CollUtil.isNotEmpty(inverterMap) && inverterMap.containsKey(mapKey)) { + FacInverter oldInverter = inverterMap.get(name); + inverter.setFinishType(oldInverter.getFinishType()); + inverter.setFinishDate(oldInverter.getFinishDate()); + inverter.setProgressCategoryId(oldInverter.getProgressCategoryId()); + inverter.setProgressCategoryName(oldInverter.getProgressCategoryName()); + inverter.setStatus(oldInverter.getStatus()); + } else { + inverter.setProgressCategoryId(progressCategoryId); + inverter.setProgressCategoryName(progressCategoryMap.get(progressCategoryId).getName()); + } + inverterList.add(inverter); + } + } + // 删除旧数据 + if (CollUtil.isNotEmpty(oldInverterList)) { + boolean result = this.removeBatchByIds(oldInverterList); + if (!result) { + throw new ServiceException("删除逆变器失败,数据库异常", HttpStatus.ERROR); + } + } + // 批量保存 + if (CollUtil.isNotEmpty(inverterList)) { + boolean result = this.saveBatch(inverterList); + if (!result) { + throw new ServiceException("新增逆变器失败,数据库异常", HttpStatus.ERROR); + } + } + return true; + } + /** * 修改设施-逆变器 * diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacMatrixServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacMatrixServiceImpl.java index 844486aa..22d49a09 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacMatrixServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacMatrixServiceImpl.java @@ -14,17 +14,17 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.facility.domain.*; -import org.dromara.facility.domain.enums.FacFinishStatusEnum; import org.dromara.facility.domain.dto.geojson.FacFeature; import org.dromara.facility.domain.dto.geojson.FacFeatureByPoint; import org.dromara.facility.domain.dto.geojson.FacGeometry; import org.dromara.facility.domain.dto.matrix.*; -import org.dromara.facility.domain.vo.matrix.FacMatrixVo; +import org.dromara.facility.domain.enums.FacFinishStatusEnum; import org.dromara.facility.domain.vo.matrix.FacMatrixDetailGisVo; +import org.dromara.facility.domain.vo.matrix.FacMatrixVo; import org.dromara.facility.mapper.FacMatrixMapper; import org.dromara.facility.service.*; import org.dromara.project.service.IBusProjectService; -import org.dromara.utils.GeoJsonUtils; +import org.dromara.utils.JSTUtils; import org.springframework.beans.BeanUtils; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -41,7 +41,8 @@ import java.util.List; * @date 2025-04-21 */ @Service -public class FacMatrixServiceImpl extends ServiceImpl implements IFacMatrixService { +public class FacMatrixServiceImpl extends ServiceImpl + implements IFacMatrixService { @Resource private IBusProjectService projectService; @@ -251,7 +252,7 @@ public class FacMatrixServiceImpl extends ServiceImpl oldMatrixList = this.lambdaQuery() .eq(FacMatrix::getProjectId, projectId).list(); List matrixList = new ArrayList<>(); @@ -263,12 +264,12 @@ public class FacMatrixServiceImpl extends ServiceImpl> coordinatesList = GeoJsonUtils.getTwoDimensionalCoordinates(geometry); + List> coordinatesList = JSTUtils.getTwoDimensionalCoordinates(geometry); // 获取方阵名称 String name = null; for (FacFeatureByPoint nameFeature : nameFeatures) { List nameCoordinates = nameFeature.getGeometry().getCoordinates(); - Boolean result = GeoJsonUtils.pointIsWithInPlane(coordinatesList, nameCoordinates); + Boolean result = JSTUtils.pointIsWithInPlane(coordinatesList, nameCoordinates); if (result) { name = nameFeature.getProperties().getText(); break; @@ -475,4 +476,57 @@ public class FacMatrixServiceImpl extends ServiceImpl matrixList, List coordinates) { + // 判断在哪个方阵里 + FacMatrix matchMatrix = null; + for (FacMatrix matrix : matrixList) { + String positions = matrix.getPositions(); + List> positionList = new ArrayList<>(); + List arr = JSONUtil.toList(positions, String.class); + for (String s : arr) { + positionList.add(JSONUtil.toList(s, Double.class)); + } + Boolean result = JSTUtils.pointIsWithInPlane(positionList, coordinates); + if (result) { + matchMatrix = matrix; + break; + } + } + return matchMatrix; + } + + /** + * 根据二维坐标获取符合的方阵 + * + * @param matrixList 方阵集合 + * @param coordinates 坐标 + * @return 符合的方阵 + */ + @Override + public FacMatrix getMatrixIdBy2Coordinates(List matrixList, List> coordinates) { + FacMatrix matchMatrix = null; + for (FacMatrix matrix : matrixList) { + String positions = matrix.getPositions(); + List> positionList = new ArrayList<>(); + List arr = JSONUtil.toList(positions, String.class); + for (String s : arr) { + positionList.add(JSONUtil.toList(s, Double.class)); + } + Boolean result = JSTUtils.planeIsWithInPlane(positionList, coordinates); + if (result) { + matchMatrix = matrix; + break; + } + } + return matchMatrix; + } + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelPartsServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelPartsServiceImpl.java index e435ba22..e904ef7d 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelPartsServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelPartsServiceImpl.java @@ -9,6 +9,7 @@ import org.dromara.common.core.constant.HttpStatus; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.facility.constant.FacPhotovoltaicPanelPartsConstant; import org.dromara.facility.domain.FacPhotovoltaicPanel; import org.dromara.facility.domain.FacPhotovoltaicPanelColumn; import org.dromara.facility.domain.FacPhotovoltaicPanelPoint; @@ -17,8 +18,11 @@ import org.dromara.facility.domain.dto.geojson.FacFeatureByPoint; import org.dromara.facility.domain.dto.photovoltaicpanelparts.FacPhotovoltaicPanelPartsCreateByGeoJsonReq; import org.dromara.facility.domain.dto.photovoltaicpanelparts.FacPhotovoltaicPanelPartsCreateReq; import org.dromara.facility.service.*; +import org.dromara.progress.constant.PgsProgressCategoryConstant; +import org.dromara.progress.domain.PgsProgressCategory; +import org.dromara.progress.service.IPgsProgressCategoryService; import org.dromara.project.service.IBusProjectService; -import org.dromara.utils.GeoJsonUtils; +import org.dromara.utils.JSTUtils; import org.springframework.aop.framework.AopContext; import org.springframework.beans.BeanUtils; import org.springframework.dao.DataAccessException; @@ -63,6 +67,9 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan @Resource private IFacPhotovoltaicPanelSupportService photovoltaicPanelSupportService; + @Resource + private IPgsProgressCategoryService progressCategoryService; + /** * 批量新增设施-光伏板(桩点、立柱、支架) * @@ -115,6 +122,19 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan List supportList = new ArrayList<>(); // 获取当前登录用户 Long userId = LoginHelper.getUserId(); + // 获取进度类别 + List progressCategoryNameList = List.of(FacPhotovoltaicPanelPartsConstant.POINT, + FacPhotovoltaicPanelPartsConstant.COLUMN, + FacPhotovoltaicPanelPartsConstant.SUPPORT); + Map progressCategoryMap = progressCategoryService.lambdaQuery() + .in(PgsProgressCategory::getName, progressCategoryNameList) + .in(PgsProgressCategory::getProjectId, projectId, PgsProgressCategoryConstant.PUBLIC_PROJECT_ID) + .list() + .stream().collect(Collectors.toMap( + PgsProgressCategory::getName, + Function.identity(), + (existing, replacement) -> existing + )); // 遍历所有光伏板,找到所有匹配的点 for (FacPhotovoltaicPanel photovoltaicPanel : photovoltaicPanelList) { String positions = photovoltaicPanel.getPositions(); @@ -124,7 +144,7 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan positionList.add(JSONUtil.toList(s, Double.class)); } // 获取点在面内的点 - List> pointInPlaneList = GeoJsonUtils.getPointInPlaneList(positionList, pointPositionList); + List> pointInPlaneList = JSTUtils.getPointInPlaneList(positionList, pointPositionList); // 删除点在面内的点 pointPositionList.removeAll(pointInPlaneList); // 判断点在面内的点是否为空 @@ -148,6 +168,11 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan photovoltaicPanelPoint.setFinishType(oldPoint.getFinishType()); photovoltaicPanelPoint.setStatus(oldPoint.getStatus()); } + if (CollUtil.isNotEmpty(progressCategoryMap) && progressCategoryMap.containsKey(FacPhotovoltaicPanelPartsConstant.POINT)) { + PgsProgressCategory progressCategory = progressCategoryMap.get(FacPhotovoltaicPanelPartsConstant.POINT); + photovoltaicPanelPoint.setProgressCategoryId(progressCategory.getId()); + photovoltaicPanelPoint.setProgressCategoryName(progressCategory.getName()); + } pointList.add(photovoltaicPanelPoint); FacPhotovoltaicPanelColumn photovoltaicPanelColumn = new FacPhotovoltaicPanelColumn(); photovoltaicPanelColumn.setProjectId(projectId); @@ -161,6 +186,11 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan photovoltaicPanelColumn.setFinishType(oldColumn.getFinishType()); photovoltaicPanelColumn.setStatus(oldColumn.getStatus()); } + if (CollUtil.isNotEmpty(progressCategoryMap) && progressCategoryMap.containsKey(FacPhotovoltaicPanelPartsConstant.COLUMN)) { + PgsProgressCategory progressCategory = progressCategoryMap.get(FacPhotovoltaicPanelPartsConstant.COLUMN); + photovoltaicPanelColumn.setProgressCategoryId(progressCategory.getId()); + photovoltaicPanelColumn.setProgressCategoryName(progressCategory.getName()); + } columnList.add(photovoltaicPanelColumn); FacPhotovoltaicPanelSupport photovoltaicPanelSupport = new FacPhotovoltaicPanelSupport(); photovoltaicPanelSupport.setProjectId(projectId); @@ -174,6 +204,11 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan photovoltaicPanelSupport.setFinishType(oldSupport.getFinishType()); photovoltaicPanelSupport.setStatus(oldSupport.getStatus()); } + if (CollUtil.isNotEmpty(progressCategoryMap) && progressCategoryMap.containsKey(FacPhotovoltaicPanelPartsConstant.SUPPORT)) { + PgsProgressCategory progressCategory = progressCategoryMap.get(FacPhotovoltaicPanelPartsConstant.SUPPORT); + photovoltaicPanelSupport.setProgressCategoryId(progressCategory.getId()); + photovoltaicPanelSupport.setProgressCategoryName(progressCategory.getName()); + } supportList.add(photovoltaicPanelSupport); i++; } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelServiceImpl.java index ea2c6f58..f391df6f 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelServiceImpl.java @@ -27,8 +27,10 @@ import org.dromara.facility.mapper.FacPhotovoltaicPanelMapper; import org.dromara.facility.service.IFacMatrixService; import org.dromara.facility.service.IFacPhotovoltaicPanelPartsService; import org.dromara.facility.service.IFacPhotovoltaicPanelService; +import org.dromara.progress.domain.PgsProgressCategory; +import org.dromara.progress.service.IPgsProgressCategoryService; import org.dromara.project.service.IBusProjectService; -import org.dromara.utils.GeoJsonUtils; +import org.dromara.utils.JSTUtils; import org.springframework.beans.BeanUtils; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -61,6 +63,9 @@ public class FacPhotovoltaicPanelServiceImpl extends ServiceImpl photovoltaicPanelList = new ArrayList<>(); List locationFeatures = geoJson.getLocationGeoJson().getFeatures(); List nameFeatures = geoJson.getNameGeoJson().getFeatures(); + // 获取进度类别信息 + List progressCategoryIdList = geoJson.getProgressCategoryIdList(); + Map progressCategoryMap = progressCategoryService.lambdaQuery() + .in(PgsProgressCategory::getId, progressCategoryIdList).list() + .stream() + .collect(Collectors.toMap( + PgsProgressCategory::getId, + Function.identity(), + (existing, replacement) -> existing + )); for (FacFeatureByPlane locationFeature : locationFeatures) { FacGeometryByPlane geometry = locationFeature.getGeometry(); List> coordinates = geometry.getCoordinates().getFirst(); // 判断光伏板在哪个方阵里 - Long matrixId = null; - for (FacMatrix matrix : matrixList) { - String positions = matrix.getPositions(); - List> positionList = new ArrayList<>(); - List arr = JSONUtil.toList(positions, String.class); - for (String s : arr) { - positionList.add(JSONUtil.toList(s, Double.class)); - } - Boolean result = GeoJsonUtils.planeIsWithInPlane(positionList, coordinates); - if (result) { - matrixId = matrix.getId(); - break; - } - } - if (matrixId == null) { + FacMatrix matrix = matrixService.getMatrixIdBy2Coordinates(matrixList, coordinates); + if (matrix == null) { continue; } // 获取光伏板名称 String name = null; for (FacFeatureByPoint nameFeature : nameFeatures) { List nameCoordinates = nameFeature.getGeometry().getCoordinates(); - Boolean result = GeoJsonUtils.pointIsWithInPlane(coordinates, nameCoordinates); + Boolean result = JSTUtils.pointIsWithInPlane(coordinates, nameCoordinates); if (result) { name = nameFeature.getProperties().getText(); break; @@ -203,9 +205,9 @@ public class FacPhotovoltaicPanelServiceImpl extends ServiceImpl target, List nameGeoJson) { + GeometryFactory geometryFactory = new GeometryFactory(); + Point targetPoint = geometryFactory.createPoint(new Coordinate(target.get(0), target.get(1))); + FacFeatureByPoint nearestFeature = null; + double minDistance = Double.MAX_VALUE; + for (FacFeatureByPoint feature : nameGeoJson) { + FacGeometryByPoint geometry = feature.getGeometry(); + List coords = geometry.getCoordinates(); + if (coords != null && coords.size() == 2) { + Point currentPoint = geometryFactory.createPoint(new Coordinate(coords.get(0), coords.get(1))); + double distance = targetPoint.distance(currentPoint); + if (distance < minDistance) { + minDistance = distance; + nearestFeature = feature; + } + } + } + if (nearestFeature != null && nearestFeature.getProperties() != null) { + return nearestFeature.getProperties().getText(); + } + return null; // 如果没找到合适的点 + } /** * 点是否在平面内 @@ -82,7 +114,7 @@ public class GeoJsonUtils { */ public static Coordinate[] getPlaneCoordinate(List> planeLists) { return planeLists.stream().map(planeList -> - new Coordinate(planeList.get(0), planeList.get(1))) + new Coordinate(planeList.getFirst(), planeList.get(1))) .toList().toArray(new Coordinate[0]); }