“mitao”
2026-05-16 881332a25bcbbe3bebb696f6d0728fba559ef635
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
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) {
        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();
    }
}