这几天遇到一个需求:
就是你要对一个集合做到 部分删除 和 部分添加 这肯定还有另一个集合 就是原来被操作的集合
通过差集来进行操作
具体案例:工作人员 修改另一工作人员的角色 前端说只能给到最后勾选的角色
我就想着 你还要把 原来他已有的角色给我做筛选
用到工具类:
实现代码:
VO层
/**
* @Description TODO
* @Author 小乌龟
* @Date 2022/3/27 12:06
*/
@Data
@ApiModel(value="工作人员保存Role")
public class UpdateAdRoleVO {
@ApiModelProperty(value = "被操作的工作人员Id")
@NotNull
@JsonFormat(shape = JsonFormat.Shape.STRING)
private Long pkId;
@ApiModelProperty(value = "修改前角色id")
private List<@NotNull Long> oldRoleIds;
@ApiModelProperty(value = "修改后的角色id")
private List<@NotNull Long> NewRoleIds;
}
service
@Override
public Integer updatedRole(UpdateAdRoleVO updateAdRoleVO) {
//传来两个数组 一个是该工作人员 原来的角色id数组 另一个是该工作人员 被修改过新的角色id数组
//目的 筛选出 删除 和 新填 的角色 subtract 计算集合的单差集,即只返回【集合1】中有,但是【集合2】中没有的元素
QueryWrapper<AdminMidRole> wrapper = new QueryWrapper<>();
Collection<Long> collection=null;
//计数
AtomicInteger flag= new AtomicInteger();
//如果oldRole为空 则直接添加角色
if (ObjectUtil.isEmpty(updateAdRoleVO.getOldRoleIds())){
//1.添加角色
updateAdRoleVO.getNewRoleIds()
.stream()
.filter(Objects::nonNull)
.forEach(
roleId->{
adminMidRoleMapper.insert(new AdminMidRole(null,updateAdRoleVO.getPkId(),roleId));
flag.getAndIncrement();
}
);
return flag.get();
}
//1.删除角色 只返回 getOldRoleIds 中有,但是getNewRoleIds中没有的元素
collection = CollUtil.subtract(updateAdRoleVO.getOldRoleIds(), updateAdRoleVO.getNewRoleIds());
collection.stream()
//过滤掉为空 无添加无删除操作
.filter(Objects::nonNull)
.forEach(
roleId->{
wrapper.eq("admin_id",updateAdRoleVO.getPkId())
.eq("role_id",roleId);
adminMidRoleMapper.delete(wrapper);
flag.getAndIncrement();
}
);
//2.添加角色 只返回 getNewRoleIds 中有,但是getOldRoleIds中没有的元素
collection = CollUtil.subtract(updateAdRoleVO.getNewRoleIds(), updateAdRoleVO.getOldRoleIds());
collection.stream()
//过滤掉为空 无添加无删除操作
.filter(Objects::nonNull)
.forEach(
roleId->{
adminMidRoleMapper.insert(new AdminMidRole(null,updateAdRoleVO.getPkId(),roleId));
flag.getAndIncrement();
}
);
return flag.get();
}