业务需求
是通知和公告的功能用到这块,之前通知和公告是任何人都可以查到全部的,现在通知这块需要具体到部门,比如研发部看不到对于人事部的通告。但是研发部和人事部同属于杭州子公司,针对于杭州子公司发布的通知两个部门都可以看到
逻辑分析
在前端添加公告时新增一个部门树绑定部门ID号
实现核心使用树的思想+递归来绑定成为一个部门树
过滤出符合能看的通知逻辑(参考下图好理解)
- 总公司
- 杭州子公司
- 研发部门
现在我对杭州子公司发送通知:那么可以看到的部门是(66、55、44、60、50)
如果我对杭州子公司的研发部门发送通知:那么可以看到的部门是(66、55、44、50)
由此可以推出来这个逻辑:通告到的部门+通告到的部门下的所有子节点(直到叶子节点)+通告到的部门的父节点(父节点的父节点,直到根节点)
实现方式和上面部门树差不多,而且不用去构建树,符合就添加到数组就可以啦
问题
在mapper层往xml文件调用sql时会存在两个参数(noticeType:通知/公告(String)、deptIds:过滤出来符合的部门ID(Long[]))
通过在mapper层使用@Param注解
/**通过类型查询列表*/
List<SysNotice> selectNoticeListByType(@Param("noticeType") String noticeType,@Param("ids") Long[] ids);
<select id="selectNoticeListByType" resultMap="SysNoticeResult">
<include refid="selectNoticeVo"/>
<where>
<if test="noticeType != null and noticeType != ''">
AND notice_type = #{noticeType}
</if>
<if test="ids != null and ids != ''">
AND notice_dept_id in
<foreach collection="ids" item="noticeDeptId" open="(" separator="," close=")">
#{noticeDeptId}
</foreach>
</if>
</where>
order by order_flag, create_time desc
</select>
错误原因可以看出来是@Param注解中的参数没有获取到
因为之前这个接口只有一个参数noticeType是没有任何问题的,所以可以定位到就是这个数组加进来的问题,那这样就把第一个参数去掉,看看第二个参数自己有没有问题
细心的同学可以看到mysql中参数并不是按照我们注解@param来对应上去的,然后有个大佬讲的
- 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
- 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
collection属性的值就是我们数据的来源
将collection属性的值换做array结果就成功啦,sql也是正确的过滤条件
既然@Param不生效,那我们就不传两个参数,我们传一个对象(map对象,map的key就是@param的属性值),将需要的数据封装传过去(动态sql中if标签并不支持判断一个数组的长度,如果数组没有数据(公告类型)那么会查不出来数据,所以通过带过去一个数组的长度来判断)
Map<String, Object> map = new HashMap<>();
map.put("noticeType", type);
map.put("ids", deptList);
map.put("idsLen", deptList.length);
return noticeMapper.selectNoticeListByType(map);
换个账号登录OVER