Bläddra i källkod

fix:账号组织管理优化

wangbo 2 år sedan
förälder
incheckning
0ff1388613
19 ändrade filer med 457 tillägg och 64 borttagningar
  1. 2 8
      smsb-customer-manager-adapter/src/main/java/com/inspur/customer/web/controller/keyclaok/KeycloakController.java
  2. 41 10
      smsb-customer-manager-adapter/src/main/java/com/inspur/customer/web/controller/org/SmsbDepartmentController.java
  3. 6 0
      smsb-customer-manager-app/pom.xml
  4. 3 1
      smsb-customer-manager-app/src/main/java/com/inspur/customer/service/keycloak/KeycloakServiceImpl.java
  5. 40 18
      smsb-customer-manager-app/src/main/java/com/inspur/customer/service/org/SmsbDepartmentServiceImpl.java
  6. 73 15
      smsb-customer-manager-app/src/main/java/com/inspur/customer/service/org/SmsbDepartmentUserServiceImpl.java
  7. 1 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/client/keycloak/KeycloakService.java
  8. 3 4
      smsb-customer-manager-client/src/main/java/com/inspur/customer/client/org/SmsbDepartmentService.java
  9. 42 6
      smsb-customer-manager-client/src/main/java/com/inspur/customer/client/org/SmsbDepartmentUserService.java
  10. 28 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/constant/Constant.java
  11. 8 1
      smsb-customer-manager-client/src/main/java/com/inspur/customer/object/keycloak/SwitchDTO.java
  12. 13 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/object/org/SmsbDepartmentCmd.java
  13. 0 1
      smsb-customer-manager-client/src/main/java/com/inspur/customer/object/org/SmsbRegrouping.java
  14. 52 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/object/org/SmsbSimpleUserCO.java
  15. 5 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/object/org/SmsbUserAdd.java
  16. 54 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/object/org/SmsbUserMigration.java
  17. 29 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/object/org/SmsbUserUpdate.java
  18. 16 0
      smsb-customer-manager-infrastructure/src/main/java/com/inspur/customer/infrastructure/convertor/SmsbDepartmentConvertor.java
  19. 41 0
      smsb-customer-manager-infrastructure/src/main/java/com/inspur/customer/infrastructure/object/org/SmsbDepartmentUserDO.java

+ 2 - 8
smsb-customer-manager-adapter/src/main/java/com/inspur/customer/web/controller/keyclaok/KeycloakController.java

@@ -70,7 +70,7 @@ public class KeycloakController {
         return Response.buildSuccess();
     }
 
