@SuppressWarnings({ "unchecked" })
@Override
@Transactional(rollbackFor = Exception.class)
public Response<Boolean> moveDown(String id) {
// TODO Auto-generated method stub
// 获取要下移的那条数据的信息
ItemEntity entity = itemDao.findById(id);
//获取需要移动的子节点 这些都是需要更新ranking
List<ItemEntity> findChildren = itemDao.findChildren(id);
// 查询上一条记录
ItemEntity entityNext = itemDao.moveDown(entity.getDocumentId(), entity.getParentId(), entity.getRanking().toString());
// 最下面的记录不能下移
if (entityNext == null) {
return new Response<Boolean>().failure("已到最后一条,不能下移");
}
List<ItemEntity> targetChildren = itemDao.findChildren(entityNext.getId());
changeRanking(findChildren, targetChildren,false);
return new Response<Boolean>().success(true);
}
private void changeRanking(List<ItemEntity> currentChildren, List<ItemEntity> targetChildren, boolean flag) {
if(currentChildren ==null || currentChildren.size() == 0|| targetChildren ==null || targetChildren.size() ==0 ){
return;
}
BigDecimal maxranking = flag ? currentChildren.get(currentChildren.size()-1).getRanking() : targetChildren.get(targetChildren.size()-1).getRanking();
BigDecimal minranking = flag ? targetChildren.get(0).getRanking() : currentChildren.get(0).getRanking();
BigDecimal commonSub = (maxranking.subtract(minranking)).divide(new BigDecimal(currentChildren.size() +targetChildren.size()),2,BigDecimal.ROUND_DOWN);
if(flag){
currentChildren.addAll(targetChildren);
for (int i = 0; i<currentChildren.size(); i++) {
currentChildren.get(i).setRanking(minranking.add(commonSub.multiply(new BigDecimal(i))));
}
itemDao.batchUpdate(currentChildren);
return;
}
targetChildren.addAll(currentChildren);
for (int i = 0; i<targetChildren.size(); i++) {
targetChildren.get(i).setRanking(minranking.add(commonSub.multiply(new BigDecimal(i))));
}
itemDao.batchUpdate(targetChildren);
}
@SuppressWarnings("unchecked")
@Override
@Transactional(rollbackFor = Exception.class)
public Response<Boolean> moveUp(String id) {
// TODO Auto-generated method stub
// 获取要上移的那条数据的信息
ItemEntity entity = itemDao.findById(id);
// 查询上一条记录
ItemEntity lastArticleEntity = itemDao.moveUp(entity.getDocumentId(), entity.getParentId(),
entity.getRanking().toString());
// 最上面的记录不能上移
if (lastArticleEntity == null) {
return new Response<Boolean>().failure("已到第一条,不能上移");
}
//获取需要移动的子节点 这些都是需要更新ranking
List<ItemEntity> findChildren = itemDao.findChildren(id);
List<ItemEntity> targetChildren = itemDao.findChildren(lastArticleEntity.getId());
changeRanking(findChildren, targetChildren,true);
return new Response<Boolean>().success(true);
}
树的上下移
最新推荐文章于 2023-11-27 14:01:16 发布