Ver código fonte

feat(user): 新增用户封禁状态检查功能

- 在LifeMessageController中添加isBanned接口用于查询聊天用户是否被封禁
- 实现LifeMessageService的isBanned方法, 支持判断普通用户和店铺用户封禁状态
- 在LifeUserController登录逻辑中增加账号封禁验证, 封禁用户无法登录
- 扩展LifeUser实体类, 增加isBanned字段表示用户封禁状态
- 修改LifeUserCreditScoreInfo多个字段类型为String, 并新增房产、车辆相关字段
- 完善信用评分服务逻辑, 支持用户信用信息更新及积分奖励发放
- 在多个业务场景中实现信用分低于100分自动封禁用户机制
qrs 1 dia atrás
pai
commit
5dec286215

+ 4 - 0
alien-entity/src/main/java/shop/alien/entity/store/LifeUser.java

@@ -121,4 +121,8 @@ public class LifeUser implements Serializable {
     @ApiModelProperty(value = "绑定他人邀请码")
     @TableField("bind_invite_code")
     private String bindInviteCode;
+
+    @ApiModelProperty(value = "是否被封禁(0-否  1-是)")
+    @TableField("is_banned")
+    private Integer isBanned;
 }

+ 30 - 8
alien-entity/src/main/java/shop/alien/entity/store/LifeUserCreditScoreInfo.java

@@ -25,15 +25,15 @@ public class LifeUserCreditScoreInfo {
 
     @ApiModelProperty(value = "职业类型")
     @TableField("occupation_type")
-    private Integer occupationType;
+    private String occupationType;
 
     @ApiModelProperty(value = "工作单位")
     @TableField("work_unit")
-    private Integer workUnit;
+    private String workUnit;
 
     @ApiModelProperty(value = "职业")
     @TableField("occupation")
-    private Integer occupation;
+    private String occupation;
 
     @ApiModelProperty(value = "月收入")
     @TableField("monthly_income")
@@ -41,26 +41,48 @@ public class LifeUserCreditScoreInfo {
 
     @ApiModelProperty(value = "最高学历")
     @TableField("highest_degree")
-    private Integer highestDegree;
+    private String highestDegree;
 
     @ApiModelProperty(value = "毕业院校")
     @TableField("graduated_institution")
-    private Integer graduatedInstitution;
+    private String graduatedInstitution;
 
     @ApiModelProperty(value = "毕业时间")
     @TableField("graduation_date")
-    private Integer graduationDate;
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date graduationDate;
 
     @ApiModelProperty(value = "所学专业")
     @TableField("major")
-    private Integer major;
+    private String major;
 
     @ApiModelProperty(value = "房产地址")
     @TableField("estate_address")
-    private Integer estateAddress;
+    private String estateAddress;
+
+    @ApiModelProperty(value = "是否有房产 1-有 0-无")
+    @TableField("has_estate")
+    private Integer hasEstate;
+
+    @ApiModelProperty(value = "房屋类型")
+    @TableField("estate_type")
+    private String estateType;
+
+    @ApiModelProperty(value = "是否有车辆 1-有 0-无")
+    @TableField("has_car")
+    private Integer hasCar;
+
+    @ApiModelProperty(value = "房产证明")
+    @TableField("estate_imgs")
+    private String estateImgs;
+
+    @ApiModelProperty(value = "行驶证明")
+    @TableField("car_imgs")
+    private String carImgs;
 
     @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
     @TableField("delete_flag")
+
     @TableLogic
     private Integer deleteFlag;
 

+ 10 - 5
alien-gateway/src/main/java/shop/alien/gateway/controller/LifeUserController.java

@@ -42,18 +42,23 @@ public class LifeUserController {
                                    @RequestParam(value = "macIp", required = false) String macIp,
                                    @RequestParam(value = "inviteCode", required = false) String inviteCode) {
         log.info("LifeUserController.userLogin?phoneNum={}&code={}", phoneNum, code);
+        LifeUserVo userVo = lifeUserService.userLogin(phoneNum, inviteCode, macIp);
+        if (null == userVo) {
+            return R.fail("登录失败");
+        }
+
+        if (1 == userVo.getIsBanned()) {
+            return R.fail("账号已被封禁, 无法登录");
+        }
+
         // 2025-11-04 验证码-用户端登录
         String cacheCode = baseRedisService.getString("verification_user_login_" + phoneNum);
         if (null == cacheCode) {
-            return R.fail("当验证码过期或未发送");
+            return R.fail("当验证码过期或未发送");
         }
         if (!cacheCode.trim().equals(code.trim())) {
             return R.fail("验证码错误");
         }
-        LifeUserVo userVo = lifeUserService.userLogin(phoneNum, inviteCode, macIp);
-        if (null == userVo) {
-            return R.fail("登录失败");
-        }
 
         if(StringUtils.isNotBlank(inviteCode)){
            String bindResult =  activityInviteConfigService.bindInviteCode(userVo.getId(), inviteCode);

+ 8 - 0
alien-gateway/src/main/java/shop/alien/gateway/service/LifeUserService.java

@@ -193,6 +193,14 @@ public class LifeUserService extends ServiceImpl<LifeUserGatewayMapper, LifeUser
                             record.setCurrentScoreCount(score);
                             record.setCreatedTime(new Date());
                             secondUserCreditRecordMapper.insert(record);
+
+                            // 小于100分封禁用户
+                            if (score < 100) {
+                                LifeUser user1 = new LifeUser();
+                                user1.setId(row.getUserId());
+                                user1.setIsBanned(1);
+                                lifeUserMapper.updateById(user1);
+                            }
                         }
                     }
 

+ 24 - 6
alien-second/src/main/java/shop/alien/second/service/impl/SecondGoodsServiceImpl.java

@@ -731,6 +731,14 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
                 record.setCurrentScoreCount(score);
                 record.setCreatedTime(new Date());
                 secondUserCreditRecordMapper.insert(record);
+
+                // 小于100分封禁用户
+                if (score < 100) {
+                    LifeUser user = new LifeUser();
+                    user.setId(goods.getUserId());
+                    user.setIsBanned(1);
+                    lifeUserMapper.updateById(user);
+                }
             }
 
             return false;
@@ -787,19 +795,29 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
                     .ge(SecondUserCreditRecord::getCreatedTime, startDate)
                     .le(SecondUserCreditRecord::getCreatedTime, endDate));
             if (num.size() <= 0) {
+                LambdaQueryWrapper<SecondUserCredit> queryWrapper1 = new LambdaQueryWrapper<>();
+                queryWrapper1.eq(SecondUserCredit::getUserId, goods.getUserId())
+                        .orderByDesc(SecondUserCredit::getCreatedTime).last("LIMIT 1");
+                SecondUserCredit secondUserCredit = secondUserCreditMapper.selectOne(queryWrapper1);
+                int score = secondUserCredit.getUserPoints() + SecondUserCreditScoreEnum.ABNORMAL_RELEASE.getScore();
+                secondUserCredit.setUserPoints(score);
+                secondUserCreditMapper.updateById(secondUserCredit);
+
                 SecondUserCreditRecord record = new SecondUserCreditRecord();
                 record.setUserId(goods.getUserId());
                 record.setPointsType(SecondUserCreditScoreEnum.ABNORMAL_RELEASE.getCode());
                 record.setPoints(SecondUserCreditScoreEnum.ABNORMAL_RELEASE.getScore());
+                record.setCurrentScoreCount(score);
                 record.setCreatedTime(new Date());
                 secondUserCreditRecordMapper.insert(record);
 
-                LambdaQueryWrapper<SecondUserCredit> queryWrapper1 = new LambdaQueryWrapper<>();
-                queryWrapper1.eq(SecondUserCredit::getUserId, goods.getUserId())
-                        .orderByDesc(SecondUserCredit::getCreatedTime).last("LIMIT 1");
-                SecondUserCredit secondUserCredit = secondUserCreditMapper.selectOne(queryWrapper1);
-                secondUserCredit.setUserPoints(secondUserCredit.getUserPoints() + SecondUserCreditScoreEnum.ABNORMAL_RELEASE.getScore());
-                secondUserCreditMapper.updateById(secondUserCredit);
+                // 小于100分封禁用户
+                if (score < 100) {
+                    LifeUser user = new LifeUser();
+                    user.setId(goods.getUserId());
+                    user.setIsBanned(1);
+                    lifeUserMapper.updateById(user);
+                }
             }
 
 

+ 8 - 0
alien-second/src/main/java/shop/alien/second/service/impl/SecondTradeRecordServiceImpl.java

@@ -346,6 +346,14 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
                     record.setCurrentScoreCount(score);
                     record.setCreatedTime(new Date());
                     secondUserCreditRecordMapper.insert(record);
+
+                    // 小于100分封禁用户
+                    if (score < 100) {
+                        LifeUser user = new LifeUser();
+                        user.setId(trade.getSellerId());
+                        user.setIsBanned(1);
+                        lifeUserMapper.updateById(user);
+                    }
                 }
 
 //                SecondRiskControlRecord riskControlRecord = new SecondRiskControlRecord();

+ 9 - 0
alien-store/src/main/java/shop/alien/store/controller/LifeMessageController.java

@@ -114,4 +114,13 @@ public class LifeMessageController {
         log.info("LifeMessageController.getTalkedUserList");
         return R.data(lifeMessageService.getTalkedUserList());
     }
+
+    @ApiOperation("聊天用户是否已被封禁")
+    @ApiOperationSupport(order = 11)
+    @GetMapping("/isBanned")
+    public R<Boolean> isBanned(String phoneId) throws Exception {
+        log.info("LifeMessageController.isBanned");
+        return R.data(lifeMessageService.isBanned(phoneId));
+    }
+
 }

+ 2 - 0
alien-store/src/main/java/shop/alien/store/service/LifeMessageService.java

@@ -30,4 +30,6 @@ public interface LifeMessageService extends IService<LifeMessage> {
     int getAllNoReadCount(String receiverId) throws Exception;
 
     List<LifeFansVo> getTalkedUserList() throws Exception;
+
+    boolean isBanned(String phoneId);
 }

+ 10 - 0
alien-store/src/main/java/shop/alien/store/service/impl/LifeMessageServiceImpl.java

@@ -509,4 +509,14 @@ public class LifeMessageServiceImpl extends ServiceImpl<LifeMessageMapper, LifeM
         }
     }
 
+    @Override
+    public boolean isBanned(String phoneId) {
+        if (phoneId.startsWith("store_")) {
+            return false;
+        }
+        LambdaQueryWrapper<LifeUser> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(LifeUser::getUserPhone, phoneId.split("_")[1]);
+        return lifeUserMapper.selectOne(wrapper).getIsBanned() == 1;
+    }
+
 }

+ 33 - 4
alien-store/src/main/java/shop/alien/store/service/impl/LifeUserCreditScoreInfoServiceImpl.java

@@ -8,23 +8,52 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import shop.alien.entity.result.R;
+import shop.alien.entity.second.SecondUserCreditRecord;
 import shop.alien.entity.store.LifeUserCreditScoreInfo;
 import shop.alien.mapper.LifeUserCreditScoreInfoMapper;
+import shop.alien.mapper.second.SecondUserCreditRecordMapper;
 import shop.alien.store.service.LifeUserCreditScoreInfoService;
+import shop.alien.util.common.JwtUtil;
+
+import java.util.Objects;
 
 @Service
 @RequiredArgsConstructor
 @Slf4j
 public class LifeUserCreditScoreInfoServiceImpl extends ServiceImpl<LifeUserCreditScoreInfoMapper, LifeUserCreditScoreInfo> implements LifeUserCreditScoreInfoService {
 
+    private final SecondUserCreditRecordMapper secondUserCreditRecordMapper;
+    private final LifeUserCreditScoreInfoMapper lifeUserCreditScoreInfoMapper;
+
     @Override
     public R<String> add(LifeUserCreditScoreInfo lifeUserCreditScoreInfo) {
         log.info("LifeUserCreditScoreInfoServiceImpl.add, param={}", lifeUserCreditScoreInfo);
-        boolean result = this.save(lifeUserCreditScoreInfo);
-        if (result) {
-            return R.success("新增成功");
+        Integer userId = Objects.requireNonNull(JwtUtil.getCurrentUserInfo()).getInteger("userId");
+
+        LambdaQueryWrapper<LifeUserCreditScoreInfo> queryWrapperInfo = new LambdaQueryWrapper<>();
+        queryWrapperInfo.eq(LifeUserCreditScoreInfo::getUserId, userId);
+        LifeUserCreditScoreInfo existingInfo = lifeUserCreditScoreInfoMapper.selectOne(queryWrapperInfo);
+        if (null == existingInfo) {
+            lifeUserCreditScoreInfo.setUserId(userId);
+            this.save(lifeUserCreditScoreInfo);
+        } else {
+            lifeUserCreditScoreInfo.setId(existingInfo.getId());
+            this.updateById(lifeUserCreditScoreInfo);
         }
-        return R.fail("新增失败");
+
+        LambdaQueryWrapper<SecondUserCreditRecord> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SecondUserCreditRecord::getUserId, userId);
+        queryWrapper.eq(SecondUserCreditRecord::getPointsType, 9);
+        SecondUserCreditRecord existingPoints = secondUserCreditRecordMapper.selectOne(queryWrapper);
+        if (null == existingPoints) {
+            SecondUserCreditRecord record = new SecondUserCreditRecord();
+            record.setUserId(userId);
+            record.setPoints(50);
+            record.setPointsType(9);
+            secondUserCreditRecordMapper.insert(record);
+        }
+
+        return R.success("新增成功");
     }
 
     @Override