大屏接口,修改bug

This commit is contained in:
lcj
2025-11-07 17:45:37 +08:00
parent 8500469918
commit 15382b5aba
19 changed files with 288 additions and 18 deletions

View File

@ -42,6 +42,7 @@ import org.dromara.common.web.core.BaseController;
import org.dromara.patch.domain.bo.PdMasterBo;
import org.dromara.patch.domain.vo.PdMasterBymiAndQt;
import org.dromara.patch.service.IPdMasterService;
import org.dromara.project.service.IBusProjectService;
import org.dromara.system.domain.SysMenu;
import org.dromara.system.mapper.SysRoleMapper;
import org.dromara.system.service.impl.SysMenuServiceImpl;
@ -95,6 +96,9 @@ public class PersonalHomeController extends BaseController {
@Resource
private IAIChatMemoryService aiChatMemoryService;
@Resource
private IBusProjectService projectService;
private final SysRoleMapper roleMapper;
private final SysMenuServiceImpl menuMapper;
@ -174,8 +178,7 @@ public class PersonalHomeController extends BaseController {
*/
@GetMapping("/getMyProjectInfo")
public R<List<MyProjectInfoVo>> getMyProjectInfoList() {
// todo
return null;
return R.ok(projectService.getMyProjectInfo());
}
/**

View File

@ -53,6 +53,7 @@ import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
@ -211,6 +212,22 @@ public class ProjectBigScreenController extends BaseController {
return R.ok(projectBigScreenService.getProjectPeople(projectId));
}
/**
* 查询项目人员情况
*/
// @SaCheckPermission("project:big:screen")
@GetMapping("/ue/people/{projectId}")
public R<ProjectPeopleVo> getProjectPeopleUe(@NotNull(message = "主键不能为空")
@PathVariable Long projectId) {
final Long tdyq = 1897160897167638529L;
final Long tdeq = 1968506669544656898L;
if (Objects.equals(projectId, tdeq) || Objects.equals(projectId, tdyq)) {
return R.ok(projectBigScreenService.getProjectPeopleTianDong());
} else {
return R.ok(projectBigScreenService.getProjectPeople(projectId));
}
}
/**
* 查询项目形象进度
*/

View File

@ -23,6 +23,11 @@ public class MyProjectInfoVo implements Serializable {
*/
private Long projectId;
/**
* 负责人
*/
private String principal;
/**
* 项目名称
*/

View File

@ -60,6 +60,13 @@ public interface ProjectBigScreenService {
*/
ProjectPeopleVo getProjectPeople(Long projectId);
/**
* 获取项目人员(田东一二期)
*
* @return 项目人员
*/
ProjectPeopleVo getProjectPeopleTianDong();
/**
* 获取项目形象进度
*
@ -89,6 +96,7 @@ public interface ProjectBigScreenService {
void setList(GpsEquipmentBo bo);
List<Map<String, Object>> getClientList(Long projectId);
List<String> getUeClientList();
/**

View File

@ -234,6 +234,91 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
return vo;
}
/**
* 获取项目人员
*
* @return 项目人员
*/
@Override
public ProjectPeopleVo getProjectPeopleTianDong() {
final Long tdyq = 1897160897167638529L;
final Long tdeq = 1968506669544656898L;
List<Long> ids = List.of(tdeq, tdyq);
BusProject project = projectService.getById(tdyq);
// 获取大屏数据
ProjectPeopleVo vo = new ProjectPeopleVo();
// 获取施工人员总数
List<SubConstructionUser> list = constructionUserService.lambdaQuery()
.in(SubConstructionUser::getProjectId, ids)
.eq(SubConstructionUser::getUserRole, "0")
.isNotNull(SubConstructionUser::getTeamId).list();
List<Long> sysUserIdList = list.stream().map(SubConstructionUser::getSysUserId).toList();
int count = list.size();
BigDecimal countDec = BigDecimal.valueOf(count);
vo.setPeopleCount(countDec);
// 获取考勤数据
List<Long> attendancePeopleList1 = attendanceService.listAttendancePeopleByProjectId(tdyq);
List<Long> attendancePeopleList2 = attendanceService.listAttendancePeopleByProjectId(tdeq);
List<Long> attendancePeopleList = new ArrayList<>();
attendancePeopleList.addAll(attendancePeopleList1);
attendancePeopleList.addAll(attendancePeopleList2);
BigDecimal attendanceSize = BigDecimal.valueOf(attendancePeopleList.size());
vo.setAttendanceCount(attendanceSize);
// 计算考勤率
vo.setAttendanceRate(BigDecimalUtil.toPercentage(attendanceSize, countDec));
if (count != 0) {
// 统计班组人数
List<BusProjectTeamMember> memberList = projectTeamMemberService.lambdaQuery()
.select(BusProjectTeamMember::getId, BusProjectTeamMember::getTeamId)
.in(BusProjectTeamMember::getProjectId, ids)
.in(BusProjectTeamMember::getMemberId, sysUserIdList)
.list();
Map<Long, List<BusProjectTeamMember>> memberMap = memberList.stream()
.collect(Collectors.groupingBy(BusProjectTeamMember::getTeamId));
// 统计班组考勤数据
Map<Long, List<SubConstructionUser>> userTeamMap = new HashMap<>();
if (CollUtil.isNotEmpty(attendancePeopleList)) {
List<SubConstructionUser> users = constructionUserService.lambdaQuery()
.in(SubConstructionUser::getSysUserId, attendancePeopleList)
.isNotNull(SubConstructionUser::getTeamId)
.list();
userTeamMap = users.stream()
.collect(Collectors.groupingBy(SubConstructionUser::getTeamId));
}
List<BusProjectTeam> teamList = projectTeamService.lambdaQuery()
.in(BusProjectTeam::getProjectId, ids)
.list();
String punchRange = project.getPunchRange();
String punchTime = "";
if (punchRange != null) {
String start = punchRange.split(",")[0];
punchTime = LocalDate.now() + " ";
}
List<ProjectTeamAttendanceVo> 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;
}
/**
* 获取项目形象进度
*

View File

@ -304,6 +304,7 @@ public class OthYs7DeviceImgServiceImpl extends ServiceImpl<OthYs7DeviceImgMappe
record.setDeviceSerial(deviceSerial);
record.setDeviceName(img.getDeviceName());
record.setPicture(targetUrl);
record.setOriginalPicture(ossUrl);
record.setRecordCategory(HseRecordCategoryEnum.MONITOR.getValue());
record.setProjectId(img.getProjectId());
// 保存识别记录
@ -314,7 +315,7 @@ public class OthYs7DeviceImgServiceImpl extends ServiceImpl<OthYs7DeviceImgMappe
boolean save = this.save(othYs7DeviceImg);
if (!save) {
log.error("保存图片失败:{}", othYs7DeviceImg);
}else {
} else {
saveList.add(othYs7DeviceImg);
}
}

View File

@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.dromara.bigscreen.domain.dto.ProjectUpdateDto;
import org.dromara.bigscreen.domain.dto.TanchuangInfoReq;
import org.dromara.bigscreen.domain.vo.MyProjectInfoVo;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.manager.weathermanager.vo.WeatherVo;
@ -222,19 +223,29 @@ public interface IBusProjectService extends IService<BusProject> {
List<BusProjectVo> selectProjectVoList();
/**
*查询地图项目分类
* 查询地图项目分类
*
* @return
*/
Map<String, Map<String, Map<String, String>>> getProjectMapList();
/**
* 查询项目地域分散图
*
* @return
*/
Map<String, Long> getProjectDiYv();
/**
* 获取我的项目信息
*
* @return 项目信息
*/
List<MyProjectInfoVo> getMyProjectInfo();
/**
* 计划和实际容量对比
*
* @return
*/
Map<String, Map<String, String>> getProjectCapacity();

View File

@ -18,6 +18,8 @@ import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.dromara.bigscreen.domain.dto.ProjectUpdateDto;
import org.dromara.bigscreen.domain.dto.TanchuangInfoReq;
import org.dromara.bigscreen.domain.vo.MilestoneVo;
import org.dromara.bigscreen.domain.vo.MyProjectInfoVo;
import org.dromara.common.core.constant.CacheNames;
import org.dromara.common.core.constant.HttpStatus;
import org.dromara.common.core.constant.SystemConstants;
@ -42,8 +44,10 @@ import org.dromara.facility.service.IFacMatrixService;
import org.dromara.manager.weathermanager.WeatherConstant;
import org.dromara.manager.weathermanager.WeatherManager;
import org.dromara.manager.weathermanager.vo.WeatherVo;
import org.dromara.progress.domain.PgsConstructionSchedulePlan;
import org.dromara.progress.domain.PgsProgressCategory;
import org.dromara.progress.domain.enums.PgsRelevancyStructureEnum;
import org.dromara.progress.service.IPgsConstructionSchedulePlanService;
import org.dromara.progress.service.IPgsProgressCategoryService;
import org.dromara.progress.service.IPgsProgressCategoryTemplateService;
import org.dromara.project.constant.BusProjectConstant;
@ -70,6 +74,8 @@ import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
@ -159,6 +165,10 @@ public class BusProjectServiceImpl extends ServiceImpl<BusProjectMapper, BusProj
@Lazy
private ISubConstructionUserService constructionUserService;
@Lazy
@Resource
private IPgsConstructionSchedulePlanService constructionSchedulePlanService;
private final Cache<String, String> WEATHER_CACHE =
Caffeine.newBuilder().initialCapacity(1024)
.maximumSize(10000L)
@ -1445,6 +1455,106 @@ public class BusProjectServiceImpl extends ServiceImpl<BusProjectMapper, BusProj
return map;
}
/**
* 获取我的项目信息
*
* @return 项目信息
*/
@Override
public List<MyProjectInfoVo> getMyProjectInfo() {
Long userId = LoginHelper.getUserId();
// 获取用户项目关联
List<BusUserProjectRelevancy> relevancyList = userProjectRelevancyService.lambdaQuery()
.eq(BusUserProjectRelevancy::getUserId, userId)
.list();
if (CollUtil.isEmpty(relevancyList)) {
return Collections.emptyList();
}
Set<Long> projectIds = relevancyList.stream().map(BusUserProjectRelevancy::getProjectId).collect(Collectors.toSet());
// 项目信息
List<BusProject> projectList = this.listByIds(projectIds);
// 获取里程碑计划
List<PgsConstructionSchedulePlan> constructionSchedulePlanList = constructionSchedulePlanService.lambdaQuery()
.in(PgsConstructionSchedulePlan::getProjectId, projectIds)
.list();
// 根据项目进行分类
Map<Long, List<PgsConstructionSchedulePlan>> planMap = constructionSchedulePlanList.stream()
.collect(Collectors.groupingBy(PgsConstructionSchedulePlan::getProjectId));
// 获取所有项目的子项目
List<BusProject> subProjects = this.lambdaQuery()
.in(BusProject::getPId, projectIds)
.list();
Set<Long> allProjectIds = subProjects.stream().map(BusProject::getId).collect(Collectors.toSet());
allProjectIds.addAll(projectIds);
// 获取进度计划
List<PgsProgressCategory> progressCategoryList = progressCategoryService.lambdaQuery()
.eq(PgsProgressCategory::getParentId, 0L)
.in(PgsProgressCategory::getProjectId, allProjectIds)
.list();
// 根据项目进行分类
Map<Long, List<PgsProgressCategory>> progressCategoryMap = progressCategoryList.stream()
.collect(Collectors.groupingBy(PgsProgressCategory::getProjectId));
// 根据进度计划计算总进度
Map<Long, BigDecimal> totalProgressMap = new HashMap<>();
for (Map.Entry<Long, List<PgsProgressCategory>> entry : progressCategoryMap.entrySet()) {
Long key = entry.getKey();
List<PgsProgressCategory> value = entry.getValue();
// 过滤掉那些还有子节点的,只保留最底层
Set<Long> parentIds = value.stream()
.map(PgsProgressCategory::getParentId)
.collect(Collectors.toSet());
List<PgsProgressCategory> children = value.stream()
.filter(item -> !parentIds.contains(item.getId())) // 没有被当作别人父id的就是叶子节点
.toList();
// 计算总进度
BigDecimal percentage = progressCategoryService.getCompletedPercentage(children);
totalProgressMap.put(key, percentage);
}
// 封装数据
return projectList.stream().map(project -> {
MyProjectInfoVo vo = new MyProjectInfoVo();
Long id = project.getId();
vo.setProjectId(id);
vo.setPrincipal(project.getPrincipal());
vo.setProjectName(project.getProjectName());
vo.setProjectGeneralize(project.getProjectGeneralize());
// 获取里程碑
List<PgsConstructionSchedulePlan> planList = planMap.getOrDefault(id, Collections.emptyList());
if (CollUtil.isNotEmpty(planList)) {
vo.setMilestones(planList.stream().map(plan -> {
MilestoneVo milestoneVo = new MilestoneVo();
BeanUtils.copyProperties(plan, milestoneVo);
// 统计最早的开始时间
LocalDate planStartDate = plan.getPlanStartDate();
LocalDate startTime = vo.getStartTime();
if (startTime == null) {
vo.setStartTime(planStartDate);
} else {
if (planStartDate.isBefore(startTime)) {
vo.setStartTime(planStartDate);
}
}
// 统计最晚的结束时间
LocalDate planEndDate = plan.getPlanEndDate();
LocalDate endTime = vo.getEndTime();
if (endTime == null) {
vo.setEndTime(planEndDate);
} else {
if (planEndDate.isAfter(endTime)) {
vo.setEndTime(planEndDate);
}
}
return milestoneVo;
}).toList());
} else {
vo.setMilestones(Collections.emptyList());
}
// 获取进度计划
vo.setProgress(totalProgressMap.getOrDefault(id, BigDecimal.ZERO));
return vo;
}).toList();
}
@Override
public Map<String, Map<String, String>> getProjectCapacity() {
//获取项目列表

View File

@ -52,6 +52,11 @@ public class HseRecognizeRecord implements Serializable {
*/
private String violationType;
/**
* 原始图片
*/
private String originalPicture;
/**
* 图片路径
*/

View File

@ -7,6 +7,7 @@ import lombok.EqualsAndHashCode;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import java.io.Serial;
import java.time.LocalDate;
/**
* 安全周报对象 hse_safety_weekly_report
@ -41,12 +42,12 @@ public class HseSafetyWeeklyReport extends BaseEntity {
/**
* 周期范围
*/
private String scope;
private LocalDate scope;
/**
* 周期范围结束
*/
private String scopeEnd;
private LocalDate scopeEnd;
/**
* 文件位置

View File

@ -37,6 +37,11 @@ public class HseRecognizeRecordCreateDto {
*/
private String recordCategory;
/**
* 原始图片
*/
private String originalPicture;
/**
* 图片路径
*/

View File

@ -4,6 +4,7 @@ import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDate;
/**
* @author lilemy
@ -28,12 +29,12 @@ public class HseSafetyWeeklyReportCreateReq implements Serializable {
/**
* 周期范围
*/
private String scope;
private LocalDate scope;
/**
* 周期范围结束
*/
private String scopeEnd;
private LocalDate scopeEnd;
/**
* 文件位置

View File

@ -4,6 +4,7 @@ import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.List;
/**
@ -34,7 +35,7 @@ public class HseSafetyWeeklyReportQueryReq implements Serializable {
/**
* 周期范围
*/
private List<String> scopeDate;
private List<LocalDate> scopeDate;
/**
* 备注

View File

@ -4,6 +4,7 @@ import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDate;
/**
* @author lilemy
@ -28,12 +29,12 @@ public class HseSafetyWeeklyReportUpdateReq implements Serializable {
/**
* 周期范围
*/
private String scope;
private LocalDate scope;
/**
* 周期范围结束
*/
private String scopeEnd;
private LocalDate scopeEnd;
/**
* 文件位置

View File

@ -66,6 +66,11 @@ public class HseRecognizeRecordVo implements Serializable {
@ExcelDictFormat(dictType = "violation_level_type")
private String violationType;
/**
* 原始图片
*/
private String originalPicture;
/**
* 图片路径
*/

View File

@ -44,6 +44,11 @@ public class HseSafetyInspectionGis implements Serializable {
*/
private String status;
/**
* 检查时间
*/
private Date checkTime;
/**
* 创建时间
*/

View File

@ -8,6 +8,7 @@ import org.dromara.safety.domain.HseSafetyWeeklyReport;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.Date;
@ -47,13 +48,13 @@ public class HseSafetyWeeklyReportVo implements Serializable {
* 周期范围
*/
@ExcelProperty(value = "周期范围")
private String scope;
private LocalDate scope;
/**
* 周期范围结束
*/
@ExcelProperty(value = "周期范围结束")
private String scopeEnd;
private LocalDate scopeEnd;
/**
* 文件位置

View File

@ -107,6 +107,7 @@ public class HseRecognizeRecordServiceImpl extends ServiceImpl<HseRecognizeRecor
entity.setDeviceName(record.getDeviceName());
entity.setRecordCategory(record.getRecordCategory());
entity.setPicture(record.getPicture());
entity.setOriginalPicture(record.getOriginalPicture());
entity.setProjectId(record.getProjectId());
entity.setCreateTime(record.getCreateTime());
Long projectId = record.getProjectId();

View File

@ -32,6 +32,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.io.PrintWriter;
import java.time.LocalDate;
import java.util.Collection;
import java.util.List;
import java.util.Scanner;
@ -186,10 +187,12 @@ public class HseSafetyWeeklyReportServiceImpl extends ServiceImpl<HseSafetyWeekl
String path = safetyWeeklyReport.getPath();
if (StringUtils.isNotBlank(path)) {
SysOssVo ossVo = ossService.getById(Long.valueOf(path));
safetyWeeklyReportVo.setFileUrl(ossVo.getUrl());
safetyWeeklyReportVo.setFilePath(ossVo.getFileName());
safetyWeeklyReportVo.setFileSuffix(ossVo.getFileSuffix());
safetyWeeklyReportVo.setFileName(ossVo.getOriginalName());
if (ossVo != null) {
safetyWeeklyReportVo.setFileUrl(ossVo.getUrl());
safetyWeeklyReportVo.setFilePath(ossVo.getFileName());
safetyWeeklyReportVo.setFileSuffix(ossVo.getFileSuffix());
safetyWeeklyReportVo.setFileName(ossVo.getOriginalName());
}
}
return safetyWeeklyReportVo;
}
@ -209,7 +212,7 @@ public class HseSafetyWeeklyReportServiceImpl extends ServiceImpl<HseSafetyWeekl
Long id = req.getId();
Long projectId = req.getProjectId();
String week = req.getWeek();
List<String> scopeDate = req.getScopeDate();
List<LocalDate> scopeDate = req.getScopeDate();
String remark = req.getRemark();
// 时间范围查询
if (ObjectUtils.isNotEmpty(scopeDate)) {
@ -222,6 +225,7 @@ public class HseSafetyWeeklyReportServiceImpl extends ServiceImpl<HseSafetyWeekl
lqw.eq(ObjectUtils.isNotEmpty(id), HseSafetyWeeklyReport::getId, id);
lqw.eq(ObjectUtils.isNotEmpty(projectId), HseSafetyWeeklyReport::getProjectId, projectId);
lqw.eq(ObjectUtils.isNotEmpty(week), HseSafetyWeeklyReport::getWeek, week);
lqw.orderByDesc(HseSafetyWeeklyReport::getScope);
return lqw;
}