Browse Source

风控体系代码提交

zjy 1 month ago
parent
commit
b5a7a798e2

+ 30 - 0
alien-entity/src/main/java/shop/alien/entity/second/vo/SecondRiskRecordVo.java

@@ -0,0 +1,30 @@
+package shop.alien.entity.second.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import shop.alien.entity.store.LifeUser;
+
+import java.util.List;
+
+@Data
+@JsonInclude
+public class SecondRiskRecordVo extends SecondRiskControlRecordVo {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "洗钱嫌疑")
+    private List<SecondTradeRecordVo> tradeRecordList;
+
+    @ApiModelProperty(value = "交易欺诈")
+    private List<SecondGoodsRecordDetailVo> goodsRecordList;
+
+    @ApiModelProperty(value = "异常发布")
+    private List<SecondGoodsVo> goodsList;
+
+    @ApiModelProperty(value = "账号异常")
+    private List<LifeUser> userList;
+
+    @ApiModelProperty(value = "1:执行, 2:忽略")
+    private Integer isExecute;
+
+}

+ 22 - 0
alien-entity/src/main/java/shop/alien/entity/second/vo/SecondUserCreditVo.java

@@ -0,0 +1,22 @@
+package shop.alien.entity.second.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import shop.alien.entity.second.SecondUserCredit;
+
+
+/**
+ * 用户
+ */
+@Data
+@JsonInclude
+public class SecondUserCreditVo extends SecondUserCredit {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "规则类型 1:洗钱嫌疑 2:账号异常 3:交易欺诈 4:异常发布")
+    private Integer ruleType;
+
+    @ApiModelProperty(value = "业务ID(如商品ID、交易ID等)")
+    private String businessId;
+}

+ 26 - 0
alien-entity/src/main/java/shop/alien/mapper/second/SecondRiskControlRecordMapper.java

@@ -1,10 +1,36 @@
 package shop.alien.mapper.second;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 import shop.alien.entity.second.SecondRiskControlRecord;
+import shop.alien.entity.second.vo.SecondRiskControlRecordVo;
+
+import java.util.List;
 
 /**
  * 二手商品风控记录映射器
  */
 public interface SecondRiskControlRecordMapper extends BaseMapper<SecondRiskControlRecord> {
+
+
+    @Select(" select r.*, case when r.rule_type = 1 then '洗钱嫌疑' when r.rule_type = 2 then '账号异常' " +
+            " when r.rule_type = 3 then '交易欺诈' when r.rule_type = 4 then '异常发布' end ruleTypeName,  " +
+            " case when r.rule_type = 1 then '高频高价交易' when r.rule_type = 2 then '同一设备/mac 24小时内注册超过3个账号' " +
+            " when r.rule_type = 3 then '用户频繁修改商品价格' when r.rule_type = 4 then '短时间大量发布同类商品' end ruleName, " +
+            " case when r.rule_type = 1 or r.rule_type = 2 then '中风险' when r.rule_type = 3 or r.rule_type = 4 then '高风险' end ruleRisk,  " +
+            " case when r.risk_status = 0 then '待处理' when r.risk_status = 1 then '已处理' " +
+            " when r.risk_status = 2 then '已忽略' end riskStatusName,  " +
+            " case when r.rule_type = 1 or r.rule_type = 3 then u.user_phone " +
+            " when r.rule_type = 2 then '账号异常' when r.rule_type = 3 then '交易欺诈'end userPhone " +
+            " from second_risk_control_record r left join life_user u on r.user_id = u.id " +
+            " where r.delete_flag = 0 ")
+    IPage<SecondRiskControlRecordVo> queryRiskControlRecords(IPage<SecondRiskControlRecordVo> page);
+
+
+    @Select(" select * from second_risk_control_record " +
+            " WHERE created_time BETWEEN DATE_FORMAT(#{starDate}, '%Y-%m-%d %H:%i:%s') " +
+            " AND DATE_FORMAT(#{endDate}, '%Y-%m-%d %H:%i:%s') AND business_id = #{macIp} ")
+    List<SecondRiskControlRecord> selectByBusinessId(@Param("starDate") String starDate, @Param("endDate") String endDate, @Param("macIp") String macIp);
 }

