From 5bb201b27260b1863a657c6ad5dcc396d7c35ea0 Mon Sep 17 00:00:00 2001 From: lcj <2331845269@qq.com> Date: Fri, 6 Jun 2025 19:52:34 +0800 Subject: [PATCH] =?UTF-8?q?[update]=20=E4=BF=AE=E6=94=B9=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E5=92=8C=E8=BF=9B=E5=BA=A6=E8=AE=A1=E5=88=92?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xinnengyuan/pom.xml | 2 +- .../src/main/resources/application-dev.yml | 3 + .../src/main/resources/application-prod.yml | 73 +++++---- .../src/main/resources/application.yml | 2 +- .../job/cycle/IncSyncDeleteProjectCache.java | 3 + .../PgsProgressCategoryController.java | 13 ++ .../PgsProgressCategoryMatrixVo.java | 60 +++++++ .../PgsProgressCategoryProjectVo.java | 62 +++++++ .../PgsProgressCategorySubProjectVo.java | 66 ++++++++ .../PgsProgressPlanDetailDateVo.java | 15 ++ .../service/IPgsProgressCategoryService.java | 9 ++ .../impl/PgsProgressCategoryServiceImpl.java | 152 ++++++++++++++++-- .../PgsProgressPlanDetailServiceImpl.java | 8 +- .../impl/PgsProgressPlanServiceImpl.java | 14 +- .../project/constant/BusProjectConstant.java | 5 + .../controller/BusProjectController.java | 36 ++++- .../BusUserProjectRelevancyController.java | 1 - .../dto/project/BusProjectCreateReq.java | 5 - .../dto/project/BusProjectCreateSubReq.java | 28 ++++ .../domain/vo/project/BusProjectVo.java | 6 + .../domain/vo/project/BusSubProjectVo.java | 34 ++++ .../project/service/IBusProjectService.java | 24 ++- .../impl/BusProjectFileServiceImpl.java | 6 +- .../service/impl/BusProjectServiceImpl.java | 125 +++++++++++++- .../BusUserProjectRelevancyServiceImpl.java | 23 ++- .../script/docker/nginx/conf/nginx.conf | 13 +- 26 files changed, 694 insertions(+), 94 deletions(-) create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progresscategory/PgsProgressCategoryMatrixVo.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progresscategory/PgsProgressCategoryProjectVo.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progresscategory/PgsProgressCategorySubProjectVo.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/project/BusProjectCreateSubReq.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusSubProjectVo.java diff --git a/xinnengyuan/pom.xml b/xinnengyuan/pom.xml index cc87970d..596eabc4 100644 --- a/xinnengyuan/pom.xml +++ b/xinnengyuan/pom.xml @@ -90,7 +90,7 @@ prod prod - warn + info ruoyi 123456 diff --git a/xinnengyuan/ruoyi-admin/src/main/resources/application-dev.yml b/xinnengyuan/ruoyi-admin/src/main/resources/application-dev.yml index 4a869122..e3ead3e8 100644 --- a/xinnengyuan/ruoyi-admin/src/main/resources/application-dev.yml +++ b/xinnengyuan/ruoyi-admin/src/main/resources/application-dev.yml @@ -269,3 +269,6 @@ weather: project-id: 2JTHPUQ5YY private-key: MC4CAQAwBQYDK2VwBCIEIMAglX7IsxYiTeM+FXXnvCUsIggajeP4s8gAllewm6BN api-host: n35rk53njv.re.qweatherapi.com +# dxf转 geojson 执行文件名 +dxf2GeoJson: + file-name: main.exe diff --git a/xinnengyuan/ruoyi-admin/src/main/resources/application-prod.yml b/xinnengyuan/ruoyi-admin/src/main/resources/application-prod.yml index d5b79928..fac878eb 100644 --- a/xinnengyuan/ruoyi-admin/src/main/resources/application-prod.yml +++ b/xinnengyuan/ruoyi-admin/src/main/resources/application-prod.yml @@ -52,35 +52,35 @@ spring: driverClassName: com.mysql.cj.jdbc.Driver # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562 # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题) - url: jdbc:mysql://mysql:3306/xinnengyuan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true - username: root - password: 123456 -# # 从库数据源 -# slave: -# lazy: true -# type: ${spring.datasource.type} -# driverClassName: com.mysql.cj.jdbc.Driver -# url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true -# username: -# password: -# oracle: -# type: ${spring.datasource.type} -# driverClassName: oracle.jdbc.OracleDriver -# url: jdbc:oracle:thin:@//localhost:1521/XE -# username: ROOT -# password: root -# postgres: -# type: ${spring.datasource.type} -# driverClassName: org.postgresql.Driver -# url: jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true -# username: root -# password: root -# sqlserver: -# type: ${spring.datasource.type} -# driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver -# url: jdbc:sqlserver://localhost:1433;DatabaseName=tempdb;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true -# username: SA -# password: root + url: jdbc:mysql://192.168.110.2:13386/xinnengyuan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true + username: xinnengyuan + password: caJWNthNFaNRpRNy + # # 从库数据源 + # slave: + # lazy: true + # type: ${spring.datasource.type} + # driverClassName: com.mysql.cj.jdbc.Driver + # url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true + # username: + # password: + # oracle: + # type: ${spring.datasource.type} + # driverClassName: oracle.jdbc.OracleDriver + # url: jdbc:oracle:thin:@//localhost:1521/XE + # username: ROOT + # password: root + # postgres: + # type: ${spring.datasource.type} + # driverClassName: org.postgresql.Driver + # url: jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true + # username: root + # password: root + # sqlserver: + # type: ${spring.datasource.type} + # driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver + # url: jdbc:sqlserver://localhost:1433;DatabaseName=tempdb;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true + # username: SA + # password: root hikari: # 最大连接池数量 maxPoolSize: 20 @@ -101,13 +101,13 @@ spring: spring.data: redis: # 地址 - host: redis + host: 192.168.110.2 # 端口,默认为6379 port: 6379 # 数据库索引 - database: 3 + database: 1 # redis 密码必须配置 - password: 123456 + password: HMASKEbyhaASPZXB # 连接超时时间 timeout: 10s # 是否开启ssl @@ -265,3 +265,12 @@ justauth: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: ${justauth.address}/social-callback?source=gitlab +# 和风天气 https://dev.qweather.com/ +weather: + key-id: T65EAABUXC + project-id: 2JTHPUQ5YY + private-key: MC4CAQAwBQYDK2VwBCIEIMAglX7IsxYiTeM+FXXnvCUsIggajeP4s8gAllewm6BN + api-host: n35rk53njv.re.qweatherapi.com +# dxf转 geojson 执行文件名 +dxf2GeoJson: + file-name: main diff --git a/xinnengyuan/ruoyi-admin/src/main/resources/application.yml b/xinnengyuan/ruoyi-admin/src/main/resources/application.yml index aa1d9408..72dfa4ec 100644 --- a/xinnengyuan/ruoyi-admin/src/main/resources/application.yml +++ b/xinnengyuan/ruoyi-admin/src/main/resources/application.yml @@ -76,7 +76,7 @@ spring: servlet: multipart: # 单个文件大小 - max-file-size: 100MB + max-file-size: 200MB # 设置总上传的文件大小 max-request-size: 200MB mvc: diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/IncSyncDeleteProjectCache.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/IncSyncDeleteProjectCache.java index 59d6b446..203885f3 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/IncSyncDeleteProjectCache.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/IncSyncDeleteProjectCache.java @@ -37,7 +37,10 @@ public class IncSyncDeleteProjectCache { } // 批量删除 if (!keysToDelete.isEmpty()) { + log.info("清理项目缓存,共 {} 条:{}", keysToDelete.size(), keysToDelete); stringRedisTemplate.delete(keysToDelete); + } else { + log.info("没有需要清理的项目缓存"); } } } 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 591124a2..41edb0f7 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 @@ -18,6 +18,7 @@ import org.dromara.progress.domain.dto.progresscategory.PgsProgressCategoryQuery import org.dromara.progress.domain.dto.progresscategory.PgsProgressCategoryUpdateReq; import org.dromara.progress.domain.vo.progresscategory.PgsProgressCategoryCoordinateVo; import org.dromara.progress.domain.vo.progresscategory.PgsProgressCategoryLastTimeVo; +import org.dromara.progress.domain.vo.progresscategory.PgsProgressCategoryProjectVo; import org.dromara.progress.domain.vo.progresscategory.PgsProgressCategoryVo; import org.dromara.progress.service.IPgsProgressCategoryService; import org.springframework.validation.annotation.Validated; @@ -84,6 +85,18 @@ public class PgsProgressCategoryController extends BaseController { return R.ok(pgsProgressCategoryService.getCoordinate(id)); } + /** + * 获取项目总的进度信息 + * + * @param projectId 项目主键 + */ + @SaCheckPermission("progress:progressCategory:query") + @GetMapping("/project/number/{projectId}") + public R getProjectNumber(@NotNull(message = "项目主键不能为空") + @PathVariable Long projectId) { + return R.ok(pgsProgressCategoryService.getProjectNumber(projectId)); + } + /** * 获取进度类别最后一次进度信息 * diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progresscategory/PgsProgressCategoryMatrixVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progresscategory/PgsProgressCategoryMatrixVo.java new file mode 100644 index 00000000..cc11f3a1 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progresscategory/PgsProgressCategoryMatrixVo.java @@ -0,0 +1,60 @@ +package org.dromara.progress.domain.vo.progresscategory; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.common.json.handler.BigDecimalToIntegerSerializer; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author lcj + * @date 2025/6/5 15:41 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class PgsProgressCategoryMatrixVo implements Serializable { + + @Serial + private static final long serialVersionUID = 3061735290740592145L; + + /** + * 方阵id + */ + private Long matrixId; + + /** + * 总数量/百分比 + */ + @JsonSerialize(using = BigDecimalToIntegerSerializer.class) + private BigDecimal total; + + /** + * 已完成数量/百分比 + */ + @JsonSerialize(using = BigDecimalToIntegerSerializer.class) + private BigDecimal completed; + + /** + * 计划总数量/百分比 + */ + @JsonSerialize(using = BigDecimalToIntegerSerializer.class) + private BigDecimal planTotal; + + /** + * 已完成数量百分比 + */ + @JsonSerialize(using = BigDecimalToIntegerSerializer.class) + private BigDecimal completedPercentage; + + /** + * 计划中数量百分比 + */ + @JsonSerialize(using = BigDecimalToIntegerSerializer.class) + private BigDecimal planTotalPercentage; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progresscategory/PgsProgressCategoryProjectVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progresscategory/PgsProgressCategoryProjectVo.java new file mode 100644 index 00000000..e87f93ec --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progresscategory/PgsProgressCategoryProjectVo.java @@ -0,0 +1,62 @@ +package org.dromara.progress.domain.vo.progresscategory; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import lombok.Data; +import org.dromara.common.json.handler.BigDecimalToIntegerSerializer; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * @author lcj + * @date 2025/6/5 15:36 + */ +@Data +public class PgsProgressCategoryProjectVo implements Serializable { + + @Serial + private static final long serialVersionUID = -8208751933207899365L; + + /** + * 项目id + */ + private Long projectId; + + /** + * 总数量/百分比 + */ + @JsonSerialize(using = BigDecimalToIntegerSerializer.class) + private BigDecimal total; + + /** + * 已完成数量/百分比 + */ + @JsonSerialize(using = BigDecimalToIntegerSerializer.class) + private BigDecimal completed; + + /** + * 计划总数量/百分比 + */ + @JsonSerialize(using = BigDecimalToIntegerSerializer.class) + private BigDecimal planTotal; + + /** + * 已完成数量百分比 + */ + @JsonSerialize(using = BigDecimalToIntegerSerializer.class) + private BigDecimal completedPercentage; + + /** + * 计划中数量百分比 + */ + @JsonSerialize(using = BigDecimalToIntegerSerializer.class) + private BigDecimal planTotalPercentage; + + /** + * 子项目列表 + */ + private List children; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progresscategory/PgsProgressCategorySubProjectVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progresscategory/PgsProgressCategorySubProjectVo.java new file mode 100644 index 00000000..e17614f4 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progresscategory/PgsProgressCategorySubProjectVo.java @@ -0,0 +1,66 @@ +package org.dromara.progress.domain.vo.progresscategory; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.common.json.handler.BigDecimalToIntegerSerializer; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * @author lcj + * @date 2025/6/5 15:39 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class PgsProgressCategorySubProjectVo implements Serializable { + + @Serial + private static final long serialVersionUID = 7523695525881518366L; + + /** + * 子项目id + */ + private Long subProjectId; + + /** + * 总数量/百分比 + */ + @JsonSerialize(using = BigDecimalToIntegerSerializer.class) + private BigDecimal total; + + /** + * 已完成数量/百分比 + */ + @JsonSerialize(using = BigDecimalToIntegerSerializer.class) + private BigDecimal completed; + + /** + * 计划总数量/百分比 + */ + @JsonSerialize(using = BigDecimalToIntegerSerializer.class) + private BigDecimal planTotal; + + /** + * 已完成数量百分比 + */ + @JsonSerialize(using = BigDecimalToIntegerSerializer.class) + private BigDecimal completedPercentage; + + /** + * 计划中数量百分比 + */ + @JsonSerialize(using = BigDecimalToIntegerSerializer.class) + private BigDecimal planTotalPercentage; + + /** + * 方阵列表 + */ + private List children; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplandetail/PgsProgressPlanDetailDateVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplandetail/PgsProgressPlanDetailDateVo.java index fd20184e..08002484 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplandetail/PgsProgressPlanDetailDateVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/vo/progressplandetail/PgsProgressPlanDetailDateVo.java @@ -1,11 +1,15 @@ package org.dromara.progress.domain.vo.progressplandetail; import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import org.dromara.common.json.handler.BigDecimalToIntegerSerializer; +import java.math.BigDecimal; import java.util.Date; +import java.util.List; /** * @author lcj @@ -27,4 +31,15 @@ public class PgsProgressPlanDetailDateVo { @JsonFormat(pattern = "yyyy-MM-dd") private Date date; + /** + * 已完成数量 + */ + @JsonSerialize(using = BigDecimalToIntegerSerializer.class) + private BigDecimal finishedNumber; + + /** + * 完成详情 + */ + private List finishedDetail; + } 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 a29a5821..3d491586 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 @@ -8,6 +8,7 @@ import org.dromara.progress.domain.dto.progresscategory.PgsProgressCategoryQuery import org.dromara.progress.domain.dto.progresscategory.PgsProgressCategoryUpdateReq; import org.dromara.progress.domain.vo.progresscategory.PgsProgressCategoryCoordinateVo; import org.dromara.progress.domain.vo.progresscategory.PgsProgressCategoryLastTimeVo; +import org.dromara.progress.domain.vo.progresscategory.PgsProgressCategoryProjectVo; import org.dromara.progress.domain.vo.progresscategory.PgsProgressCategoryVo; import java.util.Collection; @@ -111,4 +112,12 @@ public interface IPgsProgressCategoryService extends IService detailList = progressPlanDetailService.lambdaQuery() - .select(PgsProgressPlanDetail::getId, PgsProgressPlanDetail::getDate) + .select(PgsProgressPlanDetail::getId, + PgsProgressPlanDetail::getDate, + PgsProgressPlanDetail::getFinishedNumber, + PgsProgressPlanDetail::getFinishedDetail) .eq(PgsProgressPlanDetail::getProgressCategoryId, id) .orderByAsc(PgsProgressPlanDetail::getDate) .list() - .stream().map(detail -> - new PgsProgressPlanDetailDateVo(detail.getId(), detail.getDate())) - .toList(); + .stream().map(detail -> { + PgsProgressPlanDetailDateVo detailDateVo = new PgsProgressPlanDetailDateVo(); + detailDateVo.setId(detail.getId()); + detailDateVo.setDate(detail.getDate()); + detailDateVo.setFinishedNumber(new BigDecimal(detail.getFinishedNumber())); + String finishedDetail = detail.getFinishedDetail(); + if (StringUtils.isNotBlank(finishedDetail)) { + List finishedVoList = JSONUtil.toList(finishedDetail, PgsProgressPlanDetailFinishedVo.class); + detailDateVo.setFinishedDetail(finishedVoList); + } + return detailDateVo; + }).toList(); coordinateVo.setDetailList(detailList); coordinateVo.setFacilityList(facilityList); return coordinateVo; } + /** + * 根据项目id获取项目进度类别数量信息 + * + * @param projectId 项目id + * @return 项目进度类别数量信息 + */ + @Override + public PgsProgressCategoryProjectVo getProjectNumber(Long projectId) { + // 获取项目信息 + BusProject project = projectService.getById(projectId); + if (project == null) { + throw new ServiceException("项目不存在", HttpStatus.NOT_FOUND); + } + // 获取子项目信息 + List subProjectList = projectService.lambdaQuery() + .select(BusProject::getId) + .eq(BusProject::getPId, projectId) + .list(); + if (CollUtil.isEmpty(subProjectList)) { + return null; + } + List subProjectIdList = subProjectList.stream().map(BusProject::getId).toList(); + // 获取方阵信息 + List matrixList = matrixService.lambdaQuery() + .select(FacMatrix::getId) + .in(FacMatrix::getProjectId, subProjectIdList) + .list(); + if (CollUtil.isEmpty(matrixList)) { + return null; + } + List matrixIdList = matrixList.stream().map(FacMatrix::getId).toList(); + // 分组:projectId -> matrixList + Map> matrixGroupByProject = matrixList.stream() + .collect(Collectors.groupingBy(FacMatrix::getProjectId)); + // 获取每个方阵下的进度类别信息 + List progressCategoryList = this.lambdaQuery() + .select(PgsProgressCategory::getId, PgsProgressCategory::getStatus, PgsProgressCategory::getMatrixId) + .in(PgsProgressCategory::getMatrixId, matrixIdList) + .list(); + // 分组:matrixId -> categoryList + Map> categoryGroupByMatrix = progressCategoryList. + stream().collect(Collectors.groupingBy(PgsProgressCategory::getMatrixId)); + // 封装结果 + List subProjectVoList = new ArrayList<>(); + BigDecimal totalAll = BigDecimal.ZERO; + BigDecimal completedAll = BigDecimal.ZERO; + BigDecimal planTotalAll = BigDecimal.ZERO; + for (BusProject subProject : subProjectList) { + Long subProjectId = subProject.getId(); + List subMatrices = matrixGroupByProject.get(subProjectId); + if (CollUtil.isEmpty(subMatrices)) { + continue; + } + List matrixVoList = new ArrayList<>(); + BigDecimal total = BigDecimal.ZERO; + BigDecimal completed = BigDecimal.ZERO; + BigDecimal planTotal = BigDecimal.ZERO; + for (FacMatrix matrix : subMatrices) { + Long matrixId = matrix.getId(); + List categories = categoryGroupByMatrix.get(matrixId); + if (CollUtil.isEmpty(categories)) { + continue; + } + BigDecimal matrixTotal = categories.stream().map(PgsProgressCategory::getTotal).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal matrixCompleted = categories.stream().map(PgsProgressCategory::getCompleted).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal matrixPlanTotal = categories.stream().map(PgsProgressCategory::getPlanTotal).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + total = total.add(matrixTotal); + completed = completed.add(matrixCompleted); + planTotal = planTotal.add(matrixPlanTotal); + // 构建 matrixVo + PgsProgressCategoryMatrixVo matrixVo = new PgsProgressCategoryMatrixVo(); + matrixVo.setMatrixId(matrixId); + matrixVo.setTotal(matrixTotal); + matrixVo.setCompleted(matrixCompleted); + matrixVo.setPlanTotal(matrixPlanTotal); + matrixVo.setCompletedPercentage(BigDecimalUtil.toPercentage(matrixCompleted, matrixTotal)); + matrixVo.setPlanTotalPercentage(BigDecimalUtil.toPercentage(matrixPlanTotal, matrixTotal)); + matrixVoList.add(matrixVo); + } + // 构建子项目VO + PgsProgressCategorySubProjectVo subProjectVo = new PgsProgressCategorySubProjectVo(); + subProjectVo.setSubProjectId(subProjectId); + subProjectVo.setTotal(total); + subProjectVo.setCompleted(completed); + subProjectVo.setPlanTotal(planTotal); + subProjectVo.setCompletedPercentage(BigDecimalUtil.toPercentage(completed, total)); + subProjectVo.setPlanTotalPercentage(BigDecimalUtil.toPercentage(planTotal, total)); + subProjectVo.setChildren(matrixVoList); + // 累加总项目数据 + totalAll = totalAll.add(total); + completedAll = completedAll.add(completed); + planTotalAll = planTotalAll.add(planTotal); + subProjectVoList.add(subProjectVo); + } + // 构建项目VO + PgsProgressCategoryProjectVo projectVo = new PgsProgressCategoryProjectVo(); + projectVo.setProjectId(projectId); + projectVo.setTotal(totalAll); + projectVo.setCompleted(completedAll); + projectVo.setPlanTotal(planTotalAll); + projectVo.setCompletedPercentage(BigDecimalUtil.toPercentage(completedAll, totalAll)); + projectVo.setPlanTotalPercentage(BigDecimalUtil.toPercentage(planTotalAll, totalAll)); + projectVo.setChildren(subProjectVoList); + return projectVo; + } + /** * 根据子节点完成状态获取父节点完成状态 * diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressPlanDetailServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressPlanDetailServiceImpl.java index 57f84ba0..d92e8733 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressPlanDetailServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressPlanDetailServiceImpl.java @@ -499,8 +499,12 @@ public class PgsProgressPlanDetailServiceImpl extends ServiceImpl detailList = req.getDetailList(); if (CollUtil.isNotEmpty(detailList)) { - List detailList1 = detailList.stream().map(detail -> { + List newDetailList = detailList.stream().map(detail -> { PgsProgressPlanDetail progressPlanDetail = new PgsProgressPlanDetail(); BeanUtils.copyProperties(detail, progressPlanDetail); progressPlanDetail.setProgressPlanId(id); @@ -154,7 +163,7 @@ public class PgsProgressPlanServiceImpl extends ServiceImpl> listSubProject(@NotNull(message = "项目id不能为空") + @PathVariable Long id) { + return R.ok(projectService.querySubList(id)); + } + /** * 导出项目列表 */ @@ -99,6 +107,20 @@ public class BusProjectController extends BaseController { return R.ok(projectService.insertByBo(req)); } + /** + * 新增子项目 + */ + @SaCheckPermission("project:project:add") + @Log(title = "项目", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/sub") + public R addSub(@Validated(AddGroup.class) @RequestBody BusProjectCreateSubReq req) { + if (req == null) { + throw new ServiceException("参数不能为空", HttpStatus.BAD_REQUEST); + } + return R.ok(projectService.insertSubByProject(req)); + } + /** * 修改项目 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusUserProjectRelevancyController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusUserProjectRelevancyController.java index 0e934de4..2b62d14a 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusUserProjectRelevancyController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusUserProjectRelevancyController.java @@ -56,7 +56,6 @@ public class BusUserProjectRelevancyController extends BaseController { /** * 查询登录用户与项目关联列表 */ - @SaCheckPermission("project:projectRelevancy:list") @GetMapping("/login/list") public R> listByLoginUser() { Long userId = LoginHelper.getUserId(); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/project/BusProjectCreateReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/project/BusProjectCreateReq.java index a3a91597..1763560f 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/project/BusProjectCreateReq.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/project/BusProjectCreateReq.java @@ -25,11 +25,6 @@ public class BusProjectCreateReq implements Serializable { */ private String shortName; - /** - * 父项目id - */ - private Long pId; - /** * 项目图片 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/project/BusProjectCreateSubReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/project/BusProjectCreateSubReq.java new file mode 100644 index 00000000..bc706176 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/project/BusProjectCreateSubReq.java @@ -0,0 +1,28 @@ +package org.dromara.project.domain.dto.project; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lcj + * @date 2025/6/6 11:57 + */ +@Data +public class BusProjectCreateSubReq implements Serializable { + + @Serial + private static final long serialVersionUID = 6380055877986391291L; + + /** + * 项目名称 + */ + private String projectName; + + /** + * 父项目id + */ + private Long pId; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectVo.java index 36cfbbd7..8db8bcc8 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectVo.java @@ -11,6 +11,7 @@ import org.dromara.project.domain.BusProject; import java.io.Serial; import java.io.Serializable; import java.util.Date; +import java.util.List; /** @@ -183,4 +184,9 @@ public class BusProjectVo implements Serializable { @ExcelProperty(value = "创建时间") private Date createTime; + /** + * 子项目 + */ + private List children; + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusSubProjectVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusSubProjectVo.java new file mode 100644 index 00000000..c3403ff2 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusSubProjectVo.java @@ -0,0 +1,34 @@ +package org.dromara.project.domain.vo.project; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author lcj + * @date 2025/6/4 9:53 + */ +@Data +public class BusSubProjectVo implements Serializable { + + @Serial + private static final long serialVersionUID = -5283786195929619472L; + + /** + * id + */ + private Long id; + + /** + * 项目名称 + */ + private String projectName; + + /** + * 创建时间 + */ + private Date createTime; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectService.java index a1b18441..0a4329d4 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectService.java @@ -7,12 +7,10 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.project.domain.BusProject; import org.dromara.project.domain.dto.project.BusProjectCreateReq; +import org.dromara.project.domain.dto.project.BusProjectCreateSubReq; import org.dromara.project.domain.dto.project.BusProjectQueryReq; import org.dromara.project.domain.dto.project.BusProjectUpdateReq; -import org.dromara.project.domain.vo.project.BusProjectContractorListVo; -import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo; -import org.dromara.project.domain.vo.project.BusProjectVo; -import org.dromara.project.domain.vo.project.BusProjectWeatherVo; +import org.dromara.project.domain.vo.project.*; import java.util.Collection; import java.util.List; @@ -50,6 +48,14 @@ public interface IBusProjectService extends IService { */ List queryList(BusProjectQueryReq req); + /** + * 查询项目下的子项目列表 + * + * @param id 父项目id + * @return 项目下的子项目列表 + */ + List querySubList(Long id); + /** * 查询当前登录用户项目列表以及项目列表下的分包公司列表 * @@ -65,6 +71,14 @@ public interface IBusProjectService extends IService { */ Long insertByBo(BusProjectCreateReq dto); + /** + * 新增子项目 + * + * @param dto 子项目 + * @return 子项目 id + */ + Long insertSubByProject(BusProjectCreateSubReq dto); + /** * 修改项目 * @@ -91,7 +105,7 @@ public interface IBusProjectService extends IService { BusProjectVo getVo(BusProject project); /** - * 获取项目查询条件封装 + * 获取项目查询条件封装(不查询子项目) * * @param req 查询条件 * @return 查询条件封装 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 00351204..bb92f2fd 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 @@ -32,6 +32,7 @@ import org.dromara.project.service.IBusProjectFileService; import org.dromara.project.service.IBusProjectService; import org.dromara.utils.Dxf2JsonUtil; import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -67,6 +68,9 @@ public class BusProjectFileServiceImpl extends ServiceImpl USER_TASK_RUNNING = new ConcurrentHashMap<>(); + @Value("${dxf2GeoJson.file-name}") + private String dxf2GeoJsonFileName; + /** * 查询项目文件存储 * @@ -258,7 +262,7 @@ public class BusProjectFileServiceImpl extends ServiceImpl queryPageList(BusProjectQueryReq req, PageQuery pageQuery) { + // 获取当前登录用户项目列表 + Long userId = LoginHelper.getUserId(); + List projectIdList = userProjectRelevancyService.lambdaQuery() + .select(BusUserProjectRelevancy::getProjectId) + .eq(BusUserProjectRelevancy::getUserId, userId) + .list() + .stream().map(BusUserProjectRelevancy::getProjectId).toList(); + LambdaQueryWrapper lqw = this.buildQueryWrapper(req); + if (CollUtil.isEmpty(projectIdList)) { + return TableDataInfo.build(new Page<>()); + } else { + lqw.in(BusProject::getId, projectIdList); + } // 查询数据库 - Page result = this.page(pageQuery.build(), this.buildQueryWrapper(req)); + Page result = this.page(pageQuery.build(), lqw); return TableDataInfo.build(this.getVoPage(result)); } @@ -132,6 +143,27 @@ public class BusProjectServiceImpl extends ServiceImpl querySubList(Long id) { + BusProject project = this.getById(id); + if (project == null) { + throw new ServiceException("查询项目不存在", HttpStatus.NOT_FOUND); + } + List subProjectList = this.list(new LambdaQueryWrapper() + .eq(BusProject::getPId, id)); + return subProjectList.stream().map(subProject -> { + BusSubProjectVo subProjectVo = new BusSubProjectVo(); + BeanUtils.copyProperties(subProject, subProjectVo); + return subProjectVo; + }).toList(); + } + /** * 查询当前登录用户项目列表以及项目列表下的分包公司列表 * @@ -214,6 +246,49 @@ public class BusProjectServiceImpl extends ServiceImpl userIdList = new HashSet<>(List.of(userId, SystemConstants.SUPER_ADMIN_ID)); + List userProjectRelevancyList = userIdList.stream().map(id -> { + BusUserProjectRelevancy userProjectRelevancy = new BusUserProjectRelevancy(); + userProjectRelevancy.setUserId(id); + userProjectRelevancy.setProjectId(subProjectId); + return userProjectRelevancy; + }).toList(); + boolean saveRelevancy = userProjectRelevancyService.saveBatch(userProjectRelevancyList); + if (!saveRelevancy) { + throw new ServiceException("新增用户与项目关联失败,数据库异常", HttpStatus.ERROR); + } + return subProjectId; + } + /** * 修改项目 * @@ -287,6 +362,13 @@ public class BusProjectServiceImpl extends ServiceImpl 0) { + throw new ServiceException("删除项目中存在子项目,请先删除子项目", HttpStatus.BAD_REQUEST); + } } // 删除项目 boolean removeProjectList = this.removeBatchByIds(ids); @@ -330,11 +412,22 @@ public class BusProjectServiceImpl extends ServiceImpl subProjectList = this.lambdaQuery() + .select(BusProject::getId, BusProject::getProjectName, BusProject::getCreateTime) + .eq(BusProject::getPId, project.getId()) + .list(); + List subProjectVoList = subProjectList.stream().map(subProject -> { + BusSubProjectVo subProjectVo = new BusSubProjectVo(); + BeanUtils.copyProperties(subProject, subProjectVo); + return subProjectVo; + }).toList(); + projectVo.setChildren(subProjectVoList); return projectVo; } /** - * 获取项目查询条件封装 + * 获取项目查询条件封装(不查询子项目) * * @param req 查询条件 * @return 查询条件封装 @@ -382,7 +475,11 @@ public class BusProjectServiceImpl extends ServiceImpl> projectFileMap = projectFileService.lambdaQuery() .in(BusProjectFile::getProjectId, projectIdList).list() .stream().collect(Collectors.groupingBy(BusProjectFile::getProjectId)); + // 获取子项目列表 + List subProjectList = this.lambdaQuery() + .select(BusProject::getId, BusProject::getPId, BusProject::getProjectName, BusProject::getCreateTime) + .in(BusProject::getPId, projectIdList) + .list(); + Map> subProjectMap = subProjectList.stream().collect(Collectors.groupingBy(BusProject::getPId)); // 对象列表 => 封装对象列表 List projectVoList = projectList.stream().map(project -> { // 对象转封装类 @@ -415,6 +518,16 @@ public class BusProjectServiceImpl extends ServiceImpl subProjectVoList = new ArrayList<>(); + if (subProjectMap.containsKey(project.getId())){ + subProjectVoList = subProjectMap.get(project.getId()).stream().map(subProject -> { + BusSubProjectVo subProjectVo = new BusSubProjectVo(); + BeanUtils.copyProperties(subProject, subProjectVo); + return subProjectVo; + }).toList(); + } + projectVo.setChildren(subProjectVoList); return projectVo; }).toList(); projectVoPage.setRecords(projectVoList); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusUserProjectRelevancyServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusUserProjectRelevancyServiceImpl.java index 58ad4dba..7b08cb77 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusUserProjectRelevancyServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusUserProjectRelevancyServiceImpl.java @@ -13,6 +13,7 @@ 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.project.constant.BusProjectConstant; import org.dromara.project.domain.BusProject; import org.dromara.project.domain.BusUserProjectRelevancy; import org.dromara.project.domain.dto.project.BusProjectBatchByProjectListReq; @@ -29,10 +30,8 @@ import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Objects; +import java.util.*; +import java.util.stream.Collectors; /** * 系统用户与项目关联Service业务层处理 @@ -209,14 +208,22 @@ public class BusUserProjectRelevancyServiceImpl extends ServiceImpl list = this.list(queryWrapper); + List projectIdList = list.stream().map(BusUserProjectRelevancy::getProjectId).toList(); + Map> projectMap = projectService.lambdaQuery() + .select(BusProject::getId, BusProject::getPId, BusProject::getProjectName, BusProject::getShortName) + .in(BusProject::getId, projectIdList) + .eq(BusProject::getPId, BusProjectConstant.PARENT_PROJECT_ID) + .list() + .stream().collect(Collectors.groupingBy(BusProject::getId)); // 获取封装 return list.stream() .map(userProjectRelevancy -> { Long projectId = userProjectRelevancy.getProjectId(); - QueryWrapper projectQueryWrapper = new QueryWrapper<>(); - projectQueryWrapper.eq("id", projectId); - BusProject project = projectService.getOne(projectQueryWrapper); - if (project != null) { + BusProject project = null; + if (projectMap.containsKey(projectId)) { + project = projectMap.get(projectId).getFirst(); + } + if (project != null && project.getPId().equals(BusProjectConstant.PARENT_PROJECT_ID)) { BusLoginUserProjectRelevancyVo loginUserProjectRelevancy = new BusLoginUserProjectRelevancyVo(); loginUserProjectRelevancy.setId(userProjectRelevancy.getId()); loginUserProjectRelevancy.setUserId(userProjectRelevancy.getUserId()); diff --git a/xinnengyuan/script/docker/nginx/conf/nginx.conf b/xinnengyuan/script/docker/nginx/conf/nginx.conf index 3c79d97f..31fbe790 100644 --- a/xinnengyuan/script/docker/nginx/conf/nginx.conf +++ b/xinnengyuan/script/docker/nginx/conf/nginx.conf @@ -1,7 +1,7 @@ worker_processes 1; -error_log /var/log/nginx/error.log warn; -pid /var/run/nginx.pid; +error_log /mnt/disk1/docker/nginx/log/error.log warn; +pid /mnt/disk1/docker/nginx/nginx.pid; events { worker_connections 1024; @@ -19,12 +19,11 @@ http { '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; - access_log /var/log/nginx/access.log main; + access_log /mnt/disk1/docker/nginx/log/access.log main; upstream server { ip_hash; - server 127.0.0.1:8080; - server 127.0.0.1:8081; + server 127.0.0.1:8899; } upstream monitor-admin { @@ -68,12 +67,12 @@ http { } location / { - root /usr/share/nginx/html; # docker映射路径 不允许更改 + root /mnt/disk1/docker/nginx/html; # docker映射路径 不允许更改 try_files $uri $uri/ /index.html; index index.html index.htm; } - location /prod-api/ { + location /api/ { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr;