[fix]修改创建用户时自动创建member

This commit is contained in:
wangqx 2025-09-01 09:13:56 +08:00
parent 81b8b959aa
commit 4e543a22d2
9 changed files with 283 additions and 6 deletions

View File

@ -0,0 +1,20 @@
package org.dromara.common.mq.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.context.ApplicationEvent;
import java.time.Clock;
/**
* 会员创建事件
*/
public class MemberCreateEvent extends ApplicationEvent {
public MemberCreateEvent(Object source) {
super(source);
}
public MemberCreateEvent(Object source, Clock clock) {
super(source, clock);
}
}

View File

@ -101,5 +101,7 @@ public class Member extends BaseAudit {
@Schema(description ="用户id")
private Long userId;
@Schema(description = "角色")
private String role;
}

View File

@ -0,0 +1,56 @@
package com.wzj.soopin.member.enums;
/**
* 会员角色枚举
*/
public enum MemberRoleEnum {
/**
* 租户管理员
*/
TENANT_ADMIN("tenantAdmin"),
/**
* 租户普通用户
*/
TENANT_USER("tenantUser"),
/**
* 租户访客
*/
TENANT_GUEST("tenantGuest"),
/**
* 租户所有者
*/
TENANT_OWNER("tenantOwner"),
/**
* 系统管理员
*/
SYSTEM_ADMIN("systemAdmin"),
/**
* 系统普通用户
*/
SYSTEM_USER("systemUser"),
/**
* 普通用户
*/
COMMON_USER("commonUser");
/**
* 角色
*/
private final String role;
MemberRoleEnum(String role) {
this.role = role;
}
public String getRole() {
return role;
}
public static MemberRoleEnum getByRole(String role) {
for (MemberRoleEnum memberRoleEnum : MemberRoleEnum.values()) {
if (memberRoleEnum.getRole().equals(role)) {
return memberRoleEnum;
}
}
return null;
}
}

View File

@ -0,0 +1,86 @@
package com.wzj.soopin.member.listener;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.wzj.soopin.member.domain.po.Member;
import com.wzj.soopin.member.service.IMemberService;
import com.wzj.soopin.member.service.ITencentIMServicce;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.mq.domain.MemberCreateEvent;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
/**
* 消息事件监听器
*
* @author ruoyi
*/
@Slf4j
@Component
@AllArgsConstructor
public class MemberCreateEventListener {
private final IMemberService memberService;
private final ITencentIMServicce tencentIMService;
/**
* 处理消息事件
*/
@Async
@EventListener
@Transactional(rollbackFor = Exception.class)
public void handleMessageEvent(MemberCreateEvent event) {
try {
// 提取消息和用户ID
Map<String,Object> userMap = (Map<String,Object>)event.getSource();
List<Member> memberList = memberService.list(new LambdaQueryWrapper<Member>()
.eq(Member::getPhoneEncrypted, (String) userMap.get("phonenumber"))
);
//如果存在则绑定
//如果不存在则创建
if (!memberList.isEmpty()) {
//绑定
Member member = memberList.get(0);
member.setUserId((Long) userMap.get("userId"));
member.setRole(userMap.get("role").toString());
memberService.updateById(member);
//设置im账号为管理员
tencentIMService.updateMemberRole(member);
} else {
//创建
Member member=new Member();
member.setNickname((String) userMap.get("nickName"));
member.setPassword((String) userMap.get("password"));
member.setPhoneHidden((String) userMap.get("phonenumber"));
member.setAvatar((String) userMap.get("avatar"));
member.setGender((Integer) userMap.get("sex"));
member.setRole(userMap.get("role").toString());
member.setUserId((Long) userMap.get("userId"));
//创建im账号
String userSig=tencentIMService.createTencentIMAccount(member);
member.setUserSig(userSig);
memberService.save(member);
//设置im账号为管理员
tencentIMService.updateMemberRole(member);
}
} catch (Exception e) {
log.error("处理消息事件失败", e);
}
}
}

View File

@ -9,4 +9,5 @@ import com.wzj.soopin.member.domain.po.Member;
*/
public interface ITencentIMServicce {
String createTencentIMAccount(Member member);
void updateMemberRole(Member member);
}

View File

