后端接口调整
parent
ac00a2f49e
commit
8cc31a621a
|
|
@ -27,11 +27,6 @@
|
|||
<artifactId>fjrcloud-module-infra</artifactId>
|
||||
<version>${revision}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fjrcloud.boot</groupId>
|
||||
<artifactId>fjrcloud-module-member</artifactId>
|
||||
<version>${revision}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 业务组件 -->
|
||||
<dependency>
|
||||
|
|
|
|||
|
|
@ -39,7 +39,12 @@ public class AppMemberHouseController {
|
|||
@Operation(summary = "获取我的房屋认证列表")
|
||||
public CommonResult<List<AppMemberHouseRespVO>> getMyHouseList() {
|
||||
Long memberId = SecurityFrameworkUtils.getLoginUserId();
|
||||
return success(memberHouseService.getMemberHouseListByMemberId(memberId));
|
||||
List<AppMemberHouseRespVO> respVOList = memberHouseService.getMemberHouseListByMemberId(memberId);
|
||||
for (AppMemberHouseRespVO appMemberHouseRespVO : respVOList) {
|
||||
appMemberHouseRespVO.setFullAddress(String.format("%s号楼%s单元%s",
|
||||
appMemberHouseRespVO.getBuildingNo(), appMemberHouseRespVO.getUnitNo(), appMemberHouseRespVO.getRoomNo()));
|
||||
}
|
||||
return success(respVOList);
|
||||
}
|
||||
|
||||
@GetMapping("/relation-list")
|
||||
|
|
@ -68,12 +73,13 @@ public class AppMemberHouseController {
|
|||
|
||||
@PostMapping("/switch-house")
|
||||
@Operation(summary = "切换房屋(小区变更时自动重新登录)")
|
||||
@TenantIgnore
|
||||
public CommonResult<AppSwitchHouseRespVO> switchHouse(@Valid @RequestBody AppSwitchHouseReqVO reqVO) {
|
||||
Long memberId = SecurityFrameworkUtils.getLoginUserId();
|
||||
return success(memberHouseService.switchHouse(
|
||||
memberId,
|
||||
reqVO.getMemberHouseId(),
|
||||
reqVO.getHouseId(),
|
||||
memberId,
|
||||
reqVO.getMemberHouseId(),
|
||||
reqVO.getHouseId(),
|
||||
reqVO.getCommunityId()
|
||||
));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,4 +37,6 @@ public class AppMemberHouseRespVO {
|
|||
@Schema(description = "关联人员数量", example = "3")
|
||||
private Integer relationCount;
|
||||
|
||||
@Schema(description = "房屋完整地址", example = "12号楼1单元701")
|
||||
private String fullAddress;
|
||||
}
|
||||
|
|
@ -117,6 +117,10 @@ public class MemberHouseDO extends TenantBaseDO {
|
|||
* 审核时间
|
||||
*/
|
||||
private LocalDateTime auditTime;
|
||||
/**
|
||||
* 是否默认房屋(0-否,1-是)
|
||||
*/
|
||||
private Boolean isDefault;
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -50,4 +50,22 @@ public interface MemberHouseMapper extends BaseMapperX<MemberHouseDO> {
|
|||
.orderByDesc(MemberHouseDO::getId));
|
||||
}
|
||||
|
||||
default MemberHouseDO selectDefaultHouseByMemberAndCommunity(Long memberId, Long communityId) {
|
||||
return selectOne(new LambdaQueryWrapperX<MemberHouseDO>()
|
||||
.eq(MemberHouseDO::getMemberId, memberId)
|
||||
.eq(MemberHouseDO::getCommunityId, communityId)
|
||||
.eq(MemberHouseDO::getStatus, 1)
|
||||
.eq(MemberHouseDO::getIsDefault, true)
|
||||
.orderByDesc(MemberHouseDO::getId));
|
||||
}
|
||||
|
||||
default MemberHouseDO selectFirstHouseByMemberAndCommunity(Long memberId, Long communityId) {
|
||||
return selectOne(new LambdaQueryWrapperX<MemberHouseDO>()
|
||||
.eq(MemberHouseDO::getMemberId, memberId)
|
||||
.eq(MemberHouseDO::getCommunityId, communityId)
|
||||
.eq(MemberHouseDO::getStatus, 1)
|
||||
.orderByDesc(MemberHouseDO::getIsOwner)
|
||||
.orderByDesc(MemberHouseDO::getId));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -129,4 +129,23 @@ public interface MemberHouseService {
|
|||
*/
|
||||
AppSwitchHouseRespVO switchHouse(Long memberId, Long memberHouseId, Long houseId, Long communityId);
|
||||
|
||||
/**
|
||||
* 获取用户在指定小区的默认房屋
|
||||
* 优先返回标记为默认的房屋,如果没有则返回第一条已认证的房屋
|
||||
*
|
||||
* @param memberId 会员ID
|
||||
* @param communityId 小区ID
|
||||
* @return 默认房屋信息
|
||||
*/
|
||||
MemberHouseDO getDefaultHouseByCommunity(Long memberId, Long communityId);
|
||||
|
||||
/**
|
||||
* 设置用户在指定小区的默认房屋
|
||||
*
|
||||
* @param memberId 会员ID
|
||||
* @param communityId 小区ID
|
||||
* @param memberHouseId 认证记录ID
|
||||
*/
|
||||
void setDefaultHouse(Long memberId, Long communityId, Long memberHouseId);
|
||||
|
||||
}
|
||||
|
|
@ -3,6 +3,8 @@ package com.fjrcloud.community.module.community.service.memberhouse;
|
|||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.ObjUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
import com.fjrcloud.community.framework.common.enums.UserTypeEnum;
|
||||
import com.fjrcloud.community.framework.common.pojo.PageResult;
|
||||
import com.fjrcloud.community.framework.common.util.object.BeanUtils;
|
||||
|
|
@ -308,7 +310,10 @@ public class MemberHouseServiceImpl implements MemberHouseService {
|
|||
@Override
|
||||
public List<AppMemberCommunityTreeRespVO> getMemberCommunityTree(Long memberId) {
|
||||
// 1. 查询会员的所有房屋认证记录
|
||||
List<MemberHouseDO> memberHouseList = memberHouseMapper.selectListByMemberId(memberId);
|
||||
List<MemberHouseDO> memberHouseList = memberHouseMapper.selectList(new LambdaQueryWrapper<MemberHouseDO>()
|
||||
.eq(MemberHouseDO::getMemberId, memberId)
|
||||
.eq(MemberHouseDO::getStatus, 1)
|
||||
);
|
||||
|
||||
if (CollUtil.isEmpty(memberHouseList)) {
|
||||
return Collections.emptyList();
|
||||
|
|
@ -389,7 +394,10 @@ public class MemberHouseServiceImpl implements MemberHouseService {
|
|||
}
|
||||
}
|
||||
|
||||
// 7. 更新会员表的当前房屋信息
|
||||
// 7. 设置该房屋为当前小区的默认房屋
|
||||
setDefaultHouse(memberId, communityId, memberHouseId);
|
||||
|
||||
// 8. 更新会员表的当前房屋信息
|
||||
memberUserService.updateCurrentHouse(memberId, communityId, communityName, houseId, houseAddress);
|
||||
|
||||
AppSwitchHouseRespVO.AppSwitchHouseRespVOBuilder respVOBuilder = AppSwitchHouseRespVO.builder()
|
||||
|
|
@ -397,29 +405,73 @@ public class MemberHouseServiceImpl implements MemberHouseService {
|
|||
.communityId(communityId)
|
||||
.houseId(houseId);
|
||||
|
||||
// 8. 如果小区变了,需要重新登录(生成新token)
|
||||
// 9. 如果小区变了,需要重新登录(生成新token)
|
||||
if (communityChanged) {
|
||||
log.info("会员[{}]切换小区:从[{}]切换到[{}],房屋地址:{}",
|
||||
memberId, currentTenantId, communityId, houseAddress);
|
||||
|
||||
// 在新小区租户上下文中生成新的token
|
||||
OAuth2AccessTokenDO newAccessToken = TenantUtils.execute(communityId, () -> {
|
||||
return oauth2TokenService.createAccessToken(
|
||||
memberId,
|
||||
UserTypeEnum.MEMBER.getValue(),
|
||||
CLIENT_ID_DEFAULT,
|
||||
null
|
||||
);
|
||||
});
|
||||
OAuth2AccessTokenDO newAccessToken = TenantUtils.execute(communityId, () -> oauth2TokenService.createAccessToken(
|
||||
memberId,
|
||||
UserTypeEnum.MEMBER.getValue(),
|
||||
CLIENT_ID_DEFAULT,
|
||||
null
|
||||
));
|
||||
|
||||
respVOBuilder.accessToken(newAccessToken.getAccessToken())
|
||||
.refreshToken(newAccessToken.getRefreshToken())
|
||||
.expiresTime(newAccessToken.getExpiresTime());
|
||||
} else {
|
||||
log.info("会员[{}]切换房屋:小区[{}],房屋地址:{}", memberId, communityId, houseAddress);
|
||||
log.info("会员[{}]切换房屋:小区[{}],房屋地址:{},已设为默认房屋", memberId, communityId, houseAddress);
|
||||
}
|
||||
|
||||
return respVOBuilder.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public MemberHouseDO getDefaultHouseByCommunity(Long memberId, Long communityId) {
|
||||
// 1. 优先查询标记为默认的房屋
|
||||
MemberHouseDO defaultHouse = memberHouseMapper.selectDefaultHouseByMemberAndCommunity(memberId, communityId);
|
||||
if (defaultHouse != null) {
|
||||
log.debug("会员[{}]在小区[{}]有标记的默认房屋:{}", memberId, communityId, defaultHouse.getId());
|
||||
return defaultHouse;
|
||||
}
|
||||
|
||||
// 2. 如果没有默认房屋,则返回第一条已认证的房屋
|
||||
MemberHouseDO firstHouse = memberHouseMapper.selectFirstHouseByMemberAndCommunity(memberId, communityId);
|
||||
if (firstHouse != null) {
|
||||
log.debug("会员[{}]在小区[{}]没有标记默认房屋,返回第一条房屋:{}", memberId, communityId, firstHouse.getId());
|
||||
}
|
||||
|
||||
return firstHouse;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void setDefaultHouse(Long memberId, Long communityId, Long memberHouseId) {
|
||||
// 1. 校验认证记录是否存在
|
||||
MemberHouseDO memberHouse = validateMemberHouseExists(memberHouseId);
|
||||
|
||||
// 2. 校验是否属于当前会员和小区
|
||||
if (!ObjUtil.equal(memberHouse.getMemberId(), memberId) ||
|
||||
!ObjUtil.equal(memberHouse.getCommunityId(), communityId)) {
|
||||
throw exception(MEMBER_HOUSE_NOT_EXISTS);
|
||||
}
|
||||
|
||||
// 3. 将该小区下该用户的所有房屋的非默认标记清除
|
||||
memberHouseMapper.update(null, new LambdaUpdateWrapper<MemberHouseDO>()
|
||||
.set(MemberHouseDO::getIsDefault, false)
|
||||
.eq(MemberHouseDO::getMemberId, memberId)
|
||||
.eq(MemberHouseDO::getCommunityId, communityId)
|
||||
);
|
||||
|
||||
// 4. 设置当前房屋为默认房屋
|
||||
MemberHouseDO updateObj = new MemberHouseDO();
|
||||
updateObj.setId(memberHouseId);
|
||||
updateObj.setIsDefault(true);
|
||||
memberHouseMapper.updateById(updateObj);
|
||||
|
||||
log.info("会员[{}]在小区[{}]设置默认房屋为:{}", memberId, communityId, memberHouseId);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -12,12 +12,17 @@ import com.fjrcloud.community.framework.common.enums.UserTypeEnum;
|
|||
import com.fjrcloud.community.framework.common.pojo.PageResult;
|
||||
import com.fjrcloud.community.framework.common.util.object.BeanUtils;
|
||||
import com.fjrcloud.community.framework.tenant.core.context.TenantContextHolder;
|
||||
import com.fjrcloud.community.framework.tenant.core.util.TenantUtils;
|
||||
import com.fjrcloud.community.module.community.auth.AuthConvert;
|
||||
import com.fjrcloud.community.module.community.controller.admin.user.vo.MemberUserPageReqVO;
|
||||
import com.fjrcloud.community.module.community.controller.admin.user.vo.MemberUserUpdateReqVO;
|
||||
import com.fjrcloud.community.module.community.controller.app.user.vo.*;
|
||||
import com.fjrcloud.community.module.community.dal.dataobject.community.CommunityDO;
|
||||
import com.fjrcloud.community.module.community.dal.dataobject.memberhouse.MemberHouseDO;
|
||||
import com.fjrcloud.community.module.community.dal.dataobject.user.MemberUserDO;
|
||||
import com.fjrcloud.community.module.community.dal.mysql.community.CommunityMapper;
|
||||
import com.fjrcloud.community.module.community.dal.mysql.user.MemberUserMapper;
|
||||
import com.fjrcloud.community.module.community.service.memberhouse.MemberHouseService;
|
||||
import com.fjrcloud.community.module.system.api.sms.SmsCodeApi;
|
||||
import com.fjrcloud.community.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
|
||||
import com.fjrcloud.community.module.system.api.social.SocialClientApi;
|
||||
|
|
@ -63,7 +68,10 @@ public class MemberUserServiceImpl implements MemberUserService {
|
|||
private PasswordEncoder passwordEncoder;
|
||||
|
||||
@Resource
|
||||
private MemberUserTenantRelService userTenantRelService;
|
||||
private CommunityMapper communityMapper;
|
||||
|
||||
@Resource
|
||||
private MemberHouseService memberHouseService;
|
||||
|
||||
@Override
|
||||
public MemberUserDO getUserByMobile(String mobile) {
|
||||
|
|
@ -107,7 +115,7 @@ public class MemberUserServiceImpl implements MemberUserService {
|
|||
String registerIp, Integer terminal) {
|
||||
// 生成随机密码
|
||||
String password = IdUtil.fastSimpleUUID();
|
||||
|
||||
|
||||
// 构建用户对象
|
||||
MemberUserDO user = new MemberUserDO();
|
||||
user.setMobile(mobile);
|
||||
|
|
@ -115,7 +123,7 @@ public class MemberUserServiceImpl implements MemberUserService {
|
|||
user.setPassword(encodePassword(password)); // 加密密码
|
||||
user.setRegisterIp(registerIp).setRegisterTerminal(terminal);
|
||||
user.setNickname(nickname).setAvatar(avtar); // 基础信息
|
||||
|
||||
|
||||
// 昵称为空时,生成随机昵称
|
||||
if (StrUtil.isEmpty(nickname)) {
|
||||
user.setNickname("用户" + RandomUtil.randomNumbers(6));
|
||||
|
|
@ -134,7 +142,44 @@ public class MemberUserServiceImpl implements MemberUserService {
|
|||
|
||||
@Override
|
||||
public MemberUserDO getUser(Long id) {
|
||||
return memberUserMapper.selectById(id);
|
||||
MemberUserDO user = memberUserMapper.selectById(id);
|
||||
if (user == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Long tenantId = TenantContextHolder.getTenantId();
|
||||
if(user.getCurrentCommunityId() != null){
|
||||
tenantId = user.getCurrentCommunityId();
|
||||
}
|
||||
|
||||
// 如果用户有当前小区ID,则获取该小区的默认房屋信息
|
||||
if (tenantId != null) {
|
||||
MemberHouseDO defaultHouse = memberHouseService.getDefaultHouseByCommunity(
|
||||
id, tenantId);
|
||||
|
||||
if (defaultHouse != null) {
|
||||
// 更新用户的当前房屋信息为默认房屋
|
||||
String houseAddress = StrUtil.blankToDefault(defaultHouse.getBuildingNo(), "") + "号楼" +
|
||||
StrUtil.blankToDefault(defaultHouse.getUnitNo(), "") + "单元" +
|
||||
StrUtil.blankToDefault(defaultHouse.getRoomNo(), "");
|
||||
user.setCurrentCommunityId(defaultHouse.getCommunityId());
|
||||
user.setCurrentCommunityName(defaultHouse.getCommunityName());
|
||||
user.setCurrentHouseId(defaultHouse.getHouseId());
|
||||
user.setCurrentHouseAddress(houseAddress);
|
||||
|
||||
log.debug("用户[{}]在小区[{}]的默认房屋:{}", id, tenantId, defaultHouse.getId());
|
||||
}else{
|
||||
TenantUtils.executeIgnore(() -> {
|
||||
CommunityDO communityDO = communityMapper.selectById(TenantContextHolder.getTenantId());
|
||||
user.setCurrentCommunityId(TenantContextHolder.getTenantId());
|
||||
user.setCurrentCommunityName(communityDO.getCommunityName());
|
||||
user.setCurrentHouseId(null);
|
||||
user.setCurrentHouseAddress("");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return user;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -164,7 +209,7 @@ public class MemberUserServiceImpl implements MemberUserService {
|
|||
smsCodeApi.useSmsCode(new SmsCodeUseReqDTO().setMobile(user.getMobile()).setCode(reqVO.getOldCode())
|
||||
.setScene(SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene()).setUsedIp(getClientIP()));
|
||||
}
|
||||
|
||||
|
||||
// 2.2 使用新验证码
|
||||
smsCodeApi.useSmsCode(new SmsCodeUseReqDTO().setMobile(reqVO.getMobile()).setCode(reqVO.getCode())
|
||||
.setScene(SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene()).setUsedIp(getClientIP()));
|
||||
|
|
@ -179,7 +224,7 @@ public class MemberUserServiceImpl implements MemberUserService {
|
|||
SocialWxPhoneNumberInfoRespDTO phoneNumberInfo = socialClientApi.getWxMaPhoneNumberInfo(
|
||||
UserTypeEnum.MEMBER.getValue(), reqVO.getCode());
|
||||
Assert.notNull(phoneNumberInfo, "获得手机信息失败,结果为空");
|
||||
|
||||
|
||||
// 1.2 校验新手机是否已经被绑定
|
||||
validateMobileUnique(userId, phoneNumberInfo.getPhoneNumber());
|
||||
|
||||
|
|
@ -191,7 +236,7 @@ public class MemberUserServiceImpl implements MemberUserService {
|
|||
public void updateUserPassword(Long userId, AppMemberUserUpdatePasswordReqVO reqVO) {
|
||||
// 检测用户是否存在
|
||||
MemberUserDO user = validateUserExists(userId);
|
||||
|
||||
|
||||
// 校验验证码
|
||||
smsCodeApi.useSmsCode(new SmsCodeUseReqDTO().setMobile(user.getMobile()).setCode(reqVO.getCode())
|
||||
.setScene(SmsSceneEnum.MEMBER_UPDATE_PASSWORD.getScene()).setUsedIp(getClientIP()));
|
||||
|
|
@ -274,17 +319,17 @@ public class MemberUserServiceImpl implements MemberUserService {
|
|||
if (StrUtil.isBlank(mobile)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
MemberUserDO user = memberUserMapper.selectByMobile(mobile);
|
||||
if (user == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// 如果 id 为空,说明是新增场景,手机号已被使用
|
||||
if (id == null) {
|
||||
throw exception(USER_MOBILE_USED, mobile);
|
||||
}
|
||||
|
||||
|
||||
// 如果 id 不为空,检查是否为同一用户
|
||||
if (!user.getId().equals(id)) {
|
||||
throw exception(USER_MOBILE_USED, mobile);
|
||||
|
|
@ -295,18 +340,18 @@ public class MemberUserServiceImpl implements MemberUserService {
|
|||
public PageResult<MemberUserDO> getUserPage(MemberUserPageReqVO pageReqVO) {
|
||||
// 获取当前租户ID
|
||||
Long currentTenantId = TenantContextHolder.getTenantId();
|
||||
|
||||
|
||||
// 如果是系统租户,直接查询所有会员
|
||||
if (SYSTEM_TENANT_ID.equals(currentTenantId)) {
|
||||
return memberUserMapper.selectPage(pageReqVO);
|
||||
}
|
||||
|
||||
|
||||
// 校验租户ID有效性
|
||||
if (currentTenantId == null) {
|
||||
log.warn("[getUserPage][当前租户ID为空,返回空结果]");
|
||||
return PageResult.empty();
|
||||
}
|
||||
|
||||
|
||||
// 使用联表查询,一次性获取当前租户下的会员分页数据
|
||||
return memberUserMapper.selectPageByTenantId(pageReqVO, currentTenantId);
|
||||
}
|
||||
|
|
@ -355,7 +400,7 @@ public class MemberUserServiceImpl implements MemberUserService {
|
|||
updateUser.setCurrentHouseId(houseId);
|
||||
updateUser.setCurrentHouseAddress(houseAddress);
|
||||
memberUserMapper.updateById(updateUser);
|
||||
log.info("[updateCurrentHouse][用户({}) 当前房屋更新为:小区({}-{}) 房屋({}-{})]",
|
||||
log.info("[updateCurrentHouse][用户({}) 当前房屋更新为:小区({}-{}) 房屋({}-{})]",
|
||||
userId, communityId, communityName, houseId, houseAddress);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue