场景初衷
之前员工写的项目啊,很多业务都用到这个权限的控制:
- ==> 需要根据登录的员工账号获取到相对应的项目点权限 (项目点: 医院,护理站等组织),从而对所拥有的这些项目点进行操作,当我看到相关代码的时候,发现很多都是复制粘贴过来的,逻辑几乎是一模一样,最多也就几行不一样的地方,如下图:
优化
下面这张图是当时的git提交记录,现在的版本又有些改动了:
申请单业务模块的引用:
服务单业务模块的引用:
核心代码
- 获取员工项目点权限的核心代码 (里面具体的代码逻辑写得也不是很ok,也挺low的,【因为也是很之前的员工写的嘛,我也不好去改动,要是出了线上问题,那就gg啦!!】
- 之后还会找机会继续优化的, 各位大佬暂时先不用太在意!!!
/**
* 根据登录员工 -> 获取员工所拥有的项目点权限ids, '普通用户角色'时: 指派给自己的单ids
*
* @param rp
* @param query
* @return
* - ltFullControl -> 员工是否拥有所有项目点权限 (0:没有 1.拥有)
* - projectPointIds -> 员工未拥有所有项目点权限时, 拥有的部分项目点权限ids
* - relationOrderIds -> '普通用户'角色时: 指派给自己的单ids; 超管/易见医护普通用户/其他机构管理员 这3种角色 ==> 返回null
*/
public Map<String, Object> getEmployeeProjectPointAndRelationOrder(ReqParam rp, Function<ReqParam, List<Long>> query) {
// 远程调用'获取项目点权限'接口: - ltFullControl: 是否拥有所有单权限; - projectPointRightsLtOrder: 未拥有所有单权限时,所拥有的部分权限;
R r = employeeRemoteService.projectPointRightTwo(rp.employeeId, rp.platformCode, rp.companyCode, ProjectPointBusinessTypeEnum.LT_PROJECT_POINT.getCode());
Assert.state(MedicalErrorCode.SUCCESS.getCode() == r.getCode(), "远程调用时失败");
Map<String, Object> map = Convert.convert(java.util.Map.class, r.getData());
// 获取员工角色类型(0:超级管理员,1:易简医护普通用户,2:机构管理员,3:机构普通用户)
Integer employeeRoleType = Convert.convert(Integer.class, map.get("employeeRoleType"));
Assert.state(employeeRoleType.compareTo(0) >= 0, "该登录员工未分配角色!");
// 指派给自己的单ids
List<Long> relationOrderIds = null;
// query不为空时: 查询只指派给自己的单ids
if (ObjectUtil.isNotEmpty(query)) {
if (employeeRoleType.equals(Convert.toInt(RoleTypeEnum.JGPTYH.getCode()))) {
// (角色 == 3.机构普通用户) --> 只能看到指派给自己的单
relationOrderIds = query.apply(rp);
if (CollUtil.isEmpty(relationOrderIds)) {
relationOrderIds.add(-1L);
}
}
}
// 是否拥有全部项目点权限
Integer ltFullControl = Convert.convert(Integer.class, map.get("ltFullControl"));
// 所拥有的部分权限集合
List<Long> projectPointIds = new ArrayList<>();
if (ObjectUtil.isNotEmpty(map.get("projectPointRightsLtOrder"))) {
// 未拥有全部项目点权限时,所拥有的部分权限
JSONArray jsonArray = JSONUtil.parseArray(map.get("projectPointRightsLtOrder"));
List<TwoOrderLtResVo> twoOrderLtResVos = JSONUtil.toList(jsonArray, TwoOrderLtResVo.class);
projectPointIds = twoOrderLtResVos.stream().map(twoOrderLtResVo -> twoOrderLtResVo.getId()).collect(Collectors.toList());
}
if (CollUtil.isEmpty(projectPointIds)) {
projectPointIds = new ArrayList<>();
projectPointIds.add(-1L);
}
Map<String, Object> result = new HashMap<>(3);
result.put("ltFullControl", ltFullControl);
result.put("projectPointIds", projectPointIds);
result.put("relationOrderIds", relationOrderIds);
return result;
}
public Page<LtApplyOrderDTO> getApplyOrderPage(Page page, LtApplyOrderVO vo, ReqParam rp) {
// 申请单普通用户只能看到指派给自己的单
List<Long> argRelationOrderIds = ltApplyOrderRelationEmployeeService.listObjs(Wrappers.<LtApplyOrderRelationEmployee>lambdaQuery()
.eq(LtApplyOrderRelationEmployee::getEmployeeId, rp.employeeId)
.select(LtApplyOrderRelationEmployee::getApplyOrderId), result -> Long.valueOf(result.toString()));
// 获取员工所拥有的项目点权限ids, '普通用户角色'时: 指派给自己的单ids
Map<String, Object> employeeMap = employeeTool.getEmployeeProjectPointAndRelationOrder(rp, arg -> argRelationOrderIds);
// 员工是否拥有所有项目点权限 (0:没有 1.拥有)
Integer ltFullControl = Convert.convert(Integer.class, employeeMap.get("ltFullControl"));
// 员工未拥有所有项目点权限时, 拥有的部分项目点权限ids
List<Long> projectPointIds = Convert.toList(Long.class, employeeMap.get("projectPointIds"));
// '普通用户'角色时: 指派给自己的单ids; 超管/易见医护普通用户/其他机构管理员 这3种角色 ==> 返回null
List<Long> relationOrderIds = Convert.toList(Long.class, employeeMap.get("relationOrderIds"));
// 查询
Page<LtApplyOrderDTO> applyOrderPage = baseMapper.getApplyOrderPage(page, vo, ltFullControl, projectPointIds, relationOrderIds);
}