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 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 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 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 getNullHierarchyTree(Integer modelId) { var tree = getHierarchyTree(modelId); return TreeHelper.convertTree(tree.root(), (node, newNode) -> null); } @Override public List listModelProblemIds(Model model) { var ids = ((SysModel)model).getProblemIds(); if(ids != null){ return ids; } // 如果模型中没有设置,就返回所有问题 return problemService.findAllProblemIds(model.getHierarchy().getId()); } @Override public List 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); } }