Bladeren bron

feat:驿站屏邮件分组功能,新增注释等

fantingwei 1 jaar geleden
bovenliggende
commit
db3fbe34d3
26 gewijzigde bestanden met toevoegingen van 1071 en 39 verwijderingen
  1. 20 0
      smsb-customer-manager-adapter/src/main/java/com/inspur/customer/web/controller/keyclaok/KeycloakUserController.java
  2. 109 0
      smsb-customer-manager-adapter/src/main/java/com/inspur/customer/web/controller/org/SmsbMessageGroupController.java
  3. 19 22
      smsb-customer-manager-app/src/main/java/com/inspur/customer/service/keycloak/KeycloakServiceImpl.java
  4. 14 4
      smsb-customer-manager-app/src/main/java/com/inspur/customer/service/org/SmsbDepartmentServiceImpl.java
  5. 52 3
      smsb-customer-manager-app/src/main/java/com/inspur/customer/service/org/SmsbDepartmentUserServiceImpl.java
  6. 128 0
      smsb-customer-manager-app/src/main/java/com/inspur/customer/service/org/SmsbMessageGroupMemberServiceImpl.java
  7. 87 0
      smsb-customer-manager-app/src/main/java/com/inspur/customer/service/org/SmsbMessageGroupServiceImpl.java
  8. 8 4
      smsb-customer-manager-app/src/main/java/com/inspur/customer/service/tenant/TenantExceptionInformStrategyServiceImpl.java
  9. 21 4
      smsb-customer-manager-app/src/main/java/com/inspur/customer/service/tenant/UserInformServiceImpl.java
  10. 1 2
      smsb-customer-manager-client/src/main/java/com/inspur/customer/client/org/SmsbDepartmentService.java
  11. 11 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/client/org/SmsbDepartmentUserService.java
  12. 35 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/client/org/SmsbMessageGroupMemberService.java
  13. 32 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/client/org/SmsbMessageGroupService.java
  14. 10 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/object/org/SmsbDepartmentCmd.java
  15. 52 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/object/org/SmsbMessageGroupDto.java
  16. 74 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/object/org/SmsbMessageGroupMemberDto.java
  17. 44 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/object/org/SmsbMessageGroupQuery.java
  18. 39 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/object/org/SmsbMessageMemberAddDto.java
  19. 54 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/object/org/SmsbMessageMemberCO.java
  20. 40 0
      smsb-customer-manager-client/src/main/java/com/inspur/customer/object/org/SmsbMessageMemberUpdateDto.java
  21. 14 0
      smsb-customer-manager-infrastructure/src/main/java/com/inspur/customer/infrastructure/mapper/org/SmsbMessageGroupMapper.java
  22. 14 0
      smsb-customer-manager-infrastructure/src/main/java/com/inspur/customer/infrastructure/mapper/org/SmsbMessageGroupMemberMapper.java
  23. 76 0
      smsb-customer-manager-infrastructure/src/main/java/com/inspur/customer/infrastructure/object/org/SmsbMessageGroupDO.java
  24. 107 0
      smsb-customer-manager-infrastructure/src/main/java/com/inspur/customer/infrastructure/object/org/SmsbMessageGroupMemberDO.java
  25. 5 0
      smsb-customer-manager-infrastructure/src/main/resources/mapper/org/SmsbMessageGroupMapper.xml
  26. 5 0
      smsb-customer-manager-infrastructure/src/main/resources/mapper/org/SmsbMessageGroupMemberMapper.xml

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

@@ -38,6 +38,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
 import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -274,6 +275,12 @@ public class KeycloakUserController {
         return departmentService.queryDepartmentUserList(departmentCmd);
     }
 
