Kaynağa Gözat

Merge branch '84-integrate' into 'develop'

develop-20230309



See merge request !45

linwenhua 2 yıl önce
ebeveyn
işleme
addec87837
15 değiştirilmiş dosya ile 498 ekleme ve 270 silme
  1. 5 0
      smsb-customer-manager-adapter/pom.xml
  2. 5 116
      smsb-customer-manager-adapter/src/main/java/com/inspur/customer/web/controller/keyclaok/KeycloakController.java
  3. 99 0
      smsb-customer-manager-adapter/src/main/java/com/inspur/customer/web/controller/keyclaok/KeycloakDepartmentController.java
  4. 289 0
      smsb-customer-manager-adapter/src/main/java/com/inspur/customer/web/controller/keyclaok/KeycloakUserController.java
  5. 0 148
      smsb-customer-manager-adapter/src/main/java/com/inspur/customer/web/controller/org/SmsbDepartmentController.java
  6. 12 1
      smsb-customer-manager-app/src/main/java/com/inspur/customer/service/keycloak/KeycloakServiceImpl.java
  7. 25 4
      smsb-customer-manager-app/src/main/java/com/inspur/customer/service/org/SmsbDepartmentUserServiceImpl.java
  8. 16 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/client/org/SmsbDepartmentUserService.java
  9. 5 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/object/keycloak/SwitchDTO.java
  10. 2 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/object/org/SmsbRegrouping.java
  11. 5 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/object/org/SmsbUserAdd.java
  12. 10 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/object/org/SmsbUserExceptionLevelUpdate.java
  13. 3 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/object/tenant/ExceptionInformStrategyCmd.java
  14. 21 0
      smsb-customer-manager-infrastructure/src/main/java/com/inspur/customer/infrastructure/object/org/SmsbDepartmentUserDO.java
  15. 1 1
      smsb-customer-manager-start-web/src/main/java/com/inspur/customer/SmsbCustomerWebApplication.java

+ 5 - 0
smsb-customer-manager-adapter/pom.xml

@@ -17,6 +17,11 @@
             <artifactId>smsb-customer-manager-client</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>com.inspur</groupId>
+            <artifactId>smsb-event-logging-aop</artifactId>
+            <version>${project.version}</version>
+        </dependency>
         <dependency>
             <groupId>com.inspur</groupId>
             <artifactId>smsb-event-logging-client</artifactId>

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

@@ -1,22 +1,13 @@
 package com.inspur.customer.web.controller.keyclaok;
 
 import com.alibaba.cola.dto.Response;
-import com.alibaba.cola.dto.SingleResponse;
-import com.alibaba.fastjson.JSONObject;
 import com.inspur.customer.client.keycloak.KeycloakService;
-import com.inspur.customer.client.wechat.IWeChatService;
-import com.inspur.customer.constant.Constant;
-import com.inspur.customer.object.keycloak.UsersRoleMappingDTO;
-import com.inspur.customer.object.wechat.SubscribeDto;
+import com.inspur.logging.annotation.SmsbMethodLog;
+import com.inspur.logging.annotation.SmsbSysLog;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.dubbo.config.annotation.DubboReference;
-import org.keycloak.representations.idm.CredentialRepresentation;
 import org.keycloak.representations.idm.GroupRepresentation;
-import org.keycloak.representations.idm.UserRepresentation;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.scheduling.annotation.EnableScheduling;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
@@ -26,116 +17,13 @@ import org.springframework.web.bind.annotation.*;
  */
 @Slf4j
 @RestController
-@EnableScheduling
+@SmsbSysLog(value = 7,description = "租户管理控制器")
 public class KeycloakController {
 
-    @Value("${system.appKey}")
-    private String appKey;
-
     @DubboReference
     private KeycloakService keycloakService;
 
-    @DubboReference
-    private IWeChatService iWeChatService;
-
-    @PostMapping("/keycloak/update/user")
-    public Response updateUser(@RequestBody String json){
-        SubscribeDto subscribe = JSONObject.parseObject(json, SubscribeDto.class);
-        if(StringUtils.isEmpty(subscribe.getUserId())){
-            return Response.buildFailure("404","userId不能为空!");
-        }
-        keycloakService.updateAttribute(subscribe.getUserId(), "wechat", subscribe.getOppenId());
-        return Response.buildSuccess();
-    }
-
-    @GetMapping("/keycloak/query/ticket/{userId}")
-    public SingleResponse getTicket(@PathVariable("userId") String userId,
-                                    @RequestHeader("Authorization") String authorization) {
-        return SingleResponse.of(iWeChatService.queryTicket(appKey, userId, authorization));
-    }
-
-    @PutMapping("/keycloak/changePassword")
-    public Response changePassword(@RequestHeader("userId") String userId, String newPassword) {
-        if (StringUtils.isEmpty(userId)) {
-            return Response.buildFailure("400", "密码不能为空");
-        }
-        keycloakService.changePassword(userId, newPassword);
-        return Response.buildSuccess();
-    }
-
-    @Scheduled(cron = "0 0/10 * * * ?")
-    public void askUserOppenId() {
-        log.info("update wechat openId");
-        for (String userId : keycloakService.getUsersMap().keySet()) {
-            String oppenId = iWeChatService.askUser(userId);
-            if (!StringUtils.isEmpty(oppenId)) {
-                SubscribeDto dto = new SubscribeDto();
-                dto.setUserId(userId);
-                dto.setOppenId(oppenId);
-                this.updateUser(JSONObject.toJSONString(dto));
-            }
-        }
-    }
-
-    @PostMapping("/admin/group/{id}/children")
-    public Response addKeycloakGroup(@PathVariable("id") String id , @RequestBody GroupRepresentation groupRepresentation){
-        if(StringUtils.isEmpty(groupRepresentation.getName())){
-            return Response.buildFailure("500","name不能为空!");
-        }
-        if(CollectionUtils.isEmpty(groupRepresentation.getAttributes())){
-            return Response.buildFailure("500","attributes不能为空!");
-        }
-        return keycloakService.addKeycloakGroup(id , groupRepresentation);
-    }
-
-    @PutMapping("/admin/group/{id}")
-    public Response updateKeycloakGroup(@PathVariable("id") String id , @RequestBody GroupRepresentation groupRepresentation){
-        if(StringUtils.isEmpty(groupRepresentation.getName())){
-            return Response.buildFailure("500","name不能为空!");
-        }
-        if(CollectionUtils.isEmpty(groupRepresentation.getAttributes())){
-            return Response.buildFailure("500","attributes不能为空!");
-        }
-        return keycloakService.updateKeycloakGroup(id , groupRepresentation);
-    }
-
-    @DeleteMapping("/admin/group/{id}")
-    public Response removeGroup(@PathVariable("id") String id){
-        return keycloakService.removeGroup(id);
-    }
-
-    @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)){
-            return Response.buildFailure("500","type参数不合法!");
-        }
-        if(StringUtils.isEmpty(credential.getValue())){
-            return Response.buildFailure("500","value不能为空!");
-        }
-        return keycloakService.updateUser(userId , credential , Constant.RESET_PASSWORD);
-    }
-
-    @PutMapping("/admin/users/role/configure")
-    public Response roleMapping(@RequestBody UsersRoleMappingDTO usersRoleMappingDTO){
-        return keycloakService.roleMapping(usersRoleMappingDTO);
-    }
-
-    @GetMapping("/admin/users/{userId}/credentials")
-    public Response queryUserCredentials(@PathVariable("userId")String userId){
-        return keycloakService.queryUserCredentials(userId);
-    }
-
-    @DeleteMapping("/admin/users/{userId}/credentials/{credentialId}")
-    public Response removeUserCredentials(@PathVariable("userId")String userId,
-                                          @PathVariable("credentialId")String credentialId){
-        return keycloakService.removeUserCredentials(userId ,credentialId);
-    }
-
-    @PutMapping("/keycloak/users/attribute")
-    public Response updateUserAttribute(@RequestHeader String userId , @RequestBody UserRepresentation representation){
-        return keycloakService.updateUser(userId, representation, Constant.RESET_ATTRIBUTE);
-    }
-
+    @SmsbMethodLog(description = "新增租户",business = "新增租户:${groupRepresentation.name}")
     @PostMapping("/super/admin/tenant")
     public Response addKeycloakTenant(@RequestBody GroupRepresentation groupRepresentation){
         if(StringUtils.isEmpty(groupRepresentation.getName())){
@@ -147,6 +35,7 @@ public class KeycloakController {
         return keycloakService.addKeycloakTenant(groupRepresentation);
     }
 
+    @SmsbMethodLog(description = "删除租户",business = "删除租户:${id}")
     @DeleteMapping("/super/admin/tenant/{id}")
     public Response removeKeycloakTenant(@PathVariable("id")String id){
         return keycloakService.removeGroup(id);

+ 99 - 0
smsb-customer-manager-adapter/src/main/java/com/inspur/customer/web/controller/keyclaok/KeycloakDepartmentController.java

@@ -0,0 +1,99 @@
+package com.inspur.customer.web.controller.keyclaok;
+
+import com.alibaba.cola.dto.Response;
+import com.alibaba.cola.dto.SingleResponse;
+import com.inspur.customer.client.keycloak.KeycloakService;
+import com.inspur.customer.client.org.SmsbDepartmentService;
+import com.inspur.customer.object.org.OperationAuthority;
+import com.inspur.customer.object.org.SmsbDepartmentAdd;
+import com.inspur.customer.object.org.SmsbDepartmentUpdate;
+import com.inspur.logging.annotation.SmsbMethodLog;
+import com.inspur.logging.annotation.SmsbSysLog;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.keycloak.representations.idm.GroupRepresentation;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * @Author wangbo13
+ * @Date 2023/2/28 15:35
+ * @Version 1.0
+ */
+@Slf4j
+@RestController
+@SmsbSysLog(value = 6,description = "部门管理控制器")
+public class KeycloakDepartmentController {
+    @DubboReference
+    private KeycloakService keycloakService;
+    @DubboReference
+    private SmsbDepartmentService departmentService;
+
+    @Deprecated(forRemoval=true)
+    @SmsbMethodLog(description = "部门新增")
+    @PostMapping("/admin/group/{id}/children")
+    public Response addKeycloakGroup(@PathVariable("id") String id , @RequestBody GroupRepresentation groupRepresentation){
+        if(StringUtils.isEmpty(groupRepresentation.getName())){
+            return Response.buildFailure("500","name不能为空!");
+        }
+        if(CollectionUtils.isEmpty(groupRepresentation.getAttributes())){
+            return Response.buildFailure("500","attributes不能为空!");
+        }
+        return keycloakService.addKeycloakGroup(id , groupRepresentation);
+    }
+
+    @Deprecated(forRemoval=true)
+    @SmsbMethodLog(description = "部门名称修改")
+    @PutMapping("/admin/group/{id}")
+    public Response updateKeycloakGroup(@PathVariable("id") String id , @RequestBody GroupRepresentation groupRepresentation){
+        if(StringUtils.isEmpty(groupRepresentation.getName())){
+            return Response.buildFailure("500","name不能为空!");
+        }
+        if(CollectionUtils.isEmpty(groupRepresentation.getAttributes())){
+            return Response.buildFailure("500","attributes不能为空!");
+        }
+        return keycloakService.updateKeycloakGroup(id , groupRepresentation);
+    }
+
+    @Deprecated(forRemoval=true)
+    @SmsbMethodLog(description = "部门删除")
+    @DeleteMapping("/admin/group/{id}")
+    public Response removeGroup(@PathVariable("id") String id){
+        return keycloakService.removeGroup(id);
+    }
+
+    @SmsbMethodLog(description = "新增部门",business = "新增部门:${smsbDepartmentAdd.name},标识:${smsbDepartmentAdd.mark}")
+    @PostMapping("/admin/department")
+    public Response addDepartment(@RequestHeader String userId, @Valid @RequestBody SmsbDepartmentAdd smsbDepartmentAdd){
+        Response checkResult = departmentService.checkOperationAuthority(userId, smsbDepartmentAdd.getTenant());
+        if(!checkResult.isSuccess()){return checkResult;}
+        return departmentService.addDepartment(userId ,smsbDepartmentAdd);
+    }
+    @SmsbMethodLog(description = "删除部门")
+    @DeleteMapping("/admin/department/{id}")
+    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 , id);
+        return SingleResponse.buildSuccess();
+    }
+
+    @SmsbMethodLog(description = "部门名称修改")
+    @PutMapping("/admin/department")
+    public Response updateDepartment(@RequestHeader String userId , @Valid @RequestBody SmsbDepartmentUpdate departmentUpdate){
+        Response checkResponse = departmentService.checkOperationAuthority(userId, departmentService.getOneById(departmentUpdate.getId()).getTenant());
+        if(!checkResponse.isSuccess()){return checkResponse;}
+        return departmentService.updateDepartment(userId , departmentUpdate);
+    }
+
+    @SmsbMethodLog(description = "部门列表展示")
+    @PostMapping("/admin/department/list")
+    public Response queryDepartmentList(@RequestHeader String userId , @Valid @RequestBody OperationAuthority operationAuthority){
+        Response checkResponse = departmentService.checkOperationAuthority(userId, operationAuthority.getTenant());
+        if(!checkResponse.isSuccess()){return checkResponse;}
+        return departmentService.queryDepartmentList(operationAuthority.getTenant());
+    }
+}

+ 289 - 0
smsb-customer-manager-adapter/src/main/java/com/inspur/customer/web/controller/keyclaok/KeycloakUserController.java

@@ -0,0 +1,289 @@
+package com.inspur.customer.web.controller.keyclaok;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.Response;
+import com.alibaba.cola.dto.SingleResponse;
+import com.alibaba.fastjson.JSONObject;
+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.client.wechat.IWeChatService;
+import com.inspur.customer.constant.Constant;
+import com.inspur.customer.object.keycloak.KeycloakUserCO;
+import com.inspur.customer.object.keycloak.SwitchDTO;
+import com.inspur.customer.object.keycloak.UsersRoleMappingDTO;
+import com.inspur.customer.object.org.*;
+import com.inspur.customer.object.wechat.SubscribeDto;
+import com.inspur.logging.annotation.SmsbMethodLog;
+import com.inspur.logging.annotation.SmsbSysLog;
+import com.inspur.logging.annotation.SysLogIgnore;
+import com.inspur.logging.client.SmsbLogService;
+import com.inspur.logging.object.log.SmsbLogDto;
+import com.inspur.logging.service.HttpContextUtils;
+import com.inspur.logging.service.NetUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.keycloak.representations.idm.CredentialRepresentation;
+import org.keycloak.representations.idm.RoleRepresentation;
+import org.keycloak.representations.idm.UserRepresentation;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.lang.Nullable;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.time.LocalDateTime;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @Author wangbo13
+ * @Date 2023/2/28 15:34
+ * @Version 1.0
+ */
+@Slf4j
+@RestController
+@SmsbSysLog(value = 3,description = "用户管理控制器")
+@EnableScheduling
+public class KeycloakUserController {
+
+    @DubboReference
+    private KeycloakService keycloakService;
+    @DubboReference
+    private IWeChatService iWeChatService;
+    @Value("${system.appKey}")
+    private String appKey;
+    @DubboReference
+    private SmsbDepartmentUserService userService;
+    @DubboReference
+    private SmsbDepartmentService departmentService;
+    @DubboReference
+    private SmsbLogService smsbLogService;
+
+    @SmsbMethodLog(description = "公众号扫描关注",business = "公众号关注")
+    @PostMapping("/keycloak/update/user")
+    public Response updateUser(@RequestBody String json){
+        SubscribeDto subscribe = JSONObject.parseObject(json, SubscribeDto.class);
+        if(StringUtils.isEmpty(subscribe.getUserId())){
+            return Response.buildFailure("404","userId不能为空!");
+        }
+        keycloakService.updateAttribute(subscribe.getUserId(), "wechat", subscribe.getOppenId());
+        return Response.buildSuccess();
+    }
+
+    @SmsbMethodLog(description = "公众号二维码展示" , business = "公众号二维码获取")
+    @GetMapping("/keycloak/query/ticket/{userId}")
+    public SingleResponse getTicket(@PathVariable("userId") String userId,
+                                    @RequestHeader("Authorization") String authorization) {
+        return SingleResponse.of(iWeChatService.queryTicket(appKey, userId, authorization));
+    }
+
+    @SmsbMethodLog(description = "密码重置" , business = "密码重置")
+    @PutMapping("/keycloak/changePassword")
+    public Response changePassword(@RequestHeader("userId") String userId, String newPassword) {
+        if (StringUtils.isEmpty(userId)) {
+            return Response.buildFailure("400", "密码不能为空");
+        }
+        keycloakService.changePassword(userId, newPassword);
+        return Response.buildSuccess();
+    }
+
+    @SysLogIgnore
+    @Scheduled(cron = "0 0/10 * * * ?")
+    public void askUserOppenId() {
+        log.info("update wechat openId");
+        for (String userId : keycloakService.getUsersMap().keySet()) {
+            String oppenId = iWeChatService.askUser(userId);
+            if (!StringUtils.isEmpty(oppenId)) {
+                SubscribeDto dto = new SubscribeDto();
+                dto.setUserId(userId);
+                dto.setOppenId(oppenId);
+                this.updateUser(JSONObject.toJSONString(dto));
+            }
+        }
+    }
+
+    @SmsbMethodLog(description = "密码重置" ,business = "密码重置")
+    @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)){
+            return Response.buildFailure("500","type参数不合法!");
+        }
+        if(StringUtils.isEmpty(credential.getValue())){
+            return Response.buildFailure("500","value不能为空!");
+        }
+        return keycloakService.updateUser(userId , credential , Constant.RESET_PASSWORD);
+    }
+
+    @SysLogIgnore
+    @PutMapping("/admin/users/role/configure")
+    public Response roleMapping(@RequestHeader String userId ,@RequestBody UsersRoleMappingDTO usersRoleMappingDTO){
+        // 注解的方式不好描述日志信息,接口方式存储
+        SmsbLogDto logDto = new SmsbLogDto();
+        logDto.setUserId(userId);
+        logDto.setBusiness(3);
+        logDto.setDescription("账号角色分配");
+        StringBuffer sbf = new StringBuffer("给用户:"+ keycloakService.getUserMap().get(usersRoleMappingDTO.getUserId()));
+        if(!usersRoleMappingDTO.getAddRoleList().isEmpty()){
+            sbf.append(",分配角色:"+getRoleNameList(usersRoleMappingDTO.getAddRoleList()));
+        }
+        if(!usersRoleMappingDTO.getRemoveRoleList().isEmpty()){
+            sbf.append(",删除角色:"+getRoleNameList(usersRoleMappingDTO.getRemoveRoleList()));
+        }
+        logDto.setParams(sbf.toString());
+        logDto.setRequestMethod(1);
+        logDto.setMethod("roleMapping()");
+        logDto.setStatus(1);
+        logDto.setIp(NetUtils.getIpAddr(HttpContextUtils.getHttpServletRequest()));
+        logDto.setOperTime(LocalDateTime.now());
+        logDto.setTenant("unknown");
+        log.info("账号角色分配日志记录:{}" , sbf);
+        smsbLogService.saveLog(logDto);
+        return keycloakService.roleMapping(usersRoleMappingDTO);
+    }
+
+    private List<String> getRoleNameList(List<RoleRepresentation> roleRepList){
+        return roleRepList.stream().map(RoleRepresentation::getDescription).collect(Collectors.toList());
+    }
+
+    @SysLogIgnore
+    @GetMapping("/admin/users/{userId}/credentials")
+    public Response queryUserCredentials(@PathVariable("userId")String userId){
+        return keycloakService.queryUserCredentials(userId);
+    }
+
+    @SysLogIgnore
+    @DeleteMapping("/admin/users/{userId}/credentials/{credentialId}")
+    public Response removeUserCredentials(@PathVariable("userId")String userId,
+                                          @PathVariable("credentialId")String credentialId){
+        return keycloakService.removeUserCredentials(userId ,credentialId);
+    }
+
+    @SmsbMethodLog(description = "更新用户属性" ,business = "用户属性更新")
+    @PutMapping("/keycloak/users/attribute")
+    public Response updateUserAttribute(@RequestHeader String userId , @RequestBody UserRepresentation representation){
+        Map<String, List<String>> userAttribute = representation.getAttributes();
+        if(userAttribute != null){
+            KeycloakUserCO userCO = new KeycloakUserCO();
+            userCO.setEmail(representation.getEmail());
+            userCO.setPhone(userAttribute.get("phone"));
+            userCO.setWechat(userAttribute.get("wechat"));
+            userCO.setWechatApplet(userAttribute.get("wechat-applet-openid"));
+            userCO.setId(userId);
+            userService.updateUserAttribute(userCO);
+        }
+        return keycloakService.updateUser(userId, representation, Constant.RESET_ATTRIBUTE);
+    }
+
+    public String getWechatAppletOpenId(@Nullable List<String> wechatApplets) {
+        if (wechatApplets != null && !wechatApplets.isEmpty()) {
+            String temp = wechatApplets.get(0);
+            if (!temp.contains("{\"")) {
+                return temp;
+            }
+        }
+        return "";
+    }
+
+    @SmsbMethodLog(description = "新增账号",
+        business = "添加账号:${smsbUserAdd.username}到部门:${smsbUserAdd.departmentName}")
+    @PostMapping("/admin/users")
+    public Response addKeyClaokUser(@RequestHeader String userId ,@Valid @RequestBody SmsbUserAdd smsbUserAdd){
+        Response checkResponse = departmentService.checkOperationAuthority(userId, smsbUserAdd.getTenant());
+        if(!checkResponse.isSuccess()){return checkResponse;}
+        return departmentService.addKeyClaokUser(userId ,smsbUserAdd);
+    }
+
+    @SmsbMethodLog(description = "账号分组",
+        business = "将账号:${smsbRegrouping.userId}添加到部门:${smsbRegrouping.departmentName}")
+    @PutMapping("/admin/users/regrouping")
+    public Response regrouping(@RequestHeader String userId,
+                               @Valid @RequestBody SmsbRegrouping smsbRegrouping){
+        Response checkResponse = departmentService.checkOperationAuthority(userId, userService.getOneByUserId(
+            smsbRegrouping.getUserId()).getTenant());
+        if(!checkResponse.isSuccess()){return checkResponse;}
+        return departmentService.regrouping(smsbRegrouping);
+    }
+
+    @SmsbMethodLog(description = "账号注销", business = "账号:${uId}注销")
+    @DeleteMapping("/admin/users/{uId}")
+    public Response enableSwitch(@RequestHeader String userId,
+                                 @PathVariable("uId") String uId){
+        Response checkResponse = departmentService.checkOperationAuthority(userId, userService.getOneByUserId(uId).getTenant());
+        if(!checkResponse.isSuccess()){return checkResponse;}
+        if(userService.removeUser(uId)){
+            return keycloakService.removeUser(uId);
+        }else{
+            return Response.buildFailure("500","注销用户失败!");
+        }
+    }
+
+    @SysLogIgnore
+    @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);
+    }
+
+    @SysLogIgnore
+    @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);
+    }
+
+    @SmsbMethodLog(description = "账号启用/禁用", business = "账号:${switchDTO.userName}启用:${switchDTO.enabled}")
+    @PutMapping("/admin/users/enabled")
+    public Response enableSwitch(@RequestHeader String userId,
+                                 @RequestBody SwitchDTO switchDTO){
+        Response checkResponse = departmentService.checkOperationAuthority(userId, userService.getOneByUserId(switchDTO.getUserId())
+            .getTenant());
+        if(!checkResponse.isSuccess()){return checkResponse;}
+        Boolean flag = userService.enableSwitch(switchDTO);
+        if(flag){
+            return keycloakService.updateUser(switchDTO.getUserId() , switchDTO , Constant.ENABLE);
+        }
+        return Response.buildFailure("500","账号启用/禁用失败!");
+    }
+
+    @SmsbMethodLog(description = "账号名称修改", business = "用户:${userUpdate.userId}将名称修改为:${userUpdate.name}")
+    @PutMapping("/admin/users/update")
+    public Response updateUserFirstName(@RequestHeader String userId ,
+                                        @RequestBody SmsbUserUpdate userUpdate) {
+        Response checkResponse = departmentService.checkOperationAuthority(userId, userService.getOneByUserId(userUpdate.getUserId()).getTenant());
+        if (!checkResponse.isSuccess()) {
+            return checkResponse;
+        }
+        Boolean flag = userService.updateUserFirstName(userUpdate);
+        if (flag) {
+            return keycloakService.updateUser(userUpdate.getUserId(), userUpdate.getName(), Constant.UPDATE_USER_FIRSTNAME);
+        }
+        return Response.buildFailure("500", "用户名修改失败!");
+    }
+
+    @SmsbMethodLog(description = "消息推送预警级别", business = "将用户账号:${levelUpdate.userName}消息推送预警级别改为:${levelUpdate.informName}")
+    @PutMapping("/admin/users/update/deviceExceptionLevel")
+    public Response updateUserFirstName(@RequestHeader String userId,
+                                        @RequestBody SmsbUserExceptionLevelUpdate levelUpdate) {
+        Response checkResponse = departmentService.checkOperationAuthority(userId, userService.getOneByUserId(levelUpdate.getUserId()).getTenant());
+        if (!checkResponse.isSuccess()) {
+            return checkResponse;
+        }
+        if (userService.updateDeviceExceptionLevel(levelUpdate)) {
+            return Response.buildSuccess();
+        }
+        return Response.buildFailure("500", "接收级别修改失败!");
+    }
+
+    @SysLogIgnore
+    @GetMapping("/keycloak/oneself/tree")
+    public Response queryOneselfDepartTree(@RequestHeader String userId) {
+        return departmentService.queryOneselfDepartTree(userId);
+    }
+}

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

@@ -1,148 +0,0 @@
-package com.inspur.customer.web.controller.org;
-
-import com.alibaba.cola.dto.PageResponse;
-import com.alibaba.cola.dto.Response;
-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.springframework.web.bind.annotation.*;
-
-import javax.validation.Valid;
-
-/**
- * @Author wangbo13
- * @Date 2022/11/25 15:09
- * @Version 1.0
- */
-@RestController
-public class SmsbDepartmentController {
-
-    @DubboReference
-    private SmsbDepartmentService departmentService;
-    @DubboReference
-    private SmsbDepartmentUserService userService;
-    @DubboReference
-    private KeycloakService service;
-
-    @PostMapping("/admin/department")
-    public Response addDepartment(@RequestHeader String userId, @Valid @RequestBody SmsbDepartmentAdd smsbDepartmentAdd){
-        Response checkResult = departmentService.checkOperationAuthority(userId, smsbDepartmentAdd.getTenant());
-        if(!checkResult.isSuccess()){return checkResult;}
-        return departmentService.addDepartment(userId ,smsbDepartmentAdd);
-    }
-
-    @DeleteMapping("/admin/department/{id}")
-    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 , id);
-        return SingleResponse.buildSuccess();
-    }
-
-    @PutMapping("/admin/department")
-    public Response updateDepartment(@RequestHeader String userId , @Valid @RequestBody SmsbDepartmentUpdate departmentUpdate){
-        Response checkResponse = departmentService.checkOperationAuthority(userId, departmentService.getOneById(departmentUpdate.getId()).getTenant());
-        if(!checkResponse.isSuccess()){return checkResponse;}
-        return departmentService.updateDepartment(userId , departmentUpdate);
-    }
-
-    @PostMapping("/admin/department/list")
-    public Response queryDepartmentList(@RequestHeader String userId , @Valid @RequestBody OperationAuthority operationAuthority){
-        Response checkResponse = departmentService.checkOperationAuthority(userId, operationAuthority.getTenant());
-        if(!checkResponse.isSuccess()){return checkResponse;}
-        return departmentService.queryDepartmentList(operationAuthority.getTenant());
-    }
-
-    @PostMapping("/admin/users")
-    public Response addKeyClaokUser(@RequestHeader String userId ,@Valid @RequestBody SmsbUserAdd smsbUserAdd){
-        Response checkResponse = departmentService.checkOperationAuthority(userId, smsbUserAdd.getTenant());
-        if(!checkResponse.isSuccess()){return checkResponse;}
-        return departmentService.addKeyClaokUser(userId ,smsbUserAdd);
-    }
-
-    @PutMapping("/admin/users/regrouping")
-    public Response regrouping(@RequestHeader String userId,
-                               @Valid @RequestBody SmsbRegrouping smsbRegrouping){
-        Response checkResponse = departmentService.checkOperationAuthority(userId, userService.getOneByUserId(
-            smsbRegrouping.getUserId()).getTenant());
-        if(!checkResponse.isSuccess()){return checkResponse;}
-        return departmentService.regrouping(smsbRegrouping);
-    }
-
-    @DeleteMapping("/admin/users/{uId}")
-    public Response enableSwitch(@RequestHeader String userId,
-                                 @PathVariable("uId") String uId){
-        Response checkResponse = departmentService.checkOperationAuthority(userId, userService.getOneByUserId(uId).getTenant());
-        if(!checkResponse.isSuccess()){return checkResponse;}
-        if(userService.removeUser(uId)){
-            return service.removeUser(uId);
-        }else{
-            return Response.buildFailure("500","注销用户失败!");
-        }
-    }
-
-    @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, userService.getOneByUserId(switchDTO.getUserId())
-            .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, userService.getOneByUserId(userUpdate.getUserId()).getTenant());
-        if (!checkResponse.isSuccess()) {
-            return checkResponse;
-        }
-        Boolean flag = userService.updateUserFirstName(userUpdate);
-        if (flag) {
-            return service.updateUser(userUpdate.getUserId(), userUpdate.getName(), Constant.UPDATE_USER_FIRSTNAME);
-        }
-        return Response.buildFailure("500", "用户名修改失败!");
-    }
-
-    @PutMapping("/admin/users/update/deviceExceptionLevel")
-    public Response updateUserFirstName(@RequestHeader String userId,
-                                        @RequestBody SmsbUserExceptionLevelUpdate levelUpdate) {
-        Response checkResponse = departmentService.checkOperationAuthority(userId, userService.getOneByUserId(levelUpdate.getUserId()).getTenant());
-        if (!checkResponse.isSuccess()) {
-            return checkResponse;
-        }
-        if (userService.updateDeviceExceptionLevel(levelUpdate)) {
-            return Response.buildSuccess();
-        }
-        return Response.buildFailure("500", "接收级别修改失败!");
-    }
-
-    @GetMapping("/keycloak/oneself/tree")
-    public Response queryOneselfDepartTree(@RequestHeader String userId) {
-        return departmentService.queryOneselfDepartTree(userId);
-    }
-
-}

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

