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<Project, ProjectDto> 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<ProjectDto> list(String keyword,
|
List<ProjectType> projectTypes, List<Integer> clientIds, PageReq pageReq) {
|
var page = projectRepository.findProjects(keyword, projectTypes, clientIds, pageReq.toPageRequest());
|
return PageResp.of(page, toDto(page.getContent()));
|
}
|
|
@Override
|
public List<Project> list(String keyword, List<ProjectType> projectTypes, List<Integer> clientIds) {
|
return projectRepository.findProjects(keyword, projectTypes, clientIds);
|
}
|
|
@Override
|
public List<Project> listByClient(Integer clientId) {
|
// clientId为空时查询所有项目
|
if (clientId == null) {
|
return projectRepository.findProjects(null, null, null);
|
}
|
return projectRepository.findAllByClientIdAndDeleted(clientId, false);
|
}
|
@Override
|
public List<Project> 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<ProjectDto> toDto(List<Project> 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<Project> 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<Project> allProjects = projectRepository.findAllByClientIdAndDeleted(clientId, false);
|
|
// 根据planId获取所有未删除的任务,并提取其中的项目ID
|
List<CheckTask> tasks = checkTaskRepository.findAllByPlanIdAndDeleted(planId, false);
|
List<Integer> 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();
|
}
|
}
|