package com.estate.expert.admin.service.impl; import com.estate.expert.admin.component.map.GeoTranslateComponent; import com.estate.expert.admin.domain.business.device.usage.DeviceUsage; import com.estate.expert.admin.domain.common.request.PageReq; import com.estate.expert.admin.domain.common.response.PageResp; import com.estate.expert.admin.domain.exam.task.check.CheckTask; import com.estate.expert.admin.domain.exam.task.check.CheckTaskRepository; import com.estate.expert.admin.domain.plan.Plan; import com.estate.expert.admin.domain.project.Project; import com.estate.expert.admin.domain.project.ProjectDto; import com.estate.expert.admin.domain.project.ProjectRepository; import com.estate.expert.admin.domain.project.enums.ProjectType; import com.estate.expert.admin.domain.repository.ScreenAccountMybatisMapper; import com.estate.expert.admin.domain.standard.hierachy.HierarchyIds; import com.estate.expert.admin.domain.user.User; import com.estate.expert.admin.service.*; import com.estate.expert.admin.service.common.CrudServiceBaseImpl; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.util.List; /** * 项目服务实现 */ @Slf4j @Service public class ProjectServiceImpl extends CrudServiceBaseImpl implements ProjectService { @Resource private ProjectRepository projectRepository; @Resource private DeviceUsageService deviceUsageService; @Resource private HierarchyService hierarchyService; @Resource private GeoTranslateComponent geoTranslateComponent; @Resource private ScreenAccountMybatisMapper screenAccountMybatisMapper; @Resource private CheckTaskRepository checkTaskRepository; @Resource private PlanService planService; @Override public PageResp list(String keyword, List projectTypes, List clientIds, PageReq pageReq) { var page = projectRepository.findProjects(keyword, projectTypes, clientIds, pageReq.toPageRequest()); return PageResp.of(page, toDto(page.getContent())); } @Override public List list(String keyword, List projectTypes, List clientIds) { return projectRepository.findProjects(keyword, projectTypes, clientIds); } @Override public List listByClient(Integer clientId) { // clientId为空时查询所有项目 if (clientId == null) { return projectRepository.findProjects(null, null, null); } return projectRepository.findAllByClientIdAndDeleted(clientId, false); } @Override public List listByTitle(String name) { return screenAccountMybatisMapper.findAllByTitleIdAndDeleted(name); } @Override protected void beforeDelete(Project entity) { var deviceUsages = deviceUsageService.listUsages(entity.getId(), null); // 需要释放项目用到的设备 if(!CollectionUtils.isEmpty(deviceUsages)){ deviceUsageService.deleteAllById(deviceUsages.stream().map(DeviceUsage::getId).toList()); } } @Override public ProjectDto toDto(Project entity) { var hierarchy = hierarchyService.get(HierarchyIds.DEPARTMENT).getContent(); var dto = super.toDto(entity); var department = hierarchy.get(dto.getDepartmentPath()); if(department!=null) dto.setDepartmentName(department.getName()); return dto; } @Override public List toDto(List entityList) { var hierarchy = hierarchyService.get(HierarchyIds.DEPARTMENT).getContent(); var dtos = entityList.stream().map(entityMapper::toDto).toList(); for (var dto : dtos) { var department = hierarchy.get(dto.getDepartmentPath()); if(department!=null) dto.setDepartmentName(department.getName()); } return dtos; } @Override public Project add(User creator, Project entity) { updateGeoLocation(entity); return super.add(creator, entity); } @Override public Project edit(Project entity) { updateGeoLocation(entity); return super.edit(entity); } // 更新项目的地理位置信息 private void updateGeoLocation(Project entity) { var address = entity.getAddressInfo(); if(address != null){ var location = geoTranslateComponent.translate(address.getFullAddress()); address.setGps(location); } } @Override public List listAvailableByPlan(Integer planId) { // 根据planId获取计划,并从计划中获取clientId Plan plan = planService.get(planId); if (plan == null || plan.getClient() == null) { return List.of(); } Integer clientId = plan.getClient().getId(); // 根据clientId获取所有未删除的项目 List allProjects = projectRepository.findAllByClientIdAndDeleted(clientId, false); // 根据planId获取所有未删除的任务,并提取其中的项目ID List tasks = checkTaskRepository.findAllByPlanIdAndDeleted(planId, false); List usedProjectIds = tasks.stream() .map(task -> task.getProject() != null ? task.getProject().getId() : null) .filter(id -> id != null) .distinct() .toList(); // 过滤掉已经在任务中使用的项目 return allProjects.stream() .filter(project -> !usedProjectIds.contains(project.getId())) .toList(); } }