From a2d58d3dcc8f8e7c28c2105d382bd30e28685837 Mon Sep 17 00:00:00 2001 From: zhangchenbiao Date: Mon, 12 Jun 2023 16:42:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=BB=84=E7=BB=87=E6=9E=B6?= =?UTF-8?q?=E6=9E=84=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cool/store/constants/CommonConstants.java | 2 + .../com/cool/store/enums/FSEventTypeEnum.java | 59 ++++++++++++ .../cool/store/dao/EnterpriseUserRoleDAO.java | 11 ++- .../java/com/cool/store/dao/RegionDAO.java | 12 +++ .../java/com/cool/store/dao/SysRoleDAO.java | 7 ++ .../cool/store/dao/UserRegionMappingDAO.java | 14 +++ .../mapper/EnterpriseUserRoleMapper.java | 4 +- .../com/cool/store/mapper/RegionMapper.java | 13 +++ .../com/cool/store/mapper/SysRoleMapper.java | 7 ++ .../store/mapper/UserRegionMappingMapper.java | 14 +++ .../mapper/EnterpriseUserRoleMapper.xml | 20 +++- .../main/resources/mapper/RegionMapper.xml | 19 ++++ .../main/resources/mapper/SysRoleMapper.xml | 11 ++- .../mapper/UserRegionMappingMapper.xml | 13 ++- .../cool/store/dto/buser/UserEventDTO.java | 24 +++++ .../dto/enterprise/EnterpriseUserDTO.java | 37 +++++++- .../dto/enterprise/SysDepartmentDTO.java | 2 +- .../store/entity/EnterpriseUserRoleDO.java | 7 +- .../store/entity/UserRegionMappingDO.java | 19 ++++ .../store/vo/region/RegionBaseInfoVO.java | 64 +++++++++++++ .../store/mq/consumer/ConsumerClient.java | 8 +- .../listener/UserEventDealListener.java | 58 +++++++++++ .../store/service/EnterpriseSyncService.java | 8 ++ .../com/cool/store/service/RegionService.java | 10 ++ .../impl/EnterpriseSyncServiceImpl.java | 95 ++++++++++++++++--- .../store/service/impl/RegionServiceImpl.java | 13 ++- .../store/controller/RegionController.java | 35 +++++++ 27 files changed, 552 insertions(+), 34 deletions(-) create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/FSEventTypeEnum.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/buser/UserEventDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/region/RegionBaseInfoVO.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/UserEventDealListener.java create mode 100644 coolstore-partner-webb/src/main/java/com/cool/store/controller/RegionController.java diff --git a/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java b/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java index 8e64736e5..6d21d40ea 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java @@ -22,6 +22,8 @@ public class CommonConstants { public static final int THREE_DAY_SECONDS = 60*60*24*3; + public static final int NORMAL_LOCK_TIMES = 60 * 1000; + /** * 企业开通锁存活时间 */ diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/FSEventTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/FSEventTypeEnum.java new file mode 100644 index 000000000..4480d4065 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/FSEventTypeEnum.java @@ -0,0 +1,59 @@ +package com.cool.store.enums; + +import java.util.Arrays; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @author Admin + * @ClassName FsEventTypeEnum + * @Description fs的事件类型 + */ +public enum FSEventTypeEnum { + + // + USER_CREATED("contact.user.created_v3","员工入职"), + USER_DELETED("contact.user.deleted_v3", "员工离职"), + USER_UPDATED("contact.user.updated_v3", "员工信息被修改"), + + DEPARTMENT_CREATED("contact.department.created_v3", "部门被创建"), + DEPARTMENT_UPDATED("contact.department.updated_v3", "部门信息被修改"), + DEPARTMENT_DELETED("contact.department.deleted_v3", "部门被删除"), + + APP_OPEN("app_open", "首次启用应用"), + APP_STATUS_CHANGE("app_status_change", "应用停启用"), + APP_TICKET("app_ticket", "app_ticket 事件"), + APP_UNINSTALLED("app_uninstalled", "应用卸载"), + + CONTACT_SCOPE_UPDATE("contact.scope.updated_v3", "通讯录范围权限被更新"), + ORDER_PAID("order_paid", "应用商店应用购买"), + ; + + + private final String value; + private final String remark; + + private static final Map map = Arrays.stream(values()).collect(Collectors.toMap(FSEventTypeEnum::getValue, Function.identity())); + + FSEventTypeEnum(String value, String remark) { + this.value = value; + this.remark = remark; + } + + public String getValue() { + return value; + } + + public static FSEventTypeEnum parseValue(String value) { + return map.get(value); + } + + public static boolean isUserEvent(String eventType){ + return FSEventTypeEnum.USER_CREATED.getValue().equals(eventType) || FSEventTypeEnum.USER_UPDATED.getValue().equals(eventType) || FSEventTypeEnum.USER_DELETED.getValue().equals(eventType); + } + + public static boolean isDepartmentEvent(String eventType){ + return FSEventTypeEnum.DEPARTMENT_CREATED.getValue().equals(eventType) || FSEventTypeEnum.DEPARTMENT_UPDATED.getValue().equals(eventType) || FSEventTypeEnum.DEPARTMENT_DELETED.getValue().equals(eventType); + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/EnterpriseUserRoleDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/EnterpriseUserRoleDAO.java index 82c64fb20..ef66e197f 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/EnterpriseUserRoleDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/EnterpriseUserRoleDAO.java @@ -29,11 +29,18 @@ public class EnterpriseUserRoleDAO { return enterpriseUserRoleMapper.batchInsertOrUpdate(recordList); } - public Integer deleteUserRole(String roleId, DataSourceEnum dataSourceEnum, List userIds){ + public Integer deleteRoleInUser(String roleId, DataSourceEnum dataSourceEnum, List excludeUserIds){ if(StringUtils.isBlank(roleId) || Objects.isNull(dataSourceEnum)){ return null; } - return enterpriseUserRoleMapper.deleteUserRole(roleId, dataSourceEnum.getCode(), userIds); + return enterpriseUserRoleMapper.deleteRoleInUser(roleId, dataSourceEnum.getCode(), excludeUserIds); + } + + public Integer deleteUserInRole(String userId, DataSourceEnum dataSourceEnum, String excludeRoleId){ + if(StringUtils.isAnyBlank(userId, excludeRoleId) || Objects.isNull(dataSourceEnum)){ + return null; + } + return enterpriseUserRoleMapper.deleteUserInRole(userId, dataSourceEnum.getCode(), excludeRoleId); } } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/RegionDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/RegionDAO.java index 79197a5f8..d14b16cd1 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/RegionDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/RegionDAO.java @@ -3,6 +3,7 @@ package com.cool.store.dao; import com.cool.store.constants.CommonConstants; import com.cool.store.entity.RegionDO; import com.cool.store.mapper.RegionMapper; +import com.google.common.collect.Lists; import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Repository; @@ -37,4 +38,15 @@ public class RegionDAO { return regionMapper.deleteNotExistRegion(regionIds); } + public List getRegionByRegionIds(List regionIds){ + if(CollectionUtils.isEmpty(regionIds)){ + return Lists.newArrayList(); + } + return regionMapper.getRegionByRegionIds(regionIds); + } + + public List getRegionBaseInfoList(){ + return regionMapper.getRegionBaseInfoList(); + } + } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/SysRoleDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/SysRoleDAO.java index 024fa9975..8712fb554 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/SysRoleDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/SysRoleDAO.java @@ -43,4 +43,11 @@ public class SysRoleDAO { } return sysRoleMapper.getHighestPriorityRoleByUserId(userId); } + + public SysRoleDO getRoleByName(String roleName, DataSourceEnum dataSource){ + if(StringUtils.isBlank(roleName) || Objects.isNull(dataSource)){ + return null; + } + return sysRoleMapper.getRoleByName(roleName, dataSource.getCode()); + } } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/UserRegionMappingDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/UserRegionMappingDAO.java index e563c3b73..e2ae97cba 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/UserRegionMappingDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/UserRegionMappingDAO.java @@ -37,4 +37,18 @@ public class UserRegionMappingDAO { return userRegionMappingMapper.deleteUserRegion(regionId, dataSourceEnum.getCode(), excludeUserIds); } + public Integer deleteRegionUserByExcludeRegionIds(List excludeRegionIds){ + if(CollectionUtils.isEmpty(excludeRegionIds)){ + return null; + } + return userRegionMappingMapper.deleteRegionUserByExcludeRegionIds(excludeRegionIds); + } + + public Integer deleteRegionUserByExcludeUserIds(List excludeUserIds){ + if(CollectionUtils.isEmpty(excludeUserIds)){ + return null; + } + return userRegionMappingMapper.deleteRegionUserByExcludeUserIds(excludeUserIds); + } + } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseUserRoleMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseUserRoleMapper.java index e253b42fe..5895576c5 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseUserRoleMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseUserRoleMapper.java @@ -32,5 +32,7 @@ public interface EnterpriseUserRoleMapper { * @param userIds * @return */ - int deleteUserRole(@Param("roleId") String roleId, @Param("type") Integer type, @Param("userIds") List userIds); + int deleteRoleInUser(@Param("roleId") String roleId, @Param("type") Integer type, @Param("excludeUserIds") List excludeUserIds); + + int deleteUserInRole(@Param("userId") String userId, @Param("type") Integer type, @Param("excludeRoleId") String excludeRoleId); } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/RegionMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/RegionMapper.java index 05ed9c199..cb3abf312 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/RegionMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/RegionMapper.java @@ -31,4 +31,17 @@ public interface RegionMapper { * @return */ int deleteNotExistRegion(@Param("regionIds")List regionIds); + + /** + * 根据regionIds获取region + * @param regionIds + * @return + */ + List getRegionByRegionIds(@Param("regionIds")List regionIds); + + /** + * 获取区域基本信息 + * @return + */ + List getRegionBaseInfoList(); } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/SysRoleMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/SysRoleMapper.java index 36c8cea0a..c9b66c2da 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/SysRoleMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/SysRoleMapper.java @@ -33,4 +33,11 @@ public interface SysRoleMapper { * @return */ SysRoleDO getHighestPriorityRoleByUserId(@Param("userId") String userId); + + /** + * 获取角色 + * @param roleName + * @return + */ + SysRoleDO getRoleByName(@Param("roleName") String roleName, @Param("roleType")Integer roleType); } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/UserRegionMappingMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/UserRegionMappingMapper.java index e202d6ebb..fc0b95166 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/UserRegionMappingMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/UserRegionMappingMapper.java @@ -33,4 +33,18 @@ public interface UserRegionMappingMapper { * @return */ int deleteUserRegion(@Param("regionId") String regionId, @Param("type")Integer type, @Param("excludeUserIds") List excludeUserIds); + + /** + * 删除没有的部门映射关系 + * @param excludeRegionIds + * @return + */ + Integer deleteRegionUserByExcludeRegionIds(@Param("excludeRegionIds") List excludeRegionIds); + + /** + * 删除用户不在的区域 + * @param excludeUserIds + * @return + */ + Integer deleteRegionUserByExcludeUserIds(@Param("excludeUserIds") List excludeUserIds); } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserRoleMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserRoleMapper.xml index 96746e319..e65b44286 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserRoleMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserRoleMapper.xml @@ -5,12 +5,13 @@ + - id, role_id, user_id, deleted, create_time, update_time + id, role_id, user_id, type, deleted, create_time, update_time @@ -22,6 +23,9 @@ user_id, + + type, + deleted, @@ -39,6 +43,9 @@ #{record.userId}, + + #{record.type}, + #{record.deleted}, @@ -61,6 +68,9 @@ user_id = #{userId}, + + type = #{type}, + deleted = #{deleted}, @@ -74,7 +84,11 @@ where id = #{id} - - update enterprise_user_role set deleted = 1 where role_id = #{roleId} and user_id not in #{userId} + + update enterprise_user_role set deleted = 1 where role_id = #{roleId} and type = #{type} and user_id not in #{userId} + + + + update enterprise_user_role set deleted = 1 where role_id != #{roleId} and user_id = #{userId} and type = #{type} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/RegionMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/RegionMapper.xml index afa51f5cb..f9eb941e8 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/RegionMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/RegionMapper.xml @@ -158,4 +158,23 @@ update region set deleted = 1 , update_time = UNIX_TIMESTAMP() where region_id not in #{regionId} + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/SysRoleMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/SysRoleMapper.xml index a3abf7759..e0b189d5a 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/SysRoleMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/SysRoleMapper.xml @@ -126,7 +126,16 @@ from sys_role r inner join enterprise_user_role e on r.role_id = e.role_id where - e.user_id = #{userId} + e.user_id = #{userId} and r.deleted = 0 limit 1 + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/UserRegionMappingMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/UserRegionMappingMapper.xml index d163b4600..14e5b9fd1 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/UserRegionMappingMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/UserRegionMappingMapper.xml @@ -104,10 +104,19 @@ where id = #{id} - + update user_region_mapping set deleted = 1 where region_id = #{regionId} and type = #{type} and user_id not in #{userId} - + + + + update user_region_mapping set deleted = 1 where region_id not in #{regionId} + + + + update user_region_mapping set deleted = 1 where user_id not in #{userId} + + \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/buser/UserEventDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/buser/UserEventDTO.java new file mode 100644 index 000000000..ad912028d --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/buser/UserEventDTO.java @@ -0,0 +1,24 @@ +package com.cool.store.dto.buser; + +import lombok.Data; + +/** + * @author zhangchenbiao + * @FileName: UserEventDTO + * @Description: + * @date 2023-06-09 13:53 + */ +@Data +public class UserEventDTO { + + private String corpId; + + private String eventType; + + private String userId; + + private String openId; + + private String unionId; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/enterprise/EnterpriseUserDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/enterprise/EnterpriseUserDTO.java index 87902ad1e..98e7b8458 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/dto/enterprise/EnterpriseUserDTO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/enterprise/EnterpriseUserDTO.java @@ -93,7 +93,7 @@ public class EnterpriseUserDTO implements Serializable { private String openUserid; - @ApiModelProperty("") + @ApiModelProperty("用户所属部门") private List departmentLists; @@ -141,4 +141,39 @@ public class EnterpriseUserDTO implements Serializable { return resultList; } + + public static EnterpriseUserDO transUserDtoToDo(EnterpriseUserDTO user, Map regionPathMap, Multimap leaderDeptMap) { + EnterpriseUserDO enterpriseUserDO = new EnterpriseUserDO(); + enterpriseUserDO.setId(UUIDUtils.get32UUID()); + enterpriseUserDO.setUserId(user.getUserId()); + enterpriseUserDO.setName(user.getName()); + enterpriseUserDO.setRemark(user.getRemark()); + enterpriseUserDO.setMobile(user.getMobile()); + enterpriseUserDO.setEmail(user.getEmail()); + enterpriseUserDO.setOrgEmail(user.getOrgEmail()); + enterpriseUserDO.setMainAdmin(user.getMainAdmin()); + enterpriseUserDO.setIsAdmin(user.getIsAdmin()); + enterpriseUserDO.setUnionid(user.getUnionid()); + enterpriseUserDO.setAvatar(user.getAvatar()); + enterpriseUserDO.setJobnumber(user.getJobnumber()); + enterpriseUserDO.setUserStatus(UserStatusEnum.NORMAL.getCode()); + enterpriseUserDO.setIsLeader(Boolean.FALSE); + List departmentLists = user.getDepartmentLists(); + List regionPaths = new ArrayList<>(); + if(CollectionUtils.isNotEmpty(departmentLists)){ + for (String departmentId : departmentLists) { + regionPaths.add(regionPathMap.get(departmentId)); + } + } + Collection deptIds = leaderDeptMap.get(user.getUserId()); + if(CollectionUtils.isNotEmpty(deptIds)){ + enterpriseUserDO.setIsLeader(Boolean.TRUE); + enterpriseUserDO.setLeaderDeptIds(JSONObject.toJSONString(deptIds)); + } + enterpriseUserDO.setUserRegionIds(JSONObject.toJSONString(regionPaths)); + enterpriseUserDO.setDeleted(Boolean.FALSE); + enterpriseUserDO.setCreateTime(new Date()); + return enterpriseUserDO; + } + } \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/enterprise/SysDepartmentDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/enterprise/SysDepartmentDTO.java index d2c5a8bf0..45f2b8e8c 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/dto/enterprise/SysDepartmentDTO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/enterprise/SysDepartmentDTO.java @@ -217,7 +217,7 @@ public class SysDepartmentDTO { Collections.reverse(pathIds); String regionPath = CommonConstants.PATH_SPILT + String.join(CommonConstants.PATH_SPILT, pathIds) + CommonConstants.PATH_SPILT; region.setRegionPath(regionPath); - region.setDeleted(Boolean.TRUE); + region.setDeleted(Boolean.FALSE); if(CollectionUtils.isNotEmpty(dept.getDeptManagerUseridList())){ for (String leader : dept.getDeptManagerUseridList()) { leaderDeptMap.put(leader, dept.getId()); diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/EnterpriseUserRoleDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/EnterpriseUserRoleDO.java index 077f110f7..efcf08159 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/EnterpriseUserRoleDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/EnterpriseUserRoleDO.java @@ -1,5 +1,6 @@ package com.cool.store.entity; +import com.cool.store.enums.DataSourceEnum; import com.google.common.collect.Lists; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; @@ -32,6 +33,9 @@ public class EnterpriseUserRoleDO implements Serializable { @ApiModelProperty("用户id") private String userId; + @ApiModelProperty("type") + private Integer type; + @ApiModelProperty("删除标识") private Boolean deleted; @@ -41,7 +45,7 @@ public class EnterpriseUserRoleDO implements Serializable { @ApiModelProperty("更新时间") private Date updateTime; - public static List convertDO(String roleId, List userIds){ + public static List convertSyncDO(String roleId, List userIds){ if(CollectionUtils.isEmpty(userIds)){ return Lists.newArrayList(); } @@ -50,6 +54,7 @@ public class EnterpriseUserRoleDO implements Serializable { EnterpriseUserRoleDO userRole = new EnterpriseUserRoleDO(); userRole.setRoleId(roleId); userRole.setUserId(userId); + userRole.setType(DataSourceEnum.SYNC.getCode()); userRole.setDeleted(Boolean.FALSE); userRole.setCreateTime(new Date()); userRole.setUpdateTime(new Date()); diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/UserRegionMappingDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/UserRegionMappingDO.java index c15fbeebe..3478dac98 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/UserRegionMappingDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/UserRegionMappingDO.java @@ -14,6 +14,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; /** * @@ -69,4 +70,22 @@ public class UserRegionMappingDO implements Serializable { } return resultList; } + + public static List convertSyncDO(List regionIds, String userId){ + if(CollectionUtils.isEmpty(regionIds) || StringUtils.isBlank(userId)){ + return Lists.newArrayList(); + } + List resultList = new ArrayList<>(); + for (String regionId : regionIds) { + UserRegionMappingDO userRegion = new UserRegionMappingDO(); + userRegion.setRegionId(regionId); + userRegion.setUserId(userId); + userRegion.setType(DataSourceEnum.SYNC.getCode()); + userRegion.setCreateTime(System.currentTimeMillis()); + userRegion.setUpdateTime(System.currentTimeMillis()); + userRegion.setDeleted(Boolean.FALSE); + resultList.add(userRegion); + } + return resultList; + } } \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/region/RegionBaseInfoVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/region/RegionBaseInfoVO.java new file mode 100644 index 000000000..fa0f5da9c --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/region/RegionBaseInfoVO.java @@ -0,0 +1,64 @@ +package com.cool.store.vo.region; + +import com.cool.store.constants.CommonConstants; +import com.cool.store.entity.RegionDO; +import com.google.common.collect.Lists; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author zhangchenbiao + * @FileName: RegionBaseInfoVO + * @Description: + * @date 2023-06-12 16:08 + */ +@Data +public class RegionBaseInfoVO { + + @ApiModelProperty("区域id") + private String regionId; + + @ApiModelProperty("区域名称") + private String name; + + @ApiModelProperty("子区域") + private List subRegionList; + + public RegionBaseInfoVO(String regionId, String name) { + this.regionId = regionId; + this.name = name; + } + + public static RegionBaseInfoVO convertTree(List regionList){ + Map> parentMap = regionList.stream().collect(Collectors.groupingBy(k -> k.getParentId())); + RegionDO rootRegion = regionList.stream().filter(o -> CommonConstants.ZERO_STR.equals(o.getParentId())).findFirst().get(); + RegionBaseInfoVO result = new RegionBaseInfoVO(rootRegion.getRegionId(), rootRegion.getName()); + result.setSubRegionList(getSubRegion(rootRegion.getRegionId(), parentMap)); + return result; + } + + public static List getSubRegion(String regionId, Map> parentMap){ + List resultList = new ArrayList<>(); + if(Objects.isNull(parentMap) || StringUtils.isBlank(regionId)){ + return resultList; + } + List subRegion = parentMap.get(regionId); + if(CollectionUtils.isNotEmpty(subRegion)){ + for (RegionDO region : subRegion) { + RegionBaseInfoVO regionBaseInfo = new RegionBaseInfoVO(region.getRegionId(), region.getName()); + regionBaseInfo.setSubRegionList(getSubRegion(region.getRegionId(), parentMap)); + resultList.add(regionBaseInfo); + } + } + return resultList; + } + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/ConsumerClient.java b/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/ConsumerClient.java index d3f387949..bdc6b29b7 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/ConsumerClient.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/ConsumerClient.java @@ -8,7 +8,7 @@ import com.aliyun.openservices.ons.api.bean.Subscription; import com.cool.store.constants.CommonConstants; import com.cool.store.enums.RocketMqGroupEnum; import com.cool.store.mq.RocketMqConfig; -import com.cool.store.mq.consumer.listener.TestListener; +import com.cool.store.mq.consumer.listener.UserEventDealListener; import com.google.common.collect.Maps; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -29,7 +29,7 @@ public class ConsumerClient { @Resource private RocketMqConfig rocketMqConfig; @Resource - private TestListener testListener; + private UserEventDealListener userEventDealListener; /** * 获取通用配置 @@ -71,12 +71,12 @@ public class ConsumerClient { */ @Bean(initMethod = "start", destroyMethod = "shutdown") public ConsumerBean test() { - RocketMqGroupEnum groupEnum = RocketMqGroupEnum.TEST; + RocketMqGroupEnum groupEnum = RocketMqGroupEnum.DING_MSG_DEAL; ConsumerBean consumerBean = new ConsumerBean(); //配置文件 Properties properties = getCommonProperties(groupEnum); consumerBean.setProperties(properties); - Map commonSubscriptionTable = getCommonSubscriptionTable(groupEnum, testListener); + Map commonSubscriptionTable = getCommonSubscriptionTable(groupEnum, userEventDealListener); //订阅多个topic如上面设置 consumerBean.setSubscriptionTable(commonSubscriptionTable); return consumerBean; diff --git a/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/UserEventDealListener.java b/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/UserEventDealListener.java new file mode 100644 index 000000000..2d6153167 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/UserEventDealListener.java @@ -0,0 +1,58 @@ +package com.cool.store.mq.consumer.listener; + +import com.alibaba.fastjson.JSONObject; +import com.aliyun.openservices.ons.api.Action; +import com.aliyun.openservices.ons.api.ConsumeContext; +import com.aliyun.openservices.ons.api.Message; +import com.aliyun.openservices.ons.api.MessageListener; +import com.cool.store.constants.CommonConstants; +import com.cool.store.dto.buser.UserEventDTO; +import com.cool.store.service.EnterpriseSyncService; +import com.cool.store.utils.RedisUtilPool; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author zhangchenbiao + * @FileName: EnterpriseInitService + * @Description: 消息监听 + * @date 2023-06-09 16:28 + */ +@Slf4j +@Service +public class UserEventDealListener implements MessageListener { + + @Autowired + private RedisUtilPool redisUtilPool; + @Autowired + private EnterpriseSyncService enterpriseSyncService; + + @Override + public Action consume(Message message, ConsumeContext context) { + String text = new String(message.getBody()); + if(StringUtils.isBlank(text)){ + log.info("消息体为空,tag:{},messageId:{}",message.getTag(),message.getMsgID()); + return Action.CommitMessage; + } + log.info("重试消费次数 messageId:{},try times:{}", message.getMsgID(), message.getReconsumeTimes()); + + String lockKey = "DingMsgDealListener:" + message.getMsgID(); + boolean lock = redisUtilPool.setNxExpire(lockKey, message.getMsgID(), CommonConstants.NORMAL_LOCK_TIMES); + if(lock){ + try { + UserEventDTO reqBody = JSONObject.parseObject(text, UserEventDTO.class); + enterpriseSyncService.userUpdateEvent(reqBody); + }catch (Exception e){ + log.error("DingMsgDealListener consume dealAddressBookChange error",e); + return Action.ReconsumeLater; + } finally { + redisUtilPool.delKey(lockKey); + } + log.info("消费成功,tag:{},messageId:{}",message.getTag(),message.getMsgID()); + return Action.CommitMessage; + } + return Action.ReconsumeLater; + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/EnterpriseSyncService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/EnterpriseSyncService.java index df3532282..6b3944f6c 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/EnterpriseSyncService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/EnterpriseSyncService.java @@ -1,5 +1,7 @@ package com.cool.store.service; +import com.cool.store.dto.buser.UserEventDTO; + /** * @author zhangchenbiao * @FileName: EnterpriseInitService @@ -9,4 +11,10 @@ package com.cool.store.service; public interface EnterpriseSyncService { void syncAll(); + + /** + * 飞书人员事件 + * @param param + */ + void userUpdateEvent(UserEventDTO param); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/RegionService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/RegionService.java index 27fb84730..cd01d23d9 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/RegionService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/RegionService.java @@ -1,5 +1,9 @@ package com.cool.store.service; +import com.cool.store.vo.region.RegionBaseInfoVO; + +import java.util.List; + /** * @author zhangchenbiao * @FileName: RegionService @@ -8,4 +12,10 @@ package com.cool.store.service; */ public interface RegionService { + /** + * 获取组织架构基本信息列表 + * @return + */ + RegionBaseInfoVO getRegionBaseInfoList(); + } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseSyncServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseSyncServiceImpl.java index 6d1f4fac3..da2213637 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseSyncServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseSyncServiceImpl.java @@ -2,6 +2,7 @@ package com.cool.store.service.impl; import com.cool.store.constants.CommonConstants; import com.cool.store.dao.*; +import com.cool.store.dto.buser.UserEventDTO; import com.cool.store.dto.enterprise.*; import com.cool.store.entity.*; import com.cool.store.enums.DataSourceEnum; @@ -9,6 +10,7 @@ import com.cool.store.http.ISVHttpRequest; import com.cool.store.service.EnterpriseSyncService; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; +import javafx.util.Pair; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.ListUtils; @@ -19,6 +21,8 @@ import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; +import static com.cool.store.enums.FSEventTypeEnum.*; + /** * @author zhangchenbiao * @FileName: EnterpriseInitService @@ -46,19 +50,9 @@ public class EnterpriseSyncServiceImpl implements EnterpriseSyncService { @Override public void syncAll() { //同步部门 - List departments = isvHttpRequest.getSubDepartments(CommonConstants.ROOT_DEPT_ID_STR, true); - //获取企业信息 - AuthInfoDTO authInfo = isvHttpRequest.getAuthInfo(); - Multimap leaderDeptMap = ArrayListMultimap.create(); - //组织架构中增加根节点,处理部门上下级关系 - List regionList = SysDepartmentDTO.convertRegionDO(departments, leaderDeptMap); - List regionIds = regionList.stream().map(RegionDO::getRegionId).distinct().collect(Collectors.toList()); - //添加根节点 - regionList.add(getRootRegion(authInfo)); - //批量插入 - regionDAO.batchInsertOrUpdate(regionList); - //删除不存在的区域 - regionDAO.deleteNotExistRegion(regionIds); + Pair, Multimap> listMultimapPair = syncRegion(); + List regionList = listMultimapPair.getKey(); + Multimap leaderDeptMap = listMultimapPair.getValue(); Multimap roleUserMap = ArrayListMultimap.create(); //同步用户及部门 syncUserAndUserRegion(regionList, roleUserMap, leaderDeptMap); @@ -72,9 +66,9 @@ public class EnterpriseSyncServiceImpl implements EnterpriseSyncService { roleIds.add(sysRole.getRoleId()); Collection userIds = roleUserMap.get(roleName); insertOrUpdateList.add(sysRole); - userRoleInsertOrUpdateList.addAll(EnterpriseUserRoleDO.convertDO(sysRole.getRoleId(), new ArrayList<>(userIds))); + userRoleInsertOrUpdateList.addAll(EnterpriseUserRoleDO.convertSyncDO(sysRole.getRoleId(), new ArrayList<>(userIds))); //删除角色下不存在的用户 - enterpriseUserRoleDAO.deleteUserRole(sysRole.getRoleId(), DataSourceEnum.SYNC, new ArrayList<>(userIds)); + enterpriseUserRoleDAO.deleteRoleInUser(sysRole.getRoleId(), DataSourceEnum.SYNC, new ArrayList<>(userIds)); } sysRoleDAO.batchInsertSelective(insertOrUpdateList); enterpriseUserRoleDAO.batchInsertOrUpdate(userRoleInsertOrUpdateList); @@ -86,6 +80,32 @@ public class EnterpriseSyncServiceImpl implements EnterpriseSyncService { } + private Pair, Multimap> syncRegion(){ + //同步部门 + List departments = isvHttpRequest.getSubDepartments(CommonConstants.ROOT_DEPT_ID_STR, true); + //获取企业信息 + AuthInfoDTO authInfo = isvHttpRequest.getAuthInfo(); + Multimap leaderDeptMap = ArrayListMultimap.create(); + //组织架构中增加根节点,处理部门上下级关系 + List regionList = SysDepartmentDTO.convertRegionDO(departments, leaderDeptMap); + //添加根节点 + regionList.add(getRootRegion(authInfo)); + List regionIds = regionList.stream().map(RegionDO::getRegionId).distinct().collect(Collectors.toList()); + //批量插入 + regionDAO.batchInsertOrUpdate(regionList); + //删除不存在的区域 + regionDAO.deleteNotExistRegion(regionIds); + //删除区域管理的人员 + userRegionMappingDAO.deleteRegionUserByExcludeRegionIds(regionIds); + return new Pair<>(regionList, leaderDeptMap); + } + + /** + * 处理用户及部门之间的关系 + * @param regionList + * @param roleUserMap + * @param leaderDeptMap + */ private void syncUserAndUserRegion(List regionList, Multimap roleUserMap, Multimap leaderDeptMap){ Map regionPathMap = regionList.stream().collect(Collectors.toMap(RegionDO::getRegionId, RegionDO::getRegionPath)); List userList = new ArrayList<>(); @@ -117,6 +137,7 @@ public class EnterpriseSyncServiceImpl implements EnterpriseSyncService { userRegionMappingDAO.batchInsertOrUpdateUserRegion(userRegionList); //删除不存在的用户 enterpriseUserDAO.deleteUser(userIds); + userRegionMappingDAO.deleteRegionUserByExcludeUserIds(userIds); } /** @@ -132,6 +153,50 @@ public class EnterpriseSyncServiceImpl implements EnterpriseSyncService { rootRegion.setThirdDeptId(CommonConstants.ROOT_DEPT_ID_STR); rootRegion.setOrderNum(CommonConstants.ZERO); rootRegion.setRegionPath(CommonConstants.PATH_SPILT + rootRegion.getRegionId() + CommonConstants.PATH_SPILT); + rootRegion.setDeleted(Boolean.FALSE); return rootRegion; } + + @Override + public void userUpdateEvent(UserEventDTO param) { + switch (parseValue(param.getEventType())){ + case USER_CREATED: + case USER_UPDATED: + EnterpriseUserDTO userDetail = isvHttpRequest.getUserDetailByUserId(param.getOpenId()); + List departmentLists = userDetail.getDepartmentLists(); + Multimap leaderDeptMap = ArrayListMultimap.create(); + Map regionPathMap = new HashMap<>(); + if(CollectionUtils.isNotEmpty(departmentLists)){ + List regionList = regionDAO.getRegionByRegionIds(departmentLists); + List regionIds = ListUtils.emptyIfNull(regionList).stream().map(RegionDO::getRegionId).collect(Collectors.toList()); + //判断两个集合是否都是包含关系 + if(!(regionIds.containsAll(departmentLists) && departmentLists.containsAll(regionList))){ + Pair, Multimap> regionPair = syncRegion(); + regionList = regionPair.getKey(); + leaderDeptMap = regionPair.getValue(); + } + regionPathMap = regionList.stream().collect(Collectors.toMap(k->k.getRegionId(), v->v.getRegionPath())); + userRegionMappingDAO.batchInsertOrUpdateUserRegion(UserRegionMappingDO.convertSyncDO(departmentLists, userDetail.getUserId())); + } + String jobTitle = userDetail.getJobTitle(); + if(StringUtils.isNotBlank(jobTitle)){ + SysRoleDO role = sysRoleDAO.getRoleByName(jobTitle, DataSourceEnum.SYNC); + if(Objects.isNull(role)){ + //新增角色 + role = SysRoleDO.convertSyncDO(jobTitle); + sysRoleDAO.batchInsertSelective(new ArrayList<>(Arrays.asList(role))); + } + List enterpriseUserRole = EnterpriseUserRoleDO.convertSyncDO(role.getRoleId(), new ArrayList<>(Arrays.asList(userDetail.getUserId()))); + enterpriseUserRoleDAO.batchInsertOrUpdate(enterpriseUserRole); + enterpriseUserRoleDAO.deleteUserInRole(userDetail.getUserId(), DataSourceEnum.SYNC, role.getRoleId()); + } + EnterpriseUserDO enterpriseUser = EnterpriseUserDTO.transUserDtoToDo(userDetail, regionPathMap, leaderDeptMap); + enterpriseUserDAO.batchInsertOrUpdate(new ArrayList<>(Arrays.asList(enterpriseUser))); + break; + case USER_DELETED: + break; + default: + return; + } + } } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/RegionServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/RegionServiceImpl.java index c76046adb..6b592a8cd 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/RegionServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/RegionServiceImpl.java @@ -1,12 +1,16 @@ package com.cool.store.service.impl; +import com.cool.store.dao.RegionDAO; +import com.cool.store.entity.RegionDO; import com.cool.store.mq.producer.SimpleMessageService; import com.cool.store.service.RegionService; import com.cool.store.utils.RedisConstantUtil; import com.cool.store.utils.RedisUtil; +import com.cool.store.vo.region.RegionBaseInfoVO; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.List; /** * @author zhangchenbiao @@ -20,9 +24,12 @@ public class RegionServiceImpl implements RegionService { @Resource private RedisUtil redisUtil; @Resource - private RedisConstantUtil redisConstantUtil; - @Resource - private SimpleMessageService simpleMessageService; + private RegionDAO regionDAO; + @Override + public RegionBaseInfoVO getRegionBaseInfoList() { + List regionBaseInfoList = regionDAO.getRegionBaseInfoList(); + return RegionBaseInfoVO.convertTree(regionBaseInfoList); + } } diff --git a/coolstore-partner-webb/src/main/java/com/cool/store/controller/RegionController.java b/coolstore-partner-webb/src/main/java/com/cool/store/controller/RegionController.java new file mode 100644 index 000000000..9f09ac40e --- /dev/null +++ b/coolstore-partner-webb/src/main/java/com/cool/store/controller/RegionController.java @@ -0,0 +1,35 @@ +package com.cool.store.controller; + +import com.cool.store.response.ResponseResult; +import com.cool.store.service.RegionService; +import com.cool.store.vo.region.RegionBaseInfoVO; +import io.swagger.annotations.Api; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * @author zhangchenbiao + * @FileName: RegionController + * @Description: + * @date 2023-06-12 15:53 + */ +@RestController +@RequestMapping({"/v1/region" }) +@Slf4j +@Api(tags = "组织架构") +public class RegionController { + + @Resource + private RegionService regionService; + + @GetMapping("/getRegionList") + public ResponseResult getRegionBaseInfoList(){ + return ResponseResult.success(regionService.getRegionBaseInfoList()); + } + + +}