diff --git a/fjrcloud-module-community/pom.xml b/fjrcloud-module-community/pom.xml index bbe5022..65f2a4a 100644 --- a/fjrcloud-module-community/pom.xml +++ b/fjrcloud-module-community/pom.xml @@ -27,11 +27,6 @@ fjrcloud-module-infra ${revision} - - com.fjrcloud.boot - fjrcloud-module-member - ${revision} - diff --git a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/app/memberhouse/AppMemberHouseController.java b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/app/memberhouse/AppMemberHouseController.java index c8eb404..a2eb2d1 100644 --- a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/app/memberhouse/AppMemberHouseController.java +++ b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/app/memberhouse/AppMemberHouseController.java @@ -39,7 +39,12 @@ public class AppMemberHouseController { @Operation(summary = "获取我的房屋认证列表") public CommonResult> getMyHouseList() { Long memberId = SecurityFrameworkUtils.getLoginUserId(); - return success(memberHouseService.getMemberHouseListByMemberId(memberId)); + List 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 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() )); } diff --git a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/app/memberhouse/vo/AppMemberHouseRespVO.java b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/app/memberhouse/vo/AppMemberHouseRespVO.java index 02dee70..d9833ee 100644 --- a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/app/memberhouse/vo/AppMemberHouseRespVO.java +++ b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/app/memberhouse/vo/AppMemberHouseRespVO.java @@ -37,4 +37,6 @@ public class AppMemberHouseRespVO { @Schema(description = "关联人员数量", example = "3") private Integer relationCount; + @Schema(description = "房屋完整地址", example = "12号楼1单元701") + private String fullAddress; } \ No newline at end of file diff --git a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/dal/dataobject/memberhouse/MemberHouseDO.java b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/dal/dataobject/memberhouse/MemberHouseDO.java index 9a812bc..87953bd 100644 --- a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/dal/dataobject/memberhouse/MemberHouseDO.java +++ b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/dal/dataobject/memberhouse/MemberHouseDO.java @@ -117,6 +117,10 @@ public class MemberHouseDO extends TenantBaseDO { * 审核时间 */ private LocalDateTime auditTime; + /** + * 是否默认房屋(0-否,1-是) + */ + private Boolean isDefault; } \ No newline at end of file diff --git a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/dal/mysql/memberhouse/MemberHouseMapper.java b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/dal/mysql/memberhouse/MemberHouseMapper.java index 2277f3d..95bc29f 100644 --- a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/dal/mysql/memberhouse/MemberHouseMapper.java +++ b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/dal/mysql/memberhouse/MemberHouseMapper.java @@ -50,4 +50,22 @@ public interface MemberHouseMapper extends BaseMapperX { .orderByDesc(MemberHouseDO::getId)); } + default MemberHouseDO selectDefaultHouseByMemberAndCommunity(Long memberId, Long communityId) { + return selectOne(new LambdaQueryWrapperX() + .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() + .eq(MemberHouseDO::getMemberId, memberId) + .eq(MemberHouseDO::getCommunityId, communityId) + .eq(MemberHouseDO::getStatus, 1) + .orderByDesc(MemberHouseDO::getIsOwner) + .orderByDesc(MemberHouseDO::getId)); + } + } \ No newline at end of file diff --git a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/memberhouse/MemberHouseService.java b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/memberhouse/MemberHouseService.java index 11b736e..ff6ecdf 100644 --- a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/memberhouse/MemberHouseService.java +++ b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/memberhouse/MemberHouseService.java @@ -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); + } \ No newline at end of file diff --git a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/memberhouse/MemberHouseServiceImpl.java b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/memberhouse/MemberHouseServiceImpl.java index 9b714d6..f448038 100644 --- a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/memberhouse/MemberHouseServiceImpl.java +++ b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/memberhouse/MemberHouseServiceImpl.java @@ -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 getMemberCommunityTree(Long memberId) { // 1. 查询会员的所有房屋认证记录 - List memberHouseList = memberHouseMapper.selectListByMemberId(memberId); + List memberHouseList = memberHouseMapper.selectList(new LambdaQueryWrapper() + .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() + .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); + } + } \ No newline at end of file diff --git a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/user/MemberUserServiceImpl.java b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/user/MemberUserServiceImpl.java index de29c99..b9c0dee 100644 --- a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/user/MemberUserServiceImpl.java +++ b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/user/MemberUserServiceImpl.java @@ -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 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); }