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);
}