From c9186d8c9352f5ffea8a2559103447452124cd06 Mon Sep 17 00:00:00 2001 From: Yen Date: Thu, 12 Sep 2024 15:33:54 +0800 Subject: [PATCH] =?UTF-8?q?opt:=20=E5=BE=AE=E4=BF=A1=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qs/serve/common/model/enums/HttpCode.java | 2 +- .../serve/modules/ums/entity/UmsMember.java | 88 +++++++++++++++++++ .../modules/ums/mapper/UmsMemberMapper.java | 14 +++ .../modules/ums/service/UmsMemberService.java | 14 +++ .../service/impl/UmsMemberServiceImpl.java | 22 +++++ .../serve/modules/wx/api/WxSvcLoginApi.java | 7 +- .../qs/serve/modules/wx/api/WxSvcUserApi.java | 21 +++-- .../wx/common/consts/WxUserTypeConst.java | 11 +++ .../qs/serve/modules/wx/entity/WxUser.java | 8 +- .../modules/wx/entity/dto/WxLoginUser.java | 2 + .../modules/wx/service/WxUserService.java | 2 +- .../wx/service/impl/WxUserServiceImpl.java | 62 ++++++++----- 12 files changed, 217 insertions(+), 36 deletions(-) create mode 100644 src/main/java/com/qs/serve/modules/ums/entity/UmsMember.java create mode 100644 src/main/java/com/qs/serve/modules/ums/mapper/UmsMemberMapper.java create mode 100644 src/main/java/com/qs/serve/modules/ums/service/UmsMemberService.java create mode 100644 src/main/java/com/qs/serve/modules/ums/service/impl/UmsMemberServiceImpl.java create mode 100644 src/main/java/com/qs/serve/modules/wx/common/consts/WxUserTypeConst.java diff --git a/src/main/java/com/qs/serve/common/model/enums/HttpCode.java b/src/main/java/com/qs/serve/common/model/enums/HttpCode.java index 18c2e61..1e71fed 100644 --- a/src/main/java/com/qs/serve/common/model/enums/HttpCode.java +++ b/src/main/java/com/qs/serve/common/model/enums/HttpCode.java @@ -15,7 +15,7 @@ public enum HttpCode { /** 基本参数 */ SUCCESS(200,"操作成功"), ERROR(500,"操作失败"), - DEV_ERR(500,"部分功能开发中..."), + DEV_ERR(500,"功能开发中..."), WX_ERR(500,"微信服务调用异常"), LOGIN_ERR(401,"登录信息已过期或失效"), diff --git a/src/main/java/com/qs/serve/modules/ums/entity/UmsMember.java b/src/main/java/com/qs/serve/modules/ums/entity/UmsMember.java new file mode 100644 index 0000000..c5db7b1 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/ums/entity/UmsMember.java @@ -0,0 +1,88 @@ +package com.qs.serve.modules.ums.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.NotBlank; + +/** + * 实体类 + * @author YenHex + * @since 2024-09-12 + */ +@Data +@TableName("ums_member") +public class UmsMember implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 姓名 */ + @Length(max = 255,message = "姓名长度不能超过255字") + private String name; + + /** 手机号 */ + @Length(max = 255,message = "手机号长度不能超过255字") + private String mobile; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + + public static UmsMember toNewObject(UmsMember source){ + UmsMember member = new UmsMember(); + member.setId(source.getId()); + member.setName(source.getName()); + member.setMobile(source.getMobile()); + member.setCreateTime(source.getCreateTime()); + member.setCreateBy(source.getCreateBy()); + member.setUpdateTime(source.getUpdateTime()); + member.setUpdateBy(source.getUpdateBy()); + member.setTenantId(source.getTenantId()); + member.setDelFlag(source.getDelFlag()); + return member; + } + +} + diff --git a/src/main/java/com/qs/serve/modules/ums/mapper/UmsMemberMapper.java b/src/main/java/com/qs/serve/modules/ums/mapper/UmsMemberMapper.java new file mode 100644 index 0000000..2438cbf --- /dev/null +++ b/src/main/java/com/qs/serve/modules/ums/mapper/UmsMemberMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.ums.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.ums.entity.UmsMember; + +/** + * Mapper + * @author YenHex + * @date 2024-09-12 + */ +public interface UmsMemberMapper extends BaseMapper { + +} + diff --git a/src/main/java/com/qs/serve/modules/ums/service/UmsMemberService.java b/src/main/java/com/qs/serve/modules/ums/service/UmsMemberService.java new file mode 100644 index 0000000..f9033e8 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/ums/service/UmsMemberService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.ums.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.ums.entity.UmsMember; + +/** + * 服务接口 + * @author YenHex + * @date 2024-09-12 + */ +public interface UmsMemberService extends IService { + +} + diff --git a/src/main/java/com/qs/serve/modules/ums/service/impl/UmsMemberServiceImpl.java b/src/main/java/com/qs/serve/modules/ums/service/impl/UmsMemberServiceImpl.java new file mode 100644 index 0000000..f7f4f0f --- /dev/null +++ b/src/main/java/com/qs/serve/modules/ums/service/impl/UmsMemberServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.ums.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.ums.entity.UmsMember; +import com.qs.serve.modules.ums.service.UmsMemberService; +import com.qs.serve.modules.ums.mapper.UmsMemberMapper; + +/** + * 用户服务实现类 + * @author YenHex + * @since 2024-09-12 + */ +@Slf4j +@Service +@AllArgsConstructor +public class UmsMemberServiceImpl extends ServiceImpl implements UmsMemberService { + +} + diff --git a/src/main/java/com/qs/serve/modules/wx/api/WxSvcLoginApi.java b/src/main/java/com/qs/serve/modules/wx/api/WxSvcLoginApi.java index 099d742..b1e061b 100644 --- a/src/main/java/com/qs/serve/modules/wx/api/WxSvcLoginApi.java +++ b/src/main/java/com/qs/serve/modules/wx/api/WxSvcLoginApi.java @@ -125,11 +125,12 @@ public class WxSvcLoginApi { //后台管理员信息 Map tokenMap = new HashMap<>(10); String client = "wx_app"; - String redisKey = StringUtils.format(RedisCacheKeys.LOGIN_KEY_APP,client, wxUser.getSysUserId()); - String pctoken = JwtUtils.generateToken(wxUser.getSysUserId(),loginUser.getTypeFlag(),client); + String redisKey = StringUtils.format(RedisCacheKeys.LOGIN_KEY_APP,client, wxUser.getUserId()); + String pctoken = JwtUtils.generateToken(wxUser.getUserId(),loginUser.getTypeFlag(),client); redisService.set(redisKey,pctoken); tokenMap.put("token", pctoken); - tokenMap.put("userId", wxUser.getSysUserId()); + tokenMap.put("userType", wxUser.getUserType()); + tokenMap.put("userId", wxUser.getUserId()); tokenMap.put("IP", loginUser.getLoginIp()); tokenMap.put("loginType",client); tokenMap.put("client",client); diff --git a/src/main/java/com/qs/serve/modules/wx/api/WxSvcUserApi.java b/src/main/java/com/qs/serve/modules/wx/api/WxSvcUserApi.java index be4ffa4..82cb2a0 100644 --- a/src/main/java/com/qs/serve/modules/wx/api/WxSvcUserApi.java +++ b/src/main/java/com/qs/serve/modules/wx/api/WxSvcUserApi.java @@ -17,6 +17,9 @@ import com.qs.serve.modules.sys.entity.dto.SysUserVo; import com.qs.serve.modules.sys.mapper.SysMenuMapper; import com.qs.serve.modules.sys.service.SysRoleService; import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.ums.entity.UmsMember; +import com.qs.serve.modules.ums.mapper.UmsMemberMapper; +import com.qs.serve.modules.wx.common.consts.WxUserTypeConst; import com.qs.serve.modules.wx.entity.WxUser; import com.qs.serve.modules.wx.entity.dto.WxPhoneBindParam; import com.qs.serve.modules.wx.service.WxUserService; @@ -46,6 +49,7 @@ public class WxSvcUserApi { private SysUserDetailsServiceImpl userDetailsService; private SysRoleService sysRoleService; private final SysMenuMapper sysMenuMapper; + private final UmsMemberMapper umsMemberMapper; /** * 用户信息 @@ -54,8 +58,9 @@ public class WxSvcUserApi { public R info(){ WxUser wxUser = wxUserService.getCurrentWxUser(true); SysUserVo sysUserVo = null; - if(StringUtils.hasText(wxUser.getSysUserId())){ - SysUser sysUser = sysUserService.getById(wxUser.getSysUserId()); + if(wxUser.getUserType().equals(WxUserTypeConst.SYS_USER) + &&StringUtils.hasText(wxUser.getUserId())){ + SysUser sysUser = sysUserService.getById(wxUser.getUserId()); if(sysUser!=null){ // 解决H5页面权限不刷新 List defaultRole = sysRoleService.getDefaultRole(); @@ -69,12 +74,15 @@ public class WxSvcUserApi { sysUser.setAuthorList(userDetails.getAuthorList()); sysUserVo = sysUser.toSysUserVo(false); } + }else if (wxUser.getUserType().equals(WxUserTypeConst.SYS_USER) + &&StringUtils.hasText(wxUser.getUserId())){ + UmsMember member = umsMemberMapper.selectById(wxUser.getUserId()); + wxUser.setMemberInfo(member); } - if(wxUser.getAppType()!=null&&wxUser.getAppType().equals(3)){ //企业微信转化为公众号用户 WxUser wxUser1 = wxUserService.getOne(new LambdaQueryWrapper() - .eq(WxUser::getSysUserId,wxUser.getSysUserId()) + .eq(WxUser::getUserId,wxUser.getUserId()) .eq(WxUser::getAppType,2),false); if(wxUser1==null){ Assert.throwEx("请前往公众号绑定信息"); @@ -133,8 +141,9 @@ public class WxSvcUserApi { WxUser wxUser = wxUserService.getCurrentWxUser(); wxUser.setPhone(param.getPhone()); wxUser.setEmpName(sysUser.getName()); - wxUser.setSysUserId(sysUser.getId()); - wxUser.setSysUserCode(sysUser.getCode()); + wxUser.setUserType(WxUserTypeConst.SYS_USER); + wxUser.setUserId(sysUser.getId()); + wxUser.setUserCode(sysUser.getCode()); wxUserService.updateById(wxUser); //便于多设备登陆 redisService.remove(key); diff --git a/src/main/java/com/qs/serve/modules/wx/common/consts/WxUserTypeConst.java b/src/main/java/com/qs/serve/modules/wx/common/consts/WxUserTypeConst.java new file mode 100644 index 0000000..3c50585 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/wx/common/consts/WxUserTypeConst.java @@ -0,0 +1,11 @@ +package com.qs.serve.modules.wx.common.consts; + +/** + * 微信字段 + * @author YenHex + * @since 2022/3/7 + */ +public interface WxUserTypeConst { + String SYS_USER = "user"; + String UMS_MEMBER = "member"; +} diff --git a/src/main/java/com/qs/serve/modules/wx/entity/WxUser.java b/src/main/java/com/qs/serve/modules/wx/entity/WxUser.java index d97e775..cf05000 100644 --- a/src/main/java/com/qs/serve/modules/wx/entity/WxUser.java +++ b/src/main/java/com/qs/serve/modules/wx/entity/WxUser.java @@ -30,8 +30,9 @@ public class WxUser implements Serializable { @NotNull(message = "公众号配置ID、小程序AppID不能为空") private String appId; - private String sysUserId; - private String sysUserCode; + private String userType; + private String userId; + private String userCode; /** 应用类型【1->小程序;2->公众号】 */ private Integer appType; @@ -149,5 +150,8 @@ public class WxUser implements Serializable { @TableField(exist = false) private Object sysUserInfo; + @TableField(exist = false) + private Object memberInfo; + } diff --git a/src/main/java/com/qs/serve/modules/wx/entity/dto/WxLoginUser.java b/src/main/java/com/qs/serve/modules/wx/entity/dto/WxLoginUser.java index 761a402..8445c84 100644 --- a/src/main/java/com/qs/serve/modules/wx/entity/dto/WxLoginUser.java +++ b/src/main/java/com/qs/serve/modules/wx/entity/dto/WxLoginUser.java @@ -11,6 +11,8 @@ import javax.validation.constraints.NotNull; @Data public class WxLoginUser { + private String userType; + @NotNull private String code; diff --git a/src/main/java/com/qs/serve/modules/wx/service/WxUserService.java b/src/main/java/com/qs/serve/modules/wx/service/WxUserService.java index 6651a0f..1ba5755 100644 --- a/src/main/java/com/qs/serve/modules/wx/service/WxUserService.java +++ b/src/main/java/com/qs/serve/modules/wx/service/WxUserService.java @@ -45,7 +45,7 @@ public interface WxUserService extends IService { @Deprecated WxUser getByOpenId(String openId); - WxUser getByOpenId(String appId,String openId); + WxUser getByOpenId(String appId,String openId,String userType); } diff --git a/src/main/java/com/qs/serve/modules/wx/service/impl/WxUserServiceImpl.java b/src/main/java/com/qs/serve/modules/wx/service/impl/WxUserServiceImpl.java index c08868a..ca37676 100644 --- a/src/main/java/com/qs/serve/modules/wx/service/impl/WxUserServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/wx/service/impl/WxUserServiceImpl.java @@ -12,9 +12,12 @@ import com.qs.serve.common.model.enums.HttpCode; import com.qs.serve.common.util.*; import com.qs.serve.modules.sys.entity.SysUser; import com.qs.serve.modules.sys.mapper.SysUserMapper; +import com.qs.serve.modules.ums.entity.UmsMember; +import com.qs.serve.modules.ums.mapper.UmsMemberMapper; import com.qs.serve.modules.wx.common.conf.WxCpConfig; import com.qs.serve.modules.wx.common.conf.WxMpConfig; import com.qs.serve.modules.wx.common.consts.WxStatusConst; +import com.qs.serve.modules.wx.common.consts.WxUserTypeConst; import com.qs.serve.modules.wx.entity.WxApp; import com.qs.serve.modules.wx.entity.WxUser; import com.qs.serve.modules.wx.entity.dto.WxLoginUser; @@ -71,6 +74,8 @@ public class WxUserServiceImpl extends ServiceImpl impleme @Autowired private SysUserMapper sysUserMapper; + @Autowired + private UmsMemberMapper umsMemberMapper; private List getOpenIds(WxMpUserService wxMpUserService,String nextOpenId){ WxMpUserList wxMpUserList = null; @@ -147,14 +152,16 @@ public class WxUserServiceImpl extends ServiceImpl impleme @Override public List getBySysUserId(String userId) { LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); - lqw.eq(WxUser::getSysUserId,userId); + lqw.eq(WxUser::getUserId,userId); + lqw.eq(WxUser::getUserType, WxUserTypeConst.SYS_USER); return this.list(lqw); } @Override public WxUser getByCurrSysUserId(String userId) { LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); - lqw.eq(WxUser::getSysUserId,userId); + lqw.eq(WxUser::getUserId,userId); + lqw.eq(WxUser::getUserType, WxUserTypeConst.SYS_USER); lqw.eq(WxUser::getAppId,AuthContextUtils.getAppId(false)); return this.getOne(lqw,false); } @@ -162,7 +169,8 @@ public class WxUserServiceImpl extends ServiceImpl impleme @Override public List getBySysUserIds(List userIds) { LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); - lqw.in(WxUser::getSysUserId,userIds); + lqw.eq(WxUser::getUserType, WxUserTypeConst.SYS_USER); + lqw.in(WxUser::getUserId,userIds); return this.list(lqw); } @@ -170,6 +178,7 @@ public class WxUserServiceImpl extends ServiceImpl impleme public WxUser login(WxLoginUser wxLoginUser, HttpServletRequest request){ String code = wxLoginUser.getCode(); String appId = AuthContextUtils.getAppId(); + String userType = wxLoginUser.getUserType(); String agentIdStr = request.getHeader("agentId"); WxApp wxApp = wxAppService.getById(appId); WxUser wxUser = null; @@ -201,11 +210,13 @@ public class WxUserServiceImpl extends ServiceImpl impleme if(wxCpUserDetail==null||wxCpUser==null){ Assert.throwEx("企业微信登录失败"); } + //嘉士利默认userId是员工号 String userId = wxCpUserDetail.getUserId(); - wxUser = this.getByOpenId(appId,userId); + wxUser = this.getByOpenId(appId,userId,userType); if(wxUser == null){ wxUser = new WxUser(); wxUser.setAppId(wxApp.getId()); + wxUser.setUserType(userType); wxUser.setAppType(wxApp.getAppType()); wxUser.setNickName(wxCpUser.getName()); wxUser.setEmpName(wxCpUser.getName()); @@ -213,24 +224,28 @@ public class WxUserServiceImpl extends ServiceImpl impleme wxUser.setOpenId(userId); wxUser.setHeadimgUrl(wxCpUserDetail.getAvatar()); } - //通过手机号绑定员工号 - //if(StringUtils.hasText(wxCpUser.getMobile())){ - //List sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper() - // .eq(SysUser::getMobile,wxCpUser.getMobile())); - List sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper().eq(SysUser::getCode,userId)); - if(sysUsers.size()>0){ - if(sysUsers.size()>1){ - //log.error("企业微信登录,一个号码被多人使用:{}",wxCpUser.getMobile()); - log.error("企业微信登录,员工号出现重复:{}",userId); + if(userType.equals(WxUserTypeConst.SYS_USER)){ + //通过手机号绑定员工号 + List sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper().eq(SysUser::getCode,userId)); + if(sysUsers.size()>0){ + if(sysUsers.size()>1){ + log.error("企业微信登录,员工号出现重复:{}",userId); + } + SysUser sysUser = sysUsers.get(0); + wxUser.setUserId(sysUser.getId()); + wxUser.setUserCode(sysUser.getCode()); + wxUser.setEmpName(sysUser.getName()); + wxUser.setPhone(sysUser.getMobile()); + }else { + Assert.throwEx("CMS未收录该员工号["+userId+"]"); + } + }else if (userType.equals(WxUserTypeConst.UMS_MEMBER)){ + if(wxUser.getId()==null){ + //生成member + UmsMember member = new UmsMember(); + umsMemberMapper.insert(member); + wxUser.setUserId(member.getId().toString()); } - SysUser sysUser = sysUsers.get(0); - wxUser.setSysUserId(sysUser.getId()); - wxUser.setSysUserCode(sysUser.getCode()); - wxUser.setEmpName(sysUser.getName()); - wxUser.setPhone(sysUser.getMobile()); - }else { - //Assert.throwEx("CMS未收录该手机号["+wxCpUser.getMobile()+"]"); - Assert.throwEx("CMS未收录该员工号["+userId+"]"); } if(wxUser.getId()==null){ save(wxUser); @@ -247,7 +262,7 @@ public class WxUserServiceImpl extends ServiceImpl impleme log.debug("auth2AccessToken:{}",auth2AccessToken.getAccessToken()); WxOAuth2UserInfo auth2UserInfo = auth2Service.getUserInfo(auth2AccessToken, GySysConst.LANG_ZH_CN); WxMpUser wxMpUser = wxMpService.getUserService().userInfo(auth2UserInfo.getOpenid(), GySysConst.LANG_ZH_CN); - wxUser = this.getByOpenId(appId,auth2UserInfo.getOpenid()); + wxUser = this.getByOpenId(appId,auth2UserInfo.getOpenid(),userType); if(wxUser == null){ wxUser = new WxUser(); wxUser.setAppId(wxApp.getId()); @@ -291,10 +306,11 @@ public class WxUserServiceImpl extends ServiceImpl impleme } @Override - public WxUser getByOpenId(String appId, String openId) { + public WxUser getByOpenId(String appId, String openId,String userType) { LambdaQueryWrapper wxUserLambdaQueryWrapper = new LambdaQueryWrapper<>(); wxUserLambdaQueryWrapper.eq(WxUser::getOpenId,openId); wxUserLambdaQueryWrapper.eq(WxUser::getAppId,appId); + wxUserLambdaQueryWrapper.eq(WxUser::getUserType,userType); return getOne(wxUserLambdaQueryWrapper,false); } }