+    @SysLogIgnore
+    @RequestMapping("/admin/department/allUser/list")
+    public Response queryAllUser(SmsbDepartmentCmd departmentCmd) {
+        return userService.pq(departmentCmd);
+    }
+
     @SysLogIgnore
     @PostMapping("/admin/users/temporary/migration")
     public Response migration(@RequestHeader String userId, @RequestBody SmsbUserMigration userMigration) {
@@ -340,4 +347,17 @@ public class KeycloakUserController {
     public Response queryOneselfDepartTree(@RequestHeader String userId) {
         return departmentService.queryOneselfDepartTree(userId);
     }
+
+    @GetMapping("/keycloakTest")
+    public void testMethod(){
+        List<String> userIds = new ArrayList<>();
+        userIds.add("968e34b0-73c2-4589-b9c7-6054abe89522");
+        List<KeycloakUserCO> usersByIds = keycloakService.getUsersByIds(userIds);
+        for(KeycloakUserCO co : usersByIds){
+            log.info("co:{}", co);
+            log.info("email:{}", co.getEmail());
+            log.info("wechat:{}", co.getWechat());
+            log.info("wechatApp:{}", co.getWechatAppletOpenId());
+        }
+    }
 }

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

@@ -0,0 +1,109 @@
+package com.inspur.customer.web.controller.org;
+
+import com.alibaba.cola.dto.Response;
+import com.inspur.customer.client.org.SmsbMessageGroupMemberService;
+import com.inspur.customer.client.org.SmsbMessageGroupService;
+import com.inspur.customer.object.org.SmsbMessageGroupDto;
+import com.inspur.customer.object.org.SmsbMessageGroupQuery;
+import com.inspur.customer.object.org.SmsbMessageMemberAddDto;
+import com.inspur.customer.object.org.SmsbMessageMemberUpdateDto;
+import com.inspur.logging.annotation.SmsbSysLog;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author fantingwei
+ * @date 2024/6/17
+ */
+@Slf4j
+@RestController
+@SmsbSysLog(description = "预警消息分组控制器")
+public class SmsbMessageGroupController {
+
+    @DubboReference
+    private SmsbMessageGroupService smsbMessageGroupService;
+
+    @DubboReference
+    private SmsbMessageGroupMemberService messageGroupMemberService;
+
+    /**
+     * 新增消息分组接口
+     */
+    @RequestMapping("/keycloak/message/add")
+    public Response insert (@RequestHeader String userId, @RequestHeader String userName, @RequestBody SmsbMessageGroupDto smsbMessageGroupDto) {
+        smsbMessageGroupDto.setCreateUser(userName);
+        smsbMessageGroupDto.setCreateBy(userId);
+        return smsbMessageGroupService.add(smsbMessageGroupDto);
+    }
+
+    /**
+     * 删除消息分组
+     */
+    @DeleteMapping("/keycloak/message/{id}")
+    public Response delete (@PathVariable("id") Long id) {
+        return smsbMessageGroupService.delete(id);
+    }
+
+    /**
+     * 更新消息分组(包含状态、名称、接收通知等级、枚举类型)
+     */
+    @RequestMapping("/keycloak/message/update")
+    public Response updateStatus (@RequestBody SmsbMessageGroupDto smsbMessageGroupDto) {
+        return smsbMessageGroupService.updateStatus(smsbMessageGroupDto);
+    }
+
+    /**
+     * 消息分组分页查询
+     */
+    @RequestMapping("/keycloak/message/page")
+    public Response pq (SmsbMessageGroupQuery query) {
+        return smsbMessageGroupService.pq(query);
+    }
+
+
+
+
+
+
+
+
+
+
+
+
+
+    /**
+     * 根据groupId,主抄送类型,安播云用户id新增成员
+     */
+    @RequestMapping("/keycloak/message/member/add")
+    public Response addMember (@RequestHeader String userId, @RequestHeader String userName, @RequestBody SmsbMessageMemberAddDto addDto) {
+        addDto.setCreateUser(userName);
+        addDto.setCreateBy(userId);
+        return messageGroupMemberService.addMember(addDto);
+    }
+
+    /**
+     * 删除成员接口
+     */
+    @DeleteMapping("/keycloak/message/memberDelete")
+    public Response deleteMember (@RequestBody SmsbMessageMemberUpdateDto updateDto) {
+        return messageGroupMemberService.deleteByDepartmentUserIds(updateDto);
+    }
+
+    /**
+     * 修改具体用户的信息(包含启停用状态、主送抄送类型)
+     */
+    @RequestMapping("/keycloak/message/member/update")
+    public Response memberUpdate (@RequestBody SmsbMessageMemberUpdateDto updateDto) {
+        return messageGroupMemberService.updateByDepartmentUserId(updateDto);
+    }
+
+    /**
+     * 根据groupId分页查询分组下的用户信息
+     */
+    @RequestMapping("/keycloak/message/member/detail")
+    public Response pageByGroupId (SmsbMessageGroupQuery query) {
+        return messageGroupMemberService.pageByGroupId(query);
+    }
+}

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

@@ -16,16 +16,8 @@ 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.GroupResource;
-import org.keycloak.admin.client.resource.GroupsResource;
-import org.keycloak.admin.client.resource.RealmResource;
-import org.keycloak.admin.client.resource.RoleScopeResource;
-import org.keycloak.admin.client.resource.UserResource;
-import org.keycloak.representations.idm.ClientRepresentation;
-import org.keycloak.representations.idm.CredentialRepresentation;
-import org.keycloak.representations.idm.GroupRepresentation;
-import org.keycloak.representations.idm.RoleRepresentation;
-import org.keycloak.representations.idm.UserRepresentation;
+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.util.CollectionUtils;
@@ -100,19 +92,24 @@ public class KeycloakServiceImpl implements KeycloakService {
     public List<KeycloakUserCO> getUsersByIds(List<String> userIds) {
         List<KeycloakUserCO> keycloakUserCos = new ArrayList<>(userIds.size());
         userIds.forEach(id -> {
-            UserRepresentation userRepresentation = realmResource.users().get(id).toRepresentation();
-            if (userRepresentation != null) {
-                KeycloakUserCO keycloakUserCo = new KeycloakUserCO();
-                keycloakUserCo.setId(userRepresentation.getId());
-                keycloakUserCo.setUsername(userRepresentation.getUsername());
-                keycloakUserCo.setEmail(userRepresentation.getEmail());
-                Map<String, List<String>> attributes = userRepresentation.getAttributes();
-                if (attributes != null) {
-                    keycloakUserCo.setPhone(attributes.get("phone"));
-                    keycloakUserCo.setWechat(attributes.get("wechat"));
-                    keycloakUserCo.setWechatApplet(attributes.get("wechat-applet-openid"));
+            try {
+                UserRepresentation userRepresentation = realmResource.users().get(id).toRepresentation();
+                if (userRepresentation != null) {
+                    KeycloakUserCO keycloakUserCo = new KeycloakUserCO();
+                    keycloakUserCo.setId(userRepresentation.getId());
+                    keycloakUserCo.setUsername(userRepresentation.getUsername());
+                    keycloakUserCo.setEmail(userRepresentation.getEmail());
+                    Map<String, List<String>> attributes = userRepresentation.getAttributes();
+                    if (attributes != null) {
+                        keycloakUserCo.setPhone(attributes.get("phone"));
+                        keycloakUserCo.setWechat(attributes.get("wechat"));
+                        keycloakUserCo.setWechatApplet(attributes.get("wechat-applet-openid"));
+                    }
+                    keycloakUserCos.add(keycloakUserCo);
                 }
-                keycloakUserCos.add(keycloakUserCo);
+            } catch (javax.ws.rs.NotFoundException e) {
+                // keycloak上没有这个userId
+                log.error("userId:{} not found", id);
             }
         });
         return keycloakUserCos;

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

@@ -23,7 +23,6 @@ import com.inspur.device.client.core.relation.DeviceAllocateService;
 import com.inspur.service.media.MinioDataProviderService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.math3.analysis.function.Sin;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.springframework.beans.BeanUtils;
@@ -478,9 +477,15 @@ public class SmsbDepartmentServiceImpl extends ServiceImpl<SmsbDepartmentMapper
         return departmentCO;
     }
 
+    /**
+     * 根据部门,找到这个部门及其这个部门的所有父部门
+     * @param orgs 涉及的部门
+     * @return
+     */
     @Override
     public List<String> listSuperiorDepartments(List<String> orgs, String tenant) {
         List<String> departments = Lists.newArrayList();
+        // 所有部门
         List<SmsbDepartmentDO> allDepartments = super.list();
         orgs.forEach(org->{
             SmsbDepartmentDO department = super.getOne(Wrappers.<SmsbDepartmentDO>lambdaQuery().eq(SmsbDepartmentDO::getTenant , tenant)
@@ -548,9 +553,7 @@ public class SmsbDepartmentServiceImpl extends ServiceImpl<SmsbDepartmentMapper
     }
 
     /**
-     * 获取当前部门及上级部门
-     *
-     * @param present 当前部门
+     * 获取present部门的所有父部门
      */
     private List<SmsbDepartmentDO> getParentNodes(List<SmsbDepartmentDO> allDepartments , SmsbDepartmentDO present){
         List<SmsbDepartmentDO> parents = Lists.newArrayList();
@@ -558,6 +561,7 @@ public class SmsbDepartmentServiceImpl extends ServiceImpl<SmsbDepartmentMapper
         if (present.getParentId() != null) {
             SmsbDepartmentDO parent = getById(present.getParentId(), allDepartments);
             if (parent != null) {
+                // 如果找到父部门,则把父部门都找全
                 List<SmsbDepartmentDO> parentDepartments = getParentNodes(allDepartments , parent);
                 parents.addAll(parentDepartments);
             }
@@ -565,6 +569,12 @@ public class SmsbDepartmentServiceImpl extends ServiceImpl<SmsbDepartmentMapper
         return parents;
     }
 
+    /**
+     * 遍历所有部门找到部门中id与父部门id相同的部门,并返回
+     * @param id 父部门id
+     * @param departments 所有部门
+     * @return 找到对应部门信息并返回
+     */
     public SmsbDepartmentDO getById(Long id, List<SmsbDepartmentDO> departments) {
         for (SmsbDepartmentDO department : departments) {
             log.info("id的值为:{}",department.getId());

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

@@ -22,12 +22,11 @@ import com.inspur.customer.object.keycloak.KeycloakUserCO;
 import com.inspur.customer.object.keycloak.SwitchDTO;
 import com.inspur.customer.object.org.*;
 import com.inspur.customer.object.tenant.SmsbUserTenantTransferDto;
+import com.inspur.customer.utils.BeanCopyUtils;
 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.cache.annotation.Cacheable;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -198,14 +197,27 @@ public class SmsbDepartmentUserServiceImpl extends ServiceImpl<SmsbDepartmentUse
      * @param informLevel 指定informLevel
      * @return 指定部门下接收级别<= informLevel的用户
      */
+
+    /**
+     * 根据租户、部门、通知等级、错误枚举类获取要通知的用户
+     * @param tenant 租户
+     * @param org 部门
+     * @param informLevel 通知等级
+     * @param errorId 错误枚举
+     * @return 通知的用户
+     */
     @Override
     public List<SmsbSimpleUserCO> listUserByInformLevel(String tenant, List<String> org, int informLevel ,int errorId) {
+        // 用户权限表,根据通知等级和异常枚举类的值,来找到对应要添加的用户
         LambdaQueryWrapper<SmsbDepartmentUserDO> queryWrapper = Wrappers.lambdaQuery();
+        // org有值时,看看找的paths,paths是这个部门以及所有父部门的org
         List<String> paths = new ArrayList<>();
         if (org!= null && !org.isEmpty()) {
             paths = departmentService.listSuperiorDepartments(org, tenant);
         }
 
+        // 根据租户筛选,有设置通知等级,账号为启用状态,用户path为空、或用户为这个部门及其往上所有父部门
+        // 通知等级为自定义9999,去掉[ ] 后错误类型相匹配的用户 或者 通知等级在 0 到 informLevel中的用户
         queryWrapper.eq(SmsbDepartmentUserDO::getTenant, tenant)
             .ne(SmsbDepartmentUserDO::getInformLevel, -1)
             .eq(SmsbDepartmentUserDO::getEnabled, 1);
@@ -214,7 +226,9 @@ public class SmsbDepartmentUserServiceImpl extends ServiceImpl<SmsbDepartmentUse
         queryWrapper.and(wrapper -> wrapper.nested(nestedWrapper ->
                     nestedWrapper.eq(SmsbDepartmentUserDO::getInformLevel, 9999)
                         .apply("FIND_IN_SET({0}, REPLACE(REPLACE(inform_type, '[', ''), ']', '')) > 0" , errorId)
-                ).or().between(SmsbDepartmentUserDO::getInformLevel, 0, informLevel));
+                )
+            .or().between(SmsbDepartmentUserDO::getInformLevel, 0, informLevel));
+
         List<SmsbDepartmentUserDO> list = this.list(queryWrapper);
         List<SmsbSimpleUserCO> smsbSimpleUserList = Lists.newArrayListWithCapacity(list.size());
         list.forEach(user -> {
@@ -307,4 +321,39 @@ public class SmsbDepartmentUserServiceImpl extends ServiceImpl<SmsbDepartmentUse
         // keycloak操作,修改用户的租户
         return keycloakService.userTenantTransfer(transferDto.getSmsbUserIdPathMap().keySet(), transferDto.getTenant());
     }
+
+    @Override
+    public Response pq(SmsbDepartmentCmd smsbDepartmentCmd) {
+        Page<SmsbDepartmentUserDO> page = new Page<>(smsbDepartmentCmd.getPageIndex(), smsbDepartmentCmd.getPageSize());
+        LambdaQueryWrapper<SmsbDepartmentUserDO> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper
+            .like(StringUtils.isNotEmpty(smsbDepartmentCmd.getName()), SmsbDepartmentUserDO::getName, smsbDepartmentCmd.getName())
+            .like(StringUtils.isNotEmpty(smsbDepartmentCmd.getUserName()), SmsbDepartmentUserDO::getUserName, smsbDepartmentCmd.getUserName())
+            .orderByDesc(SmsbDepartmentUserDO::getCreateTime);
+        page = this.page(page, queryWrapper);
+
+        // 获取用户userIds,从keycloak上获取邮箱和电话信息
+        List<String> userIds = page.getRecords().stream().map(SmsbDepartmentUserDO::getUserId).distinct().collect(Collectors.toList());
+        Map<String, KeycloakUserCO> userMap = keycloakService.getUsersByIds(userIds).stream()
+            .collect(Collectors.toMap(KeycloakUserCO::getId,user -> user));
+
+        List<SmsbMessageMemberCO> resultList = new ArrayList<>();
+        page.getRecords().forEach(record -> {
+            SmsbMessageMemberCO co = BeanCopyUtils.copy(record, SmsbMessageMemberCO.class);
+            KeycloakUserCO keycloakUser = userMap.get(record.getUserId());
+            if (Objects.nonNull(keycloakUser)) {
+                co.setEmail(keycloakUser.getEmail());
+                co.setPhone(keycloakUser.getPhone());
+            }
+            resultList.add(co);
+        });
+
+        return PageResponse.of(resultList, (int) page.getTotal(), (int) page.getSize(), (int) page.getCurrent());
+    }
+
+    @Override
+    public List<SmsbMessageMemberCO> listByIds(List<Long> ids) {
+        List<SmsbDepartmentUserDO> list = lambdaQuery().in(SmsbDepartmentUserDO::getId, ids).list();
+        return BeanCopyUtils.copyList(list, SmsbMessageMemberCO.class);
+    }
 }

+ 128 - 0
smsb-customer-manager-app/src/main/java/com/inspur/customer/service/org/SmsbMessageGroupMemberServiceImpl.java

@@ -0,0 +1,128 @@
+package com.inspur.customer.service.org;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.Response;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.inspur.customer.client.keycloak.KeycloakService;
+import com.inspur.customer.client.org.SmsbDepartmentUserService;
+import com.inspur.customer.client.org.SmsbMessageGroupMemberService;
+import com.inspur.customer.infrastructure.mapper.org.SmsbMessageGroupMemberMapper;
+import com.inspur.customer.infrastructure.object.org.SmsbMessageGroupMemberDO;
+import com.inspur.customer.object.keycloak.KeycloakUserCO;
+import com.inspur.customer.object.org.SmsbMessageGroupQuery;
+import com.inspur.customer.object.org.SmsbMessageMemberAddDto;
+import com.inspur.customer.object.org.SmsbMessageMemberCO;
+import com.inspur.customer.object.org.SmsbMessageMemberUpdateDto;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.apache.dubbo.config.annotation.DubboService;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * @author fantingwei
+ * @date 2024/6/17
+ */
+@Slf4j
+@DubboService(interfaceClass = SmsbMessageGroupMemberService.class)
+public class SmsbMessageGroupMemberServiceImpl extends ServiceImpl<SmsbMessageGroupMemberMapper, SmsbMessageGroupMemberDO> implements SmsbMessageGroupMemberService {
+
+    @DubboReference
+    private SmsbDepartmentUserService smsbDepartmentUserService;
+
+    @DubboReference
+    private KeycloakService keycloakService;
+
+    @Override
+    public Response pageByGroupId(SmsbMessageGroupQuery query) {
+        Page<SmsbMessageGroupMemberDO> page = new Page<>(query.getPageIndex(), query.getPageSize());
+        LambdaQueryWrapper<SmsbMessageGroupMemberDO> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper
+            .eq(Objects.nonNull(query.getGroupId()), SmsbMessageGroupMemberDO::getGroupId, query.getGroupId())
+            .eq(Objects.nonNull(query.getRecipientType()), SmsbMessageGroupMemberDO::getRecipientType, query.getRecipientType())
+            .orderByAsc(SmsbMessageGroupMemberDO::getRecipientType);
+        page = this.page(page, queryWrapper);
+
+        // 根据主表id,获取用户表的keycloak user_id,name和userName,email和phone
+        List<Long> departmentUserIds = page.getRecords().stream().map(SmsbMessageGroupMemberDO::getDepartmentUserId).distinct().collect(Collectors.toList());
+        List<SmsbMessageMemberCO> smsbMessageMemberCOS = smsbDepartmentUserService.listByIds(departmentUserIds);
+        List<String> userIds = smsbMessageMemberCOS.stream().map(SmsbMessageMemberCO::getUserId).distinct().collect(Collectors.toList());
+        Map<String, KeycloakUserCO> userMap = keycloakService.getUsersByIds(userIds).stream().collect(Collectors.toMap(KeycloakUserCO::getId,user -> user));
+        Map<Long, SmsbMessageGroupMemberDO> memberMap = page.getRecords().stream().collect(Collectors.toMap(SmsbMessageGroupMemberDO::getDepartmentUserId,
+            t -> t));
+
+        // 封装数据
+        smsbMessageMemberCOS.forEach(member -> {
+            KeycloakUserCO keycloakUser = userMap.get(member.getUserId());
+            member.setEmail(Objects.nonNull(keycloakUser) ? keycloakUser.getEmail() : null);
+            member.setPhone(Objects.nonNull(keycloakUser) ? keycloakUser.getPhone() : null);
+            member.setRecipientType(memberMap.get(member.getId()).getRecipientType());
+            member.setEnabled(memberMap.get(member.getId()).getEnabled());
+        });
+
+        return PageResponse.of(smsbMessageMemberCOS, (int) page.getTotal(), (int) page.getSize(), (int) page.getCurrent());
+    }
+
+    @Override
+    public Response addMember(SmsbMessageMemberAddDto addDto) {
+        List<Long> addDepartmentUserIds = addDto.getIdList();
+
+        // 查询当前group下的所有用户,移除掉重复部分,避免重复新增
+        List<Long> curIds = lambdaQuery()
+            .eq(SmsbMessageGroupMemberDO::getGroupId, addDto.getGroupId())
+            .list()
+            .stream()
+            .map(SmsbMessageGroupMemberDO::getDepartmentUserId)
+            .collect(Collectors.toList());
+        addDepartmentUserIds.removeAll(curIds);
+        LocalDateTime now = LocalDateTime.now();
+
+        List<SmsbMessageGroupMemberDO> addList = new ArrayList<>();
+        addDepartmentUserIds.forEach(departmentUserId -> {
+            SmsbMessageGroupMemberDO memberDO = new SmsbMessageGroupMemberDO();
+            memberDO.setId(null);
+            memberDO.setGroupId(addDto.getGroupId());
+            memberDO.setUserType(1);
+            memberDO.setDepartmentUserId(departmentUserId);
+            memberDO.setEnabled(1);
+            memberDO.setRecipientType(addDto.getRecipientType());
+            memberDO.setCreateBy(addDto.getCreateBy());
+            memberDO.setCreateUser(addDto.getCreateUser());
+            memberDO.setCreateTime(now);
+            memberDO.setUpdateTime(now);
+            addList.add(memberDO);
+        });
+        this.saveBatch(addList);
+
+        return Response.buildSuccess();
+    }
+
+    @Override
+    public Response updateByDepartmentUserId(SmsbMessageMemberUpdateDto updateDto) {
+        boolean update = this.update(new LambdaUpdateWrapper<SmsbMessageGroupMemberDO>()
+            .eq(SmsbMessageGroupMemberDO::getDepartmentUserId, updateDto.getDepartmentUserId())
+            .eq(SmsbMessageGroupMemberDO::getGroupId, updateDto.getGroupId())
+            .set(SmsbMessageGroupMemberDO::getEnabled, updateDto.getEnabled())
+            .set(SmsbMessageGroupMemberDO::getRecipientType, updateDto.getRecipientType())
+            .set(SmsbMessageGroupMemberDO::getUpdateTime, LocalDateTime.now()));
+
+        return update ? Response.buildSuccess() : Response.buildFailure("400", "更新失败");
+    }
+
+
+    public Response deleteByDepartmentUserIds(SmsbMessageMemberUpdateDto updateDto) {
+        boolean success = this.remove(new LambdaUpdateWrapper<SmsbMessageGroupMemberDO>()
+            .eq(SmsbMessageGroupMemberDO::getGroupId, updateDto.getGroupId())
+            .in(SmsbMessageGroupMemberDO::getDepartmentUserId, updateDto.getDepartmentUserIds()));
+        return success ? Response.buildSuccess() : Response.buildFailure("400","删除失败");
+    }
+
+}

+ 87 - 0
smsb-customer-manager-app/src/main/java/com/inspur/customer/service/org/SmsbMessageGroupServiceImpl.java

@@ -0,0 +1,87 @@
+package com.inspur.customer.service.org;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.Response;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.inspur.customer.client.org.SmsbMessageGroupService;
+import com.inspur.customer.infrastructure.mapper.org.SmsbMessageGroupMapper;
+import com.inspur.customer.infrastructure.object.org.SmsbMessageGroupDO;
+import com.inspur.customer.object.org.SmsbMessageGroupDto;
+import com.inspur.customer.object.org.SmsbMessageGroupQuery;
+import com.inspur.customer.utils.BeanCopyUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.springframework.util.CollectionUtils;
+
+import java.time.LocalDateTime;
+import java.util.Objects;
+
+/**
+ * @author fantingwei
+ * @date 2024/6/17
+ */
+@Slf4j
+@DubboService(interfaceClass = SmsbMessageGroupService.class)
+public class SmsbMessageGroupServiceImpl extends ServiceImpl<SmsbMessageGroupMapper, SmsbMessageGroupDO> implements SmsbMessageGroupService {
+
+
+    @Override
+    public Response add(SmsbMessageGroupDto smsbMessageGroupDto) {
+        // 组名校验、组名重复校验
+        if (Objects.isNull(smsbMessageGroupDto.getGroupName())) {
+            return Response.buildFailure("400","组名不能为空");
+        }
+        SmsbMessageGroupDO duplicateDO = this.lambdaQuery().eq(SmsbMessageGroupDO::getGroupName, smsbMessageGroupDto.getGroupName()).one();
+        if (Objects.nonNull(duplicateDO)) {
+            return Response.buildFailure("400", "组名重复");
+        }
+
+        SmsbMessageGroupDO smsbMessageGroupDO = BeanCopyUtils.copy(smsbMessageGroupDto, SmsbMessageGroupDO.class);
+        LocalDateTime now = LocalDateTime.now();
+        smsbMessageGroupDO.setCreateTime(now);
+        smsbMessageGroupDO.setUpdateTime(now);
+        super.save(smsbMessageGroupDO);
+
+        return Response.buildSuccess();
+    }
+
+    @Override
+    public Response delete(Long id) {
+        this.removeById(id);
+        return Response.buildSuccess();
+    }
+
+    @Override
+    public Response updateStatus(SmsbMessageGroupDto smsbMessageGroupDto) {
+        this.update(new LambdaUpdateWrapper<>(SmsbMessageGroupDO.class)
+            .set(Objects.nonNull(smsbMessageGroupDto.getEnabled()), SmsbMessageGroupDO::getEnabled, smsbMessageGroupDto.getEnabled())
+            .set(Objects.nonNull(smsbMessageGroupDto.getGroupName()), SmsbMessageGroupDO::getGroupName, smsbMessageGroupDto.getGroupName())
+            .set(Objects.nonNull(smsbMessageGroupDto.getInformLevel()), SmsbMessageGroupDO::getInformLevel, smsbMessageGroupDto.getInformLevel())
+            .set(Objects.nonNull(smsbMessageGroupDto.getInformType()), SmsbMessageGroupDO::getInformType,
+                CollectionUtils.isEmpty(smsbMessageGroupDto.getInformType()) ? null : JSONObject.toJSONString(smsbMessageGroupDto.getInformType()))
+            .set(SmsbMessageGroupDO::getUpdateTime,LocalDateTime.now())
+            .eq(SmsbMessageGroupDO::getId,smsbMessageGroupDto.getId()));
+        return Response.buildSuccess();
+    }
+
+    @Override
+    public Response pq(SmsbMessageGroupQuery query) {
+        Page<SmsbMessageGroupDO> page = new Page<>(query.getPageIndex(), query.getPageSize());
+        LambdaQueryWrapper<SmsbMessageGroupDO> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper
+            .like(StringUtils.isNotBlank(query.getGroupName()), SmsbMessageGroupDO::getGroupName, query.getGroupName())
+            .eq(Objects.nonNull(query.getEnabled()), SmsbMessageGroupDO::getEnabled, query.getEnabled())
+            .eq(Objects.nonNull(query.getTenant()), SmsbMessageGroupDO::getTenant, query.getTenant())
+            .orderByDesc(SmsbMessageGroupDO::getUpdateTime);
+
+        page = this.page(page, queryWrapper);
+
+        return PageResponse.of(page.getRecords(), (int) page.getTotal(), (int) page.getSize(), (int) page.getCurrent());
+    }
+
+}

+ 8 - 4
smsb-customer-manager-app/src/main/java/com/inspur/customer/service/tenant/TenantExceptionInformStrategyServiceImpl.java

@@ -66,7 +66,8 @@ public class TenantExceptionInformStrategyServiceImpl extends ServiceImpl<Tenant
     }
 
     /**
-     * change to co
+     * informStrategyCo包含一个异常通知map,key为通知等级(提示性、中级、紧急、租户、部门、单一通知、单一邮件)等预警,value为对应的通知策略
+     * 即要通知note?email?wechat?wechatApplet?等
      * @param informStrategyDo do
      * @return co
      */
@@ -85,9 +86,12 @@ public class TenantExceptionInformStrategyServiceImpl extends ServiceImpl<Tenant
     }
 
     /**
-     * if user didn't set strategy, return default one
-     * @param tenant tenant identifier
-     * @return strategy
+     * 如果租户没有通知策略,则设置默认的通知策略
+     * new ExceptionInformStrategyCmd(1) 为note通知
+     * new ExceptionInformStrategyCmd(2) 为email通知
+     * new ExceptionInformStrategyCmd(4) 为weChat通知
+     * new ExceptionInformStrategyCmd(8) 为weChatApplet通知
+     * new ExceptionInformStrategyCmd(15) 为全部通知
      */
     private TenantExceptionInformStrategyCO getDefaultStrategy(String tenant) {
         log.info("get default strategy");

+ 21 - 4
smsb-customer-manager-app/src/main/java/com/inspur/customer/service/tenant/UserInformServiceImpl.java

@@ -1,16 +1,15 @@
 package com.inspur.customer.service.tenant;
 
-import com.alibaba.cola.exception.BizException;
 import com.inspur.customer.client.keycloak.KeycloakService;
 import com.inspur.customer.client.org.SmsbDepartmentUserService;
 import com.inspur.customer.client.tenant.TenantExceptionInformStrategyService;
 import com.inspur.customer.client.tenant.UserInformService;
 import com.inspur.customer.context.inform.InformLevelEnum;
 import com.inspur.customer.context.inform.InformTypeEnum;
-import com.inspur.customer.object.org.SmsbSimpleUserCO;
-import com.inspur.customer.object.tenant.InformAddresseeCO;
 import com.inspur.customer.object.keycloak.KeycloakUserCO;
+import com.inspur.customer.object.org.SmsbSimpleUserCO;
 import com.inspur.customer.object.tenant.ExceptionInformStrategyCmd;
+import com.inspur.customer.object.tenant.InformAddresseeCO;
 import com.inspur.customer.object.tenant.TenantExceptionInformStrategyCO;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
@@ -38,9 +37,19 @@ public class UserInformServiceImpl implements UserInformService {
     @DubboReference
     private TenantExceptionInformStrategyService tenantExceptionInformStrategyService;
 
+    /**
+     * 三个地方引用,其中1个是AI审核的,1个是测试的,最后一个预警策略的,只关注最后一项即可。
+     * @param userId null
+     * @param tenant 租户
+     * @param org 设备涉及的部门
+     * @param informLevel 预警通知等级
+     * @param errorId 错误枚举类id
+     * @return InformAddresseeCO,包含用户keycloak通知信息,当前通知策略
+     */
     @Override
     public InformAddresseeCO getInformAddresseesByInformLevel(@Nullable String userId, String tenant, @Nullable List<String> org, InformLevelEnum informLevel, int errorId) {
-        // get base user
+        // 1、获取通知策略,即要给哪些设备发消息;2、获取通知人,即要给谁发消息
+        // userId -> null, tenant -> "msr", orgs -> null, informLevel -> TENANT(3, "租户管理级别"), errorId -> -99
         List<KeycloakUserCO> users = new ArrayList<>();
         InformAddresseeCO informAddressee = new InformAddresseeCO();
         if (userId != null) {
@@ -48,7 +57,9 @@ public class UserInformServiceImpl implements UserInformService {
         }
         // get and set inform strategy
         log.info("tenant: {}", tenant);
+        // 获取租户通知策略,里面有租户通知策略map,key为等级,value为用什么方式通知
         TenantExceptionInformStrategyCO informStrategy = tenantExceptionInformStrategyService.getTenantInformStrategyCache(tenant);
+        // 根据通知等级,获取配置中通知的方式(目前驿站屏提示性、中级、紧急预警都开启了邮件预警,这里不用管)
         informAddressee.setInformStrategy(informStrategy.getInformStrategy(String.valueOf(informLevel.getId())));
         // get additional user,代码注销,暂不处理超管用户
         /*switch (informLevel) {
@@ -76,17 +87,22 @@ public class UserInformServiceImpl implements UserInformService {
         }*/
 
         log.debug("users:{},org:{}", users , org);
+        // 根据租户,该部门及其所有父部门路径,通知等级,错误枚举值进行筛选,找到要通知的用户
         List<SmsbSimpleUserCO> orgUserList = departmentUserService.listUserByInformLevel(tenant, org, informLevel.getId() , errorId);
         List<String> existedUserIdList = users.stream().map(KeycloakUserCO::getId).collect(Collectors.toList());
         List<String> orgUserIdList = orgUserList.stream().map(SmsbSimpleUserCO::getUserId).distinct().collect(Collectors.toList());
         orgUserIdList.removeAll(existedUserIdList);
+        // 通知的用户log打印,这里打印的是所有要通知的用户的userId
         log.debug("orgUserIdList:{}", orgUserIdList);
         if (!CollectionUtils.isEmpty(orgUserIdList)) {
+            // 如果要通知的用户不为空,获取用户在keycloak上的wechat、手机、app等消息,设置到user字段中
             List<KeycloakUserCO> orgKeyCloakUserList = keycloakService.getUsersByIds(orgUserIdList);
             log.debug("orgKeyCloakUserList:{}", orgKeyCloakUserList);
             users.addAll(orgKeyCloakUserList);
         }
 
+        // TODO:informAddressee这里加驿站屏收件人、抄送人
+
 
         informAddressee.setUsers(users);
         return informAddressee;
@@ -95,6 +111,7 @@ public class UserInformServiceImpl implements UserInformService {
     @Override
     public InformAddresseeCO getInformAddresseesByInformType(@Nullable String userId, String tenant, @Nullable List<String> orgs, InformTypeEnum informType) {
         // todo errorId为用户自定义勾选预警,接收指定预警信息
+        // userId -> null, tenant -> "msr", orgs -> null, informType -> AI_AUDIT_CREDIT_INSUFFICIENT_WARN
         return getInformAddresseesByInformLevel(userId, tenant, orgs, informType.getLevel() , -99);
     }
 

+ 1 - 2
smsb-customer-manager-client/src/main/java/com/inspur/customer/client/org/SmsbDepartmentService.java

@@ -138,8 +138,7 @@ public interface SmsbDepartmentService {
     SingleResponse<SmsbDepartmentCO> getDepartmentByPath(String tenant, String departmentPath);
 
     /**
-     * 冒泡获取上级部门列表
-     *
+     * 递归获取租户下该部门以及该部门所有父部门的所有path
      * @param orgs
      * @param tenant
      * @return

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

@@ -142,4 +142,15 @@ public interface SmsbDepartmentUserService {
      * 用户租户迁移
      */
     Response tenantTransfer(SmsbUserTenantTransferDto transferDto);
+
+    /**
+     * 分页查询安播云所有用户
+     */
+    Response pq(SmsbDepartmentCmd smsbDepartmentCmd);
+
+    /**
+     * 根据主键idList获取用户数据
+     * @param ids 主键idList
+     */
+    List<SmsbMessageMemberCO> listByIds(List<Long> ids);
 }

+ 35 - 0
smsb-customer-manager-client/src/main/java/com/inspur/customer/client/org/SmsbMessageGroupMemberService.java

@@ -0,0 +1,35 @@
+package com.inspur.customer.client.org;
+
+import com.alibaba.cola.dto.Response;
+import com.inspur.customer.object.org.SmsbMessageGroupQuery;
+import com.inspur.customer.object.org.SmsbMessageMemberAddDto;
+import com.inspur.customer.object.org.SmsbMessageMemberUpdateDto;
+
+/**
+ * @author fantingwei
+ * @date 2024/6/17
+ */
+public interface SmsbMessageGroupMemberService {
+
+    /**
+     * 根据分组id分页查询该分组下的所有用户信息
+     * @param groupId 分组id
+     */
+    Response pageByGroupId(SmsbMessageGroupQuery query);
+
+    /**
+     * 新增groupMember,根据groupId和userIds
+     */
+    Response addMember(SmsbMessageMemberAddDto addDto);
+
+    /**
+     * 根据smsb_department_user主表id、分组id,修改主抄送类型,启用状态
+     */
+    Response updateByDepartmentUserId(SmsbMessageMemberUpdateDto updateDto);
+
+    /**
+     * 根据smsb_department_user主表id集合、分组id,删除成员
+     */
+    Response deleteByDepartmentUserIds(SmsbMessageMemberUpdateDto updateDto);
+
+}

+ 32 - 0
smsb-customer-manager-client/src/main/java/com/inspur/customer/client/org/SmsbMessageGroupService.java

@@ -0,0 +1,32 @@
+package com.inspur.customer.client.org;
+
+import com.alibaba.cola.dto.Response;
+import com.inspur.customer.object.org.SmsbMessageGroupDto;
+import com.inspur.customer.object.org.SmsbMessageGroupQuery;
+
+/**
+ * @author fantingwei
+ * @date 2024/6/17
+ */
+public interface SmsbMessageGroupService {
+
+    /**
+     * 新增消息分组
+     */
+    Response add(SmsbMessageGroupDto smsbMessageGroupDto);
+
+    /**
+     * 根据主表id删除记录
+     */
+    Response delete(Long id);
+
+    /**
+     * 根据主键id,修改分组数据
+     */
+    Response updateStatus(SmsbMessageGroupDto smsbMessageGroupDto);
+
+    /**
+     * 分页查询
+     */
+    Response pq(SmsbMessageGroupQuery query);
+}

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

@@ -36,6 +36,16 @@ public class SmsbDepartmentCmd extends PageQuery {
      */
     private Integer recursive;
 
+    /**
+     * 使用者名称
+     */
+    private String name;
+
+    /**
+     * 账号名称
+     */
+    private String userName;
+
     public Integer getRecursive(){
         return Objects.nonNull(this.recursive)?this.recursive:0;
     }

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

@@ -0,0 +1,52 @@
+package com.inspur.customer.object.org;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author fantingwei
+ * @date 2024/6/17
+ */
+@Data
+public class SmsbMessageGroupDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 分组主键id
+     */
+    private Long id;
+
+    /**
+     * 消息组名称
+     */
+    private String groupName;
+
+    /**
+     * 消息组接收的通知等级
+     */
+    private Integer informLevel;
+
+
+    /**
+     * 消息组接收的通知枚举类
+     */
+    private List<Integer> informType;
+
+    /**
+     * 消息组状态
+     * 0:禁用
+     * 1:启用
+     */
+    private Integer enabled;
+
+    private String createBy;
+
+    private String createUser;
+
+    /**
+     * 租户
+     */
+    private String tenant;
+}

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

@@ -0,0 +1,74 @@
+package com.inspur.customer.object.org;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author fantingwei
+ * @date 2024/6/17
+ */
+@Data
+public class SmsbMessageGroupMemberDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    /**
+     * smsb_message_group表id
+     */
+    private Long groupId;
+
+    /**
+     * 用户类型
+     * 1:安播云用户
+     * 2:自定义用户
+     */
+    private Integer userType;
+
+    /**
+     * smsb_department_user表id
+     */
+    private Long departmentUserId;
+
+
+    // --------------------- 若是安播云用户(即departmentUserId不为空),则如下字段为空 ---------------------
+    /**
+     * 用户启停用状态
+     * 0:禁用
+     * 1:启用
+     */
+    private Integer enabled;
+
+    /**
+     * 账号名称
+     */
+    private String userName;
+
+    /**
+     * 使用者名称
+     */
+    private String name;
+
+    /**
+     * 使用者手机号
+     */
+    private String phone;
+
+    /**
+     * 使用者邮箱
+     */
+    private String email;
+    // --------------------------------------------------------------------------------------------
+
+    /**
+     * 主送、抄送状态
+     * 1:主送
+     * 2:抄送
+     */
+    private Integer recipientType;
+
+    private String createBy;
+
+    private String createUser;
+}

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

@@ -0,0 +1,44 @@
+package com.inspur.customer.object.org;
+
+import com.alibaba.cola.dto.PageQuery;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author fantingwei
+ * @date 2024/6/17
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class SmsbMessageGroupQuery extends PageQuery {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 分组id
+     */
+    private Long groupId;
+
+    /**
+     * 消息组名称
+     */
+    private String groupName;
+
+    /**
+     * 主抄送状态
+     * 1-主送 2-抄送
+     */
+    private Integer recipientType;
+
+    /**
+     * 消息组状态
+     * 0:禁用
+     * 1:启用
+     */
+    private Integer enabled;
+
+    /**
+     * 租户
+     */
+    private String tenant;
+
+}

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

@@ -0,0 +1,39 @@
+package com.inspur.customer.object.org;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Author fantingwei
+ * @Date 2024/6/17 11:22
+ */
+@Data
+public class SmsbMessageMemberAddDto implements Serializable {
+    private static final long serialVersionUID = -514586097597178413L;
+
+    /**
+     * 分组id
+     */
+    private Long groupId;
+
+    /**
+     * 账号表主表idList
+     */
+    private List<Long> idList;
+
+    /**
+     * 主送、抄送状态,1-主送,2-抄送
+     */
+    private Integer recipientType;
+
+    /**
+     * 用户类型 1-安播云用户 2-自定义用户
+     */
+    private Integer userType;
+
+    private String createBy;
+
+    private String createUser;
+}

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

@@ -0,0 +1,54 @@
+package com.inspur.customer.object.org;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @Author fantingwei
+ * @Date 2024/6/17 11:22
+ */
+@Data
+public class SmsbMessageMemberCO implements Serializable {
+    private static final long serialVersionUID = -514586097597178413L;
+
+    /**
+     * smsb_department_user用户主表id
+     */
+    private Long id;
+
+    /**
+     * 用户 keycloak id
+     */
+    private String userId;
+
+    /**
+     * 账号名称
+     */
+    private String userName;
+
+    /**
+     * 使用者名称
+     */
+    private String name;
+
+    /**
+     * 手机号
+     */
+    private String phone;
+
+    /**
+     * 邮箱
+     */
+    private String email;
+
+    /**
+     * 主送、抄送类型
+     */
+    private Integer recipientType;
+
+    /**
+     * 用户启停用状态
+     */
+    private Integer enabled;
+}

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

@@ -0,0 +1,40 @@
+package com.inspur.customer.object.org;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Author fantingwei
+ * @Date 2024/6/17 11:22
+ */
+@Data
+public class SmsbMessageMemberUpdateDto implements Serializable {
+    private static final long serialVersionUID = -514586097597178413L;
+
+    /**
+     * 分组id
+     */
+    private Long groupId;
+
+    /**
+     * 安播云用户id
+     */
+    private Long departmentUserId;
+
+    /**
+     * 用户启停用状态,0-禁用 1-启用
+     */
+    private Integer enabled;
+
+    /**
+     * 主送、抄送状态,1-主送,2-抄送
+     */
+    private Integer recipientType;
+
+    /**
+     * 安播云用户idList
+     */
+    private List<Long> departmentUserIds;
+}

+ 14 - 0
smsb-customer-manager-infrastructure/src/main/java/com/inspur/customer/infrastructure/mapper/org/SmsbMessageGroupMapper.java

@@ -0,0 +1,14 @@
+package com.inspur.customer.infrastructure.mapper.org;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.inspur.customer.infrastructure.object.org.SmsbMessageGroupDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @Author fantingwei
+ * @Date 2024/6/17 10:22
+ */
+@Mapper
+public interface SmsbMessageGroupMapper extends BaseMapper<SmsbMessageGroupDO> {
+
+}

+ 14 - 0
smsb-customer-manager-infrastructure/src/main/java/com/inspur/customer/infrastructure/mapper/org/SmsbMessageGroupMemberMapper.java

@@ -0,0 +1,14 @@
+package com.inspur.customer.infrastructure.mapper.org;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.inspur.customer.infrastructure.object.org.SmsbMessageGroupMemberDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @Author fantingwei
+ * @Date 2024/6/17 10:22
+ */
+@Mapper
+public interface SmsbMessageGroupMemberMapper extends BaseMapper<SmsbMessageGroupMemberDO> {
+
+}

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

@@ -0,0 +1,76 @@
+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 fantingwei
+ * @Date 2024/6/17 10:20
+ */
+@Data
+@TableName("smsb_message_group")
+public class SmsbMessageGroupDO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId
+    private Long id;
+
+    /**
+     * 消息组名称
+     */
+    @TableField("group_name")
+    private String groupName;
+
+    /**
+     * 消息组接收的通知等级
+     */
+    @TableField("inform_level")
+    private Integer informLevel;
+
+
+    /**
+     * 消息组接收的通知枚举类
+     */
+    @TableField("inform_type")
+    private String informType;
+
+    /**
+     * 消息组状态
+     * 0:禁用
+     * 1:启用
+     */
+    @TableField("enabled")
+    private Integer enabled;
+
+    @TableField("create_by")
+    private String createBy;
+
+    @TableField("create_user")
+    private String createUser;
+
+    @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;
+
+
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    /**
+     * 租户
+     */
+    @TableField("tenant")
+    private String tenant;
+}

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

@@ -0,0 +1,107 @@
+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 fantingwei
+ * @Date 2024/6/17 10:20
+ */
+@Data
+@TableName("smsb_message_group_member")
+public class SmsbMessageGroupMemberDO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId
+    private Long id;
+
+    /**
+     * smsb_message_group表id
+     */
+    @TableField("group_id")
+    private Long groupId;
+
+    /**
+     * 用户类型
+     * 1:安播云用户
+     * 2:自定义用户
+     */
+    @TableField("user_type")
+    private Integer userType;
+
+    /**
+     * smsb_department_user表id
+     */
+    @TableField("smsb_department_user_id")
+    private Long departmentUserId;
+
+
+    // --------------------- 若是安播云用户(即departmentUserId不为空),则如下字段为空 ---------------------
+    /**
+     * 用户启停用状态
+     * 0:禁用
+     * 1:启用
+     */
+    @TableField("enabled")
+    private Integer enabled;
+
+    /**
+     * 账号名称
+     */
+    @TableField("user_name")
+    private String userName;
+
+    /**
+     * 使用者名称
+     */
+    @TableField("name")
+    private String name;
+
+    /**
+     * 使用者手机号
+     */
+    @TableField("phone")
+    private String phone;
+
+    /**
+     * 使用者邮箱
+     */
+    @TableField("email")
+    private String email;
+    // --------------------------------------------------------------------------------------------
+
+    /**
+     * 主送、抄送状态
+     * 1:主送
+     * 2:抄送
+     */
+    @TableField("recipient_type")
+    private Integer recipientType;
+
+    @TableField("create_by")
+    private String createBy;
+
+    @TableField("create_user")
+    private String createUser;
+
+    @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;
+
+
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+}

+ 5 - 0
smsb-customer-manager-infrastructure/src/main/resources/mapper/org/SmsbMessageGroupMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.inspur.customer.infrastructure.mapper.org.SmsbMessageGroupMapper">
+
+</mapper>

+ 5 - 0
smsb-customer-manager-infrastructure/src/main/resources/mapper/org/SmsbMessageGroupMemberMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.inspur.customer.infrastructure.mapper.org.SmsbMessageGroupMemberMapper">
+
+</mapper>