From baf0794ccea1c27f21991801b5e3223584a65cda Mon Sep 17 00:00:00 2001 From: lcj <2331845269@qq.com> Date: Fri, 22 Aug 2025 22:40:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectBigScreenController.java | 43 ++++ .../domain/vo/ProjectImageProgressVo.java | 54 +++++ .../bigscreen/domain/vo/ProjectPeopleVo.java | 39 ++++ .../domain/vo/ProjectSafetyInspectionVo.java | 39 ++++ .../domain/vo/ProjectTeamAttendanceVo.java | 49 +++++ .../service/ProjectBigScreenService.java | 35 +++ .../impl/ProjectBigScreenServiceImpl.java | 206 +++++++++++++++++- .../impl/FacBoxTransformerServiceImpl.java | 9 +- .../service/impl/FacInverterServiceImpl.java | 9 +- ...FacPhotovoltaicPanelColumnServiceImpl.java | 6 +- .../FacPhotovoltaicPanelPartsServiceImpl.java | 3 +- .../FacPhotovoltaicPanelPointServiceImpl.java | 6 +- .../impl/FacPhotovoltaicPanelServiceImpl.java | 9 +- ...acPhotovoltaicPanelSupportServiceImpl.java | 6 +- .../impl/OutConstructionValueServiceImpl.java | 6 +- .../progress/domain/PgsProgressCategory.java | 9 +- .../PgsProgressCategoryCreatePriceReq.java | 9 +- .../PgsProgressCategoryCreateReq.java | 12 +- .../PgsProgressCategoryVo.java | 12 +- .../impl/PgsProgressCategoryServiceImpl.java | 9 +- .../dromara/project/domain/BusProject.java | 5 + .../dto/project/BusProjectCreateReq.java | 5 + .../dto/project/BusProjectUpdateReq.java | 5 + 23 files changed, 558 insertions(+), 27 deletions(-) create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectImageProgressVo.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectPeopleVo.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectSafetyInspectionVo.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectTeamAttendanceVo.java diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/ProjectBigScreenController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/ProjectBigScreenController.java index 3b496783..f13602f7 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/ProjectBigScreenController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/ProjectBigScreenController.java @@ -5,7 +5,10 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import jakarta.annotation.Resource; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; +import org.dromara.bigscreen.domain.vo.ProjectImageProgressVo; import org.dromara.bigscreen.domain.vo.ProjectLandVo; +import org.dromara.bigscreen.domain.vo.ProjectPeopleVo; +import org.dromara.bigscreen.domain.vo.ProjectSafetyInspectionVo; import org.dromara.bigscreen.service.ProjectBigScreenService; import org.dromara.common.core.domain.R; import org.dromara.land.domain.BusLandBlock; @@ -124,4 +127,44 @@ public class ProjectBigScreenController { @PathVariable Long projectId) { return R.ok(projectBigScreenService.getProjectNews(projectId)); } + + /** + * 查询项目AI安全巡检 + */ + @SaCheckPermission("project:bigScreen:safetyInspection") + @GetMapping("/safetyInspection/{projectId}") + public R> getProjectSafetyInspection(@NotNull(message = "主键不能为空") + @PathVariable Long projectId) { + return R.ok(projectBigScreenService.getProjectSafetyInspection(projectId)); + } + + /** + * 查询项目人员情况 + */ + @SaCheckPermission("project:bigScreen:people") + @GetMapping("/people/{projectId}") + public R getProjectPeople(@NotNull(message = "主键不能为空") + @PathVariable Long projectId) { + return R.ok(projectBigScreenService.getProjectPeople(projectId)); + } + + /** + * 查询项目形象进度 + */ + @SaCheckPermission("project:bigScreen:imageProgress") + @GetMapping("/imageProgress/{projectId}") + public R getProjectImageProgress(@NotNull(message = "主键不能为空") + @PathVariable Long projectId) { + return R.ok(projectBigScreenService.getProjectImageProgress(projectId)); + } + + /** + * 查询项目概括 + */ + @SaCheckPermission("project:bigScreen:generalize") + @GetMapping("/generalize/{projectId}") + public R getProjectGeneralize(@NotNull(message = "主键不能为空") + @PathVariable Long projectId) { + return R.ok(projectBigScreenService.getProjectGeneralize(projectId)); + } } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectImageProgressVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectImageProgressVo.java new file mode 100644 index 00000000..6eebaec5 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectImageProgressVo.java @@ -0,0 +1,54 @@ +package org.dromara.bigscreen.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author lilemy + * @date 2025-08-22 20:05 + */ +@Data +public class ProjectImageProgressVo implements Serializable { + + @Serial + private static final long serialVersionUID = 7963637133004484891L; + + /** + * 场区百分比 + */ + private BigDecimal areaPercentage; + + /** + * 道路百分比 + */ + private BigDecimal roadPercentage; + + /** + * 集电线路百分比 + */ + private BigDecimal collectorLinePercentage; + + /** + * 送出线路百分比 + */ + private BigDecimal exportLinePercentage; + + /** + * 升压站百分比 + */ + private BigDecimal substationPercentage; + + /** + * 箱变百分比 + */ + private BigDecimal boxTransformerPercentage; + + /** + * 总百分比 + */ + private BigDecimal totalPercentage; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectPeopleVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectPeopleVo.java new file mode 100644 index 00000000..2eff1816 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectPeopleVo.java @@ -0,0 +1,39 @@ +package org.dromara.bigscreen.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * @author lilemy + * @date 2025-08-22 20:03 + */ +@Data +public class ProjectPeopleVo implements Serializable { + + @Serial + private static final long serialVersionUID = -3169574372374491372L; + + /** + * 施工人员数量 + */ + private BigDecimal peopleCount; + + /** + * 出勤人员数量 + */ + private BigDecimal attendanceCount; + + /** + * 出勤率 + */ + private BigDecimal attendanceRate; + + /** + * 班组出勤信息 + */ + private List teamAttendanceList; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectSafetyInspectionVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectSafetyInspectionVo.java new file mode 100644 index 00000000..5cd9cb29 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectSafetyInspectionVo.java @@ -0,0 +1,39 @@ +package org.dromara.bigscreen.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author lilemy + * @date 2025-08-22 19:58 + */ +@Data +public class ProjectSafetyInspectionVo implements Serializable { + + @Serial + private static final long serialVersionUID = 5077897258656815177L; + + /** + * 主键id + */ + private Long id; + + /** + * 违章类型(多个逗号分隔) + */ + private String violationType; + + /** + * 图片路径 + */ + private String picture; + + /** + * 创建时间 + */ + private Date createTime; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectTeamAttendanceVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectTeamAttendanceVo.java new file mode 100644 index 00000000..de8147a1 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/ProjectTeamAttendanceVo.java @@ -0,0 +1,49 @@ +package org.dromara.bigscreen.domain.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author lilemy + * @date 2025-08-22 20:29 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ProjectTeamAttendanceVo { + + /** + * 主键id + */ + private Long id; + + /** + * 班组名称 + */ + private String teamName; + + /** + * 出勤人数 + */ + private BigDecimal attendanceNumber; + + /** + * 总人数 + */ + private BigDecimal allNumber; + + /** + * 出勤率 + */ + private BigDecimal attendanceRate; + + /** + * 考勤时间 + */ + private String attendanceTime; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/ProjectBigScreenService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/ProjectBigScreenService.java index 20820a68..a783281e 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/ProjectBigScreenService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/ProjectBigScreenService.java @@ -1,5 +1,8 @@ package org.dromara.bigscreen.service; +import org.dromara.bigscreen.domain.vo.ProjectImageProgressVo; +import org.dromara.bigscreen.domain.vo.ProjectPeopleVo; +import org.dromara.bigscreen.domain.vo.ProjectSafetyInspectionVo; import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo; import org.dromara.project.domain.vo.project.BusProjectWeatherVo; import org.dromara.project.domain.vo.projectnews.BusProjectNewsVo; @@ -35,4 +38,36 @@ public interface ProjectBigScreenService { * @return 项目新闻 */ List getProjectNews(Long projectId); + + /** + * 获取项目安全检查 + * + * @param projectId 项目id + * @return 项目安全检查 + */ + List getProjectSafetyInspection(Long projectId); + + /** + * 获取项目人员 + * + * @param projectId 项目id + * @return 项目人员 + */ + ProjectPeopleVo getProjectPeople(Long projectId); + + /** + * 获取项目形象进度 + * + * @param projectId 项目id + * @return 项目形象进度 + */ + ProjectImageProgressVo getProjectImageProgress(Long projectId); + + /** + * 获取项目概括 + * + * @param projectId 项目id + * @return 项目概括 + */ + String getProjectGeneralize(Long projectId); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/ProjectBigScreenServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/ProjectBigScreenServiceImpl.java index ecf3640d..121ec33a 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/ProjectBigScreenServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/ProjectBigScreenServiceImpl.java @@ -1,18 +1,38 @@ package org.dromara.bigscreen.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.RandomUtil; import jakarta.annotation.Resource; +import org.dromara.bigscreen.domain.vo.ProjectImageProgressVo; +import org.dromara.bigscreen.domain.vo.ProjectPeopleVo; +import org.dromara.bigscreen.domain.vo.ProjectSafetyInspectionVo; +import org.dromara.bigscreen.domain.vo.ProjectTeamAttendanceVo; import org.dromara.bigscreen.service.ProjectBigScreenService; import org.dromara.common.core.constant.HttpStatus; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.utils.BigDecimalUtil; +import org.dromara.contractor.domain.SubConstructionUser; +import org.dromara.contractor.service.ISubConstructionUserService; import org.dromara.project.domain.BusProject; +import org.dromara.project.domain.BusProjectTeam; +import org.dromara.project.domain.BusProjectTeamMember; import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo; import org.dromara.project.domain.vo.project.BusProjectWeatherVo; import org.dromara.project.domain.vo.projectnews.BusProjectNewsVo; -import org.dromara.project.service.IBusProjectNewsService; -import org.dromara.project.service.IBusProjectService; +import org.dromara.project.service.*; +import org.dromara.safety.domain.HseRecognizeRecord; +import org.dromara.safety.service.IHseRecognizeRecordService; +import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * @author lilemy @@ -27,6 +47,21 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService { @Resource private IBusProjectNewsService projectNewsService; + @Resource + private IHseRecognizeRecordService recognizeRecordService; + + @Resource + private ISubConstructionUserService constructionUserService; + + @Resource + private IBusAttendanceService attendanceService; + + @Resource + private IBusProjectTeamService projectTeamService; + + @Resource + private IBusProjectTeamMemberService projectTeamMemberService; + /** * 获取项目天气 * @@ -63,6 +98,173 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService { return projectNewsService.queryListByProject(projectId); } + /** + * 获取项目安全检查 + * + * @param projectId 项目id + * @return 项目安全检查 + */ + @Override + public List getProjectSafetyInspection(Long projectId) { + checkProject(projectId); + List recordList = recognizeRecordService.lambdaQuery() + .eq(HseRecognizeRecord::getProjectId, projectId) + .orderByDesc(HseRecognizeRecord::getCreateTime) // 按创建时间倒序 + .last("limit 10") // 只取前10条 + .list(); + return recordList.stream().map(record -> { + ProjectSafetyInspectionVo vo = new ProjectSafetyInspectionVo(); + BeanUtils.copyProperties(record, vo); + return vo; + }).toList(); + } + + /** + * 获取项目人员 + * + * @param projectId 项目id + * @return 项目人员 + */ + @Override + public ProjectPeopleVo getProjectPeople(Long projectId) { + // 参数校验 + BusProject project = projectService.getById(projectId); + if (project == null) { + throw new ServiceException("项目信息不存在", HttpStatus.NOT_FOUND); + } + // 获取大屏数据 + ProjectPeopleVo vo = new ProjectPeopleVo(); + // 获取施工人员总数 + Long count = constructionUserService.lambdaQuery() + .eq(SubConstructionUser::getProjectId, projectId).count(); + BigDecimal countDec = BigDecimal.valueOf(count); + vo.setPeopleCount(countDec); + // 获取考勤数据 + List attendancePeopleList = attendanceService.listAttendancePeopleByProjectId(projectId); + BigDecimal attendanceSize = BigDecimal.valueOf(attendancePeopleList.size()); + vo.setAttendanceCount(attendanceSize); + // 计算考勤率 + vo.setAttendanceRate(BigDecimalUtil.toPercentage(attendanceSize, countDec)); + if (count != 0) { + // 统计班组人数 + List memberList = projectTeamMemberService.lambdaQuery() + .select(BusProjectTeamMember::getId, BusProjectTeamMember::getTeamId) + .eq(BusProjectTeamMember::getProjectId, projectId) + .list(); + Map> memberMap = memberList.stream() + .collect(Collectors.groupingBy(BusProjectTeamMember::getTeamId)); + // 统计班组考勤数据 + Map> userTeamMap = new HashMap<>(); + if (CollUtil.isNotEmpty(attendancePeopleList)) { + List users = constructionUserService.listByIds(attendancePeopleList); + userTeamMap = users.stream() + .collect(Collectors.groupingBy(SubConstructionUser::getTeamId)); + } + List teamList = projectTeamService.lambdaQuery() + .eq(BusProjectTeam::getProjectId, projectId) + .list(); + String punchRange = project.getPunchRange(); + String punchTime = ""; + if (punchRange != null) { + String start = punchRange.split(",")[0]; + punchTime = LocalDate.now() + " " + start; + } + List listVo = new ArrayList<>(); + for (BusProjectTeam projectTeam : teamList) { + ProjectTeamAttendanceVo teamAttendanceVo = new ProjectTeamAttendanceVo(); + Long id = projectTeam.getId(); + teamAttendanceVo.setId(id); + teamAttendanceVo.setTeamName(projectTeam.getTeamName()); + teamAttendanceVo.setAttendanceTime(punchTime); + BigDecimal allNumber = BigDecimal.ZERO; + if (memberMap.containsKey(id)) { + allNumber = BigDecimal.valueOf(memberMap.get(id).size()); + } + BigDecimal attendanceNumber = BigDecimal.ZERO; + if (CollUtil.isNotEmpty(userTeamMap) && userTeamMap.containsKey(id)) { + attendanceNumber = BigDecimal.valueOf(userTeamMap.get(id).size()); + } + teamAttendanceVo.setAttendanceNumber(attendanceNumber); + teamAttendanceVo.setAllNumber(allNumber); + teamAttendanceVo.setAttendanceRate(BigDecimalUtil.toPercentage(attendanceNumber, allNumber)); + listVo.add(teamAttendanceVo); + } + vo.setTeamAttendanceList(listVo); + } + return vo; + } + + /** + * 获取项目形象进度 + * + * @param projectId 项目id + * @return 项目形象进度 + */ + @Override + public ProjectImageProgressVo getProjectImageProgress(Long projectId) { + checkProject(projectId); + // 生成 0 ~ 100 的随机 double + double random = RandomUtil.randomDouble(0, 100); + + // 保留两位小数(四舍五入) + double result = NumberUtil.round(random, 2).doubleValue(); + ProjectImageProgressVo vo = new ProjectImageProgressVo(); + vo.setAreaPercentage(BigDecimal.valueOf(result)); + // 生成 0 ~ 100 的随机 double + double random1 = RandomUtil.randomDouble(0, 100); + + // 保留两位小数(四舍五入) + double result1 = NumberUtil.round(random1, 2).doubleValue(); + vo.setRoadPercentage(BigDecimal.valueOf(result1)); + // 生成 0 ~ 100 的随机 double + double random2 = RandomUtil.randomDouble(0, 100); + + // 保留两位小数(四舍五入) + double result2 = NumberUtil.round(random2, 2).doubleValue(); + vo.setCollectorLinePercentage(BigDecimal.valueOf(result2)); + // 生成 0 ~ 100 的随机 double + double random3 = RandomUtil.randomDouble(0, 100); + + // 保留两位小数(四舍五入) + double result3 = NumberUtil.round(random3, 2).doubleValue(); + vo.setExportLinePercentage(BigDecimal.valueOf(result3)); + // 生成 0 ~ 100 的随机 double + double random4 = RandomUtil.randomDouble(0, 100); + + // 保留两位小数(四舍五入) + double result4 = NumberUtil.round(random4, 2).doubleValue(); + vo.setSubstationPercentage(BigDecimal.valueOf(result4)); + // 生成 0 ~ 100 的随机 double + double random5 = RandomUtil.randomDouble(0, 100); + + // 保留两位小数(四舍五入) + double result5 = NumberUtil.round(random5, 2).doubleValue(); + vo.setBoxTransformerPercentage(BigDecimal.valueOf(result5)); + + // 生成 0 ~ 100 的随机 double + double random6 = RandomUtil.randomDouble(0, 100); + + // 保留两位小数(四舍五入) + double result6 = NumberUtil.round(random6, 2).doubleValue(); + vo.setTotalPercentage(BigDecimal.valueOf(result6)); + return vo; + } + + /** + * 获取项目概括 + * + * @param projectId 项目id + * @return 项目概括 + */ + @Override + public String getProjectGeneralize(Long projectId) { + BusProject project = projectService.getById(projectId); + if (project == null) { + throw new ServiceException("项目不存在", HttpStatus.NOT_FOUND); + } + return project.getProjectGeneralize(); + } + /** * 检查项目是否存在 * 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 1a793004..33e3a541 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 @@ -239,7 +239,8 @@ public class FacBoxTransformerServiceImpl extends ServiceImpl