From 19754c1ca99e9612a5e2716a93c4d1d70e6ed827 Mon Sep 17 00:00:00 2001 From: lcj <2331845269@qq.com> Date: Fri, 25 Apr 2025 15:52:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=BC=82=E6=AD=A5=E5=A4=84?= =?UTF-8?q?=E7=90=86=E4=BC=98=E5=8C=96DXF=20=E8=BD=AC=20GeoJSON=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=93=8D=E5=BA=94=E9=80=9F=E5=BA=A6=EF=BC=9B=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E9=83=A8=E5=88=86=E9=80=BB=E8=BE=91=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=88=A0=E9=99=A4=E5=8A=9F=E8=83=BD=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/DromaraApplication.java | 3 +- ...nstant.java => DesignMapFileConstant.java} | 8 +- .../IFacPhotovoltaicPanelPartsService.java | 20 ++++ .../impl/FacBoxTransformerServiceImpl.java | 5 + .../service/impl/FacInverterServiceImpl.java | 5 + .../service/impl/FacMatrixServiceImpl.java | 93 +++++++++++------- ...FacPhotovoltaicPanelColumnServiceImpl.java | 5 + .../FacPhotovoltaicPanelPartsServiceImpl.java | 75 +++++++++++++++ .../FacPhotovoltaicPanelPointServiceImpl.java | 5 + .../impl/FacPhotovoltaicPanelServiceImpl.java | 21 +++++ ...acPhotovoltaicPanelSupportServiceImpl.java | 5 + .../controller/BusProjectFileController.java | 6 +- .../service/IBusProjectFileService.java | 2 +- .../impl/BusProjectFileServiceImpl.java | 94 +++++++++++++------ .../{DxfUtils.java => Dxf2JsonUtils.java} | 2 +- .../java/org/dromara/utils/GeoJsonUtils.java | 37 ++++++++ 16 files changed, 316 insertions(+), 70 deletions(-) rename RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/constant/{DxfFileConstant.java => DesignMapFileConstant.java} (72%) rename RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/utils/{DxfUtils.java => Dxf2JsonUtils.java} (99%) diff --git a/RuoYi-Vue-Plus/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java b/RuoYi-Vue-Plus/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java index 8ef33fe5..b39e8126 100644 --- a/RuoYi-Vue-Plus/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java +++ b/RuoYi-Vue-Plus/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java @@ -3,13 +3,14 @@ package org.dromara; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; +import org.springframework.scheduling.annotation.EnableAsync; /** * 启动程序 * * @author Lion Li */ - +@EnableAsync @SpringBootApplication public class DromaraApplication { diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/constant/DxfFileConstant.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/constant/DesignMapFileConstant.java similarity index 72% rename from RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/constant/DxfFileConstant.java rename to RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/constant/DesignMapFileConstant.java index 4a485e70..81cee96a 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/constant/DxfFileConstant.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/constant/DesignMapFileConstant.java @@ -6,9 +6,9 @@ import java.io.File; * @author lcj * @date 2025/4/23 11:09 */ -public interface DxfFileConstant { +public interface DesignMapFileConstant { - String DXF_BASE_PATH = "file" + File.separator + "resource" + File.separator + "dxf"; + String DXF_BASE_PATH = "file" + File.separator + "resource" + File.separator + "design"; /** * WGS 84 @@ -17,6 +17,10 @@ public interface DxfFileConstant { String EPSG4524 = "4524"; + String DXFFileSuffix = "dxf"; + + String JSONFileSuffix = "json"; + static String getDxfProjectPath(Long projectId) { return DXF_BASE_PATH + File.separator + projectId; } diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/IFacPhotovoltaicPanelPartsService.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/IFacPhotovoltaicPanelPartsService.java index 4b8a1856..f53e74cb 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/IFacPhotovoltaicPanelPartsService.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/IFacPhotovoltaicPanelPartsService.java @@ -3,6 +3,8 @@ package org.dromara.facility.service; import org.dromara.facility.domain.req.photovoltaicpanelparts.PhotovoltaicPanelPartsCreateByGeoJsonReq; import org.dromara.facility.domain.req.photovoltaicpanelparts.PhotovoltaicPanelPartsCreateReq; +import java.util.Collection; + /** * 设施-光伏板(桩点、立柱、支架)Service接口 * @@ -27,4 +29,22 @@ public interface IFacPhotovoltaicPanelPartsService { */ Boolean insertPartsByBatch(PhotovoltaicPanelPartsCreateReq req); + /** + * 根据方阵主键判断是否存在光伏板点 + * + * @param projectId 项目id + * @param matrixIds 方阵Id列表 + * @return 是否存在 + */ + Boolean validPartsExistByMatrix(Long projectId, Collection matrixIds); + + /** + * 根据光伏板名称判断是否存在光伏板点 + * + * @param projectId 项目id + * @param photovoltaicPanelNames 光伏板名称列表 + * @return 是否存在 + */ + Boolean validPartsExistByPhotovoltaicPanel(Long projectId, Collection photovoltaicPanelNames); + } diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacBoxTransformerServiceImpl.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacBoxTransformerServiceImpl.java index f88fa945..607f9fab 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacBoxTransformerServiceImpl.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacBoxTransformerServiceImpl.java @@ -12,6 +12,7 @@ import org.dromara.common.core.utils.ObjectUtils; import org.dromara.common.core.utils.StringUtils; 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.req.boxtransformer.BoxTransformerCreateReq; import org.dromara.facility.domain.req.boxtransformer.BoxTransformerQueryReq; @@ -194,8 +195,12 @@ public class FacBoxTransformerServiceImpl extends ServiceImpl ids, Boolean isValid) { + Long userId = LoginHelper.getUserId(); + List boxTransformerList = this.listByIds(ids); if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 + List projectId = boxTransformerList.stream().map(FacBoxTransformer::getProjectId).toList(); + projectService.validAuth(projectId, userId); } return this.removeBatchByIds(ids); } diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacInverterServiceImpl.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacInverterServiceImpl.java index b60eb57c..1f8aa6f6 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacInverterServiceImpl.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacInverterServiceImpl.java @@ -12,6 +12,7 @@ import org.dromara.common.core.utils.ObjectUtils; import org.dromara.common.core.utils.StringUtils; 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.req.inverter.InverterCreateReq; import org.dromara.facility.domain.req.inverter.InverterQueryReq; @@ -194,8 +195,12 @@ public class FacInverterServiceImpl extends ServiceImpl ids, Boolean isValid) { + Long userId = LoginHelper.getUserId(); + List inverterList = this.listByIds(ids); if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 + List projectId = inverterList.stream().map(FacInverter::getProjectId).toList(); + projectService.validAuth(projectId, userId); } return this.removeBatchByIds(ids); } diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacMatrixServiceImpl.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacMatrixServiceImpl.java index 867f03af..c48b1c8d 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacMatrixServiceImpl.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacMatrixServiceImpl.java @@ -12,8 +12,11 @@ import org.dromara.common.core.utils.ObjectUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.constant.GeoJsonConstant; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.facility.domain.FacBoxTransformer; +import org.dromara.facility.domain.FacInverter; import org.dromara.facility.domain.FacMatrix; +import org.dromara.facility.domain.FacPhotovoltaicPanel; import org.dromara.facility.domain.req.geojson.Feature; import org.dromara.facility.domain.req.geojson.FeatureByPoint; import org.dromara.facility.domain.req.geojson.Geometry; @@ -23,17 +26,17 @@ import org.dromara.facility.domain.req.matrix.MatrixQueryReq; import org.dromara.facility.domain.req.matrix.MatrixUpdateReq; import org.dromara.facility.domain.vo.FacMatrixVo; import org.dromara.facility.mapper.FacMatrixMapper; -import org.dromara.facility.service.IFacMatrixService; +import org.dromara.facility.service.*; import org.dromara.project.service.IBusProjectService; import org.dromara.utils.GeoJsonUtils; import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; 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.stream.Collectors; /** * 设施-方阵Service业务层处理 @@ -47,6 +50,22 @@ public class FacMatrixServiceImpl extends ServiceImpl matrixList = new ArrayList<>(); List locationFeatures = geoJson.getLocationGeoJson().getFeatures(); List nameFeatures = geoJson.getNameGeoJson().getFeatures(); + // 遍历位置信息 for (Feature feature : locationFeatures) { FacMatrix matrix = new FacMatrix(); matrix.setProjectId(projectId); Geometry geometry = feature.getGeometry(); - List coordinates = geometry.getCoordinates(); - if (geometry.getType().equals(GeoJsonConstant.POINT)) { - throw new ServiceException("点位无法创建方阵", HttpStatus.BAD_REQUEST); - } + // 获取坐标信息 + List> coordinatesList = GeoJsonUtils.getTwoDimensionalCoordinates(geometry); // 获取方阵名称 String name = null; - List> coordinatesList = new ArrayList<>(); - if (geometry.getType().equals(GeoJsonConstant.LINE)) { - for (Object obj : coordinates) { - if (obj instanceof List innerList) { - List point = new ArrayList<>(); - for (Object num : innerList) { - if (num instanceof Number) { - point.add(((Number) num).doubleValue()); - } - } - coordinatesList.add(point); - } - } - } else if (geometry.getType().equals(GeoJsonConstant.POLYGON)) { - coordinatesList = coordinates.stream() - .filter(obj -> obj instanceof List) - .flatMap(obj -> ((List) obj).stream()) - .filter(pointObj -> pointObj instanceof List) - .map(pointObj -> ((List) pointObj).stream() - .filter(num -> num instanceof Number) - .map(num -> ((Number) num).doubleValue()) - .collect(Collectors.toList())) - .collect(Collectors.toList()); - } for (FeatureByPoint nameFeature : nameFeatures) { List nameCoordinates = nameFeature.getGeometry().getCoordinates(); Boolean result = GeoJsonUtils.pointIsWithInPlane(coordinatesList, nameCoordinates); @@ -183,7 +177,8 @@ public class FacMatrixServiceImpl extends ServiceImpl ids, Boolean isValid) { + Long userId = LoginHelper.getUserId(); + List matrixList = this.listByIds(ids); if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 + List projectIds = matrixList.stream().map(FacMatrix::getProjectId).distinct().toList(); + if (CollUtil.isNotEmpty(projectIds) && projectIds.size() > 1) { + throw new ServiceException("仅能删除单个项目下的方阵", HttpStatus.BAD_REQUEST); + } + Long projectId = projectIds.get(0); + projectService.validAuth(projectId, userId); + // 判断方阵下是否存在光伏板信息 + Long photovoltaicPanelCount = photovoltaicPanelService.lambdaQuery() + .eq(FacPhotovoltaicPanel::getProjectId, projectId) + .in(FacPhotovoltaicPanel::getMatrixId, ids).count(); + if (photovoltaicPanelCount > 0) { + throw new ServiceException("删除失败,方阵下存在光伏板信息", HttpStatus.CONFLICT); + } + // 判断方阵下是否存在箱变信息 + Long boxTransformerCount = boxTransformerService.lambdaQuery() + .eq(FacBoxTransformer::getProjectId, projectId) + .in(FacBoxTransformer::getMatrixId, ids).count(); + if (boxTransformerCount > 0) { + throw new ServiceException("删除失败,方阵下存在箱变信息", HttpStatus.CONFLICT); + } + // 判断方阵下是否存在逆变器信息 + Long inverterCount = inverterService.lambdaQuery() + .eq(FacInverter::getProjectId, projectId) + .in(FacInverter::getMatrixId, ids).count(); + if (inverterCount > 0) { + throw new ServiceException("删除失败,方阵下存在逆变器信息", HttpStatus.CONFLICT); + } + // 判断方阵下是否存在光伏板点信息 + Boolean result = photovoltaicPanelPartsService.validPartsExistByMatrix(projectId, ids); + if (result) { + throw new ServiceException("删除失败,方阵下存在光伏板点信息", HttpStatus.CONFLICT); + } } return this.removeBatchByIds(ids); } diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelColumnServiceImpl.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelColumnServiceImpl.java index 7d8273f6..fc153708 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelColumnServiceImpl.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelColumnServiceImpl.java @@ -12,6 +12,7 @@ import org.dromara.common.core.utils.ObjectUtils; import org.dromara.common.core.utils.StringUtils; 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.FacPhotovoltaicPanelColumn; import org.dromara.facility.domain.req.photovoltaicpanelcolumn.PhotovoltaicPanelColumnCreateReq; import org.dromara.facility.domain.req.photovoltaicpanelcolumn.PhotovoltaicPanelColumnQueryReq; @@ -194,8 +195,12 @@ public class FacPhotovoltaicPanelColumnServiceImpl extends ServiceImpl ids, Boolean isValid) { + Long userId = LoginHelper.getUserId(); + List photovoltaicPanelColumnList = this.listByIds(ids); if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 + List projectId = photovoltaicPanelColumnList.stream().map(FacPhotovoltaicPanelColumn::getProjectId).toList(); + projectService.validAuth(projectId, userId); } return this.removeBatchByIds(ids); } diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelPartsServiceImpl.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelPartsServiceImpl.java index b4aaa0b0..5275f4f7 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelPartsServiceImpl.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelPartsServiceImpl.java @@ -2,6 +2,7 @@ package org.dromara.facility.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import jakarta.annotation.Resource; import org.dromara.common.core.constant.HttpStatus; import org.dromara.common.core.exception.ServiceException; @@ -21,6 +22,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; +import java.util.Collection; import java.util.List; /** @@ -61,17 +63,20 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan if (projectService.getById(projectId) == null) { throw new ServiceException("项目不存在", HttpStatus.NOT_FOUND); } + // 查询项目下光伏板 List photovoltaicPanelList = photovoltaicPanelService.lambdaQuery() .eq(FacPhotovoltaicPanel::getProjectId, projectId).list(); if (CollUtil.isEmpty(photovoltaicPanelList)) { throw new ServiceException("项目下未创建光伏板", HttpStatus.NOT_FOUND); } List features = geoJson.getPointGeoJson().getFeatures(); + // 获取所有点列表 List> pointList = new ArrayList<> (features.stream().map(featureByPoint -> featureByPoint.getGeometry().getCoordinates()).toList()); List photovoltaicPanelPointList = new ArrayList<>(); List photovoltaicPanelColumnList = new ArrayList<>(); List photovoltaicPanelSupportList = new ArrayList<>(); + // 遍历所有光伏板,找到所有匹配的点 for (FacPhotovoltaicPanel photovoltaicPanel : photovoltaicPanelList) { String positions = photovoltaicPanel.getPositions(); List> positionList = new ArrayList<>(); @@ -79,10 +84,13 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan for (String s : arr) { positionList.add(JSONUtil.toList(s, Double.class)); } + // 获取点在面内的点 List> pointInPlaneList = GeoJsonUtils.getPointInPlaneList(positionList, pointList); + // 删除点在面内的点 pointList.removeAll(pointInPlaneList); if (CollUtil.isNotEmpty(pointInPlaneList)) { int i = 1; + // 遍历点在面内的点,添加实体信息 for (List list : pointInPlaneList) { String str = String.format("%02d", i); String name = photovoltaicPanel.getName() + "." + str; @@ -110,6 +118,7 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan } } } + // 批量新增 if (CollUtil.isNotEmpty(photovoltaicPanelPointList)) { boolean result = photovoltaicPanelPointService.saveBatch(photovoltaicPanelPointList); if (!result) { @@ -182,6 +191,72 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan return true; } + /** + * 根据方阵主键判断是否存在光伏板点 + * + * @param projectId 项目id + * @param matrixIds 方阵Id列表 + * @return 是否存在 + */ + @Override + public Boolean validPartsExistByMatrix(Long projectId, Collection matrixIds) { + Long pointCount = photovoltaicPanelPointService.lambdaQuery() + .eq(FacPhotovoltaicPanelPoint::getProjectId, projectId) + .in(FacPhotovoltaicPanelPoint::getMatrixId, matrixIds) + .count(); + if (pointCount > 0) { + return true; + } + Long columnCount = photovoltaicPanelColumnService.lambdaQuery() + .eq(FacPhotovoltaicPanelColumn::getProjectId, projectId) + .in(FacPhotovoltaicPanelColumn::getMatrixId, matrixIds) + .count(); + if (columnCount > 0) { + return true; + } + Long supportCount = photovoltaicPanelSupportService.lambdaQuery() + .eq(FacPhotovoltaicPanelSupport::getProjectId, projectId) + .in(FacPhotovoltaicPanelSupport::getMatrixId, matrixIds) + .count(); + return supportCount > 0; + } + + /** + * 根据光伏板名称判断是否存在光伏板点 + * + * @param projectId 项目id + * @param photovoltaicPanelNames 光伏板名称列表 + * @return 是否存在 + */ + @Override + public Boolean validPartsExistByPhotovoltaicPanel(Long projectId, Collection photovoltaicPanelNames) { + LambdaQueryWrapper pointWrapper = new LambdaQueryWrapper<>(); + pointWrapper.and(query -> { + for (String name : photovoltaicPanelNames) { + query.or().likeRight(FacPhotovoltaicPanelPoint::getName, name + "."); + } + }); + if (photovoltaicPanelPointService.count(pointWrapper) > 0) { + return true; + } + LambdaQueryWrapper ColumnWrapper = new LambdaQueryWrapper<>(); + ColumnWrapper.and(query -> { + for (String name : photovoltaicPanelNames) { + query.or().likeRight(FacPhotovoltaicPanelColumn::getName, name + "."); + } + }); + if (photovoltaicPanelColumnService.count(ColumnWrapper) > 0) { + return true; + } + LambdaQueryWrapper supportWrapper = new LambdaQueryWrapper<>(); + supportWrapper.and(query -> { + for (String name : photovoltaicPanelNames) { + query.or().likeRight(FacPhotovoltaicPanelSupport::getName, name + "."); + } + }); + return photovoltaicPanelSupportService.count(supportWrapper) > 0; + } + /** * 校验名称是否重复 * diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelPointServiceImpl.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelPointServiceImpl.java index ae781d93..edd1bfbb 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelPointServiceImpl.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelPointServiceImpl.java @@ -12,6 +12,7 @@ import org.dromara.common.core.utils.ObjectUtils; import org.dromara.common.core.utils.StringUtils; 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.FacPhotovoltaicPanelPoint; import org.dromara.facility.domain.req.photovoltaicpanelpoint.PhotovoltaicPanelPointCreateReq; import org.dromara.facility.domain.req.photovoltaicpanelpoint.PhotovoltaicPanelPointQueryReq; @@ -194,8 +195,12 @@ public class FacPhotovoltaicPanelPointServiceImpl extends ServiceImpl ids, Boolean isValid) { + Long userId = LoginHelper.getUserId(); + List photovoltaicPanelPointList = this.list(this.buildQueryWrapper(null)); if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 + List projectId = photovoltaicPanelPointList.stream().map(FacPhotovoltaicPanelPoint::getProjectId).toList(); + projectService.validAuth(projectId, userId); } return this.removeBatchByIds(ids); } diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelServiceImpl.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelServiceImpl.java index 96c01c84..4aca9d23 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelServiceImpl.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelServiceImpl.java @@ -12,6 +12,7 @@ import org.dromara.common.core.utils.ObjectUtils; import org.dromara.common.core.utils.StringUtils; 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.FacMatrix; import org.dromara.facility.domain.FacPhotovoltaicPanel; import org.dromara.facility.domain.req.geojson.FeatureByPlane; @@ -24,10 +25,12 @@ import org.dromara.facility.domain.req.photovoltaicpanel.PhotovoltaicPanelUpdate import org.dromara.facility.domain.vo.FacPhotovoltaicPanelVo; 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.project.service.IBusProjectService; import org.dromara.utils.GeoJsonUtils; import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -51,6 +54,10 @@ public class FacPhotovoltaicPanelServiceImpl extends ServiceImpl ids, Boolean isValid) { + Long userId = LoginHelper.getUserId(); + List photovoltaicPanelList = this.listByIds(ids); if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 + List projectIds = photovoltaicPanelList.stream().map(FacPhotovoltaicPanel::getProjectId).distinct().toList(); + if (CollUtil.isNotEmpty(projectIds) && projectIds.size() > 1) { + throw new ServiceException("仅能删除单个项目下的光伏板", HttpStatus.BAD_REQUEST); + } + Long projectId = projectIds.get(0); + projectService.validAuth(projectId, userId); + // 判断是否存在光伏板点信息 + List matrixNames = photovoltaicPanelList.stream().map(FacPhotovoltaicPanel::getName).toList(); + Boolean result = photovoltaicPanelPartsService.validPartsExistByPhotovoltaicPanel(projectId, matrixNames); + if (result) { + throw new ServiceException("删除失败,存在光伏板点信息", HttpStatus.CONFLICT); + } } return this.removeBatchByIds(ids); } diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelSupportServiceImpl.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelSupportServiceImpl.java index a2841c90..8308de25 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelSupportServiceImpl.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacPhotovoltaicPanelSupportServiceImpl.java @@ -12,6 +12,7 @@ import org.dromara.common.core.utils.ObjectUtils; import org.dromara.common.core.utils.StringUtils; 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.FacPhotovoltaicPanelSupport; import org.dromara.facility.domain.req.photovoltaicpanelsupport.PhotovoltaicPanelSupportCreateReq; import org.dromara.facility.domain.req.photovoltaicpanelsupport.PhotovoltaicPanelSupportQueryReq; @@ -194,8 +195,12 @@ public class FacPhotovoltaicPanelSupportServiceImpl extends ServiceImpl ids, Boolean isValid) { + Long userId = LoginHelper.getUserId(); + List photovoltaicPanelSupportList = this.listByIds(ids); if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 + List projectId = photovoltaicPanelSupportList.stream().map(FacPhotovoltaicPanelSupport::getProjectId).toList(); + projectService.validAuth(projectId, userId); } return this.removeBatchByIds(ids); } diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusProjectFileController.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusProjectFileController.java index da0c0583..b64b6cd1 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusProjectFileController.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusProjectFileController.java @@ -101,8 +101,8 @@ public class BusProjectFileController extends BaseController { */ @Log(title = "项目文件存储", businessType = BusinessType.IMPORT) @PostMapping("/upload/dxf") - public R uploadDxf2Json(@RequestParam("file") MultipartFile file, ProjectFileUploadDxfReq req) { - return R.ok(busProjectFileService.uploadDxf2Json(file, req)); + public R uploadDxf2Json(@RequestParam("file") MultipartFile file, ProjectFileUploadDxfReq req) { + return toAjax(busProjectFileService.uploadDxf2Json(file, req)); } /** @@ -113,7 +113,7 @@ public class BusProjectFileController extends BaseController { @SaCheckPermission("project:projectFile:query") @GetMapping("/json/{id}") public R getJSONFile(@NotNull(message = "主键不能为空") - @PathVariable Long id){ + @PathVariable Long id) { return R.ok(busProjectFileService.getJSONFile(id)); } } diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectFileService.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectFileService.java index 969163ad..21c768b9 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectFileService.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectFileService.java @@ -81,7 +81,7 @@ public interface IBusProjectFileService extends IService { * @param req 请求 * @return 主键 */ - Long uploadDxf2Json(MultipartFile file, ProjectFileUploadDxfReq req); + Boolean uploadDxf2Json(MultipartFile file, ProjectFileUploadDxfReq req); /** * 获取项目文件存储视图对象 diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectFileServiceImpl.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectFileServiceImpl.java index 1b541409..cd4d36f1 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectFileServiceImpl.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectFileServiceImpl.java @@ -16,7 +16,10 @@ import org.dromara.common.core.utils.ObjectUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.constant.DxfFileConstant; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.sse.dto.SseMessageDto; +import org.dromara.common.sse.utils.SseMessageUtils; +import org.dromara.constant.DesignMapFileConstant; import org.dromara.project.domain.BusProject; import org.dromara.project.domain.BusProjectFile; import org.dromara.project.domain.req.projectfile.ProjectFileQueryReq; @@ -26,7 +29,7 @@ import org.dromara.project.domain.vo.BusProjectFileVo; import org.dromara.project.mapper.BusProjectFileMapper; import org.dromara.project.service.IBusProjectFileService; import org.dromara.project.service.IBusProjectService; -import org.dromara.utils.DxfUtils; +import org.dromara.utils.Dxf2JsonUtils; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -41,6 +44,8 @@ import java.nio.file.Paths; import java.util.Collection; import java.util.List; import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledExecutorService; /** * 项目文件存储Service业务层处理 @@ -56,6 +61,11 @@ public class BusProjectFileServiceImpl extends ServiceImpl USER_TASK_RUNNING = new ConcurrentHashMap<>(); + /** * 查询项目文件存储 * @@ -167,7 +177,7 @@ public class BusProjectFileServiceImpl extends ServiceImpl { + try { + // 构造命令行参数 + Dxf2JsonUtils.dxf2json(exePath, inputDXFPath, outputJSONPath, sourceEPSG, targetEPSG); + String jsonFilePath = bashPath + File.separator + uuid + "." + DesignMapFileConstant.JSONFileSuffix; + String jsonFileName = FileUtil.getPrefix(fileName) + "." + DesignMapFileConstant.JSONFileSuffix; + BusProjectFile projectFile = new BusProjectFile(); + if (oldProjectFile != null) { + projectFile.setId(oldProjectFile.getId()); + projectFile.setFileName(jsonFileName); + projectFile.setFilePath(jsonFilePath); + boolean update = this.updateById(projectFile); + if (!update) throw new ServiceException("数据库修改异常"); + } else { + projectFile.setProjectId(projectId); + projectFile.setFileName(jsonFileName); + projectFile.setFilePath(jsonFilePath); + boolean save = this.save(projectFile); + if (!save) throw new ServiceException("数据库新增异常"); + } + SseMessageDto dto = new SseMessageDto(); + dto.setMessage("DXF 文件转换成 GeoJSON 成功"); + dto.setUserIds(List.of(userId)); + SseMessageUtils.publishMessage(dto); + } catch (Exception e) { + log.error("DXF 转换失败", e); + SseMessageDto dto = new SseMessageDto(); + dto.setMessage("DXF 文件转换失败,请联系管理员处理"); + dto.setUserIds(List.of(userId)); + SseMessageUtils.publishMessage(dto); + } finally { + // 无论成功或失败都释放状态 + USER_TASK_RUNNING.remove(userId); + } + }); + return true; } /** diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/utils/DxfUtils.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/utils/Dxf2JsonUtils.java similarity index 99% rename from RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/utils/DxfUtils.java rename to RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/utils/Dxf2JsonUtils.java index ce9e9c9c..e4dcbca9 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/utils/DxfUtils.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/utils/Dxf2JsonUtils.java @@ -15,7 +15,7 @@ import java.util.List; * @date 2025/4/23 10:42 */ @Slf4j -public class DxfUtils { +public class Dxf2JsonUtils { /** * dxf转json diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/utils/GeoJsonUtils.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/utils/GeoJsonUtils.java index d24dc4d9..ec53b9aa 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/utils/GeoJsonUtils.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/utils/GeoJsonUtils.java @@ -1,8 +1,13 @@ package org.dromara.utils; +import org.dromara.common.core.constant.HttpStatus; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.constant.GeoJsonConstant; +import org.dromara.facility.domain.req.geojson.Geometry; import org.locationtech.jts.geom.*; import java.util.List; +import java.util.stream.Collectors; /** * @author lcj @@ -80,4 +85,36 @@ public class GeoJsonUtils { new Coordinate(planeList.get(0), planeList.get(1))) .toList().toArray(new Coordinate[0]); } + + /** + * 获取二维坐标 + * + * @param geometry 几何对象 + * @return 二维坐标 + */ + public static List> getTwoDimensionalCoordinates(Geometry geometry) { + String type = geometry.getType(); + List coordinates = geometry.getCoordinates(); + return switch (type) { + case GeoJsonConstant.POINT -> throw new ServiceException("点位无法创建方阵", HttpStatus.BAD_REQUEST); + case GeoJsonConstant.LINE -> coordinates.stream() + .filter(obj -> obj instanceof List) + .map(obj -> ((List) obj).stream() + .filter(num -> num instanceof Number) + .map(num -> ((Number) num).doubleValue()) + .collect(Collectors.toList())) + .collect(Collectors.toList()); + case GeoJsonConstant.POLYGON -> coordinates.stream() + .filter(obj -> obj instanceof List) + .flatMap(obj -> ((List) obj).stream()) + .filter(pointObj -> pointObj instanceof List) + .map(pointObj -> ((List) pointObj).stream() + .filter(num -> num instanceof Number) + .map(num -> ((Number) num).doubleValue()) + .collect(Collectors.toList())) + .collect(Collectors.toList()); + default -> throw new ServiceException("暂不支持该类型", HttpStatus.BAD_REQUEST); + }; + } + }