添加樹形結構createTreeModel
思路:
關鍵代碼:
@Override
public boolean createTreeModel(List<QuestionClassifyModel> questionClassifyModelList) {
// 分解試題分類集合
List<QuestionClassifyModel> models = resolveQuestionClassify(questionClassifyModelList);
// 實例化一個ArrayList集合teQuestionClassifyList
List<TeQuestionClassify> teQuestionClassifyList = new ArrayList<>();
// copyroperties model到questionClassifyEntity值
for (QuestionClassifyModel model : models) {
TeQuestionClassify teQuestionClassify = new TeQuestionClassify();
// 將model 賦值給實體teQuestionClassify
BeanUtils.copyProperties(model, teQuestionClassify);
// 父id爲空,賦值0
if (StringUtils.isEmpty(teQuestionClassify.getParentId())) {
teQuestionClassify.setParentId("0");
}
// 實體id爲空,重新賦值
if (StringUtils.isEmpty(teQuestionClassify.getId())) {
teQuestionClassify.setId(IdWorker.getIdStr());
}
// 把實體添加到集合裏
teQuestionClassifyList.add(teQuestionClassify);
}
// 保存到數據庫
return questionClassifyService.saveBatch(teQuestionClassifyList);
}
private List<QuestionClassifyModel> resolveQuestionClassify(List<QuestionClassifyModel> questionClassifyModelList) {
// 實例化集合classifyModelList
List<QuestionClassifyModel> classifyModelList = new ArrayList<>();
// 通過增強for循環將試題分類集合賦值給model
for (QuestionClassifyModel model : questionClassifyModelList){
// 設置id
model.setId(IdWorker.getIdStr());
// 去掉null值
model.getQuestionClassifyModel().remove(null);
if (model.getQuestionClassifyModel() != null){
for (QuestionClassifyModel sonModel : model.getQuestionClassifyModel()) {
// 子類設置父id
sonModel.setParentId(model.getId());
}
// 遞歸循環添加子類試題分類集合到實例化的集合classifyModelList,子類試題分類集合空遞歸結束
classifyModelList.addAll(resolveQuestionClassify(model.getQuestionClassifyModel()));
}
classifyModelList.add(model);
}
return classifyModelList;
}
關鍵代碼:
@Override
public TeQuestionClassify createTreeNode(QuestionClassifyModel questionClassifyModel) {
TeQuestionClassify teQuestionClassify = new TeQuestionClassify();
// 將questionClassifyModel賦值給teQuestionClassify
BeanUtils.copyProperties(questionClassifyModel, teQuestionClassify);
// 實體父id爲空賦值0
if (StringUtils.isEmpty(teQuestionClassify.getParentId())) {
teQuestionClassify.setParentId("0");
}
// teQuestionClassify實體id爲空,重新賦值
if (StringUtils.isEmpty(teQuestionClassify.getId())) {
teQuestionClassify.setId(IdWorker.getIdStr());
}
// 通過父id查詢實體
TeQuestionClassify teQuestionClassify1 = this.getById(questionClassifyModel.getParentId());
// 實體爲空或父id爲0則賦值默認值Level爲0
if (teQuestionClassify1 == null || "0".equals(teQuestionClassify1.getParentId())) {
teQuestionClassify.setLevel(0);
} else {
// 設置等級+1
teQuestionClassify.setLevel(teQuestionClassify.getLevel() + 1);
}
// 插入實體到數據庫
questionClassifyDao.insert(teQuestionClassify);
return teQuestionClassify;
}
刪除:
baseMapper的removeById(id)刪除;
修改:
將參數QuestionClassifyModel賦值給實體
調用baseMapper的updateById(實體)方法修改;
查詢:
關鍵代碼:
@Override
public List<QuestionTypeClassifyModel> getQuestionClassify(String questionTypeId, String courseId, String operator) {
/**
* 1.查詢該課程下所有該題型的所有分類
* 2.將無子節點試題分類先放入集合中
* 3.將所有parent_id去重得到一個父ids數組
* 4.根據父id和當前結構遞歸調用方法查詢試題分類的樹形結構
*/
List<QuestionTypeClassifyModel> treeList = new ArrayList<>();
List<QuestionTypeClassifyModel> questionTypeClassifyModelList = questionClassifyDao.getQuestionClassify(questionTypeId, courseId, operator);
// TODO: 換種方式-xsh
List<QuestionTypeClassifyModel> listParent = questionTypeClassifyModelList.stream().filter(a -> "0".equals(a.getParentId())).collect(Collectors.toList());
treeList.addAll(listParent);
List<String> parentIdList = questionTypeClassifyModelList.stream().map(QuestionTypeClassifyModel::getParentId).collect(Collectors.toList());
List<QuestionTypeClassifyModel> treeListChildren = getTreeQuestionClassify(questionTypeClassifyModelList, parentIdList, courseId);
// 將子結構放入父結構數組中
treeList.addAll(treeListChildren);
return treeList;
}
private List<QuestionTypeClassifyModel> getTreeQuestionClassify(List<QuestionTypeClassifyModel> questionTypeClassifyModelList, List<String> parentIdList, String courseId) {
List<QuestionTypeClassifyModel> treeList = new ArrayList<>();
HashSet<String> hs = new HashSet<>(parentIdList);
parentIdList.clear();
parentIdList.addAll(hs);
parentIdList.remove(null);
parentIdList.remove("0");
if (!CollectionUtils.isEmpty(parentIdList)) {
List<QuestionTypeClassifyModel> questionClassifyTree = questionClassifyDao.getQuestionClassifyTree(parentIdList, courseId);
parentIdList.forEach(y->{
if (!"0".equals(y)) {
List<QuestionTypeClassifyModel> listChildren = questionTypeClassifyModelList.stream().filter(a -> y.equals(a.getParentId())).collect(Collectors.toList());
// Option容器接收用於避免空指針異常
Optional<QuestionTypeClassifyModel> parent = questionClassifyTree.stream().filter(a -> y.equals(a.getKey())).findFirst();
parent.orElse(new QuestionTypeClassifyModel()).setChildren(listChildren);
treeList.add(parent.orElse(null));
}
});
parentIdList = questionClassifyTree.stream().map(QuestionTypeClassifyModel::getParentId).collect(Collectors.toList());
parentIdList.remove("0");
// 遞歸此方法,出口爲所有parentId爲0,最上層節點出去
return getTreeQuestionClassify(treeList, parentIdList, courseId);
} else {
// 當父id集合爲空時,返回
return questionTypeClassifyModelList;
}
}