liujie
2026-01-26 753097b2693fec43c8bbbd766b8c1b32d73d7e43
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
package com.estate.expert.admin.service.impl;
 
import com.estate.expert.admin.domain.common.EntityRef;
import com.estate.expert.admin.domain.common.mapper.EntityRefMapper;
import com.estate.expert.admin.domain.common.request.PageReq;
import com.estate.expert.admin.domain.common.response.PageResp;
import com.estate.expert.admin.domain.standard.hierachy.HierarchyData;
import com.estate.expert.admin.domain.standard.hierachy.HierarchyIds;
import com.estate.expert.admin.domain.standard.model.Model;
import com.estate.expert.admin.domain.standard.model.system.SysModel;
import com.estate.expert.admin.domain.standard.model.system.SysModelDto;
import com.estate.expert.admin.domain.standard.model.system.SysModelRepository;
import com.estate.expert.admin.domain.standard.problem.Problem;
import com.estate.expert.admin.domain.user.User;
import com.estate.expert.admin.enums.BizResultCode;
import com.estate.expert.admin.service.HierarchyService;
import com.estate.expert.admin.service.ProblemService;
import com.estate.expert.admin.service.UserService;
import com.estate.expert.admin.service.common.CrudServiceBaseImpl;
import com.estate.expert.admin.service.model.SystemModelService;
import com.estate.expert.admin.utils.tree.SimpleTreeRoot;
import com.estate.expert.admin.utils.tree.TreeNode;
import com.estate.expert.admin.utils.tree.TreeRoot;
import com.estate.expert.admin.utils.tree.helper.TreeHelper;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
 
import javax.annotation.Resource;
import javax.lang.model.type.NullType;
import java.util.HashSet;
import java.util.List;
 
/**
 * 系统模型服务实现
 */
@Service
public class SystemModelServiceImpl extends CrudServiceBaseImpl<SysModel, SysModelDto> implements SystemModelService {
 
    @Resource
    private SysModelRepository repository;
 
    @Resource
    private UserService userService;
 
    @Resource
    private HierarchyService hierarchyService;
 
    @Resource
    private EntityRefMapper entityRefMapper;
 
    @Resource
    private ProblemService problemService;
 
 
    @Override
    public PageResp<EntityRef> list(String keyword, PageReq pageReq) {
        // 要显示的信息比较简单,就不单独写mapper了
        var page = repository.findAllByKeyword(keyword, pageReq.toPageRequest());
        var list = page.getContent().stream().map(entityRefMapper::toReference).toList();
        return PageResp.of(page, list);
    }
 
    @Override
    public SysModel add(User creator, SysModel entity) {
        // 初始化模型
        entity.setHierarchy(hierarchyService.get(HierarchyIds.SYSTEM));
        entity.setVersion(0);
        return super.add(creator, entity);
    }
 
    @Override
    public void sync(Integer id) {
        var model = get(id);
        BizResultCode.MODEL_NOT_FOUND.check(model == null);
        model.setVersion(model.getVersion() + 1);
        
        // 根据 hierarchyPaths 重新获取当前对应的问题ID
        if (model.getHierarchyPaths() != null && !model.getHierarchyPaths().isEmpty()) {
            var problemIds = problemService.listIds(model.getHierarchy().getId(), model.getHierarchyPaths());
            model.setProblemIds(problemIds);
        } else {
            // 如果 hierarchyPaths 为空,清空 problemIds
            model.setProblemIds(null);
        }
        
        save(model);
    }
 
    @Override
    public SysModel getDefaultModel() {
        return get(HierarchyIds.SYSTEM);
    }
 
    @Override
    public void createDefaultModel() {
        var model = getDefaultModel();
        if(model != null){
            return;
        }
 
        // 初始化默认模型
        var modelDto = SysModelDto.builder()
                .name("默认综合模型")
                .version(0)
                .build();
        add(userService.getSystemUser(), modelDto);
    }
 
    @Override
    public TreeRoot<HierarchyData> getHierarchyTree(Integer modelId) {
        var model = get(modelId);
        var root = hierarchyService.root(HierarchyIds.SYSTEM);
        if(model.getHierarchyPaths() == null || model.getHierarchyPaths().isEmpty()){
            return root;
        }
        var paths = root.findAllPaths(model.getHierarchyPaths());
        var pathSet = new HashSet<>(paths);
 
        var newRoot = TreeHelper.pruneTree(root.root(), (node) -> pathSet.contains(node.getPath()));
        return new SimpleTreeRoot<>(newRoot);
    }
 
    @Override
    public TreeNode<NullType> getNullHierarchyTree(Integer modelId) {
        var tree = getHierarchyTree(modelId);
        return TreeHelper.convertTree(tree.root(), (node, newNode) -> null);
    }
 
    @Override
    public List<Integer> listModelProblemIds(Model model) {
        var ids = ((SysModel)model).getProblemIds();
        if(ids != null){
            return ids;
        }
 
        // 如果模型中没有设置,就返回所有问题
        return problemService.findAllProblemIds(model.getHierarchy().getId());
    }
 
    @Override
    public List<Problem> listProblems(Model model, String hierarchyPath) {
        BizResultCode.HIERARCHY_NODE_NOT_FOUND.check(hierarchyPath == null);
        var allPaths = hierarchyService.findAllPaths(model.getHierarchy().getId(), List.of(hierarchyPath));
        BizResultCode.HIERARCHY_NODE_NOT_FOUND.check(allPaths.isEmpty());
 
        var ids = ((SysModel)model).getProblemIds();
        ids = CollectionUtils.isEmpty(ids) ? null : ids;
        return problemService.findProblems(model.getHierarchy().getId(), allPaths, ids);
    }
}