@@ -5,6 +5,7 @@ import com.alibaba.cola.dto.Response;
 import com.alibaba.cola.dto.SingleResponse;
 import com.google.common.collect.Lists;
 import com.inspur.customer.client.keycloak.KeycloakService;
+import com.inspur.customer.client.org.SmsbDepartmentUserService;
 import com.inspur.customer.constant.Constant;
 import com.inspur.customer.object.keycloak.KeycloakUserCO;
 import com.inspur.customer.object.keycloak.SwitchDTO;
@@ -13,12 +14,12 @@ import com.inspur.customer.object.org.SmsbDepartmentCmd;
 import com.inspur.customer.object.org.SmsbUserAdd;
 import com.inspur.customer.object.wechat.Pair;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.keycloak.admin.client.resource.*;
 import org.keycloak.representations.idm.*;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Cacheable;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
@@ -35,6 +36,8 @@ public class KeycloakServiceImpl implements KeycloakService {
 
     @Resource
     private RealmResource realmResource;
+    @DubboReference
+    private SmsbDepartmentUserService userService;
 
     @Override
     @Cacheable(value = "smsb:users")
@@ -122,6 +125,14 @@ public class KeycloakServiceImpl implements KeycloakService {
 
     @Override
     public void updateAttribute(String userId ,String property , String value) {
+        KeycloakUserCO userCO = new KeycloakUserCO();
+        userCO.setId(userId);
+        if(Objects.nonNull(property) && property.equals("wechat")){
+            userCO.setWechat(Collections.singletonList(value));
+        }else if(Objects.nonNull(property) && property.equals("wechat-applet-openid")){
+            userCO.setWechatAppletOpenId(value);
+        }
+        userService.updateUserAttribute(userCO);
         UserResource user = realmResource.users().get(userId);
         UserRepresentation userRepresentation = user.toRepresentation();
         if (userRepresentation.getAttributes() == null) {

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

@@ -15,19 +15,18 @@ 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.keycloak.KeycloakUserCO;
 import com.inspur.customer.object.keycloak.SwitchDTO;
 import com.inspur.customer.object.org.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.springframework.beans.BeanUtils;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 
 /**
  * @Author wangbo13
@@ -212,4 +211,26 @@ public class SmsbDepartmentUserServiceImpl extends ServiceImpl<SmsbDepartmentUse
         });
         return smsbSimpleUserList;
     }
+
+    @Override
+    public Boolean updateUserAttribute(KeycloakUserCO userCO) {
+        if(StringUtils.isEmpty(userCO.getId()) && StringUtils.isEmpty(userCO.getUsername())){
+            return Boolean.FALSE;
+        }
+        log.info("开始更新用户表属性:{}",userCO);
+        return super.update(new LambdaUpdateWrapper<>(SmsbDepartmentUserDO.class)
+            .set(SmsbDepartmentUserDO::getWechat , userCO.getWechat())
+            .set(SmsbDepartmentUserDO::getWechatApplet , userCO.getWechatAppletOpenId())
+            .set(SmsbDepartmentUserDO::getPhone , userCO.getPhone())
+            .set(SmsbDepartmentUserDO::getEmail , userCO.getEmail())
+            .eq(StringUtils.isNotBlank(userCO.getUsername()) ,SmsbDepartmentUserDO::getUserName , userCO.getUsername())
+            .eq(StringUtils.isNotBlank(userCO.getId()) ,SmsbDepartmentUserDO::getUserId , userCO.getId()));
+    }
+
+    @Override
+    public Map<String, String> getUserMap() {
+        Map<String, String> userMap = new HashMap<>();
+        this.list().forEach(user -> userMap.put(user.getUserId(),user.getUserName()));
+        return userMap;
+    }
 }

+ 16 - 0
smsb-customer-manager-client/src/main/java/com/inspur/customer/client/org/SmsbDepartmentUserService.java

@@ -2,10 +2,12 @@ package com.inspur.customer.client.org;
 
 import com.alibaba.cola.dto.PageResponse;
 import com.alibaba.cola.dto.Response;
+import com.inspur.customer.object.keycloak.KeycloakUserCO;
 import com.inspur.customer.object.keycloak.SwitchDTO;
 import com.inspur.customer.object.org.*;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * @Author wangbo13
@@ -103,4 +105,18 @@ public interface SmsbDepartmentUserService {
      * @return 指定部门下接收级别<= informLevel的用户
      */
     List<SmsbSimpleUserCO> listUserByInformLevel(String tenant, List<String> org, int informLevel);
+
+    /**
+     * 更新用户属性
+     * 用户id || 用户账号必传一个
+     *
+     * @param userCO
+     * @return boolean
+     */
+    Boolean updateUserAttribute(KeycloakUserCO userCO);
+
+    /**
+     * 以map形式获取
+     */
+    Map<String, String> getUserMap();
 }

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

@@ -26,4 +26,9 @@ public class SwitchDTO extends OperationAuthority {
      */
     @NotNull(message = "enabled不能为空")
     private Boolean enabled;
+
+    /**
+     * 账号
+     */
+    private String userName;
 }

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

@@ -19,4 +19,6 @@ public class SmsbRegrouping extends OperationAuthority{
     private String userId;
 
     private Long departmentId;
+
+    private String departmentName;
 }

+ 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 departmentName;
+
     /**
      * 部门路径
      */

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

@@ -22,4 +22,14 @@ public class SmsbUserExceptionLevelUpdate extends OperationAuthority {
 
     @NotNull(message = "通知级别不能为空")
     private Integer informLevel;
+
+    /**
+     * 账号
+     */
+    private String userName;
+
+    /**
+     * 通知级别名称
+     */
+    private String informName;
 }

+ 3 - 0
smsb-customer-manager-client/src/main/java/com/inspur/customer/object/tenant/ExceptionInformStrategyCmd.java

@@ -63,6 +63,9 @@ public class ExceptionInformStrategyCmd extends Command {
     public Integer getStrategyFlag() {
         BitSet bitSet = getStrategySet();
         byte[] byteFlag = bitSet.toByteArray();
+        if (byteFlag.length <= 0) {
+            return 0;
+        }
         return (int) byteFlag[0];
     }
 

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

@@ -77,4 +77,25 @@ public class SmsbDepartmentUserDO implements Serializable {
      */
     @TableField("inform_level")
     private Integer informLevel;
+
+    /**
+     * 微信公众号openId
+     */
+    private String wechat;
+
+    /**
+     * 小程序OpenId
+     */
+    @TableField("wechat_applet")
+    private String wechatApplet;
+
+    /**
+     * 手机
+     */
+    private String phone;
+
+    /**
+     * 邮箱
+     */
+    private String email;
 }

+ 1 - 1
smsb-customer-manager-start-web/src/main/java/com/inspur/customer/SmsbCustomerWebApplication.java

@@ -12,7 +12,7 @@ import org.springframework.scheduling.annotation.EnableAsync;
  */
 @EnableDubbo
 @EnableAsync
-@SpringBootApplication
+@SpringBootApplication(scanBasePackages = "com.inspur")
 public class SmsbCustomerWebApplication {
 
     public static void main(String[] args) {