From a81469f405bb3a7cea503b6b73c2296e2022a1de Mon Sep 17 00:00:00 2001 From: lcj <2331845269@qq.com> Date: Tue, 27 May 2025 19:53:53 +0800 Subject: [PATCH] =?UTF-8?q?[update]=20=E4=BF=AE=E6=94=B9=E3=80=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=A0=B9=E6=8D=AEGeoJson=E5=88=9B=E5=BB=BA=E6=96=B9?= =?UTF-8?q?=E9=98=B5=E3=80=81=E5=85=89=E4=BC=8F=E6=9D=BF=E3=80=81=E7=AE=B1?= =?UTF-8?q?=E5=8F=98=E3=80=81=E9=80=86=E5=8F=98=E5=99=A8=E6=96=B9=E6=B3=95?= =?UTF-8?q?=20[add]=20=E6=96=B0=E5=A2=9E=E8=BF=9B=E5=BA=A6=E8=AE=A1?= =?UTF-8?q?=E5=88=92=E8=BF=9B=E5=BA=A6=E8=AE=A1=E5=88=92=E3=80=81=E8=BF=9B?= =?UTF-8?q?=E5=BA=A6=E8=AE=A1=E5=88=92=E8=AF=A6=E6=83=85=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../constant/FacRedisKeyConstant.java | 34 ++ .../FacBoxTransformerCreateByGeoJsonReq.java | 2 +- .../domain/dto/geojson/FacFeatureByPoint.java | 8 +- .../dto/geojson/FacGeometryByPoint.java | 7 +- .../domain/dto/geojson/FacProperties.java | 8 +- .../FacInverterCreateByGeoJsonReq.java | 2 +- .../matrix/FacMatrixCreateByGeoJsonReq.java | 2 +- ...acPhotovoltaicPanelCreateByGeoJsonReq.java | 2 +- ...tovoltaicPanelPartsCreateByGeoJsonReq.java | 15 + .../impl/FacBoxTransformerServiceImpl.java | 9 +- .../service/impl/FacInverterServiceImpl.java | 9 +- .../service/impl/FacMatrixServiceImpl.java | 23 +- .../FacPhotovoltaicPanelPartsServiceImpl.java | 115 +++++-- .../impl/FacPhotovoltaicPanelServiceImpl.java | 25 +- .../PgsProgressCategoryController.java | 11 - .../controller/PgsProgressPlanController.java | 95 ++++++ .../PgsProgressPlanDetailController.java | 96 ++++++ .../progress/domain/PgsProgressPlan.java | 90 ++++++ .../domain/PgsProgressPlanDetail.java | 75 +++++ .../PgsProgressPlanCreateReq.java | 59 ++++ .../progressplan/PgsProgressPlanQueryReq.java | 47 +++ .../PgsProgressPlanDetailCreateDto.java | 30 ++ .../PgsProgressPlanDetailQueryReq.java | 34 ++ .../PgsProgressPlanDetailUpdateReq.java | 18 ++ .../PgsProgressCategoryVo.java | 10 + .../vo/progressplan/PgsProgressPlanVo.java | 77 +++++ .../PgsProgressPlanDetailFacilityVo.java | 33 ++ .../PgsProgressPlanDetailNumVo.java | 43 +++ .../PgsProgressPlanDetailVo.java | 72 +++++ .../mapper/PgsProgressPlanDetailMapper.java | 15 + .../mapper/PgsProgressPlanMapper.java | 15 + .../service/IPgsProgressCategoryService.java | 20 +- .../IPgsProgressPlanDetailService.java | 99 ++++++ .../service/IPgsProgressPlanService.java | 98 ++++++ .../impl/PgsProgressCategoryServiceImpl.java | 70 ++-- .../PgsProgressPlanDetailServiceImpl.java | 263 +++++++++++++++ .../impl/PgsProgressPlanServiceImpl.java | 300 ++++++++++++++++++ .../controller/BusProjectFileController.java | 4 +- .../service/IBusProjectFileService.java | 4 +- .../impl/BusProjectFileServiceImpl.java | 20 +- .../service/impl/BusProjectServiceImpl.java | 2 +- .../org/dromara/utils/BigDecimalUtil.java | 27 ++ .../java/org/dromara/utils/Dxf2JsonUtils.java | 7 + .../progress/PgsProgressPlanDetailMapper.xml | 7 + .../mapper/progress/PgsProgressPlanMapper.xml | 7 + xinnengyuan/script/sql/xinnengyuan.sql | 46 +++ 46 files changed, 1935 insertions(+), 120 deletions(-) create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/constant/FacRedisKeyConstant.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/controller/PgsProgressPlanController.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/controller/PgsProgressPlanDetailController.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/PgsProgressPlan.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/PgsProgressPlanDetail.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/dto/progressplan/PgsProgressPlanCreateReq.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/dto/progressplan/PgsProgressPlanQueryReq.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/dto/progressplandetail/PgsProgressPlanDetailCreateDto.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/dto/progressplandetail/PgsProgressPlanDetailQueryReq.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/dto/progressplandetail/PgsProgressPlanDetailUpdateReq.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplan/PgsProgressPlanVo.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplandetail/PgsProgressPlanDetailFacilityVo.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplandetail/PgsProgressPlanDetailNumVo.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplandetail/PgsProgressPlanDetailVo.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/mapper/PgsProgressPlanDetailMapper.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/mapper/PgsProgressPlanMapper.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsProgressPlanDetailService.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsProgressPlanService.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressPlanDetailServiceImpl.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressPlanServiceImpl.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/utils/BigDecimalUtil.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/progress/PgsProgressPlanDetailMapper.xml create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/progress/PgsProgressPlanMapper.xml diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/constant/FacRedisKeyConstant.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/constant/FacRedisKeyConstant.java new file mode 100644 index 00000000..c8f2e88c --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/constant/FacRedisKeyConstant.java @@ -0,0 +1,34 @@ +package org.dromara.facility.constant; + +/** + * @author lcj + * @date 2025/5/27 18:27 + */ +public interface FacRedisKeyConstant { + + String FAC_REDIS_PREFIX = "fac:"; + + String FAC_IN_OPERATION_REDIS_KEY_PREFIX = FAC_REDIS_PREFIX + "inOperation:"; + + /** + * 批量上传桩点、支架、立柱 Redis 缓存 key + * + * @param sessionId 唯一标识 + * @param batchNum 第几批数据 + * @return Redis 缓存 key + */ + static String getBatchUploadPartsRedisKey(String sessionId, int batchNum) { + return String.format("%s%s:%s:%s", FAC_REDIS_PREFIX, "panel:parts", sessionId, batchNum); + } + + /** + * 当前项目是否正在操作 Redis 缓存 key + * + * @param projectId 项目 ID + * @return Redis 缓存 key + */ + static String getInOperationByProjectRedisKey(Long projectId) { + return String.format("%s%s:%s", FAC_IN_OPERATION_REDIS_KEY_PREFIX, "project", projectId); + } + +} 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 index 6c750573..abfdd2d5 100644 --- 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 @@ -25,7 +25,7 @@ public class FacBoxTransformerCreateByGeoJsonReq implements Serializable { /** * 地理位置 */ - private FacGeoJsonByPoint locationGeoJson; + private List locationGeoJson; /** * 名称 diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/geojson/FacFeatureByPoint.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/geojson/FacFeatureByPoint.java index 2c22b13e..c437f3eb 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/geojson/FacFeatureByPoint.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/geojson/FacFeatureByPoint.java @@ -4,6 +4,9 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.io.Serial; +import java.io.Serializable; + /** * @author lcj * @date 2025/4/24 10:40 @@ -11,7 +14,10 @@ import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor -public class FacFeatureByPoint { +public class FacFeatureByPoint implements Serializable { + + @Serial + private static final long serialVersionUID = -3848496198713404019L; private String type; diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/geojson/FacGeometryByPoint.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/geojson/FacGeometryByPoint.java index ff62021b..7de469e8 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/geojson/FacGeometryByPoint.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/geojson/FacGeometryByPoint.java @@ -4,6 +4,8 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.io.Serial; +import java.io.Serializable; import java.util.List; /** @@ -13,7 +15,10 @@ import java.util.List; @Data @NoArgsConstructor @AllArgsConstructor -public class FacGeometryByPoint { +public class FacGeometryByPoint implements Serializable { + + @Serial + private static final long serialVersionUID = -5904591901195563882L; private String type; diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/geojson/FacProperties.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/geojson/FacProperties.java index 8ab0e8d6..4cc05b2f 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/geojson/FacProperties.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/geojson/FacProperties.java @@ -4,6 +4,9 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.io.Serial; +import java.io.Serializable; + /** * @author lcj * @date 2025/4/24 10:53 @@ -11,7 +14,10 @@ import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor -public class FacProperties { +public class FacProperties implements Serializable { + + @Serial + private static final long serialVersionUID = -2997401596985220109L; private String type; 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 index 1452afdf..295e94fc 100644 --- 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 @@ -25,7 +25,7 @@ public class FacInverterCreateByGeoJsonReq implements Serializable { /** * 地理位置 */ - private FacGeoJsonByPoint locationGeoJson; + private List locationGeoJson; /** * 名称 diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/matrix/FacMatrixCreateByGeoJsonReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/matrix/FacMatrixCreateByGeoJsonReq.java index f90e3955..b64dc8a7 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/matrix/FacMatrixCreateByGeoJsonReq.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/matrix/FacMatrixCreateByGeoJsonReq.java @@ -26,7 +26,7 @@ public class FacMatrixCreateByGeoJsonReq implements Serializable { /** * 地理位置 */ - private FacGeoJson locationGeoJson; + private List locationGeoJson; /** * 名称 diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/photovoltaicpanel/FacPhotovoltaicPanelCreateByGeoJsonReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/photovoltaicpanel/FacPhotovoltaicPanelCreateByGeoJsonReq.java index f203038c..1fb1d9db 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/photovoltaicpanel/FacPhotovoltaicPanelCreateByGeoJsonReq.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/photovoltaicpanel/FacPhotovoltaicPanelCreateByGeoJsonReq.java @@ -26,7 +26,7 @@ public class FacPhotovoltaicPanelCreateByGeoJsonReq implements Serializable { /** * 地理位置 */ - private FacGeoJsonByPlane locationGeoJson; + private List locationGeoJson; /** * 名称 diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/photovoltaicpanelparts/FacPhotovoltaicPanelPartsCreateByGeoJsonReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/photovoltaicpanelparts/FacPhotovoltaicPanelPartsCreateByGeoJsonReq.java index a360860f..af52ef6d 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/photovoltaicpanelparts/FacPhotovoltaicPanelPartsCreateByGeoJsonReq.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/domain/dto/photovoltaicpanelparts/FacPhotovoltaicPanelPartsCreateByGeoJsonReq.java @@ -26,4 +26,19 @@ public class FacPhotovoltaicPanelPartsCreateByGeoJsonReq implements Serializable */ private FacGeoJsonByPoint locationGeoJson; + /** + * 批次上传标识 + */ + private String sessionId; + + /** + * 当前批次 + */ + private int batchNum; + + /** + * 总批次 + */ + private int totalBatch; + } 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 24aa16f4..fe1934d6 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 @@ -154,7 +154,7 @@ public class FacBoxTransformerServiceImpl extends ServiceImpl matrixList = matrixService.lambdaQuery() .eq(FacMatrix::getProjectId, projectId).list(); if (CollUtil.isEmpty(matrixList)) { - throw new ServiceException("项目下无方阵数据,请先创建方阵消息后再添加光伏板信息", HttpStatus.NOT_FOUND); + throw new ServiceException("项目下无方阵数据,请先创建方阵信息后再添加箱变信息", HttpStatus.NOT_FOUND); } // 获取箱变信息 List oldBoxTransformerList = this.lambdaQuery() @@ -164,7 +164,12 @@ public class FacBoxTransformerServiceImpl extends ServiceImpl boxTransformer1 )); - List locationGeoJson = geoJson.getLocationGeoJson().getFeatures(); + // 获取箱变地理信息 + List locationGeoJsonList = geoJson.getLocationGeoJson(); + List locationGeoJson = new ArrayList<>(); + for (FacGeoJsonByPoint geoJsonByPoint : locationGeoJsonList) { + locationGeoJson.addAll(geoJsonByPoint.getFeatures()); + } // 获取所有对应名称的点 List nameGeoJsonList = geoJson.getNameGeoJson(); List nameGeoJson = new ArrayList<>(); 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 fef0a193..0f203a4d 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 @@ -154,7 +154,7 @@ public class FacInverterServiceImpl extends ServiceImpl matrixList = matrixService.lambdaQuery() .eq(FacMatrix::getProjectId, projectId).list(); if (CollUtil.isEmpty(matrixList)) { - throw new ServiceException("项目下无方阵数据,请先创建方阵消息后再添加光伏板信息", HttpStatus.NOT_FOUND); + throw new ServiceException("项目下无方阵数据,请先创建方阵信息后再添加逆变器信息", HttpStatus.NOT_FOUND); } // 获取箱变信息 List oldInverterList = this.lambdaQuery() @@ -164,7 +164,12 @@ public class FacInverterServiceImpl extends ServiceImpl inverter1 )); - List locationGeoJson = geoJson.getLocationGeoJson().getFeatures(); + // 获取所有逆变器对应名称的点 + List locationGeoJsonList = geoJson.getLocationGeoJson(); + List locationGeoJson = new ArrayList<>(); + for (FacGeoJsonByPoint geoJsonByPoint : locationGeoJsonList) { + locationGeoJson.addAll(geoJsonByPoint.getFeatures()); + } // 获取所有对应名称的点 List nameGeoJsonList = geoJson.getNameGeoJson(); List nameGeoJson = new ArrayList<>(); 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 b55472e8..d8e2848f 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 @@ -13,11 +13,9 @@ 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.constant.FacRedisKeyConstant; import org.dromara.facility.domain.*; -import org.dromara.facility.domain.dto.geojson.FacFeature; -import org.dromara.facility.domain.dto.geojson.FacFeatureByPoint; -import org.dromara.facility.domain.dto.geojson.FacGeoJsonByPoint; -import org.dromara.facility.domain.dto.geojson.FacGeometry; +import org.dromara.facility.domain.dto.geojson.*; import org.dromara.facility.domain.dto.matrix.*; import org.dromara.facility.domain.enums.FacFinishStatusEnum; import org.dromara.facility.domain.vo.matrix.FacMatrixDetailGisVo; @@ -30,6 +28,7 @@ import org.dromara.project.service.IBusProjectService; import org.dromara.utils.JSTUtils; import org.springframework.beans.BeanUtils; import org.springframework.context.annotation.Lazy; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -82,6 +81,9 @@ public class FacMatrixServiceImpl extends ServiceImpl redisTemplate; + /** * 查询设施-方阵 * @@ -255,6 +257,13 @@ public class FacMatrixServiceImpl extends ServiceImpl oldMatrixList = this.lambdaQuery() .eq(FacMatrix::getProjectId, projectId).list(); List matrixList = new ArrayList<>(); - List locationFeatures = geoJson.getLocationGeoJson().getFeatures(); + List locationGeoJsonList = geoJson.getLocationGeoJson(); + List locationFeatures = new ArrayList<>(); + for (FacGeoJson geoJsonByPoint : locationGeoJsonList) { + locationFeatures.addAll(geoJsonByPoint.getFeatures()); + } // 获取所有对应名称的点 List nameGeoJsonList = geoJson.getNameGeoJson(); List nameFeatures = new ArrayList<>(); 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 793723aa..c0b5e2e7 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,7 +9,10 @@ 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.common.sse.dto.SseMessageDto; +import org.dromara.common.sse.utils.SseMessageUtils; import org.dromara.facility.constant.FacPhotovoltaicPanelPartsConstant; +import org.dromara.facility.constant.FacRedisKeyConstant; import org.dromara.facility.domain.FacPhotovoltaicPanel; import org.dromara.facility.domain.FacPhotovoltaicPanelColumn; import org.dromara.facility.domain.FacPhotovoltaicPanelPoint; @@ -20,15 +23,14 @@ import org.dromara.facility.domain.dto.photovoltaicpanelparts.FacPhotovoltaicPan import org.dromara.facility.service.*; import org.dromara.progress.constant.PgsProgressCategoryConstant; import org.dromara.progress.domain.PgsProgressCategory; -import org.dromara.progress.domain.PgsProgressCategoryTemplate; import org.dromara.progress.service.IPgsProgressCategoryService; -import org.dromara.progress.service.IPgsProgressCategoryTemplateService; import org.dromara.project.service.IBusProjectService; import org.dromara.utils.JSTUtils; -import org.springframework.aop.framework.AopContext; import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; import org.springframework.dao.DataAccessException; import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -36,10 +38,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -72,6 +71,16 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan @Resource private IPgsProgressCategoryService progressCategoryService; + @Resource + private RedisTemplate redisTemplate; + + @Resource + private ScheduledExecutorService scheduledExecutorService; + + @Resource + @Lazy + private FacPhotovoltaicPanelPartsServiceImpl self; // 注入自己 + /** * 批量新增设施-光伏板(桩点、立柱、支架) * @@ -80,17 +89,88 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan */ @Override public Boolean insertPartsByGeoJson(FacPhotovoltaicPanelPartsCreateByGeoJsonReq geoJson) { - Long projectId = geoJson.getProjectId(); - if (projectService.getById(projectId) == null) { - throw new ServiceException("项目不存在", HttpStatus.NOT_FOUND); + // 设置 redis 防止多次操作 + String operationRedisKey = FacRedisKeyConstant.getInOperationByProjectRedisKey(geoJson.getProjectId()); + // 判断 redis key 是否存在,存在则返回 + Object object = redisTemplate.opsForValue().get(operationRedisKey); + if (object != null && (Boolean) object) { + throw new ServiceException("项目下桩点、立柱、支架数据正在处理中,请勿重复操作", HttpStatus.BAD_REQUEST); } + // 第一次接收请求,进行数据校验 + int batchNum = geoJson.getBatchNum(); + if (batchNum == 1) { + Long projectId = geoJson.getProjectId(); + 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); + } + } + // 获取 redis key + String sessionId = geoJson.getSessionId(); + int totalBatch = geoJson.getTotalBatch(); + List dataList = geoJson.getLocationGeoJson().getFeatures(); + String redisKey = FacRedisKeyConstant.getBatchUploadPartsRedisKey(sessionId, batchNum); + // 存储到 Redis,设置过期时间 30 分钟 + redisTemplate.opsForValue().set(redisKey, dataList, 1800, TimeUnit.SECONDS); + log.info("已接收第 {} 批数据,共 {} 批", batchNum, totalBatch); + Long userId = LoginHelper.getUserId(); + SseMessageDto messageDto = new SseMessageDto(); + messageDto.setUserIds(List.of(userId)); + // 如果是最后一批,开始合并 + if (batchNum == totalBatch) { + List allData = new ArrayList<>(); + for (int i = 1; i <= totalBatch; i++) { + String batchKey = FacRedisKeyConstant.getBatchUploadPartsRedisKey(sessionId, i); + Object batch = redisTemplate.opsForValue().get(batchKey); + if (batch instanceof List) { + allData.addAll((List) batch); + } + } + // 设置 redis key,防止多次操作 + redisTemplate.opsForValue().set(operationRedisKey, true); + messageDto.setMessage("桩点、立柱、支架数据上传完毕,等待中"); + SseMessageUtils.publishMessage(messageDto); + scheduledExecutorService.execute(() -> { + try { + // 合并后的数据处理,如入库 + this.saveBatch(geoJson.getProjectId(), allData, userId); + } catch (Exception e) { + messageDto.setMessage("桩点、立柱、支架数据处理失败,请联系管理员处理"); + SseMessageUtils.publishMessage(messageDto); + log.error("桩点、立柱、支架数据处理失败", e); + throw new ServiceException("桩点、立柱、支架数据处理失败", HttpStatus.ERROR); + } finally { + // 清理缓存 + for (int i = 1; i <= totalBatch; i++) { + String batchKey = FacRedisKeyConstant.getBatchUploadPartsRedisKey(sessionId, i); + redisTemplate.delete(batchKey); + } + redisTemplate.delete(operationRedisKey); + } + messageDto.setMessage("桩点、立柱、支架数据处理完毕"); + SseMessageUtils.publishMessage(messageDto); + }); + return true; + } + return true; + } + + /** + * 批量保存数据 + * + * @param projectId 项目id + * @param features 数据 + * @param userId 操作用户id + */ + private void saveBatch(Long projectId, List features, Long userId) { // 查询项目下光伏板 List photovoltaicPanelList = photovoltaicPanelService.lambdaQuery() .eq(FacPhotovoltaicPanel::getProjectId, projectId).list(); - if (CollUtil.isEmpty(photovoltaicPanelList)) { - throw new ServiceException("项目下未创建光伏板", HttpStatus.NOT_FOUND); - } - List features = geoJson.getLocationGeoJson().getFeatures(); // 获取数据库中所有点的列表 List oldPointList = photovoltaicPanelPointService.lambdaQuery() .eq(FacPhotovoltaicPanelPoint::getProjectId, projectId).list(); @@ -122,8 +202,6 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan List pointList = new ArrayList<>(); List columnList = new ArrayList<>(); List supportList = new ArrayList<>(); - // 获取当前登录用户 - Long userId = LoginHelper.getUserId(); // 获取进度类别 List progressCategoryNameList = List.of(FacPhotovoltaicPanelPartsConstant.POINT, FacPhotovoltaicPanelPartsConstant.COLUMN, @@ -237,7 +315,7 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan List batchSupportList = oldSupportList.subList(i, endIndex); // 使用事务处理每批数据 // 获取代理 - FacPhotovoltaicPanelPartsServiceImpl photovoltaicPanelPartsService = (FacPhotovoltaicPanelPartsServiceImpl) AopContext.currentProxy(); + FacPhotovoltaicPanelPartsServiceImpl photovoltaicPanelPartsService = self; // 异步处理每批数据,将任务添加到异步任务列表 CompletableFuture future = CompletableFuture.runAsync(() -> photovoltaicPanelPartsService.batchDeletePartsInner(batchPointList, batchColumnList, batchSupportList), customExecutor); deleteFutures.add(future); @@ -254,7 +332,7 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan List batchSupportList = supportList.subList(i, endIndex); // 使用事务处理每批数据 // 获取代理 - FacPhotovoltaicPanelPartsServiceImpl photovoltaicPanelPartsService = (FacPhotovoltaicPanelPartsServiceImpl) AopContext.currentProxy(); + FacPhotovoltaicPanelPartsServiceImpl photovoltaicPanelPartsService = self; // 异步处理每批数据,将任务添加到异步任务列表 CompletableFuture future = CompletableFuture.runAsync(() -> photovoltaicPanelPartsService.batchInsertPartsInner(batchPointList, batchColumnList, batchSupportList), customExecutor); insertFutures.add(future); @@ -263,7 +341,6 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan CompletableFuture.allOf(insertFutures.toArray(new CompletableFuture[0])).join(); // 关闭线程池 customExecutor.shutdown(); - return true; } /** 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 14e74ad8..4c8f0760 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 @@ -14,12 +14,10 @@ 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.constant.FacRedisKeyConstant; import org.dromara.facility.domain.FacMatrix; import org.dromara.facility.domain.FacPhotovoltaicPanel; -import org.dromara.facility.domain.dto.geojson.FacFeatureByPlane; -import org.dromara.facility.domain.dto.geojson.FacFeatureByPoint; -import org.dromara.facility.domain.dto.geojson.FacGeoJsonByPoint; -import org.dromara.facility.domain.dto.geojson.FacGeometryByPlane; +import org.dromara.facility.domain.dto.geojson.*; import org.dromara.facility.domain.dto.photovoltaicpanel.FacPhotovoltaicPanelCreateByGeoJsonReq; import org.dromara.facility.domain.dto.photovoltaicpanel.FacPhotovoltaicPanelCreateReq; import org.dromara.facility.domain.dto.photovoltaicpanel.FacPhotovoltaicPanelQueryReq; @@ -40,6 +38,7 @@ import org.springframework.beans.BeanUtils; import org.springframework.context.annotation.Lazy; import org.springframework.dao.DataAccessException; import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -73,6 +72,9 @@ public class FacPhotovoltaicPanelServiceImpl extends ServiceImpl redisTemplate; + /** * 查询设施-光伏板 * @@ -157,6 +159,13 @@ public class FacPhotovoltaicPanelServiceImpl extends ServiceImpl matrixList = matrixService.lambdaQuery() .eq(FacMatrix::getProjectId, projectId).list(); if (CollUtil.isEmpty(matrixList)) { - throw new ServiceException("项目下无方阵数据,请先创建方阵消息后再添加光伏板信息", HttpStatus.NOT_FOUND); + throw new ServiceException("项目下无方阵数据,请先创建方阵信息后再添加光伏板信息", HttpStatus.NOT_FOUND); } // 获取当下项目下光伏板的信息 List oldPhotovoltaicPanelList = this.lambdaQuery() @@ -176,7 +185,11 @@ public class FacPhotovoltaicPanelServiceImpl extends ServiceImpl existing // 如果有重复,保留第一个 )); - List locationFeatures = geoJson.getLocationGeoJson().getFeatures(); + List locationGeoJsonList = geoJson.getLocationGeoJson(); + List locationFeatures = new ArrayList<>(); + for (FacGeoJsonByPlane geoJsonByPlane : locationGeoJsonList) { + locationFeatures.addAll(geoJsonByPlane.getFeatures()); + } // 获取所有对应名称的点 List nameGeoJsonList = geoJson.getNameGeoJson(); List nameFeatures = new ArrayList<>(); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/controller/PgsProgressCategoryController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/controller/PgsProgressCategoryController.java index 3f1f0e02..eeea6dda 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/controller/PgsProgressCategoryController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/controller/PgsProgressCategoryController.java @@ -12,8 +12,6 @@ import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.common.idempotent.annotation.RepeatSubmit; import org.dromara.common.log.annotation.Log; 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.progress.domain.dto.progresscategory.PgsProgressCategoryCreateReq; import org.dromara.progress.domain.dto.progresscategory.PgsProgressCategoryQueryReq; @@ -39,15 +37,6 @@ public class PgsProgressCategoryController extends BaseController { @Resource private IPgsProgressCategoryService pgsProgressCategoryService; - /** - * 分页查询进度类别列表 - */ - @SaCheckPermission("progress:progressCategory:page") - @GetMapping("/page") - public TableDataInfo page(PgsProgressCategoryQueryReq req, PageQuery pageQuery) { - return pgsProgressCategoryService.queryPageList(req, pageQuery); - } - /** * 查询进度类别列表 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/controller/PgsProgressPlanController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/controller/PgsProgressPlanController.java new file mode 100644 index 00000000..f818abe9 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/controller/PgsProgressPlanController.java @@ -0,0 +1,95 @@ +package org.dromara.progress.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +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.progress.domain.dto.progressplan.PgsProgressPlanCreateReq; +import org.dromara.progress.domain.dto.progressplan.PgsProgressPlanQueryReq; +import org.dromara.progress.domain.vo.progressplan.PgsProgressPlanVo; +import org.dromara.progress.service.IPgsProgressPlanService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 进度计划 + * + * @author lcj + * @date 2025-05-27 + */ +@Validated +@RestController +@RequestMapping("/progress/progressPlan") +public class PgsProgressPlanController extends BaseController { + + @Resource + private IPgsProgressPlanService pgsProgressPlanService; + + /** + * 查询进度计划列表 + */ + @SaCheckPermission("progress:progressPlan:list") + @GetMapping("/list") + public TableDataInfo list(PgsProgressPlanQueryReq req, PageQuery pageQuery) { + return pgsProgressPlanService.queryPageList(req, pageQuery); + } + + /** + * 导出进度计划列表 + */ + @SaCheckPermission("progress:progressPlan:export") + @Log(title = "进度计划", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(PgsProgressPlanQueryReq req, HttpServletResponse response) { + List list = pgsProgressPlanService.queryList(req); + ExcelUtil.exportExcel(list, "进度计划", PgsProgressPlanVo.class, response); + } + + /** + * 获取进度计划详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("progress:progressPlan:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(pgsProgressPlanService.queryById(id)); + } + + /** + * 新增进度计划 + */ + @SaCheckPermission("progress:progressPlan:add") + @Log(title = "进度计划", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody PgsProgressPlanCreateReq req) { + return R.ok(pgsProgressPlanService.insertByBo(req)); + } + + /** + * 删除进度计划 + * + * @param ids 主键串 + */ + @SaCheckPermission("progress:progressPlan:remove") + @Log(title = "进度计划", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(pgsProgressPlanService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/controller/PgsProgressPlanDetailController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/controller/PgsProgressPlanDetailController.java new file mode 100644 index 00000000..6d03d95b --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/controller/PgsProgressPlanDetailController.java @@ -0,0 +1,96 @@ +package org.dromara.progress.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotNull; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +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.progress.domain.dto.progressplandetail.PgsProgressPlanDetailQueryReq; +import org.dromara.progress.domain.dto.progressplandetail.PgsProgressPlanDetailUpdateReq; +import org.dromara.progress.domain.vo.progressplandetail.PgsProgressPlanDetailFacilityVo; +import org.dromara.progress.domain.vo.progressplandetail.PgsProgressPlanDetailVo; +import org.dromara.progress.service.IPgsProgressPlanDetailService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 进度计划详情 + * + * @author lcj + * @date 2025-05-27 + */ +@Validated +@RestController +@RequestMapping("/progress/progressPlanDetail") +public class PgsProgressPlanDetailController extends BaseController { + + @Resource + private IPgsProgressPlanDetailService pgsProgressPlanDetailService; + + /** + * 查询进度计划详情列表 + */ + @SaCheckPermission("progress:progressPlanDetail:list") + @GetMapping("/list") + public TableDataInfo list(PgsProgressPlanDetailQueryReq req, PageQuery pageQuery) { + return pgsProgressPlanDetailService.queryPageList(req, pageQuery); + } + + /** + * 导出进度计划详情列表 + */ + @SaCheckPermission("progress:progressPlanDetail:export") + @Log(title = "进度计划详情", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(PgsProgressPlanDetailQueryReq req, HttpServletResponse response) { + List list = pgsProgressPlanDetailService.queryList(req); + ExcelUtil.exportExcel(list, "进度计划详情", PgsProgressPlanDetailVo.class, response); + } + + /** + * 获取进度计划详情详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("progress:progressPlanDetail:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(pgsProgressPlanDetailService.queryById(id)); + } + + /** + * 获取进度计划详情详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("progress:progressPlanDetail:query") + @GetMapping("/detail/{id}") + public R> getDetail(@NotNull(message = "主键不能为空") + @PathVariable Long id, + PageQuery pageQuery) { + return R.ok(pgsProgressPlanDetailService.queryFacilityById(id, pageQuery)); + } + + /** + * 修改进度计划详情 + */ + @SaCheckPermission("progress:progressPlanDetail:edit") + @Log(title = "进度计划详情", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody PgsProgressPlanDetailUpdateReq req) { + return toAjax(pgsProgressPlanDetailService.updateByBo(req)); + } + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/PgsProgressPlan.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/PgsProgressPlan.java new file mode 100644 index 00000000..1bb8232d --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/PgsProgressPlan.java @@ -0,0 +1,90 @@ +package org.dromara.progress.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; +import java.util.Date; + +/** + * 进度计划对象 pgs_progress_plan + * + * @author lcj + * @date 2025-05-27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("pgs_progress_plan") +public class PgsProgressPlan extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id") + private Long id; + + /** + * 项目id + */ + private Long projectId; + + /** + * 方阵id + */ + private Long matrixId; + + /** + * 方阵名称 + */ + private String matrixName; + + /** + * 进度类型id + */ + private Long progressCategoryId; + + /** + * 进度类别名称 + */ + private String progressCategoryName; + + /** + * 计划开始时间 + */ + private Date startDate; + + /** + * 计划结束时间 + */ + private Date endDate; + + /** + * 计划数量/百分比 + */ + private Long planNumber; + + /** + * 完成数量/百分比 + */ + private Long finishedNumber; + + /** + * 删除时间 + */ + private Date deletedAt; + + /** + * 是否删除(0正常 1删除) + */ + @TableLogic + private Long isDelete; + + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/PgsProgressPlanDetail.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/PgsProgressPlanDetail.java new file mode 100644 index 00000000..8c7ad6d1 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/PgsProgressPlanDetail.java @@ -0,0 +1,75 @@ +package org.dromara.progress.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; +import java.util.Date; + +/** + * 进度计划详情对象 pgs_progress_plan_detail + * + * @author lcj + * @date 2025-05-27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("pgs_progress_plan_detail") +public class PgsProgressPlanDetail extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id") + private Long id; + + /** + * 项目id + */ + private Long projectId; + + /** + * 进度计划id + */ + private Long progressPlanId; + + /** + * 计划时间 + */ + private Date date; + + /** + * 计划数量/百分比 + */ + private Long planNumber; + + /** + * 完成数量/百分比 + */ + private Long finishedNumber; + + /** + * AI填入数量 + */ + private Long aiFill; + + /** + * 删除时间 + */ + private Date deletedAt; + + /** + * 是否删除(0正常 1删除) + */ + @TableLogic + private Long isDelete; + + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/dto/progressplan/PgsProgressPlanCreateReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/dto/progressplan/PgsProgressPlanCreateReq.java new file mode 100644 index 00000000..3aa6d177 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/dto/progressplan/PgsProgressPlanCreateReq.java @@ -0,0 +1,59 @@ +package org.dromara.progress.domain.dto.progressplan; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.dromara.progress.domain.dto.progressplandetail.PgsProgressPlanDetailCreateDto; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author lcj + * @date 2025/5/27 10:21 + */ +@Data +public class PgsProgressPlanCreateReq implements Serializable { + + @Serial + private static final long serialVersionUID = -1696848895886843506L; + + /** + * 项目id + */ + private Long projectId; + + /** + * 方阵id + */ + private Long matrixId; + + /** + * 进度类型id + */ + private Long progressCategoryId; + + /** + * 计划开始时间 + */ + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") + private Date startDate; + + /** + * 计划结束时间 + */ + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") + private Date endDate; + + /** + * 计划数量/百分比 + */ + private Long planNumber; + + /** + * 计划详情列表 + */ + List detailList; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/dto/progressplan/PgsProgressPlanQueryReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/dto/progressplan/PgsProgressPlanQueryReq.java new file mode 100644 index 00000000..b78bf80b --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/dto/progressplan/PgsProgressPlanQueryReq.java @@ -0,0 +1,47 @@ +package org.dromara.progress.domain.dto.progressplan; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author lcj + * @date 2025/5/27 10:22 + */ +@Data +public class PgsProgressPlanQueryReq implements Serializable { + + @Serial + private static final long serialVersionUID = 2964218996260328296L; + + /** + * 项目id + */ + private Long projectId; + + /** + * 方阵id + */ + private Long matrixId; + + /** + * 进度类型id + */ + private Long progressCategoryId; + + /** + * 计划开始时间 + */ + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") + private Date startDate; + + /** + * 计划结束时间 + */ + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") + private Date endDate; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/dto/progressplandetail/PgsProgressPlanDetailCreateDto.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/dto/progressplandetail/PgsProgressPlanDetailCreateDto.java new file mode 100644 index 00000000..96ce9fd0 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/dto/progressplandetail/PgsProgressPlanDetailCreateDto.java @@ -0,0 +1,30 @@ +package org.dromara.progress.domain.dto.progressplandetail; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * @author lcj + * @date 2025/5/27 15:06 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class PgsProgressPlanDetailCreateDto { + + /** + * 计划时间 + */ + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") + private Date date; + + /** + * 计划数量/百分比 + */ + private Long planNumber; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/dto/progressplandetail/PgsProgressPlanDetailQueryReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/dto/progressplandetail/PgsProgressPlanDetailQueryReq.java new file mode 100644 index 00000000..7dba19ec --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/dto/progressplandetail/PgsProgressPlanDetailQueryReq.java @@ -0,0 +1,34 @@ +package org.dromara.progress.domain.dto.progressplandetail; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author lcj + * @date 2025/5/27 10:58 + */ +@Data +public class PgsProgressPlanDetailQueryReq implements Serializable { + + @Serial + private static final long serialVersionUID = -1135087412952022463L; + + /** + * 项目id + */ + private Long projectId; + + /** + * 进度计划id + */ + private Long progressPlanId; + + /** + * 计划时间 + */ + private Date date; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/dto/progressplandetail/PgsProgressPlanDetailUpdateReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/dto/progressplandetail/PgsProgressPlanDetailUpdateReq.java new file mode 100644 index 00000000..3630c8af --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/dto/progressplandetail/PgsProgressPlanDetailUpdateReq.java @@ -0,0 +1,18 @@ +package org.dromara.progress.domain.dto.progressplandetail; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lcj + * @date 2025/5/27 10:58 + */ +@Data +public class PgsProgressPlanDetailUpdateReq implements Serializable { + + @Serial + private static final long serialVersionUID = -3397212461695330079L; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progresscategory/PgsProgressCategoryVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progresscategory/PgsProgressCategoryVo.java index b50a8602..7934118c 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progresscategory/PgsProgressCategoryVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progresscategory/PgsProgressCategoryVo.java @@ -86,6 +86,16 @@ public class PgsProgressCategoryVo implements Serializable { @ExcelProperty(value = "计划总数量/百分比") private BigDecimal planTotal; + /** + * 已完成数量百分比 + */ + private String completedPercentage; + + /** + * 计划中数量百分比 + */ + private String planTotalPercentage; + /** * 是否超期(0否 1是) */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplan/PgsProgressPlanVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplan/PgsProgressPlanVo.java new file mode 100644 index 00000000..9f8c54be --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplan/PgsProgressPlanVo.java @@ -0,0 +1,77 @@ +package org.dromara.progress.domain.vo.progressplan; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.progress.domain.PgsProgressPlan; +import org.dromara.progress.domain.vo.progressplandetail.PgsProgressPlanDetailNumVo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + +/** + * 进度计划视图对象 pgs_progress_plan + * + * @author lcj + * @date 2025-05-27 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = PgsProgressPlan.class) +public class PgsProgressPlanVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @ExcelProperty(value = "主键id") + private Long id; + + /** + * 进度类型id + */ + @ExcelProperty(value = "进度类型id") + private Long progressCategoryId; + + /** + * 进度类别名称 + */ + @ExcelProperty(value = "进度类别名称") + private String progressCategoryName; + + /** + * 计划开始时间 + */ + @ExcelProperty(value = "计划开始时间") + private Date startDate; + + /** + * 计划结束时间 + */ + @ExcelProperty(value = "计划结束时间") + private Date endDate; + + /** + * 计划数量/百分比 + */ + @ExcelProperty(value = "计划数量/百分比") + private Long planNumber; + + /** + * 完成数量/百分比 + */ + @ExcelProperty(value = "完成数量/百分比") + private Long finishedNumber; + + /** + * 进度计划详情 + */ + private List detailList; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplandetail/PgsProgressPlanDetailFacilityVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplandetail/PgsProgressPlanDetailFacilityVo.java new file mode 100644 index 00000000..50c04a87 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplandetail/PgsProgressPlanDetailFacilityVo.java @@ -0,0 +1,33 @@ +package org.dromara.progress.domain.vo.progressplandetail; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lcj + * @date 2025/5/27 16:08 + */ +@Data +public class PgsProgressPlanDetailFacilityVo implements Serializable { + + @Serial + private static final long serialVersionUID = -4292009770864819304L; + + /** + * 设施id + */ + private Long id; + + /** + * 设施名称 + */ + private String name; + + /** + * 设施完成类型 + */ + private String finishType; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplandetail/PgsProgressPlanDetailNumVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplandetail/PgsProgressPlanDetailNumVo.java new file mode 100644 index 00000000..0d5eabcb --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplandetail/PgsProgressPlanDetailNumVo.java @@ -0,0 +1,43 @@ +package org.dromara.progress.domain.vo.progressplandetail; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * @author lcj + * @date 2025/5/27 14:31 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class PgsProgressPlanDetailNumVo { + + /** + * 主键id + */ + private Long id; + + /** + * 计划时间 + */ + private Date date; + + /** + * 计划数量/百分比 + */ + private Long planNumber; + + /** + * 完成数量/百分比 + */ + private Long finishedNumber; + + /** + * AI填入数量 + */ + private Long aiFill; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplandetail/PgsProgressPlanDetailVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplandetail/PgsProgressPlanDetailVo.java new file mode 100644 index 00000000..8373b377 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplandetail/PgsProgressPlanDetailVo.java @@ -0,0 +1,72 @@ +package org.dromara.progress.domain.vo.progressplandetail; + +import java.util.Date; + +import org.dromara.progress.domain.PgsProgressPlanDetail; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 进度计划详情视图对象 pgs_progress_plan_detail + * + * @author lcj + * @date 2025-05-27 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = PgsProgressPlanDetail.class) +public class PgsProgressPlanDetailVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @ExcelProperty(value = "主键id") + private Long id; + + /** + * 项目id + */ + @ExcelProperty(value = "项目id") + private Long projectId; + + /** + * 进度计划id + */ + @ExcelProperty(value = "进度计划id") + private Long progressPlanId; + + /** + * 计划时间 + */ + @ExcelProperty(value = "计划时间") + private Date date; + + /** + * 计划数量/百分比 + */ + @ExcelProperty(value = "计划数量/百分比") + private Long planNumber; + + /** + * 完成数量/百分比 + */ + @ExcelProperty(value = "完成数量/百分比") + private Long finishedNumber; + + /** + * AI填入数量 + */ + @ExcelProperty(value = "AI填入数量") + private Long aiFill; + + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/mapper/PgsProgressPlanDetailMapper.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/mapper/PgsProgressPlanDetailMapper.java new file mode 100644 index 00000000..60d70310 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/mapper/PgsProgressPlanDetailMapper.java @@ -0,0 +1,15 @@ +package org.dromara.progress.mapper; + +import org.dromara.progress.domain.PgsProgressPlanDetail; +import org.dromara.progress.domain.vo.progressplandetail.PgsProgressPlanDetailVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 进度计划详情Mapper接口 + * + * @author lcj + * @date 2025-05-27 + */ +public interface PgsProgressPlanDetailMapper extends BaseMapperPlus { + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/mapper/PgsProgressPlanMapper.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/mapper/PgsProgressPlanMapper.java new file mode 100644 index 00000000..3205f0e8 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/mapper/PgsProgressPlanMapper.java @@ -0,0 +1,15 @@ +package org.dromara.progress.mapper; + +import org.dromara.progress.domain.PgsProgressPlan; +import org.dromara.progress.domain.vo.progressplan.PgsProgressPlanVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 进度计划Mapper接口 + * + * @author lcj + * @date 2025-05-27 + */ +public interface PgsProgressPlanMapper extends BaseMapperPlus { + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsProgressCategoryService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsProgressCategoryService.java index d1ead6b1..fe307c1b 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsProgressCategoryService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsProgressCategoryService.java @@ -1,10 +1,7 @@ package org.dromara.progress.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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.progress.domain.PgsProgressCategory; import org.dromara.progress.domain.dto.progresscategory.PgsProgressCategoryCreateReq; import org.dromara.progress.domain.dto.progresscategory.PgsProgressCategoryQueryReq; @@ -30,15 +27,6 @@ public interface IPgsProgressCategoryService extends IService queryPageList(PgsProgressCategoryQueryReq req, PageQuery pageQuery); - /** * 查询符合条件的进度类别列表 * @@ -89,12 +77,12 @@ public interface IPgsProgressCategoryService extends IService buildQueryWrapper(PgsProgressCategoryQueryReq req); /** - * 获取进度类别分页对象视图 + * 获取进度类别列表对象视图 * - * @param progressCategoryPage 进度类别分页对象 - * @return 进度类别分页对象视图 + * @param progressCategoryList 进度类别列表对象 + * @return 进度类别列表对象视图 */ - Page getVoPage(Page progressCategoryPage); + List getVoList(List progressCategoryList); /** * 根据模板创建进度类别 diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsProgressPlanDetailService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsProgressPlanDetailService.java new file mode 100644 index 00000000..2a47e19a --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsProgressPlanDetailService.java @@ -0,0 +1,99 @@ +package org.dromara.progress.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +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.progress.domain.PgsProgressPlanDetail; +import org.dromara.progress.domain.dto.progressplandetail.PgsProgressPlanDetailQueryReq; +import org.dromara.progress.domain.dto.progressplandetail.PgsProgressPlanDetailUpdateReq; +import org.dromara.progress.domain.vo.progressplandetail.PgsProgressPlanDetailFacilityVo; +import org.dromara.progress.domain.vo.progressplandetail.PgsProgressPlanDetailNumVo; +import org.dromara.progress.domain.vo.progressplandetail.PgsProgressPlanDetailVo; + +import java.util.List; + +/** + * 进度计划详情Service接口 + * + * @author lcj + * @date 2025-05-27 + */ +public interface IPgsProgressPlanDetailService extends IService { + + /** + * 查询进度计划详情 + * + * @param id 主键 + * @return 进度计划详情 + */ + PgsProgressPlanDetailVo queryById(Long id); + + /** + * 分页查询进度计划详情列表 + * + * @param req 查询条件 + * @param pageQuery 分页参数 + * @return 进度计划详情分页列表 + */ + TableDataInfo queryPageList(PgsProgressPlanDetailQueryReq req, PageQuery pageQuery); + + /** + * 查询符合条件的进度计划详情列表 + * + * @param req 查询条件 + * @return 进度计划详情列表 + */ + List queryList(PgsProgressPlanDetailQueryReq req); + + /** + * 分页查询进度计划详情设施列表 + * + * @param id 主键 + * @param pageQuery 分页参数 + * @return 进度计划详情设施分页列表 + */ + TableDataInfo queryFacilityById(Long id, PageQuery pageQuery); + + /** + * 修改进度计划详情 + * + * @param req 进度计划详情 + * @return 是否修改成功 + */ + Boolean updateByBo(PgsProgressPlanDetailUpdateReq req); + + /** + * 获取进度计划详情视图对象 + * + * @param progressPlanDetail 进度计划详情对象 + * @return 进度计划详情视图对象 + */ + PgsProgressPlanDetailVo getVo(PgsProgressPlanDetail progressPlanDetail); + + /** + * 获取进度计划详情视图对象列表 + * + * @param progressPlanDetailList 进度计划详情对象列表 + * @return 进度计划详情视图对象列表 + */ + List getNumVoList(List progressPlanDetailList); + + /** + * 获取进度计划详情查询条件封装 + * + * @param req 查询条件 + * @return 查询条件封装 + */ + LambdaQueryWrapper buildQueryWrapper(PgsProgressPlanDetailQueryReq req); + + /** + * 获取进度计划详情分页对象视图 + * + * @param progressPlanDetailPage 进度计划详情分页对象 + * @return 进度计划详情分页对象视图 + */ + Page getVoPage(Page progressPlanDetailPage); + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsProgressPlanService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsProgressPlanService.java new file mode 100644 index 00000000..9b298412 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/IPgsProgressPlanService.java @@ -0,0 +1,98 @@ +package org.dromara.progress.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +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.progress.domain.PgsProgressPlan; +import org.dromara.progress.domain.dto.progressplan.PgsProgressPlanCreateReq; +import org.dromara.progress.domain.dto.progressplan.PgsProgressPlanQueryReq; +import org.dromara.progress.domain.vo.progressplan.PgsProgressPlanVo; + +import java.util.Collection; +import java.util.List; + +/** + * 进度计划Service接口 + * + * @author lcj + * @date 2025-05-27 + */ +public interface IPgsProgressPlanService extends IService { + + /** + * 查询进度计划 + * + * @param id 主键 + * @return 进度计划 + */ + PgsProgressPlanVo queryById(Long id); + + /** + * 分页查询进度计划列表 + * + * @param req 查询条件 + * @param pageQuery 分页参数 + * @return 进度计划分页列表 + */ + TableDataInfo queryPageList(PgsProgressPlanQueryReq req, PageQuery pageQuery); + + /** + * 查询符合条件的进度计划列表 + * + * @param req 查询条件 + * @return 进度计划列表 + */ + List queryList(PgsProgressPlanQueryReq req); + + /** + * 新增进度计划 + * + * @param req 进度计划 + * @return 新增进度计划主键 + */ + Long insertByBo(PgsProgressPlanCreateReq req); + + /** + * 校验并批量删除进度计划信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 获取进度计划视图对象 + * + * @param progressPlan 进度计划对象 + * @return 进度计划视图对象 + */ + PgsProgressPlanVo getVo(PgsProgressPlan progressPlan); + + /** + * 获取进度计划查询条件封装 + * + * @param req 查询条件 + * @return 查询条件封装 + */ + LambdaQueryWrapper buildQueryWrapper(PgsProgressPlanQueryReq req); + + /** + * 获取进度计划分页对象视图 + * + * @param progressPlanPage 进度计划分页对象 + * @return 进度计划分页对象视图 + */ + Page getVoPage(Page progressPlanPage); + + /** + * 校验计划数量是否合法 + * + * @param planNumber 计划数量 + * @param progressCategoryId 进度类别id + */ + void validPlanNumber(Long planNumber, Long progressCategoryId); + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressCategoryServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressCategoryServiceImpl.java index 219c3a5d..3b2861e6 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressCategoryServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressCategoryServiceImpl.java @@ -4,14 +4,11 @@ import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import jakarta.annotation.Resource; import org.dromara.common.core.constant.HttpStatus; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.ObjectUtils; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.facility.domain.FacPercentageFacility; import org.dromara.facility.service.IFacPercentageFacilityService; import org.dromara.progress.constant.PgsProgressCategoryConstant; @@ -25,12 +22,14 @@ import org.dromara.progress.domain.vo.progresscategory.PgsProgressCategoryVo; import org.dromara.progress.mapper.PgsProgressCategoryMapper; import org.dromara.progress.service.IPgsProgressCategoryService; import org.dromara.progress.service.IPgsProgressCategoryTemplateService; +import org.dromara.utils.BigDecimalUtil; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.*; +import java.util.stream.Collectors; /** * 进度类别Service业务层处理 @@ -63,19 +62,6 @@ public class PgsProgressCategoryServiceImpl extends ServiceImpl queryPageList(PgsProgressCategoryQueryReq req, PageQuery pageQuery) { - Page progressCategoryPage = this.page(pageQuery.build(), this.buildQueryWrapper(req)); - return TableDataInfo.build(this.getVoPage(progressCategoryPage)); - } - /** * 查询符合条件的进度类别列表 * @@ -85,7 +71,7 @@ public class PgsProgressCategoryServiceImpl extends ServiceImpl queryList(PgsProgressCategoryQueryReq req) { List list = this.list(this.buildQueryWrapper(req)); - return list.stream().map(this::getVo).toList(); + return this.getVoList(list); } /** @@ -221,27 +207,41 @@ public class PgsProgressCategoryServiceImpl extends ServiceImpl getVoPage(Page progressCategoryPage) { - List progressCategoryList = progressCategoryPage.getRecords(); - Page progressCategoryVoPage = new Page<>(progressCategoryPage.getCurrent(), progressCategoryPage.getSize(), progressCategoryPage.getTotal()); + public List getVoList(List progressCategoryList) { if (CollUtil.isEmpty(progressCategoryList)) { - return progressCategoryVoPage; + return List.of(); } + // 1. 构建 pid -> 子节点列表的映射 + Map> parentIdToChildrenMap = progressCategoryList.stream() + .filter(item -> item.getPid() != 0) + .collect(Collectors.groupingBy(PgsProgressCategory::getPid)); // 对象列表 => 封装对象列表 - List progressCategoryVoList = progressCategoryList.stream().map(progressCategory -> { - // 对象转封装类 - PgsProgressCategoryVo progressCategoryVo = new PgsProgressCategoryVo(); - BeanUtils.copyProperties(progressCategory, progressCategoryVo); - return progressCategoryVo; + return progressCategoryList.stream().map(progressCategory -> { + PgsProgressCategoryVo vo = new PgsProgressCategoryVo(); + BeanUtils.copyProperties(progressCategory, vo); + // 如果是父节点,计算其子节点的总和 + if (progressCategory.getPid() == 0) { + List children = parentIdToChildrenMap.getOrDefault(progressCategory.getId(), Collections.emptyList()); + // 累加子节点数据 + BigDecimal total = children.stream().map(PgsProgressCategory::getTotal).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal completed = children.stream().map(PgsProgressCategory::getCompleted).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal planTotal = children.stream().map(PgsProgressCategory::getPlanTotal).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + // 可以在 VO 中额外设置这些总和值(或替换原有字段) + vo.setTotal(total); + vo.setCompleted(completed); + vo.setPlanTotal(planTotal); + } + // 计算百分比(避免除以 0) + vo.setCompletedPercentage(BigDecimalUtil.toPercentage(vo.getCompleted(), vo.getTotal())); + vo.setPlanTotalPercentage(BigDecimalUtil.toPercentage(vo.getPlanTotal(), vo.getTotal())); + return vo; }).toList(); - progressCategoryVoPage.setRecords(progressCategoryVoList); - return progressCategoryVoPage; } /** @@ -264,9 +264,10 @@ public class PgsProgressCategoryServiceImpl extends ServiceImpl newList = new ArrayList<>(); List percentageFacilityList = new ArrayList<>(); + // 每个 matrixId 对应一套新的 ID 映射 for (Long matrixId : matrixIds) { - // 每个 matrixId 对应一套新的 ID 映射 - Map localIdMap = new HashMap<>(); // templateId -> newId + // templateId -> newId + Map localIdMap = new HashMap<>(); List localList = new ArrayList<>(); for (PgsProgressCategoryTemplate template : categoryTemplateList) { Long newId = IdWorker.getId(); @@ -278,7 +279,8 @@ public class PgsProgressCategoryServiceImpl extends ServiceImpl + implements IPgsProgressPlanDetailService { + + @Lazy + @Resource + private IPgsProgressPlanService progressPlanService; + + @Resource + private IFacBoxTransformerService boxTransformerService; + + @Resource + private IFacInverterService inverterService; + + @Resource + private IFacPhotovoltaicPanelService photovoltaicPanelService; + + @Resource + private IPgsProgressCategoryService progressCategoryService; + + /** + * 查询进度计划详情 + * + * @param id 主键 + * @return 进度计划详情 + */ + @Override + public PgsProgressPlanDetailVo queryById(Long id) { + PgsProgressPlanDetail progressPlanDetail = this.getById(id); + if (progressPlanDetail == null) { + throw new ServiceException("进度计划详情信息不存在", HttpStatus.NOT_FOUND); + } + return this.getVo(progressPlanDetail); + } + + /** + * 分页查询进度计划详情列表 + * + * @param req 查询条件 + * @param pageQuery 分页参数 + * @return 进度计划详情分页列表 + */ + @Override + public TableDataInfo queryPageList(PgsProgressPlanDetailQueryReq req, PageQuery pageQuery) { + Page result = this.page(pageQuery.build(), this.buildQueryWrapper(req)); + return TableDataInfo.build(this.getVoPage(result)); + } + + /** + * 查询符合条件的进度计划详情列表 + * + * @param req 查询条件 + * @return 进度计划详情列表 + */ + @Override + public List queryList(PgsProgressPlanDetailQueryReq req) { + List list = this.list(this.buildQueryWrapper(req)); + return list.stream().map(this::getVo).toList(); + } + + /** + * 分页查询进度计划详情设施列表 + * + * @param id 主键 + * @param pageQuery 分页参数 + * @return 进度计划详情设施分页列表 + */ + @Override + public TableDataInfo queryFacilityById(Long id, PageQuery pageQuery) { + PgsProgressPlanDetail progressPlanDetail = this.getById(id); + if (progressPlanDetail == null) { + throw new ServiceException("进度计划详情信息不存在", HttpStatus.NOT_FOUND); + } + PgsProgressPlan progressPlan = progressPlanService.getById(progressPlanDetail.getProgressPlanId()); + if (progressPlan == null) { + throw new ServiceException("进度计划信息不存在", HttpStatus.NOT_FOUND); + } + Long progressCategoryId = progressPlan.getProgressCategoryId(); + Long projectId = progressPlan.getProjectId(); + Long matrixId = progressPlan.getMatrixId(); + PgsProgressCategory progressCategory = progressCategoryService.getById(progressCategoryId); + if (progressCategory == null) { + throw new ServiceException("进度计划类别信息不存在", HttpStatus.NOT_FOUND); + } + String workType = progressCategory.getWorkType(); + Page resultPage = pageQuery.build(); + if (PgsProgressCategoryConstant.PHOTOVOLTAIC_PANEL_PROGRESS_CATEGORY_WORK_TYPE.contains(workType)) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(FacPhotovoltaicPanel::getProjectId, projectId); + lqw.eq(FacPhotovoltaicPanel::getMatrixId, matrixId); + lqw.eq(FacPhotovoltaicPanel::getProgressCategoryId, progressCategoryId); + lqw.eq(FacPhotovoltaicPanel::getFinishDate, progressPlanDetail.getDate()); + lqw.eq(FacPhotovoltaicPanel::getFinishType, FacFinishStatusEnum.FINISH.getValue()); + Page result = photovoltaicPanelService.page(pageQuery.build(), lqw); + List records = result.getRecords(); + List facilityVoList = records.stream().map(photovoltaicPanel -> { + PgsProgressPlanDetailFacilityVo facilityVo = new PgsProgressPlanDetailFacilityVo(); + facilityVo.setId(photovoltaicPanel.getId()); + facilityVo.setName(photovoltaicPanel.getName()); + facilityVo.setFinishType(photovoltaicPanel.getFinishType()); + return facilityVo; + }).toList(); + resultPage.setRecords(facilityVoList); + } else if (PgsProgressCategoryConstant.INVERTER_PROGRESS_CATEGORY_WORK_TYPE.contains(workType)) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(FacInverter::getProjectId, projectId); + lqw.eq(FacInverter::getMatrixId, matrixId); + lqw.eq(FacInverter::getProgressCategoryId, progressCategoryId); + lqw.eq(FacInverter::getFinishDate, progressPlanDetail.getDate()); + lqw.eq(FacInverter::getFinishType, FacFinishStatusEnum.FINISH.getValue()); + Page result = inverterService.page(pageQuery.build(), lqw); + List records = result.getRecords(); + List facilityVoList = records.stream().map(inverter -> { + PgsProgressPlanDetailFacilityVo facilityVo = new PgsProgressPlanDetailFacilityVo(); + facilityVo.setId(inverter.getId()); + facilityVo.setName(inverter.getName()); + facilityVo.setFinishType(inverter.getFinishType()); + return facilityVo; + }).toList(); + resultPage.setRecords(facilityVoList); + } else if (PgsProgressCategoryConstant.BOX_TRANSFORMER_PROGRESS_CATEGORY_WORK_TYPE.contains(workType)) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(FacBoxTransformer::getProjectId, projectId); + lqw.eq(FacBoxTransformer::getMatrixId, matrixId); + lqw.eq(FacBoxTransformer::getProgressCategoryId, progressCategoryId); + lqw.eq(FacBoxTransformer::getFinishDate, progressPlanDetail.getDate()); + lqw.eq(FacBoxTransformer::getFinishType, FacFinishStatusEnum.FINISH.getValue()); + Page result = boxTransformerService.page(pageQuery.build(), lqw); + List records = result.getRecords(); + List facilityVoList = records.stream().map(boxTransformer -> { + PgsProgressPlanDetailFacilityVo facilityVo = new PgsProgressPlanDetailFacilityVo(); + facilityVo.setId(boxTransformer.getId()); + facilityVo.setName(boxTransformer.getName()); + facilityVo.setFinishType(boxTransformer.getFinishType()); + return facilityVo; + }).toList(); + resultPage.setRecords(facilityVoList); + } else { + throw new ServiceException("未知进度计划类别工作类型", HttpStatus.BAD_REQUEST); + } + return TableDataInfo.build(resultPage); + } + + /** + * 修改进度计划详情 + * + * @param req 进度计划详情 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(PgsProgressPlanDetailUpdateReq req) { + return null; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(PgsProgressPlanDetail entity) { + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 获取进度计划详情视图对象 + * + * @param progressPlanDetail 进度计划详情对象 + * @return 进度计划详情视图对象 + */ + @Override + public PgsProgressPlanDetailVo getVo(PgsProgressPlanDetail progressPlanDetail) { + return null; + } + + /** + * 获取进度计划详情视图对象列表 + * + * @param progressPlanDetailList 进度计划详情对象列表 + * @return 进度计划详情视图对象列表 + */ + @Override + public List getNumVoList(List progressPlanDetailList) { + return progressPlanDetailList.stream().map(progressPlanDetail -> { + PgsProgressPlanDetailNumVo progressPlanDetailNumVo = new PgsProgressPlanDetailNumVo(); + BeanUtils.copyProperties(progressPlanDetail, progressPlanDetailNumVo); + return progressPlanDetailNumVo; + }).toList(); + } + + /** + * 获取进度计划详情查询条件封装 + * + * @param req 查询条件 + * @return 查询条件封装 + */ + @Override + public LambdaQueryWrapper buildQueryWrapper(PgsProgressPlanDetailQueryReq req) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + if (req == null) { + return lqw; + } + Long projectId = req.getProjectId(); + Long progressPlanId = req.getProgressPlanId(); + Date date = req.getDate(); + lqw.eq(ObjectUtils.isNotEmpty(projectId), PgsProgressPlanDetail::getProjectId, projectId); + lqw.eq(ObjectUtils.isNotEmpty(progressPlanId), PgsProgressPlanDetail::getProgressPlanId, progressPlanId); + lqw.eq(ObjectUtils.isNotEmpty(date), PgsProgressPlanDetail::getDate, date); + return lqw; + } + + /** + * 获取进度计划详情分页对象视图 + * + * @param progressPlanDetailPage 进度计划详情分页对象 + * @return 进度计划详情分页对象视图 + */ + @Override + public Page getVoPage(Page progressPlanDetailPage) { + return null; + } +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressPlanServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressPlanServiceImpl.java new file mode 100644 index 00000000..3a8ad396 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressPlanServiceImpl.java @@ -0,0 +1,300 @@ +package org.dromara.progress.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import jakarta.annotation.Resource; +import org.dromara.common.core.constant.HttpStatus; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.ObjectUtils; +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.service.IFacMatrixService; +import org.dromara.progress.domain.PgsProgressCategory; +import org.dromara.progress.domain.PgsProgressPlan; +import org.dromara.progress.domain.PgsProgressPlanDetail; +import org.dromara.progress.domain.dto.progressplan.PgsProgressPlanCreateReq; +import org.dromara.progress.domain.dto.progressplan.PgsProgressPlanQueryReq; +import org.dromara.progress.domain.dto.progressplandetail.PgsProgressPlanDetailCreateDto; +import org.dromara.progress.domain.vo.progressplan.PgsProgressPlanVo; +import org.dromara.progress.domain.vo.progressplandetail.PgsProgressPlanDetailNumVo; +import org.dromara.progress.mapper.PgsProgressPlanMapper; +import org.dromara.progress.service.IPgsProgressCategoryService; +import org.dromara.progress.service.IPgsProgressPlanDetailService; +import org.dromara.progress.service.IPgsProgressPlanService; +import org.dromara.project.service.IBusProjectService; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 进度计划Service业务层处理 + * + * @author lcj + * @date 2025-05-27 + */ +@Service +public class PgsProgressPlanServiceImpl extends ServiceImpl + implements IPgsProgressPlanService { + + @Resource + private IBusProjectService projectService; + + @Resource + private IPgsProgressPlanDetailService progressPlanDetailService; + + @Resource + private IPgsProgressCategoryService progressCategoryService; + + @Resource + private IFacMatrixService matrixService; + + /** + * 查询进度计划 + * + * @param id 主键 + * @return 进度计划 + */ + @Override + public PgsProgressPlanVo queryById(Long id) { + PgsProgressPlan progressPlan = this.getById(id); + if (progressPlan == null) { + throw new ServiceException("进度计划信息不存在", HttpStatus.NOT_FOUND); + } + return this.getVo(progressPlan); + } + + /** + * 分页查询进度计划列表 + * + * @param req 查询条件 + * @param pageQuery 分页参数 + * @return 进度计划分页列表 + */ + @Override + public TableDataInfo queryPageList(PgsProgressPlanQueryReq req, PageQuery pageQuery) { + Page result = this.page(pageQuery.build(), this.buildQueryWrapper(req)); + return TableDataInfo.build(this.getVoPage(result)); + } + + /** + * 查询符合条件的进度计划列表 + * + * @param req 查询条件 + * @return 进度计划列表 + */ + @Override + public List queryList(PgsProgressPlanQueryReq req) { + List list = this.list(this.buildQueryWrapper(req)); + return list.stream().map(this::getVo).toList(); + } + + /** + * 新增进度计划 + * + * @param req 进度计划 + * @return 新增进度计划主键 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Long insertByBo(PgsProgressPlanCreateReq req) { + // 将实体类和 DTO 进行转换 + PgsProgressPlan progressPlan = new PgsProgressPlan(); + BeanUtils.copyProperties(req, progressPlan); + // 数据校验 + Long projectId = progressPlan.getProjectId(); + if (projectService.getById(projectId) == null) { + throw new ServiceException("对应项目不存在", HttpStatus.NOT_FOUND); + } + Long matrixId = progressPlan.getMatrixId(); + FacMatrix matrix = matrixService.getById(matrixId); + if (matrix == null) { + throw new ServiceException("对应方阵不存在", HttpStatus.NOT_FOUND); + } + Long progressCategoryId = progressPlan.getProgressCategoryId(); + this.validPlanNumber(req.getPlanNumber(), progressCategoryId); + progressPlan.setMatrixName(matrix.getMatrixName()); + // 操作数据库 + boolean save = this.save(progressPlan); + if (!save) { + throw new ServiceException("新增进度计划失败,数据库异常", HttpStatus.ERROR); + } + // 更新进度计划详情 + Long id = progressPlan.getId(); + List detailList = req.getDetailList(); + if (CollUtil.isNotEmpty(detailList)) { + List detailList1 = detailList.stream().map(detail -> { + PgsProgressPlanDetail progressPlanDetail = new PgsProgressPlanDetail(); + BeanUtils.copyProperties(detail, progressPlanDetail); + progressPlanDetail.setProgressPlanId(id); + progressPlanDetail.setProjectId(progressPlan.getProjectId()); + return progressPlanDetail; + }).toList(); + boolean result = progressPlanDetailService.saveBatch(detailList1); + if (!result) { + throw new ServiceException("新增进度计划详情失败,数据库操作失败", HttpStatus.ERROR); + } + } + // 更新进度分类计划总数量 + boolean update = progressCategoryService.lambdaUpdate() + .eq(PgsProgressCategory::getId, progressCategoryId) + .set(PgsProgressCategory::getPlanTotal, progressPlan.getPlanNumber()) + .update(); + if (!update) { + throw new ServiceException("更新进度分类计划总数量失败,数据库操作失败", HttpStatus.ERROR); + } + return id; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(PgsProgressPlan entity) { + // TODO 做一些数据校验,如唯一约束 + Long projectId = entity.getProjectId(); + if (projectService.getById(projectId) == null) { + throw new ServiceException("对应项目不存在", HttpStatus.NOT_FOUND); + } + Long matrixId = entity.getMatrixId(); + if (matrixService.getById(matrixId) == null) { + throw new ServiceException("对应方阵不存在", HttpStatus.NOT_FOUND); + } + } + + /** + * 校验并批量删除进度计划信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + Long userId = LoginHelper.getUserId(); + List progressPlanList = this.listByIds(ids); + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + List projectId = progressPlanList.stream().map(PgsProgressPlan::getProjectId).toList(); + projectService.validAuth(projectId, userId); + } + return this.removeBatchByIds(ids); + } + + /** + * 获取进度计划视图对象 + * + * @param progressPlan 进度计划对象 + * @return 进度计划视图对象 + */ + @Override + public PgsProgressPlanVo getVo(PgsProgressPlan progressPlan) { + // 对象转封装类 + PgsProgressPlanVo progressPlanVo = new PgsProgressPlanVo(); + if (progressPlan == null) { + return progressPlanVo; + } + BeanUtils.copyProperties(progressPlan, progressPlanVo); + // 获取详情列表 + Long id = progressPlan.getId(); + List detailList = progressPlanDetailService.lambdaQuery() + .eq(PgsProgressPlanDetail::getProgressPlanId, id) + .eq(PgsProgressPlanDetail::getProjectId, progressPlan.getProjectId()) + .list(); + progressPlanVo.setDetailList(progressPlanDetailService.getNumVoList(detailList)); + return progressPlanVo; + } + + /** + * 获取进度计划查询条件封装 + * + * @param req 查询条件 + * @return 查询条件封装 + */ + @Override + public LambdaQueryWrapper buildQueryWrapper(PgsProgressPlanQueryReq req) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + if (req == null) { + return lqw; + } + Long projectId = req.getProjectId(); + Long matrixId = req.getMatrixId(); + Long progressCategoryId = req.getProgressCategoryId(); + Date startDate = req.getStartDate(); + Date endDate = req.getEndDate(); + lqw.eq(ObjectUtils.isNotEmpty(projectId), PgsProgressPlan::getProjectId, projectId); + lqw.eq(ObjectUtils.isNotEmpty(matrixId), PgsProgressPlan::getMatrixId, matrixId); + lqw.eq(ObjectUtils.isNotEmpty(progressCategoryId), PgsProgressPlan::getProgressCategoryId, progressCategoryId); + // 日期条件:大于startDate,小于endDate + lqw.gt(ObjectUtils.isNotEmpty(startDate), PgsProgressPlan::getStartDate, startDate); + lqw.lt(ObjectUtils.isNotEmpty(endDate), PgsProgressPlan::getEndDate, endDate); + return lqw; + } + + /** + * 获取进度计划分页对象视图 + * + * @param progressPlanPage 进度计划分页对象 + * @return 进度计划分页对象视图 + */ + @Override + public Page getVoPage(Page progressPlanPage) { + List progressPlanList = progressPlanPage.getRecords(); + Page progressPlanVoPage = new Page<>( + progressPlanPage.getCurrent(), + progressPlanPage.getSize(), + progressPlanPage.getTotal()); + if (CollUtil.isEmpty(progressPlanList)) { + return progressPlanVoPage; + } + // 获取详情列表 + List idList = progressPlanList.stream().map(PgsProgressPlan::getId).toList(); + List detailList = progressPlanDetailService.lambdaQuery() + .in(PgsProgressPlanDetail::getProgressPlanId, idList).list(); + Map> detailMap = detailList + .stream().collect(Collectors.groupingBy(PgsProgressPlanDetail::getProgressPlanId)); + // 对象列表 => 封装对象列表 + List progressPlanVoList = progressPlanList.stream().map(progressPlan -> { + // 对象转封装类 + PgsProgressPlanVo progressPlanVo = new PgsProgressPlanVo(); + BeanUtils.copyProperties(progressPlan, progressPlanVo); + // 获取详情列表 + Long id = progressPlan.getId(); + List numDetailList = new ArrayList<>(); + if (detailMap.containsKey(id)) { + numDetailList = progressPlanDetailService.getNumVoList(detailMap.get(id)); + } + progressPlanVo.setDetailList(numDetailList); + return progressPlanVo; + }).toList(); + progressPlanVoPage.setRecords(progressPlanVoList); + return progressPlanVoPage; + } + + /** + * 校验计划数量是否合法 + * + * @param planNumber 计划数量 + * @param progressCategoryId 进度类别id + */ + @Override + public void validPlanNumber(Long planNumber, Long progressCategoryId) { + PgsProgressCategory progressCategory = progressCategoryService.getById(progressCategoryId); + if (progressCategory == null) { + throw new ServiceException("进度类别不存在", HttpStatus.NOT_FOUND); + } + BigDecimal total = progressCategory.getTotal(); + BigDecimal completed = progressCategory.getCompleted(); + BigDecimal planTotal = total.subtract(completed); + if (planNumber.compareTo(planTotal.longValue()) > 0) { + throw new ServiceException("计划数量不能大于剩余数量", HttpStatus.BAD_REQUEST); + } + } +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusProjectFileController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusProjectFileController.java index 483f5932..da02abca 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusProjectFileController.java +++ b/xinnengyuan/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, BusProjectFileUploadDxfReq req) { - return R.ok(busProjectFileService.uploadDxf2Json(file, req)); + public R uploadDxf2Json(@RequestParam("file") MultipartFile file, BusProjectFileUploadDxfReq req) { + return toAjax(busProjectFileService.uploadDxf2Json(file, req)); } /** diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectFileService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectFileService.java index 0eafc00c..cc631114 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectFileService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectFileService.java @@ -79,9 +79,9 @@ public interface IBusProjectFileService extends IService { * * @param file 文件 * @param req 请求 - * @return 主键 + * @return 是否上传文件成功 */ - Long uploadDxf2Json(MultipartFile file, BusProjectFileUploadDxfReq req); + Boolean uploadDxf2Json(MultipartFile file, BusProjectFileUploadDxfReq req); /** * 获取项目文件存储视图对象 diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectFileServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectFileServiceImpl.java index a477a06c..7301ed1a 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectFileServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectFileServiceImpl.java @@ -209,11 +209,11 @@ public class BusProjectFileServiceImpl extends ServiceImpl projectFileList = projectFileMap.get(project.getId()); if (CollUtil.isNotEmpty(projectFileList)) { - projectVo.setDesignId(projectFileList.get(0).getId()); + projectVo.setDesignId(projectFileList.getFirst().getId()); } return projectVo; }).toList(); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/utils/BigDecimalUtil.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/utils/BigDecimalUtil.java new file mode 100644 index 00000000..75aaf599 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/utils/BigDecimalUtil.java @@ -0,0 +1,27 @@ +package org.dromara.utils; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +/** + * @author lcj + * @date 2025/5/27 9:16 + */ +public class BigDecimalUtil { + + /** + * 计算百分比 + * + * @param dividend 被除数 + * @param divisor 除数 + * @return 百分比(保留2位小数)如 12.34% + */ + public static String toPercentage(BigDecimal dividend, BigDecimal divisor) { + if (dividend == null || divisor == null || divisor.compareTo(BigDecimal.ZERO) == 0) { + return "0"; + } + BigDecimal percentage = dividend.divide(divisor, 2, RoundingMode.HALF_UP).multiply(new BigDecimal("100")); + return percentage.toPlainString(); + } + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/utils/Dxf2JsonUtils.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/utils/Dxf2JsonUtils.java index 274d6f7a..76befac8 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/utils/Dxf2JsonUtils.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/utils/Dxf2JsonUtils.java @@ -1,5 +1,7 @@ package org.dromara.utils; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.exception.ServiceException; @@ -53,6 +55,11 @@ public class Dxf2JsonUtils { exePath, inputDXFPath, outputJSONPath, sourceEPSG, targetEPSG); while ((line = reader.readLine()) != null) { log.info("dxf 转 json 程序执行中:{}", line); + JSONObject jsonObject = JSONUtil.parseObj(line); + Integer code = jsonObject.get("code", Integer.class); + if (code != 0 && code != 200) { + throw new ServiceException("dxf 转 json 程序执行出错!"); + } } int exitCode = process.waitFor(); log.info("dxf 转 json 程序执行完毕,程序退出码:{}", exitCode); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/progress/PgsProgressPlanDetailMapper.xml b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/progress/PgsProgressPlanDetailMapper.xml new file mode 100644 index 00000000..ec1bcc91 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/progress/PgsProgressPlanDetailMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/progress/PgsProgressPlanMapper.xml b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/progress/PgsProgressPlanMapper.xml new file mode 100644 index 00000000..0988fe65 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/progress/PgsProgressPlanMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/xinnengyuan/script/sql/xinnengyuan.sql b/xinnengyuan/script/sql/xinnengyuan.sql index 4a0a1e55..0d54aa46 100644 --- a/xinnengyuan/script/sql/xinnengyuan.sql +++ b/xinnengyuan/script/sql/xinnengyuan.sql @@ -1016,3 +1016,49 @@ CREATE TABLE `fac_percentage_facility` INDEX `idx_matrix_id` (`matrix_id` ASC) USING BTREE comment '方阵id', INDEX `idx_progress_category_id` (`progress_category_id` ASC) USING BTREE comment '进度类别id' ) comment ='设施-百分比设施' COLLATE = utf8mb4_unicode_ci; + +DROP TABLE IF EXISTS `pgs_progress_plan`; +CREATE TABLE `pgs_progress_plan` +( + `id` bigint not null auto_increment comment '主键id', + `project_id` bigint not null comment '项目id', + `matrix_id` bigint not null comment '方阵id', + `matrix_name` varchar(64) null comment '方阵名称', + `progress_category_id` bigint null comment '进度类型id', + `progress_category_name` varchar(64) null comment '进度类别名称', + `start_date` date null comment '计划开始时间', + `end_date` date null comment '计划结束时间', + `plan_number` decimal(10) null comment '计划数量/百分比', + `finished_number` decimal(10) null comment '完成数量/百分比', + `create_by` varchar(64) null comment '创建者', + `update_by` varchar(64) null comment '更新者', + `create_time` datetime default CURRENT_TIMESTAMP null comment '创建时间', + `update_time` datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '更新时间', + `deleted_at` datetime null comment '删除时间', + `is_delete` tinyint(4) default 0 not null comment '是否删除(0正常 1删除)', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_project_id` (`project_id` ASC) USING BTREE comment '项目id', + INDEX `idx_matrix_id` (`matrix_id` ASC) USING BTREE comment '方阵id', + INDEX `idx_progress_category_id` (`progress_category_id` ASC) USING BTREE comment '进度类别id' +) comment ='进度计划' COLLATE = utf8mb4_unicode_ci; + +DROP TABLE IF EXISTS `pgs_progress_plan_detail`; +CREATE TABLE `pgs_progress_plan_detail` +( + `id` bigint not null auto_increment comment '主键id', + `project_id` bigint not null comment '项目id', + `progress_plan_id` bigint not null comment '进度计划id', + `date` date null comment '计划时间', + `plan_number` decimal(10) null comment '计划数量/百分比', + `finished_number` decimal(10) null comment '完成数量/百分比', + `ai_fill` decimal(10) null comment 'AI填入数量', + `create_by` varchar(64) null comment '创建者', + `update_by` varchar(64) null comment '更新者', + `create_time` datetime default CURRENT_TIMESTAMP null comment '创建时间', + `update_time` datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '更新时间', + `deleted_at` datetime null comment '删除时间', + `is_delete` tinyint(4) default 0 not null comment '是否删除(0正常 1删除)', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_project_id` (`project_id` ASC) USING BTREE comment '项目id', + INDEX `idx_progress_plan_id` (`progress_plan_id` ASC) USING BTREE comment '进度计划id' +) comment ='进度计划详情' COLLATE = utf8mb4_unicode_ci;