+ 1 - 0
alien-second/src/main/java/shop/alien/second/controller/RiskControlController.java

@@ -36,4 +36,5 @@ public class RiskControlController {
     public void sendNotice(Integer userId) {
         riskControlService.sendNotice(userId);
     }
+
 }

+ 7 - 10
alien-second/src/main/java/shop/alien/second/controller/SecondUserPointsController.java → alien-second/src/main/java/shop/alien/second/controller/SecondUserCreditController.java

@@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
 import shop.alien.entity.second.SecondUserCredit;
+import shop.alien.entity.second.vo.SecondUserCreditVo;
 import shop.alien.second.service.SecondUserCreditService;
 
 /**
@@ -18,7 +19,7 @@ import shop.alien.second.service.SecondUserCreditService;
 @RestController
 @RequestMapping("/userPoints")
 @RequiredArgsConstructor
-public class SecondUserPointsController {
+public class SecondUserCreditController {
     
     private final SecondUserCreditService secondUserCreditService;
     
@@ -41,22 +42,18 @@ public class SecondUserPointsController {
     
     @ApiOperation("更新用户积分")
     @ApiOperationSupport(order = 2)
-    @ApiImplicitParams({
-        @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "Integer", paramType = "path", required = true),
-        @ApiImplicitParam(name = "points", value = "积分变动值", dataType = "Integer", paramType = "query", required = true)
-    })
-    @PostMapping("/{userId}/points")
-    public R<Boolean> updateUserPoints(@PathVariable Integer userId, @RequestParam Integer points) {
-        log.info("更新用户积分,userId={}, points={}", userId, points);
+    @PostMapping("/update/credit")
+    public R<Boolean> updateUserPoints(SecondUserCreditVo credit) {
+        log.info("更新用户积分,credit={}", credit);
         try {
-            boolean result = secondUserCreditService.updatePoints(userId, points);
+            boolean result = secondUserCreditService.updatePoints(credit);
             if (result) {
                 return R.success("积分更新成功");
             } else {
                 return R.fail("积分更新失败");
             }
         } catch (Exception e) {
-            log.error("更新用户积分失败,userId={}, points={}", userId, points, e);
+            log.error("更新用户积分失败,credit={}", credit, e);
             return R.fail("积分更新失败");
         }
     }

+ 1 - 1
alien-second/src/main/java/shop/alien/second/controller/SecondUserPointsRecordController.java → alien-second/src/main/java/shop/alien/second/controller/SecondUserCreditRecordController.java

@@ -19,7 +19,7 @@ import java.util.List;
 @RestController
 @RequestMapping("/userPointsRecord")
 @RequiredArgsConstructor
-public class SecondUserPointsRecordController {
+public class SecondUserCreditRecordController {
     
     private final SecondUserCreditRecordService secondUserPointsRecordService;
     

+ 62 - 0
alien-second/src/main/java/shop/alien/second/platform/PlatformRiskControlController.java

@@ -0,0 +1,62 @@
+package shop.alien.second.platform;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiSort;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.second.vo.*;
+import shop.alien.second.service.RiskControlService;
+
+import java.util.List;
+
+/**
+ * 风控商品信息控制器
+ */
+@Slf4j
+@Api(tags = {"二手平台-风控商品信息管理(管理后台)"})
+@ApiSort(2)
+@CrossOrigin
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/riskControl")
+public class PlatformRiskControlController {
+
+    private final RiskControlService riskControlService;
+
+    /**
+     * 风控数据
+     *
+     * @param vo
+     */
+    @ApiOperation("风控数据")
+    @PostMapping("/queryRiskControlRecords")
+    public R<IPage<SecondRiskControlRecordVo>> queryRiskControlRecords(@RequestBody SecondUserViolationVo vo) {
+        return R.data(riskControlService.queryRiskControlRecords(vo.getPageNum(), vo.getPageSize()));
+    }
+
+
+    @ApiOperation("风控数据")
+    @PostMapping("/queryRiskControlRecordsDetail")
+    public R<SecondRiskRecordVo> queryRiskControlRecordsDetail(@RequestBody SecondRiskRecordVo vo) throws Exception {
+        return R.data(riskControlService.queryRiskControlRecordsDetail(vo));
+    }
+
+    @ApiOperation("账号封禁处理")
+    @PostMapping("/accountBan")
+    public R<SecondRiskRecordVo> accountBan(@RequestBody SecondRiskRecordVo vo) throws Exception {
+        try {
+            boolean type = riskControlService.accountBan(vo);
+            if (!type) {
+                return R.fail("封禁失败");
+            }
+            return R.success("封禁成功");
+        } catch (Exception e) {
+            return R.fail("系统异常,请联系管理员!!!");
+        }
+    }
+
+}

+ 22 - 0
alien-second/src/main/java/shop/alien/second/service/RiskControlService.java

@@ -1,8 +1,10 @@
 package shop.alien.second.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import shop.alien.entity.second.SecondRiskControlRecord;
 import shop.alien.entity.second.vo.SecondRiskControlRecordVo;
+import shop.alien.entity.second.vo.SecondRiskRecordVo;
 
 import java.util.List;
 
@@ -39,4 +41,24 @@ public interface RiskControlService extends IService<SecondRiskControlRecord> {
      * 发送封禁通知
      */
     void sendNotice(Integer userId);
+
+    /**
+     * 获取相同类型的风控数据
+     *
+     * @param page   页码
+     * @param size 条数
+     * @return 查询风控列表
+     */
+    IPage<SecondRiskControlRecordVo> queryRiskControlRecords(Integer page, Integer size);
+
+    /**
+     * 账号封禁详细查询
+     */
+    SecondRiskRecordVo queryRiskControlRecordsDetail(SecondRiskRecordVo vo) throws Exception;
+
+    /**
+     * 账号封禁处理
+     */
+    boolean accountBan(SecondRiskRecordVo vo) throws Exception;
+
 }

+ 3 - 3
alien-second/src/main/java/shop/alien/second/service/SecondUserCreditService.java

@@ -3,6 +3,7 @@ package shop.alien.second.service;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
 import shop.alien.entity.second.SecondUserCredit;
+import shop.alien.entity.second.vo.SecondUserCreditVo;
 
 /**
  * 二手平台用户积分服务接口
@@ -18,11 +19,10 @@ public interface SecondUserCreditService extends IService<SecondUserCredit> {
     
     /**
      * 更新用户积分
-     * @param userId 用户ID
-     * @param points 积分变动值(可为负数)
+     * @param credit
      * @return 是否更新成功
      */
-    boolean updatePoints(Integer userId, Integer points);
+    boolean updatePoints(SecondUserCreditVo credit);
     
     /**
      * 新建用户积分记录

+ 140 - 5
alien-second/src/main/java/shop/alien/second/service/impl/RiskControlServiceImpl.java

@@ -1,23 +1,36 @@
 package shop.alien.second.service.impl;
 
 import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import shop.alien.entity.second.SecondRiskControlRecord;
-import shop.alien.entity.store.LifeNotice;
+import shop.alien.entity.second.SecondUserCredit;
+import shop.alien.entity.second.SecondUserCreditRecord;
+import shop.alien.entity.second.vo.*;
 import shop.alien.entity.store.LifeUser;
+
+import shop.alien.entity.store.LifeNotice;
 import shop.alien.entity.store.vo.WebSocketVo;
 import shop.alien.mapper.LifeNoticeMapper;
 import shop.alien.mapper.LifeUserMapper;
 import shop.alien.mapper.second.SecondRiskControlRecordMapper;
+import shop.alien.mapper.second.SecondUserCreditMapper;
 import shop.alien.second.feign.AlienStoreFeign;
 import shop.alien.second.service.RiskControlService;
 
-import java.util.Date;
-import java.util.List;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 风控服务实现类
@@ -31,6 +44,15 @@ public class RiskControlServiceImpl extends ServiceImpl<SecondRiskControlRecordM
     private final LifeNoticeMapper lifeNoticeMapper;
     private final LifeUserMapper lifeUserMapper;
     private final AlienStoreFeign alienStoreFeign;
+
+    private final RiskControlGoodsServiceImpl riskControlGoodsService;
+    private final PlatformSecondTradeServiceImpl tradeService;
+    private final SecondUserCreditMapper secondUserCreditMapper;
+    private final SecondUserCreditRecordServiceImpl sreditRecordService;
+
+    @Lazy
+    @Autowired
+    private SecondGoodsServiceImpl secondGoodsService;
     /**
      * 记录风控数据
      *
@@ -53,8 +75,8 @@ public class RiskControlServiceImpl extends ServiceImpl<SecondRiskControlRecordM
             record.setRuleName(ruleName);
             record.setBusinessId(businessId);
             record.setDetailInfo(detailInfo);
-            record.setCreatedTime(new Date());
-            record.setUpdatedTime(new Date());
+            record.setCreatedTime(Date.from(LocalDateTime.now().plusDays(7).atZone(ZoneId.systemDefault()).toInstant()));
+            record.setUpdatedTime(Date.from(LocalDateTime.now().plusDays(7).atZone(ZoneId.systemDefault()).toInstant()));
             record.setDeleteFlag(0);
             record.setCreatedUserId(userId);
             record.setUpdatedUserId(userId);
@@ -82,6 +104,17 @@ public class RiskControlServiceImpl extends ServiceImpl<SecondRiskControlRecordM
         return secondRiskControlRecordMapper.selectList(queryWrapper);
     }
 
+    @Override
+    public IPage<SecondRiskControlRecordVo> queryRiskControlRecords(Integer page, Integer size) {
+        try {
+            return secondRiskControlRecordMapper.queryRiskControlRecords(new Page<>(page, size));
+        } catch (Exception e) {
+            log.error("记录风控数据时发生异常: ", e);
+            return null;
+        }
+    }
+
+
     /**
      * 发送封禁通知
      */
@@ -115,4 +148,106 @@ public class RiskControlServiceImpl extends ServiceImpl<SecondRiskControlRecordM
         alienStoreFeign.sendMsgToClientByPhoneId(phoneId, JSONObject.from(webSocketVo).toJSONString());
     }
 
+
+    @Override
+    public SecondRiskRecordVo queryRiskControlRecordsDetail(SecondRiskRecordVo vo) throws Exception {
+        // 返回实体
+        SecondRiskRecordVo item = new SecondRiskRecordVo();
+
+        if (vo.getRuleType() == 1) {
+            item.setTradeRecordList(tradeService.getTradeRecordListByRiskId(vo.getId()));
+        } else if (vo.getRuleType() == 2) {
+            // 将数组转换为包含整数的列表
+            List<Integer> userIds = Arrays.stream(vo.getDetailInfo().split(","))
+                    .map(Integer::parseInt)
+                    .collect(Collectors.toList());
+
+            // 使用LambdaQueryWrapper进行查询
+            LambdaQueryWrapper<LifeUser> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.in(LifeUser::getId, userIds);
+            item.setUserList(lifeUserMapper.selectList(queryWrapper));
+        } else if (vo.getRuleType() == 3 || vo.getRuleType() == 4) {
+            // 移除方括号并按逗号分割,然后转换为Integer列表
+            List<Integer> integerList = Arrays.stream(vo.getDetailInfo().substring(1, vo.getDetailInfo().length() - 1)
+                            .split(","))
+                    .map(String::trim)
+                    .map(Integer::parseInt)
+                    .collect(Collectors.toList());
+
+            if (vo.getRuleType() == 3) {
+                item.setGoodsRecordList(riskControlGoodsService.getGoodsInfoByRecordIds(integerList));
+            } else {
+                item.setGoodsList(riskControlGoodsService.getGoodsInfoByGoodsIds(integerList));
+            }
+        }
+        return item;
+    }
+
+
+    @Override
+    public boolean accountBan(SecondRiskRecordVo vo) throws Exception {
+        if (vo.getIsExecute() == 1) {
+            // 封禁时间
+            Date freezeTime = Date.from(LocalDateTime.now().plusDays(7).atZone(ZoneId.systemDefault()).toInstant());
+
+            if (vo.getRuleType() == 2) {
+                // 查询所有待交易
+                LambdaQueryWrapper<SecondRiskControlRecord> wrapper = new LambdaQueryWrapper<>();
+                wrapper.eq(SecondRiskControlRecord::getBusinessId, vo.getBusinessId());
+                List<SecondRiskControlRecord> records = secondRiskControlRecordMapper.selectList(wrapper);
+
+                // 将所有记录的detailInfo用逗号连接在一起
+                String combinedDetailInfo = records.stream()
+                        .map(SecondRiskControlRecord::getDetailInfo)
+                        .filter(Objects::nonNull) // 过滤掉null值
+                        .collect(Collectors.joining(","));
+
+                // 将数组转换为包含整数的列表
+                Set<Integer> userIds = Arrays.stream(combinedDetailInfo.split(","))
+                        .map(Integer::parseInt)
+                        .collect(Collectors.toSet());
+
+                // 方式1: 使用LambdaUpdateWrapper
+                LambdaUpdateWrapper<SecondUserCredit> updateWrapper = new LambdaUpdateWrapper<>();
+                updateWrapper.in(SecondUserCredit::getUserId, userIds)
+                        .set(SecondUserCredit::getFreezeTime, freezeTime)
+                        .set(SecondUserCredit::getUpdatedTime, new Date());
+                secondUserCreditMapper.update(null, updateWrapper);
+            } else {
+                LambdaQueryWrapper<SecondUserCredit> queryWrapper = new LambdaQueryWrapper<>();
+                queryWrapper.eq(SecondUserCredit::getUserId, vo.getUserId())
+                        .eq(SecondUserCredit::getDeleteFlag, 0);
+                SecondUserCredit userPoints = secondUserCreditMapper.selectOne(queryWrapper);
+                if (userPoints == null) {
+                    return false;
+                }
+                if (vo.getRuleType() == 1) {
+                    tradeService.bannedAccountCancelTrade(vo.getUserId());
+                } else {
+                    if (vo.getRuleType() == 3 || vo.getRuleType() == 4) {
+                        // 更新积分
+                        int newPoints = userPoints.getUserPoints() - 50;
+                        // 创建积分记录
+                        SecondUserCreditRecord record = new SecondUserCreditRecord();
+                        record.setUserId(vo.getUserId());
+                        record.setPoints(-50);
+                        record.setPointsType(3);
+                        sreditRecordService.createRecord(record);
+                        userPoints.setUserPoints(newPoints);
+                        secondGoodsService.batchShelveGoodsByRiskControlRecord(vo.getRuleType(), vo.getBusinessId());
+                    }
+                }
+                userPoints.setFreezeTime(freezeTime);
+                secondUserCreditMapper.updateById(userPoints);
+            }
+        }
+        // 方式1: 使用LambdaUpdateWrapper
+        LambdaUpdateWrapper<SecondRiskControlRecord> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.in(SecondRiskControlRecord::getUserId, vo.getBusinessId())
+                .set(SecondRiskControlRecord::getRiskStatus, vo.getIsExecute())
+                .set(SecondRiskControlRecord::getUpdatedTime, new Date());
+        secondRiskControlRecordMapper.update(null, updateWrapper);
+        return true;
+    }
+
 }

+ 17 - 9
alien-second/src/main/java/shop/alien/second/service/impl/SecondUserCreditServiceImpl.java

@@ -6,13 +6,14 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.openqa.selenium.json.Json;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import shop.alien.entity.second.SecondUserCredit;
 import shop.alien.entity.second.SecondUserCreditRecord;
+import shop.alien.entity.second.vo.SecondUserCreditVo;
 import shop.alien.mapper.second.SecondUserCreditMapper;
 import shop.alien.mapper.second.SecondUserCreditRecordMapper;
+import shop.alien.second.service.SecondGoodsService;
 import shop.alien.second.service.SecondUserCreditService;
 
 import java.util.Date;
@@ -30,6 +31,11 @@ public class SecondUserCreditServiceImpl extends ServiceImpl<SecondUserCreditMap
     private final SecondUserCreditRecordMapper secondUserCreditRecordMapper;
 
     /**
+     * 二手商品服务
+     */
+    private final SecondGoodsService secondGoodsService;
+
+    /**
      * 根据用户ID获取用户积分信息
      * @param userId 用户ID
      * @return 用户积分信息
@@ -44,35 +50,37 @@ public class SecondUserCreditServiceImpl extends ServiceImpl<SecondUserCreditMap
     
     /**
      * 更新用户积分
-     * @param userId 用户ID
-     * @param points 积分变动值(可为负数)
+     * @param credit
      * @return 是否更新成功
      */
     @Override