-    @Scheduled(cron = "0/10 * * * * ?")
+    /*@Scheduled(cron = "0/10 * * * * ?")*/
     public void askUserOppenId() {
         for (String userId : keycloakService.getUsersMap().keySet()) {
             String oppenId = iWeChatService.askUser(userId);
@@ -110,13 +110,6 @@ public class KeycloakController {
         return keycloakService.removeGroup(id);
     }
 
-
-    @PutMapping("/admin/users/{userId}")
-    public Response enableSwitch(@PathVariable("userId") String userId, @RequestBody SwitchDTO switchDTO){
-        log.info("userId:{}",userId);
-        return keycloakService.updateUser(userId , switchDTO , Constant.ENABLE);
-    }
-
     @PutMapping("/admin/users/{userId}/resetPassword")
     public Response resetPassword(@PathVariable("userId") String userId , @RequestBody CredentialRepresentation credential){
         if(StringUtils.isEmpty(credential.getType()) || !credential.getType().equals(Constant.type)){
@@ -164,4 +157,5 @@ public class KeycloakController {
     public Response addKeyclaokTenant(@PathVariable("id")String id){
         return keycloakService.removeGroup(id);
     }
+
 }

+ 41 - 10
smsb-customer-manager-adapter/src/main/java/com/inspur/customer/web/controller/org/SmsbDepartmentController.java

@@ -6,13 +6,13 @@ import com.alibaba.cola.dto.SingleResponse;
 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.object.keycloak.SwitchDTO;
 import com.inspur.customer.object.org.*;
 import org.apache.dubbo.config.annotation.DubboReference;
-import org.keycloak.representations.idm.UserRepresentation;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
-import java.util.Collections;
 
 /**
  * @Author wangbo13
@@ -40,7 +40,7 @@ public class SmsbDepartmentController {
     public Response DeleteDepartment(@RequestHeader String userId , @PathVariable("id")Long id){
         Response checkResponse = departmentService.checkOperationAuthority(userId, departmentService.getOneById(id).getTenant());
         if(!checkResponse.isSuccess()){return checkResponse;}
-        departmentService.deleteDepartment(userId , Collections.singletonList(id));
+        departmentService.deleteDepartment(userId , id);
         return SingleResponse.buildSuccess();
     }
 
@@ -58,13 +58,6 @@ public class SmsbDepartmentController {
         return departmentService.queryDepartmentList(operationAuthority.getTenant());
     }
 
-    @PostMapping("/admin/department/user/list")
-    public PageResponse<UserRepresentation> queryDepartmentUserList(@RequestHeader String userId , @Valid @RequestBody SmsbDepartmentCmd departmentCmd){
-        Response checkResponse = departmentService.checkOperationAuthority(userId, departmentCmd.getTenant());
-        if(!checkResponse.isSuccess()){return PageResponse.buildFailure(checkResponse.getErrCode(),checkResponse.getErrMessage());}
-        return departmentService.queryDepartmentUserList(departmentCmd);
-    }
-
     @PostMapping("/admin/users")
     public Response addKeyClaokUser(@RequestHeader String userId ,@Valid @RequestBody SmsbUserAdd smsbUserAdd){
         Response checkResponse = departmentService.checkOperationAuthority(userId, smsbUserAdd.getTenant());
@@ -93,4 +86,42 @@ public class SmsbDepartmentController {
         }
     }
 
+    @PostMapping("/admin/department/user/list")
+    public PageResponse<SmsbSimpleUserCO> queryDepartmentUserList(@RequestHeader String userId , @Valid @RequestBody SmsbDepartmentCmd departmentCmd){
+        Response checkResponse = departmentService.checkOperationAuthority(userId, departmentCmd.getTenant());
+        if(!checkResponse.isSuccess()){return PageResponse.buildFailure(checkResponse.getErrCode(),checkResponse.getErrMessage());}
+        return departmentService.queryDepartmentUserList(departmentCmd);
+    }
+
+    @PostMapping("/admin/users/temporary/migration")
+    public Response migration(@RequestHeader String userId , @RequestBody SmsbUserMigration userMigration){
+        Response checkResponse = departmentService.checkOperationAuthority(userId, userMigration.getTenant());
+        if(!checkResponse.isSuccess()){return checkResponse;}
+        return userService.migration(userMigration);
+    }
+
+    @PutMapping("/admin/users/enabled")
+    public Response enableSwitch(@RequestHeader String userId,
+                                 @RequestBody SwitchDTO switchDTO){
+        Response checkResponse = departmentService.checkOperationAuthority(userId, switchDTO.getTenant());
+        if(!checkResponse.isSuccess()){return checkResponse;}
+        Boolean flag = userService.enableSwitch(switchDTO);
+        if(flag){
+            return service.updateUser(switchDTO.getUserId() , switchDTO , Constant.ENABLE);
+        }
+        return Response.buildFailure("500","账号启用/禁用失败!");
+    }
+
+    @PutMapping("/admin/users/update")
+    public Response updateUserFirstName(@RequestHeader String userId ,
+                                        @RequestBody SmsbUserUpdate userUpdate){
+        Response checkResponse = departmentService.checkOperationAuthority(userId, userUpdate.getTenant());
+        if(!checkResponse.isSuccess()){return checkResponse;}
+        Boolean flag = userService.updateUserFirstName(userUpdate);
+        if(flag){
+            return service.updateUser(userUpdate.getUserId() , userUpdate.getFamilyName() , Constant.UPDATE_USER_FIRSTNAME);
+        }
+        return Response.buildFailure("500","用户名修改失败!");
+    }
+
 }

+ 6 - 0
smsb-customer-manager-app/pom.xml

@@ -73,6 +73,12 @@
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.inspur</groupId>
+            <artifactId>smsb-device-manager-client</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
 </project>

+ 3 - 1
smsb-customer-manager-app/src/main/java/com/inspur/customer/service/keycloak/KeycloakServiceImpl.java

@@ -317,6 +317,8 @@ public class KeycloakServiceImpl implements KeycloakService {
                 user.setEmail(Optional.ofNullable(userRepresentation.getEmail()).orElse(null));
                 user.setFirstName(userRepresentation.getFirstName());
                 user.setAttributes(userRepresentation.getAttributes());
+            case Constant.UPDATE_USER_FIRSTNAME:
+                user.setFirstName((String) representation);
             default:
                 break;
         }
@@ -393,7 +395,7 @@ public class KeycloakServiceImpl implements KeycloakService {
             .stream()
             .sorted(Comparator.comparing(i -> i.getPath().length()))
             .collect(Collectors.toList());
-        return CollectionUtils.isEmpty(groupList) ? null : groupList.stream().findFirst().get().getPath();
+        return CollectionUtils.isEmpty(groupList) ? "" : groupList.stream().findFirst().get().getPath();
     }
 
     @Override

+ 40 - 18
smsb-customer-manager-app/src/main/java/com/inspur/customer/service/org/SmsbDepartmentServiceImpl.java

@@ -15,11 +15,11 @@ 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.keycloak.representations.idm.UserRepresentation;
 import org.springframework.beans.BeanUtils;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
@@ -45,6 +45,8 @@ public class SmsbDepartmentServiceImpl extends ServiceImpl<SmsbDepartmentMapper
     private KeycloakService service;
     @DubboReference
     private SmsbDepartmentUserService userService;
+    @DubboReference
+    private DeviceAllocateService deviceAllocateService;
 
     @Override
     public Response addDepartment(String userId , SmsbDepartmentAdd smsbDepartmentAdd) {
@@ -62,7 +64,17 @@ public class SmsbDepartmentServiceImpl extends ServiceImpl<SmsbDepartmentMapper
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void deleteDepartment(String userId, List<Long> ids) {
+    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)
@@ -71,7 +83,7 @@ public class SmsbDepartmentServiceImpl extends ServiceImpl<SmsbDepartmentMapper
         List<SmsbDepartmentDO> nextDepartment = super.list(new LambdaQueryWrapper<>(SmsbDepartmentDO.class)
             .in(SmsbDepartmentDO::getParentId, ids));
         if(!CollectionUtils.isEmpty(nextDepartment)){
-            deleteDepartment(userId , nextDepartment.stream().map(i -> i.getId()).collect(Collectors.toList()));
+            removeDepartment(userId , nextDepartment.stream().map(i -> i.getId()).collect(Collectors.toList()));
         }
     }
 
@@ -119,6 +131,7 @@ public class SmsbDepartmentServiceImpl extends ServiceImpl<SmsbDepartmentMapper
     @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();
@@ -133,21 +146,20 @@ public class SmsbDepartmentServiceImpl extends ServiceImpl<SmsbDepartmentMapper
     }
 
     @Override
-    public PageResponse<UserRepresentation> queryDepartmentUserList(SmsbDepartmentCmd departmentCmd) {
+    public PageResponse<SmsbSimpleUserCO> queryDepartmentUserList(SmsbDepartmentCmd departmentCmd) {
         if(Objects.nonNull(departmentCmd.getDepartmentId())){
-            // 不为空返回指定部门用户列表
-            PageResponse<String> userIds = departmentUserService.queryUserIdByDeprIds(departmentCmd);
-            PageResponse<UserRepresentation> userRepresentation = service.getUserListByIds(departmentCmd, userIds.getData());
-            return PageResponse.of(
-                userRepresentation.getData(),userIds.getTotalCount() ,userIds.getPageSize() ,userIds.getPageIndex());
+            // 部门id不为空,path过滤
+            departmentCmd.setTenant(super.getById(departmentCmd.getDepartmentId()).getPath());
+            return departmentUserService.queryUserPageByDeprIds(departmentCmd , 1);
         }else{
-            // 部门id为空,返回全部
-            return service.getUserListByIds(departmentCmd, Lists.newArrayList());
+            // 部门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 ->{
@@ -193,22 +205,32 @@ public class SmsbDepartmentServiceImpl extends ServiceImpl<SmsbDepartmentMapper
         log.info("new user id:{}",addUserId);
         // 2、是否传递所属部门,不传递不做处理
         if(Objects.nonNull(smsbUserAdd.getDepartmentId())){
-            // 3、保存用户与部门关系
-            userService.addUserDepartment(addUserId , smsbUserAdd.getDepartmentId());
-            // 4、将部门信息写入keucloak的attibute中
-            service.addAttributesByUserId(addUserId , "org" , Collections.singletonList(super.getById(smsbUserAdd.getDepartmentId()).getPath()));
+            // 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 = departmentUserService.clearAndCreateRelation(smsbRegrouping.getUserId(), smsbRegrouping.getDepartmentId());
+        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(
-                super.getById(smsbRegrouping.getDepartmentId()).getPath()));
+            service.addAttributesByUserId(smsbRegrouping.getUserId() , "org" ,
+                Collections.singletonList(path));
             return Response.buildSuccess();
         }else{
             return Response.buildFailure("500","用户重分组失败!");

+ 73 - 15
smsb-customer-manager-app/src/main/java/com/inspur/customer/service/org/SmsbDepartmentUserServiceImpl.java

@@ -2,20 +2,27 @@ 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.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
 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.SmsbDepartmentUserMapper;
 import com.inspur.customer.infrastructure.object.org.SmsbDepartmentUserDO;
-import com.inspur.customer.object.org.SmsbDepartmentCmd;
+import com.inspur.customer.object.keycloak.SwitchDTO;
+import com.inspur.customer.object.org.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboService;
+import org.springframework.beans.BeanUtils;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * @Author wangbo13
@@ -27,28 +34,43 @@ import java.util.stream.Collectors;
 public class SmsbDepartmentUserServiceImpl extends ServiceImpl<SmsbDepartmentUserMapper, SmsbDepartmentUserDO> implements  SmsbDepartmentUserService{
 
     @Override
-    public Boolean addUserDepartment(String userId, Long departmentId) {
-        SmsbDepartmentUserDO userRelation = new SmsbDepartmentUserDO();
-        userRelation.setUserId(userId);
-        userRelation.setDepartmentId(departmentId);
-        return super.save(userRelation);
+    public Boolean addUserDepartment(String userId, SmsbUserAdd smsbUserAdd) {
+        return super.save(SmsbDepartmentConvertor.toDataObjectForCreate(userId , smsbUserAdd));
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Boolean clearAndCreateRelation(String userId, Long departmentId) {
-        super.remove(new LambdaQueryWrapper<>(SmsbDepartmentUserDO.class).eq(SmsbDepartmentUserDO::getUserId ,userId));
-        return this.addUserDepartment(userId ,departmentId);
+    public Boolean updateRelation(String userId, Long departmentId ,String path) {
+        return super.update(new LambdaUpdateWrapper<>(SmsbDepartmentUserDO.class)
+            .set(SmsbDepartmentUserDO::getDepartmentId , departmentId)
+            .set(SmsbDepartmentUserDO::getPath , path)
+            .eq(SmsbDepartmentUserDO::getUserId , userId));
     }
 
     @Override
-    public PageResponse<String> queryUserIdByDeprIds(SmsbDepartmentCmd departmentCmd) {
+    public PageResponse<SmsbSimpleUserCO> queryUserPageByDeprIds(SmsbDepartmentCmd departmentCmd, Integer oprateFlag) {
         Page<SmsbDepartmentUserDO> page = new Page<>(departmentCmd.getPageIndex(), departmentCmd.getPageSize());
-        LambdaQueryWrapper<SmsbDepartmentUserDO> queryWrapper = new LambdaQueryWrapper<>(SmsbDepartmentUserDO.class)
-            .eq(SmsbDepartmentUserDO::getDepartmentId , departmentCmd.getDepartmentId());
+        LambdaQueryWrapper<SmsbDepartmentUserDO> queryWrapper = Wrappers.lambdaQuery();
+        switch (oprateFlag){
+            case 1:
+                switch (departmentCmd.getRecursive()){
+                    case 0: queryWrapper.eq(SmsbDepartmentUserDO::getPath , departmentCmd.getTenant());break;
+                    case 1: queryWrapper.likeRight(SmsbDepartmentUserDO::getPath , departmentCmd.getTenant());break;
+                    default: break;
+                }
+                break;
+            case 2: queryWrapper.eq(SmsbDepartmentUserDO::getTenant , departmentCmd.getTenant());break;
+            default: break;
+        }
+        queryWrapper.orderByDesc(SmsbDepartmentUserDO::getCreateTime);
         page = this.page(page, queryWrapper);
-        List<String> userIds = page.getRecords().stream().map(j -> j.getUserId()).distinct().collect(Collectors.toList());
-        return PageResponse.of(userIds, (int) page.getTotal(), (int) page.getSize(), (int) page.getCurrent());
+        List<SmsbSimpleUserCO> smsbSimpleUserList = Lists.newArrayListWithCapacity((int) page.getSize());
+        page.getRecords().forEach(user->{
+            SmsbSimpleUserCO smsbSimpleUserCO = new SmsbSimpleUserCO();
+            BeanUtils.copyProperties(user, smsbSimpleUserCO);
+            smsbSimpleUserList.add(smsbSimpleUserCO);
+        });
+        return PageResponse.of(smsbSimpleUserList, (int) page.getTotal(), (int) page.getSize(), (int) page.getCurrent());
     }
 
     @Override
@@ -56,4 +78,40 @@ public class SmsbDepartmentUserServiceImpl extends ServiceImpl<SmsbDepartmentUse
         return super.remove(new LambdaQueryWrapper<>(SmsbDepartmentUserDO.class)
             .eq(SmsbDepartmentUserDO::getUserId , userId));
     }
+
+    @Override
+    public Response migration(SmsbUserMigration userMigration) {
+        List<SmsbDepartmentUserDO> exitUser = super.list(new LambdaQueryWrapper<>(SmsbDepartmentUserDO.class)
+            .eq(SmsbDepartmentUserDO::getUserId, userMigration.getUserId()));
+        if(!CollectionUtils.isEmpty(exitUser)){
+            return Response.buildFailure("500","用户已迁移!");
+        }
+        SmsbDepartmentUserDO smsbDepartmentUserDO = new SmsbDepartmentUserDO();
+        BeanUtils.copyProperties(userMigration , smsbDepartmentUserDO);
+        super.save(smsbDepartmentUserDO);
+        return SingleResponse.of(smsbDepartmentUserDO);
+    }
+
+    @Override
+    public Boolean enableSwitch(SwitchDTO switchDTO) {
+        return super.update(new LambdaUpdateWrapper<>(SmsbDepartmentUserDO.class)
+            .set(SmsbDepartmentUserDO::getEnabled, switchDTO.getEnabled()?
+                Constant.AccountNumberEnum.ENABLE.value() :Constant.AccountNumberEnum.DISABLE.value())
+            .eq(SmsbDepartmentUserDO::getUserId, switchDTO.getUserId()));
+    }
+
+    @Override
+    public Boolean removeUserDepartmentRelation(String path) {
+        return super.update(new LambdaUpdateWrapper<>(SmsbDepartmentUserDO.class)
+            .set(SmsbDepartmentUserDO::getDepartmentId , null)
+            .set(SmsbDepartmentUserDO::getPath , null)
+            .likeRight(SmsbDepartmentUserDO::getPath , path));
+    }
+
+    @Override
+    public Boolean updateUserFirstName(SmsbUserUpdate userUpdate) {
+        return super.update(new LambdaUpdateWrapper<>(SmsbDepartmentUserDO.class)
+            .set(SmsbDepartmentUserDO::getFamilyName , userUpdate.getFamilyName())
+            .eq(SmsbDepartmentUserDO::getUserId , userUpdate.getUserId()));
+    }
 }

+ 1 - 0
smsb-customer-manager-client/src/main/java/com/inspur/customer/client/keycloak/KeycloakService.java

@@ -220,4 +220,5 @@ public interface KeycloakService {
      * @return
      */
     PageResponse<UserRepresentation> getUserListByIds(SmsbDepartmentCmd departmentCmd , List<String> userId);
+
 }

+ 3 - 4
smsb-customer-manager-client/src/main/java/com/inspur/customer/client/org/SmsbDepartmentService.java

@@ -3,7 +3,6 @@ package com.inspur.customer.client.org;
 import com.alibaba.cola.dto.PageResponse;
 import com.alibaba.cola.dto.Response;
 import com.inspur.customer.object.org.*;
-import org.keycloak.representations.idm.UserRepresentation;
 
 import java.util.List;
 
@@ -30,9 +29,9 @@ public interface SmsbDepartmentService {
      * 删除部门
      *
      * @param userId
-     * @param ids
+     * @param id
      */
-    void deleteDepartment(String userId , List<Long> ids);
+    void deleteDepartment(String userId , Long id);
 
     /**
      * 修改部门
@@ -57,7 +56,7 @@ public interface SmsbDepartmentService {
      * @param departmentCmd
      * @return
      */
-    PageResponse<UserRepresentation> queryDepartmentUserList(SmsbDepartmentCmd departmentCmd);
+    PageResponse<SmsbSimpleUserCO> queryDepartmentUserList(SmsbDepartmentCmd departmentCmd);
 
     /**
      * 检查用户是否超级管理员以及该租户权限

+ 42 - 6
smsb-customer-manager-client/src/main/java/com/inspur/customer/client/org/SmsbDepartmentUserService.java

@@ -2,8 +2,8 @@ package com.inspur.customer.client.org;
 
 import com.alibaba.cola.dto.PageResponse;
 import com.alibaba.cola.dto.Response;
-import com.inspur.customer.object.org.SmsbDepartmentCmd;
-import org.keycloak.representations.idm.UserRepresentation;
+import com.inspur.customer.object.keycloak.SwitchDTO;
+import com.inspur.customer.object.org.*;
 
 import java.util.List;
 
@@ -18,10 +18,10 @@ public interface SmsbDepartmentUserService {
      * 保存
      *
      * @param userId
-     * @param departmentId
+     * @param smsbUserAdd
      * @return
      */
-    Boolean addUserDepartment(String userId , Long departmentId);
+    Boolean addUserDepartment(String userId , SmsbUserAdd smsbUserAdd);
 
     /**
      * 清空并建立新绑定关系
@@ -30,15 +30,18 @@ public interface SmsbDepartmentUserService {
      * @param departmentId
      * @return
      */
-    Boolean clearAndCreateRelation(String userId, Long departmentId);
+    Boolean updateRelation(String userId, Long departmentId ,String path);
 
     /**
      * 通过部门id获取用户id
+     * oprateFlag:1 path过滤
+     * oprateFlag:2 tenant过滤
      *
      * @param departmentCmd
+     * @param oprateFlag
      * @return
      */
-    PageResponse<String> queryUserIdByDeprIds(SmsbDepartmentCmd departmentCmd);
+    PageResponse<SmsbSimpleUserCO> queryUserPageByDeprIds(SmsbDepartmentCmd departmentCmd ,Integer oprateFlag);
 
 
     /**
@@ -48,4 +51,37 @@ public interface SmsbDepartmentUserService {
      * @return
      */
     Boolean removeUser(String userId);
+
+    /**
+     * 注意:临时使用
+     * 迁移keycloak用户至smsb_department_user表中
+     *
+     * @param userMigration
+     * @return
+     */
+    Response migration(SmsbUserMigration userMigration);
+
+    /**
+     * 账号启用/禁用开关
+     *
+     * @param switchDTO
+     * @return
+     */
+    Boolean enableSwitch(SwitchDTO switchDTO);
+
+    /**
+     * 左关联匹配删除用户部门绑定关系
+     *
+     * @param path
+     * @return
+     */
+    Boolean removeUserDepartmentRelation(String path);
+
+    /**
+     * 修改用户familyName
+     *
+     * @param userUpdate
+     * @return
+     */
+    Boolean updateUserFirstName(SmsbUserUpdate userUpdate);
 }

+ 28 - 0
smsb-customer-manager-client/src/main/java/com/inspur/customer/constant/Constant.java

@@ -22,6 +22,10 @@ public final class Constant {
      */
     public static final int RESET_ATTRBUTE = 3;
 
+    /**
+     * 更新用户名称
+     */
+    public static final int UPDATE_USER_FIRSTNAME = 4;
 
     /**
      * 凭证类型
@@ -43,4 +47,28 @@ public final class Constant {
      */
     public static final String ROLE_ADMIN = "ROLE_ADMIN";
 
+    /**
+     * 账号启用/禁用
+     */
+    public enum AccountNumberEnum {
+        ENABLE(1, "启用"),
+        DISABLE(0, "禁用");
+
+        private final int value;
+        private final String message;
+
+        AccountNumberEnum(int value, String message) {
+            this.value = value;
+            this.message = message;
+        }
+
+        public int value() {
+            return this.value;
+        }
+
+        public String getMessage() {
+            return this.message;
+        }
+
+    }
 }

+ 8 - 1
smsb-customer-manager-client/src/main/java/com/inspur/customer/object/keycloak/SwitchDTO.java

@@ -1,5 +1,6 @@
 package com.inspur.customer.object.keycloak;
 
+import com.inspur.customer.object.org.OperationAuthority;
 import lombok.Data;
 
 import javax.validation.constraints.NotNull;
@@ -11,9 +12,15 @@ import java.io.Serializable;
  * @Version 1.0
  */
 @Data
-public class SwitchDTO implements Serializable {
+public class SwitchDTO extends OperationAuthority {
     private static final long serialVersionUID = 3364299451602207573L;
 
+    /**
+     * 用户ID
+     */
+    @NotNull(message = "userId不能为空")
+    private String userId ;
+
     /**
      * 启用/禁用 true/false
      */

+ 13 - 0
smsb-customer-manager-client/src/main/java/com/inspur/customer/object/org/SmsbDepartmentCmd.java

@@ -5,6 +5,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import javax.validation.constraints.NotNull;
+import java.util.Objects;
 
 /**
  * @Author wangbo13
@@ -26,4 +27,16 @@ public class SmsbDepartmentCmd extends PageQuery {
      */
     @NotNull(message = "tenant不能为空")
     private String tenant;
+
+    /**
+     * 开关
+     * 0:所有子部门集合包括当前部门
+     * 1:当前部门集合
+     * 默认:0
+     */
+    private Integer recursive;
+
+    public Integer getRecursive(){
+        return Objects.nonNull(this.recursive)?this.recursive:0;
+    }
 }

+ 0 - 1
smsb-customer-manager-client/src/main/java/com/inspur/customer/object/org/SmsbRegrouping.java

@@ -18,6 +18,5 @@ public class SmsbRegrouping extends OperationAuthority{
     @NotNull(message = "userId不能为空")
     private String userId;
 
-    @NotNull(message = "departmentId不能为空")
     private Long departmentId;
 }

+ 52 - 0
smsb-customer-manager-client/src/main/java/com/inspur/customer/object/org/SmsbSimpleUserCO.java

@@ -0,0 +1,52 @@
+package com.inspur.customer.object.org;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @Author wangbo13
+ * @Date 2022/12/5 11:22
+ * @Version 1.0
+ */
+@Data
+public class SmsbSimpleUserCO implements Serializable {
+    private static final long serialVersionUID = -514586097597178413L;
+
+    /**
+     * 部门id
+     */
+    private Long departmentId;
+
+    /**
+     * 部门路径
+     */
+    private String path;
+
+    /**
+     * 用户id
+     */
+    private String userId;
+
+    /**
+     * 账号
+     */
+    private String userName;
+
+    /**
+     * 用户名
+     */
+    private String familyName;
+
+    /**
+     * 租户
+     */
+    private String tenant;
+
+    /**
+     * 状态
+     * 0:启用
+     * 1:禁用
+     */
+    private Integer enabled;
+}

+ 5 - 0
smsb-customer-manager-client/src/main/java/com/inspur/customer/object/org/SmsbUserAdd.java

@@ -29,6 +29,11 @@ public class SmsbUserAdd extends OperationAuthority {
      */
     private Long departmentId;
 
+    /**
+     * 部门路径
+     */
+    private String path;
+
     /**
      * 用户中文名
      */

+ 54 - 0
smsb-customer-manager-client/src/main/java/com/inspur/customer/object/org/SmsbUserMigration.java

@@ -0,0 +1,54 @@
+package com.inspur.customer.object.org;
+
+import com.alibaba.cola.dto.Command;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Author wangbo13
+ * @Date 2022/12/5 17:09
+ * @Version 1.0
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class SmsbUserMigration extends Command {
+    private static final long serialVersionUID = 2062076612804311850L;
+
+    /**
+     * 部门id
+     */
+    private Long departmentId;
+
+    /**
+     * 部门路径
+     */
+    private String path;
+
+    /**
+     * 用户id
+     */
+    @NotNull(message = "userId不能为空")
+    private String userId;
+
+    /**
+     * 账号
+     */
+    @NotNull(message = "userName不能为空")
+    private String userName;
+
+    /**
+     * 租户
+     */
+    @NotNull(message = "tenant不能为空")
+    private String tenant;
+
+    /**
+     * 状态
+     * 0:禁用
+     * 1:启用
+     */
+    @NotNull(message = "userId不能为空")
+    private Integer enabled;
+}

+ 29 - 0
smsb-customer-manager-client/src/main/java/com/inspur/customer/object/org/SmsbUserUpdate.java

@@ -0,0 +1,29 @@
+package com.inspur.customer.object.org;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Author wangbo13
+ * @Date 2022/12/5 18:12
+ * @Version 1.0
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class SmsbUserUpdate extends OperationAuthority{
+    private static final long serialVersionUID = -217457569019658548L;
+
+    /**
+     * 用户ID
+     */
+    @NotNull(message = "userId不能为空")
+    private String userId ;
+
+    /**
+     * 用户中文名
+     */
+    @NotNull(message = "familyName不能为空")
+    private String familyName;
+}

+ 16 - 0
smsb-customer-manager-infrastructure/src/main/java/com/inspur/customer/infrastructure/convertor/SmsbDepartmentConvertor.java

@@ -1,7 +1,10 @@
 package com.inspur.customer.infrastructure.convertor;
 
+import com.inspur.customer.constant.Constant;
 import com.inspur.customer.infrastructure.object.org.SmsbDepartmentDO;
+import com.inspur.customer.infrastructure.object.org.SmsbDepartmentUserDO;
 import com.inspur.customer.object.org.SmsbDepartmentAdd;
+import com.inspur.customer.object.org.SmsbUserAdd;
 import org.springframework.beans.BeanUtils;
 
 import java.time.LocalDateTime;
@@ -25,4 +28,17 @@ public class SmsbDepartmentConvertor {
         department.setUpdateTime(LocalDateTime.now());
         return department;
     }
+
+    public static SmsbDepartmentUserDO toDataObjectForCreate(String userId, SmsbUserAdd smsbUserAdd){
+        SmsbDepartmentUserDO userRelation = new SmsbDepartmentUserDO();
+        userRelation.setUserId(userId);
+        userRelation.setFamilyName(smsbUserAdd.getFamilyName());
+        userRelation.setUserName(smsbUserAdd.getUsername());
+        userRelation.setDepartmentId(smsbUserAdd.getDepartmentId());
+        userRelation.setPath(smsbUserAdd.getPath());
+        userRelation.setEnabled(Constant.AccountNumberEnum.ENABLE.value());
+        userRelation.setTenant(smsbUserAdd.getTenant());
+        userRelation.setCreateTime(LocalDateTime.now());
+        return userRelation;
+    }
 }

+ 41 - 0
smsb-customer-manager-infrastructure/src/main/java/com/inspur/customer/infrastructure/object/org/SmsbDepartmentUserDO.java

@@ -1,11 +1,15 @@
 package com.inspur.customer.infrastructure.object.org;
 
+import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
+import java.time.LocalDateTime;
 
 /**
  * @Author wangbo13
@@ -26,9 +30,46 @@ public class SmsbDepartmentUserDO implements Serializable {
     @TableField("department_id")
     private Long departmentId;
 
+    /**
+     * 部门路径
+     */
+    private String path;
+
     /**
      * 用户id
      */
     @TableField("user_id")
     private String userId;
+
+    /**
+     * 用户名
+     */
+    @TableField("family_name")
+    private String familyName;
+
+    /**
+     * 账号
+     */
+    @TableField("user_name")
+    private String userName;
+
+    /**
+     * 租户
+     */
+    private String tenant;
+
+    /**
+     * 状态
+     * 0:启用
+     * 1:禁用
+     */
+    private Integer enabled;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(value = "create_time", fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
 }