@ -1,5 +1,6 @@
package com.wzj.soopin.member.service.impl;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import com.wzj.soopin.member.domain.po.Member;
import com.wzj.soopin.member.service.ITencentIMServicce;
@ -90,6 +91,79 @@ public class TencentIMServiceImpl implements ITencentIMServicce {
}
}
/**
* 更新用户角色
*/
@Override
public void updateMemberRole(Member member) {
//调用腾讯云IM接口更新用户角色
String phone=member.getPhoneHidden();
try {
//这里生成一个管理员签名
String adminSig=generateUserSig(adminAccount);
String random = String.valueOf(System.currentTimeMillis());
JSONObject object=new JSONObject();
object.put("Tag","Tag_Profile_IM_Role");
object.put("Value",member.getRole());
JSONArray jsonArray = new JSONArray();
jsonArray.add(object);
// 构建请求体
JSONObject requestBody = new JSONObject();
requestBody.put("From_Account", member.getId()+"");
requestBody.put("ProfileItem", jsonArray);
// 构建URL - 使用管理员账号(administrator)而不是用户ID来生成签名
String urlString = String.format(
"https://console.tim.qq.com/v4/profile/protrait_set" +
"?sdkappid=%s&identifier=%s&usersig=%s&random=%s&contenttype=json",
GenerateTestUserSig.SDKAPPID,
adminAccount, // 使用管理员账号
adminSig, // 使用管理员的UserSig
random);
// return userSig;
// 创建HTTP客户端
OkHttpClient client = new OkHttpClient().newBuilder().connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
.writeTimeout(15, TimeUnit.SECONDS)
.build();
// 发送请求
Request request = new Request.Builder()
.url(urlString)
.post(RequestBody.create(MediaType.get("application/json; charset=utf-8"),
requestBody.toString()))
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
log.error("更新IM账号角色失败: {}, 状态码: {}",phone , response.code());
throw new ServiceException(String.format("创建IM账号异常: %s", phone));
}
String responseBody = response.body().string();
JSONObject jsonResponse = new JSONObject(responseBody);
int errorCode = jsonResponse.getInt("ErrorCode");
if (errorCode == 0) {
log.info("更新IM账号角色成功: {}", phone);
} else {
log.error("更新IM账号角色失败: {}, 错误码: {}, 错误信息: {}",
phone, errorCode, jsonResponse.get("ErrorInfo"));
throw new ServiceException(String.format("更新IM账号角色异常: %s", phone));
}
}
} catch (Exception e) {
throw new ServiceException(String.format("更新IM账号角色异常: %s", phone));
}
}
/**
* 生成UserSig
*/

View File

@ -31,11 +31,14 @@
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-job</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-mq</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-mybatis</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-translation</artifactId>

View File

@ -113,6 +113,11 @@ public class SysUserBo extends BaseEntity {
*/
private String excludeUserIds;
/**
* 同步会员
*/
private String syncMemberFlag;
public SysUserBo(Long userId) {
this.userId = userId;
}

View File

@ -5,10 +5,12 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
@ -19,6 +21,7 @@ import org.dromara.common.core.domain.dto.UserDTO;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.service.UserService;
import org.dromara.common.core.utils.*;
import org.dromara.common.mq.domain.MemberCreateEvent;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
@ -32,13 +35,11 @@ import org.dromara.system.mapper.*;
import org.dromara.system.service.ISysUserService;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
//import com.wzj.soopin.member.domain.po.Member;
@ -61,6 +62,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
private final SysPostMapper postMapper;
private final SysUserRoleMapper userRoleMapper;
private final SysUserPostMapper userPostMapper;
private final ApplicationEventPublisher eventPublisher;
@Override
public TableDataInfo<SysUserVo> selectPageUserList(SysUserBo user, PageQuery pageQuery) {
@ -309,9 +311,37 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
int rows = baseMapper.insert(sysUser);
user.setUserId(sysUser.getUserId());
// 新增用户岗位关联
insertUserPost(user, false);
// 新增用户与角色管理
insertUserRole(user, false);
// 新增用户会员关联
if(user.getSyncMemberFlag()!=null&&user.getSyncMemberFlag().equals(SystemConstants.NORMAL)){
Map<String,Object> source=new HashMap<>();
source.put("userId",user.getUserId());
source.put("userName",sysUser.getUserName());
source.put("nickName",sysUser.getNickName());
source.put("email",sysUser.getEmail());
source.put("phonenumber",sysUser.getPhonenumber());
source.put("avatar", sysUser.getAvatar());
source.put("password",sysUser.getPassword());
source.put("set",sysUser.getSex());
//获取用户角色id
LambdaQueryWrapper<SysRole> roleQueryWrapper = new LambdaQueryWrapper<SysRole>();
roleQueryWrapper.in(SysRole::getRoleId,user.getRoleIds());
List<SysRoleVo> roles = roleMapper.selectRoleList(roleQueryWrapper);
if(CollectionUtils.isNotEmpty(roles)){
List<String> roleKeys= roles.stream().map(SysRoleVo::getRoleKey).collect(Collectors.toList());
source.put("roleKeys",String.join(",",roleKeys));
}
eventPublisher.publishEvent(new MemberCreateEvent(source));
}
return rows;
}