-    public boolean updatePoints(Integer userId, Integer points) {
+    public boolean updatePoints(SecondUserCreditVo credit) {
         try {
             // 查询用户积分记录
-            SecondUserCredit userPoints = getByUserId(userId);
+            SecondUserCredit userPoints = getByUserId(credit.getUserId());
             
             if (userPoints == null) {
                 // 如果用户没有积分记录,则创建新记录
                 userPoints = new SecondUserCredit();
-                userPoints.setUserId(userId);
-                userPoints.setUserPoints(points > 0 ? points : 0);
+                userPoints.setUserId(credit.getUserId());
+                userPoints.setUserPoints(credit.getUserPoints() > 0 ? credit.getUserPoints() : 0);
                 userPoints.setDeleteFlag(0);
                 userPoints.setCreatedTime(new Date());
                 userPoints.setUpdatedTime(new Date());
                 secondUserCreditMapper.insert(userPoints);
             } else {
                 // 更新积分
-                int newPoints = userPoints.getUserPoints() + points;
+                int newPoints = userPoints.getUserPoints() - 50;
                 userPoints.setUserPoints(newPoints > 0 ? newPoints : 0);
                 userPoints.setUpdatedTime(new Date());
                 secondUserCreditMapper.updateById(userPoints);
             }
+            if (credit.getRuleType() == 3 || credit.getRuleType() == 4) {
+                secondGoodsService.batchShelveGoodsByRiskControlRecord(credit.getRuleType(), credit.getBusinessId());
+            }
             return true;
         } catch (Exception e) {
-            log.error("更新用户积分失败,userId={}, points={}", userId, points, e);
+            log.error("更新用户积分失败,credit={}", credit, e);
             return false;
         }
     }

+ 57 - 2
alien-store/src/main/java/shop/alien/store/service/LifeUserService.java

@@ -19,6 +19,8 @@ import org.springframework.util.CollectionUtils;
 import shop.alien.config.properties.RiskControlProperties;
 import shop.alien.entity.second.LifeUserLog;
 import shop.alien.entity.result.R;
+import shop.alien.entity.second.SecondRiskControlRecord;
+import shop.alien.entity.second.SecondUserCredit;
 import shop.alien.entity.store.LifeFans;
 import shop.alien.entity.store.LifeNotice;
 import shop.alien.entity.store.LifeUser;
@@ -26,6 +28,8 @@ import shop.alien.entity.store.vo.LifeMessageVo;
 import shop.alien.entity.store.vo.LifeUserVo;
 import shop.alien.entity.store.vo.WebSocketVo;
 import shop.alien.mapper.second.LifeUserLogMapper;
+import shop.alien.mapper.second.SecondRiskControlRecordMapper;
+import shop.alien.mapper.second.SecondUserCreditMapper;
 import shop.alien.store.config.BaseRedisService;
 import shop.alien.mapper.LifeFansMapper;
 import shop.alien.mapper.LifeMessageMapper;
@@ -67,6 +71,10 @@ public class LifeUserService extends ServiceImpl<LifeUserMapper, LifeUser> {
 
     private final SecondServiceFeign alienSecondFeign;
 
+    private final SecondUserCreditMapper secondUserCreditMapper;
+
+    private final SecondRiskControlRecordMapper secondRiskControlRecordMapper;
+
     @Autowired
     private RiskControlProperties riskControlProperties;
 
@@ -183,8 +191,6 @@ public class LifeUserService extends ServiceImpl<LifeUserMapper, LifeUser> {
 
                 // 二手平台登录log,同一个macip登录多账号记录
                 addLifeUserLogInfo(user2, macIp);
-                // 第一次登录,添加用户基础积分
-                alienSecondFeign.createPointsRecord(user2.getId(), 300, 1);
 
                 return userVo;
             } else {
@@ -325,4 +331,53 @@ public class LifeUserService extends ServiceImpl<LifeUserMapper, LifeUser> {
             log.error("LifeUserService webSocketProcess Stack={}", e);
         }
     }
+
+    public void addLifeUserLogInfo(LifeUser user, String macIp) {
+        try {
+            LifeUserLog lifeUserLog = new LifeUserLog();
+            lifeUserLog.setUserId(user.getId());
+            lifeUserLog.setUserName(user.getUserName());
+            lifeUserLog.setMacIp(macIp);
+            lifeUserLog.setCreatedTime(new Date());
+            int count = lifeUserLogMapper.insert(lifeUserLog);
+            if (count > 0) {
+                String startDate = LocalDateTime.now().minusHours(24L).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+                String endDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+                List<LifeUserLog> lsit = lifeUserLogMapper.getLifeUserLogByDate(startDate, endDate, macIp);
+
+                if (lsit.size() > riskControlProperties.getAccountAbnormal().getRegCount24h() && !isViolation(startDate, endDate, macIp, user.getId())) {
+                    String detailInfo = lsit.stream()
+                            .map(row -> row.getUserId().toString())
+                            .collect(Collectors.joining(","));
+                    alienSecondFeign.recordRiskControlData(null, 2, "账号异常", macIp, detailInfo);
+                }
+            }
+
+
+            // 使用LambdaQueryWrapper的exists方法 查看是否已添加基础积分
+            LambdaQueryWrapper<SecondUserCredit> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(SecondUserCredit::getUserId, user.getId()).eq(SecondUserCredit::getDeleteFlag, 0);
+            boolean exists = secondUserCreditMapper.selectCount(queryWrapper) > 0;
+            if (!exists) {
+                // 第一次登录,添加用户基础积分
+                alienSecondFeign.createPointsRecord(user.getId(), 300, 1);
+            }
+        } catch (Exception e) {
+            log.error("用户登录log存放异常:{}", e);
+        }
+    }
+
+    public boolean isViolation(String startDate, String endDate, String macIp, Integer userId) {
+        List<SecondRiskControlRecord> list = secondRiskControlRecordMapper.selectByBusinessId(startDate, endDate, macIp);
+        for (SecondRiskControlRecord record : list) {
+            // 将数组转换为包含整数的列表
+            List<Integer> userIdList = Arrays.stream(record.getDetailInfo().split(","))
+                    .map(Integer::parseInt)
+                    .collect(Collectors.toList());
+            if (userIdList.contains(userId)) {
+                return true;
+            }
+        }
+        return false;
+    }
 }