|
|
@@ -0,0 +1,239 @@
|
|
|
+package com.inspur.customer.service.org;
|
|
|
+
|
|
|
+import com.alibaba.cola.dto.PageResponse;
|
|
|
+import com.alibaba.cola.dto.Response;
|
|
|
+import com.alibaba.cola.dto.SingleResponse;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.google.common.collect.Lists;
|
|
|
+import com.inspur.customer.client.keycloak.KeycloakService;
|
|
|
+import com.inspur.customer.client.org.SmsbDepartmentService;
|
|
|
+import com.inspur.customer.client.org.SmsbDepartmentUserService;
|
|
|
+import com.inspur.customer.constant.Constant;
|
|
|
+import com.inspur.customer.infrastructure.convertor.SmsbDepartmentConvertor;
|
|
|
+import com.inspur.customer.infrastructure.mapper.org.SmsbDepartmentMapper;
|
|
|
+import com.inspur.customer.infrastructure.object.org.SmsbDepartmentDO;
|
|
|
+import com.inspur.customer.object.org.*;
|
|
|
+import com.inspur.device.client.core.relation.DeviceAllocateService;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
+import org.apache.dubbo.config.annotation.DubboService;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
+
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.util.Collections;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Objects;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @Author wangbo13
|
|
|
+ * @Date 2022/11/25 14:58
|
|
|
+ * @Version 1.0
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@DubboService(interfaceClass = SmsbDepartmentService.class)
|
|
|
+public class SmsbDepartmentServiceImpl extends ServiceImpl<SmsbDepartmentMapper , SmsbDepartmentDO> implements SmsbDepartmentService {
|
|
|
+
|
|
|
+ @DubboReference
|
|
|
+ private SmsbDepartmentUserService departmentUserService;
|
|
|
+ @DubboReference
|
|
|
+ private KeycloakService service;
|
|
|
+ @DubboReference
|
|
|
+ private SmsbDepartmentUserService userService;
|
|
|
+ @DubboReference
|
|
|
+ private DeviceAllocateService deviceAllocateService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Response addDepartment(String userId , SmsbDepartmentAdd smsbDepartmentAdd) {
|
|
|
+ List<SmsbDepartmentDO> departments = this.list(new LambdaQueryWrapper<>(SmsbDepartmentDO.class)
|
|
|
+ .eq(SmsbDepartmentDO::getTenant, smsbDepartmentAdd.getTenant())
|
|
|
+ .eq(SmsbDepartmentDO::getMark, smsbDepartmentAdd.getMark()));
|
|
|
+ if(!CollectionUtils.isEmpty(departments)){return Response.buildFailure("500",
|
|
|
+ "部门标识["+smsbDepartmentAdd.getMark()+"]在租户["+smsbDepartmentAdd.getTenant()+"]中已存在!");}
|
|
|
+ SmsbDepartmentDO department = SmsbDepartmentConvertor.toDataObjectForCreate(userId, smsbDepartmentAdd);
|
|
|
+ department.setPath(smsbDepartmentAdd.getTenant()+pathFactory(smsbDepartmentAdd.getParentId(),smsbDepartmentAdd.getMark()));
|
|
|
+ department.setOrderNo(orderNmFactory(smsbDepartmentAdd.getParentId()));
|
|
|
+ super.save(department);
|
|
|
+ return SingleResponse.of(department);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void deleteDepartment(String userId, Long id) {
|
|
|
+ SmsbDepartmentDO department = super.getById(id);
|
|
|
+ // 1、删除用户
|
|
|
+ userService.removeUserDepartmentRelation(department.getPath());
|
|
|
+ // 2、删除设备关系
|
|
|
+ deviceAllocateService.deleteRelatedOrg(department.getPath());
|
|
|
+ // 3、删除部门
|
|
|
+ removeDepartment(userId , Collections.singletonList(id));
|
|
|
+ }
|
|
|
+
|
|
|
+ private void removeDepartment(String userId, List<Long> ids){
|
|
|
+ super.update(new LambdaUpdateWrapper<>(SmsbDepartmentDO.class)
|
|
|
+ .set(SmsbDepartmentDO::getIsDel , 1)
|
|
|
+ .set(SmsbDepartmentDO::getUpdateBy , userId)
|
|
|
+ .set(SmsbDepartmentDO::getUpdateTime , LocalDateTime.now())
|
|
|
+ .in(SmsbDepartmentDO::getId , ids));
|
|
|
+ List<SmsbDepartmentDO> nextDepartment = super.list(new LambdaQueryWrapper<>(SmsbDepartmentDO.class)
|
|
|
+ .in(SmsbDepartmentDO::getParentId, ids));
|
|
|
+ if(!CollectionUtils.isEmpty(nextDepartment)){
|
|
|
+ removeDepartment(userId , nextDepartment.stream().map(i -> i.getId()).collect(Collectors.toList()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Response updateDepartment(String userId, SmsbDepartmentUpdate departmentUpdate) {
|
|
|
+ boolean flag = super.update(new LambdaUpdateWrapper<>(SmsbDepartmentDO.class)
|
|
|
+ .set(StringUtils.isNotBlank(departmentUpdate.getName()), SmsbDepartmentDO::getName, departmentUpdate.getName())
|
|
|
+ .set(SmsbDepartmentDO::getUpdateBy, userId)
|
|
|
+ .set(SmsbDepartmentDO::getUpdateTime, LocalDateTime.now())
|
|
|
+ .eq(SmsbDepartmentDO::getId, departmentUpdate.getId()));
|
|
|
+ return flag ? Response.buildSuccess() : Response.buildFailure("500","部门更新失败!");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取当前部门路径
|
|
|
+ *
|
|
|
+ * @param parentId 父节点id(可为空)
|
|
|
+ * @param mark 当前节点名称
|
|
|
+ * @return 当前路径
|
|
|
+ */
|
|
|
+ private String pathFactory(Long parentId , String mark){
|
|
|
+ if(Objects.isNull(parentId)){
|
|
|
+ return Constant.OBLIQUE_LINE.concat(mark);
|
|
|
+ }else{
|
|
|
+ SmsbDepartmentDO department = super.getById(parentId);
|
|
|
+ return pathFactory(department.getParentId() , department.getMark().concat(Constant.OBLIQUE_LINE).concat(mark));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取序号
|
|
|
+ *
|
|
|
+ * @param parentId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Integer orderNmFactory(Long parentId){
|
|
|
+ if(Objects.isNull(parentId)) return 1;
|
|
|
+ SmsbDepartmentDO department = super.getOne(new LambdaQueryWrapper<>(SmsbDepartmentDO.class)
|
|
|
+ .eq(SmsbDepartmentDO::getParentId, parentId)
|
|
|
+ .orderByDesc(SmsbDepartmentDO::getOrderNo)
|
|
|
+ .last("limit 1"));
|
|
|
+ return Objects.isNull(department)?1:department.getOrderNo()+1;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Response queryDepartmentList(String tenant) {
|
|
|
+ List<SmsbDepartmentDO> departmentList = super.list(new LambdaQueryWrapper<>(SmsbDepartmentDO.class)
|
|
|
+ .eq(SmsbDepartmentDO::getIsDel , 0)
|
|
|
+ .eq(SmsbDepartmentDO::getTenant, tenant)
|
|
|
+ .isNull(SmsbDepartmentDO::getParentId));
|
|
|
+ List<SmsbDepartmentCO> departmentTree = Lists.newArrayList();
|
|
|
+ departmentList.forEach(department->{
|
|
|
+ SmsbDepartmentCO smsbDepartmentCO = new SmsbDepartmentCO();
|
|
|
+ BeanUtils.copyProperties(department , smsbDepartmentCO);
|
|
|
+ smsbDepartmentCO.setChildren(this.getChilde(department.getId()));
|
|
|
+ departmentTree.add(smsbDepartmentCO);
|
|
|
+ });
|
|
|
+ log.info("tree num is :{}",departmentTree.size());
|
|
|
+ return SingleResponse.of(departmentTree);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public PageResponse<SmsbSimpleUserCO> queryDepartmentUserList(SmsbDepartmentCmd departmentCmd) {
|
|
|
+ if(Objects.nonNull(departmentCmd.getDepartmentId())){
|
|
|
+ // 部门id不为空,path过滤
|
|
|
+ departmentCmd.setTenant(super.getById(departmentCmd.getDepartmentId()).getPath());
|
|
|
+ return departmentUserService.queryUserPageByDeprIds(departmentCmd , 1);
|
|
|
+ }else{
|
|
|
+ // 部门id为空,tenant过滤
|
|
|
+ return departmentUserService.queryUserPageByDeprIds(departmentCmd , 2);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<SmsbDepartmentCO> getChilde(Long id){
|
|
|
+ List<SmsbDepartmentDO> childList = this.list(new LambdaQueryWrapper<>(SmsbDepartmentDO.class)
|
|
|
+ .eq(SmsbDepartmentDO::getIsDel ,0)
|
|
|
+ .eq(SmsbDepartmentDO::getParentId, id));
|
|
|
+ List<SmsbDepartmentCO> finalChilds = Lists.newArrayList();
|
|
|
+ childList.forEach(child ->{
|
|
|
+ SmsbDepartmentCO smsbDepartmentCO = new SmsbDepartmentCO();
|
|
|
+ BeanUtils.copyProperties(child , smsbDepartmentCO);
|
|
|
+ smsbDepartmentCO.setChildren(this.getChilde(child.getId()));
|
|
|
+ finalChilds.add(smsbDepartmentCO);
|
|
|
+ });
|
|
|
+ return finalChilds;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 鉴权
|
|
|
+ *
|
|
|
+ * @param tenant
|
|
|
+ * @param userId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Response checkOperationAuthority(String userId , String tenant){
|
|
|
+ String real = service.queryUserTenant(userId);
|
|
|
+ if(service.isExitTargetRole(userId ,Constant.SUPER_ADMIN) ||
|
|
|
+ (StringUtils.isNotEmpty(real) && real.equals(tenant) && service.isExitTargetRole(userId , Constant.ROLE_ADMIN))){
|
|
|
+ return Response.buildSuccess();
|
|
|
+ }
|
|
|
+ return Response.buildFailure("401","无权操作!");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public SmsbDepartmentCO getOneById(Long id) {
|
|
|
+ SmsbDepartmentDO department = super.getById(id);
|
|
|
+ SmsbDepartmentCO departmentDO = new SmsbDepartmentCO();
|
|
|
+ BeanUtils.copyProperties(department , departmentDO);
|
|
|
+ return departmentDO;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Response addKeyClaokUser(String userId ,SmsbUserAdd smsbUserAdd) {
|
|
|
+ // 1、keycloak新增账号
|
|
|
+ SingleResponse addUserResponse = service.addKeyClaokUser(smsbUserAdd);
|
|
|
+ if(!addUserResponse.isSuccess()){return addUserResponse;}
|
|
|
+ String addUserId = (String)addUserResponse.getData();
|
|
|
+ log.info("new user id:{}",addUserId);
|
|
|
+ // 2、是否传递所属部门,不传递不做处理
|
|
|
+ if(Objects.nonNull(smsbUserAdd.getDepartmentId())){
|
|
|
+ // 3、将部门信息写入keucloak的attibute中
|
|
|
+ smsbUserAdd.setPath(super.getById(smsbUserAdd.getDepartmentId()).getPath());
|
|
|
+ service.addAttributesByUserId(addUserId , "org" , Collections.singletonList(smsbUserAdd.getPath()));
|
|
|
+ }
|
|
|
+ // 4、保存用户与部门关系
|
|
|
+ userService.addUserDepartment(addUserId , smsbUserAdd);
|
|
|
+ return SingleResponse.of(addUserId);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Response regrouping(SmsbRegrouping smsbRegrouping) {
|
|
|
+ // 1、清空原绑定关系,建立新绑定关系
|
|
|
+ Boolean result;
|
|
|
+ String path;
|
|
|
+ if(Objects.nonNull(smsbRegrouping.getDepartmentId())){
|
|
|
+ path = super.getById(smsbRegrouping.getDepartmentId()).getPath();
|
|
|
+ result = departmentUserService.updateRelation(smsbRegrouping.getUserId(),
|
|
|
+ smsbRegrouping.getDepartmentId(),path);
|
|
|
+ }else {
|
|
|
+ path = smsbRegrouping.getTenant();
|
|
|
+ result = departmentUserService.updateRelation(smsbRegrouping.getUserId(), null ,null);
|
|
|
+ }
|
|
|
+ // 2、更新attribute
|
|
|
+ if(result){
|
|
|
+ service.addAttributesByUserId(smsbRegrouping.getUserId() , "org" ,
|
|
|
+ Collections.singletonList(path));
|
|
|
+ return Response.buildSuccess();
|
|
|
+ }else{
|
|
|
+ return Response.buildFailure("500","用户重分组失败!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|