소스 검색

feat(second): 引入用户信用评分枚举并更新相关服务逻辑

- 新增 SecondUserCreditScoreEnum 枚举类定义各类信用评分规则
- 在 LifeUserService 中替换硬编码的积分类型为枚举值
- 更新 SecondGoodsServiceImpl 和 SecondTradeRecordServiceImpl
  中的风控处理逻辑,使用信用评分枚举替代原有风控记录方式
- 优化信用分计算逻辑,确保用户信用分正确增减
- 添加时间范围查询条件避免重复扣分
qrs 4 일 전
부모
커밋
6cb2c1707f

+ 3 - 0
alien-entity/src/main/java/shop/alien/entity/second/SecondUserCreditRecord.java

@@ -30,6 +30,9 @@ public class SecondUserCreditRecord implements Serializable {
     @TableField("points_type")
     private Integer pointsType;
 
+    @TableField("current_score_count")
+    private Integer currentScoreCount;
+
     @TableField("delete_flag")
     @TableLogic
     private Integer deleteFlag;

+ 25 - 0
alien-entity/src/main/java/shop/alien/entity/second/enums/SecondUserCreditScoreEnum.java

@@ -0,0 +1,25 @@
+package shop.alien.entity.second.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum SecondUserCreditScoreEnum {
+
+    BASE_SCORE(1, 300, "基础分"),
+    CERTIFICATION_SCORE(2, 200, "认证分"),
+    TRANSACTION_SCORE(3, 50, "交易成功"),
+    SUSPECTED_OF_MONEY_LAUNDERING(4, -50, "洗钱嫌疑"),
+    ABNORMAL_ACCOUNTV(5, -50, "账号异常"),
+    TRADING_FRAUD(6, -50, "交易欺诈"),
+    ABNORMAL_RELEASE(7, -50, "异常发布");
+
+    private final Integer code;
+    private final Integer score;
+    private final String description;
+
+    SecondUserCreditScoreEnum(Integer code, Integer score, String description) {
+        this.code = code;
+        this.score = score;
+        this.description = description;
+    }
+}

+ 12 - 9
alien-gateway/src/main/java/shop/alien/gateway/service/LifeUserService.java

@@ -15,6 +15,7 @@ import shop.alien.entity.second.LifeUserLog;
 import shop.alien.entity.second.SecondRiskControlRecord;
 import shop.alien.entity.second.SecondUserCredit;
 import shop.alien.entity.second.SecondUserCreditRecord;
+import shop.alien.entity.second.enums.SecondUserCreditScoreEnum;
 import shop.alien.entity.store.LifeUser;
 import shop.alien.entity.store.StoreImg;
 import shop.alien.entity.store.StoreUser;
@@ -172,24 +173,26 @@ public class LifeUserService extends ServiceImpl<LifeUserGatewayMapper, LifeUser
                     for (LifeUserLog row: lsit) {
                         List<SecondUserCreditRecord> num = secondUserCreditRecordMapper.selectList(new LambdaQueryWrapper<SecondUserCreditRecord>()
                                 .eq(SecondUserCreditRecord::getUserId, row.getUserId())
-                                .eq(SecondUserCreditRecord::getPointsType, 5)
+                                .eq(SecondUserCreditRecord::getPointsType, SecondUserCreditScoreEnum.ABNORMAL_ACCOUNTV.getCode())
                                 .ge(SecondUserCreditRecord::getCreatedTime, startDate)
                                 .le(SecondUserCreditRecord::getCreatedTime, endDate));
 
                         if (num.size() <= 0) {
-                            SecondUserCreditRecord record = new SecondUserCreditRecord();
-                            record.setUserId(row.getUserId());
-                            record.setPointsType(5);
-                            record.setPoints(-10);
-                            record.setCreatedTime(new Date());
-                            secondUserCreditRecordMapper.insert(record);
-
                             LambdaQueryWrapper<SecondUserCredit> queryWrapper = new LambdaQueryWrapper<>();
                             queryWrapper.eq(SecondUserCredit::getUserId, row.getUserId())
                                     .orderByDesc(SecondUserCredit::getCreatedTime).last("LIMIT 1");
                             SecondUserCredit secondUserCredit = secondUserCreditMapper.selectOne(queryWrapper);
-                            secondUserCredit.setUserPoints(secondUserCredit.getUserPoints() - 10);
+                            int score = secondUserCredit.getUserPoints() + SecondUserCreditScoreEnum.ABNORMAL_ACCOUNTV.getScore();
+                            secondUserCredit.setUserPoints(score);
                             secondUserCreditMapper.updateById(secondUserCredit);
+
+                            SecondUserCreditRecord record = new SecondUserCreditRecord();
+                            record.setUserId(row.getUserId());
+                            record.setPointsType(SecondUserCreditScoreEnum.ABNORMAL_ACCOUNTV.getCode());
+                            record.setPoints(SecondUserCreditScoreEnum.ABNORMAL_ACCOUNTV.getScore());
+                            record.setCurrentScoreCount(score);
+                            record.setCreatedTime(new Date());
+                            secondUserCreditRecordMapper.insert(record);
                         }
                     }
 

+ 59 - 2
alien-second/src/main/java/shop/alien/second/service/impl/SecondGoodsServiceImpl.java

@@ -24,6 +24,7 @@ import shop.alien.entity.SecondVideoTask;
 import shop.alien.entity.second.*;
 import shop.alien.entity.second.enums.RiskControlRuleTypeEnum;
 import shop.alien.entity.second.enums.SecondGoodsStatusEnum;
+import shop.alien.entity.second.enums.SecondUserCreditScoreEnum;
 import shop.alien.entity.second.vo.*;
 import shop.alien.entity.store.*;
 import shop.alien.entity.store.vo.LifeUserVo;
@@ -37,6 +38,8 @@ import shop.alien.util.common.VideoUtils;
 import shop.alien.util.common.safe.*;
 
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -166,6 +169,9 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
 
     private final SecondGoodsAuditService secondGoodsAuditService;
 
+    private final SecondUserCreditMapper secondUserCreditMapper;
+    private final SecondUserCreditRecordMapper secondUserCreditRecordMapper;
+
     /**
      * 获取商品操作记录详情(管理后台使用)
      * @param recordId 商品操作记录ID
@@ -700,7 +706,33 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
         // 如果发布数量超过限制,记录风控数据
         if (sameCategoryCount > publishLimit) {
             // "异常发布-同类商品发布频率"
-            riskControlService.recordRiskControlData(goods.getUserId(), RiskControlRuleTypeEnum.TRANSACTION_FRAUD.getRuleType(), RiskControlRuleTypeEnum.TRANSACTION_FRAUD.getDescription(), goods.getId().toString(),json);
+//            riskControlService.recordRiskControlData(goods.getUserId(), RiskControlRuleTypeEnum.TRANSACTION_FRAUD.getRuleType(), RiskControlRuleTypeEnum.TRANSACTION_FRAUD.getDescription(), goods.getId().toString(),json);
+
+            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<SecondUserCreditRecord> num = secondUserCreditRecordMapper.selectList(new LambdaQueryWrapper<SecondUserCreditRecord>()
+                    .eq(SecondUserCreditRecord::getUserId, goods.getUserId())
+                    .eq(SecondUserCreditRecord::getPointsType, SecondUserCreditScoreEnum.TRADING_FRAUD.getCode())
+                    .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.TRADING_FRAUD.getScore();
+                secondUserCredit.setUserPoints(score);
+                secondUserCreditMapper.updateById(secondUserCredit);
+
+                SecondUserCreditRecord record = new SecondUserCreditRecord();
+                record.setUserId(goods.getUserId());
+                record.setPointsType(SecondUserCreditScoreEnum.TRADING_FRAUD.getCode());
+                record.setPoints(SecondUserCreditScoreEnum.TRADING_FRAUD.getScore());
+                record.setCurrentScoreCount(score);
+                record.setCreatedTime(new Date());
+                secondUserCreditRecordMapper.insert(record);
+            }
+
             return false;
         }
         return true;
@@ -745,7 +777,32 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
         // 如果发布数量超过限制,记录风控数据
         if (sameCategoryCount > sameCategoryLimit) {
             // "异常发布-同类商品发布频率"
-            riskControlService.recordRiskControlData(goods.getUserId(), RiskControlRuleTypeEnum.ABNORMAL_PUBLISH.getRuleType(), RiskControlRuleTypeEnum.ABNORMAL_PUBLISH.getDescription(), goods.getId().toString(),json);
+//            riskControlService.recordRiskControlData(goods.getUserId(), RiskControlRuleTypeEnum.ABNORMAL_PUBLISH.getRuleType(), RiskControlRuleTypeEnum.ABNORMAL_PUBLISH.getDescription(), goods.getId().toString(),json);
+
+            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<SecondUserCreditRecord> num = secondUserCreditRecordMapper.selectList(new LambdaQueryWrapper<SecondUserCreditRecord>()
+                    .eq(SecondUserCreditRecord::getUserId, goods.getUserId())
+                    .eq(SecondUserCreditRecord::getPointsType, SecondUserCreditScoreEnum.ABNORMAL_RELEASE.getCode())
+                    .ge(SecondUserCreditRecord::getCreatedTime, startDate)
+                    .le(SecondUserCreditRecord::getCreatedTime, endDate));
+            if (num.size() <= 0) {
+                SecondUserCreditRecord record = new SecondUserCreditRecord();
+                record.setUserId(goods.getUserId());
+                record.setPointsType(SecondUserCreditScoreEnum.ABNORMAL_RELEASE.getCode());
+                record.setPoints(SecondUserCreditScoreEnum.ABNORMAL_RELEASE.getScore());
+                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);
+            }
+
+
             return false;
         }
         return true;

+ 36 - 9
alien-second/src/main/java/shop/alien/second/service/impl/SecondTradeRecordServiceImpl.java

@@ -21,6 +21,7 @@ import shop.alien.config.properties.RiskControlProperties;
 import shop.alien.config.redis.BaseRedisService;
 import shop.alien.entity.result.BusinessException;
 import shop.alien.entity.second.*;
+import shop.alien.entity.second.enums.SecondUserCreditScoreEnum;
 import shop.alien.entity.second.vo.SecondEntrustUserDTO;
 import shop.alien.entity.store.*;
 import shop.alien.mapper.second.SecondRiskControlRecordMapper;
@@ -37,6 +38,7 @@ import shop.alien.second.service.SecondTradeRecordService;
 import shop.alien.util.common.JwtUtil;
 
 import java.time.*;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -321,15 +323,40 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
             wrapper.gt(SecondTradeRecord::getTransactionAmount, riskControlProperties.getMoneyLaundering().getAmountThreshold());
             List<SecondTradeRecord> recordList = secondTradeRecordMapper.selectList(wrapper);
             if (recordList.size() > riskControlProperties.getMoneyLaundering().getDailyCount()) {
-                SecondRiskControlRecord riskControlRecord = new SecondRiskControlRecord();
-                riskControlRecord.setRuleType(1);
-                riskControlRecord.setUserId(trade.getSellerId());
-                riskControlRecord.setBusinessId(String.valueOf(trade.getSellerId()));
-                riskControlRecord.setRuleName(riskControlProperties.getMoneyLaundering().getRiskType());
-                JSONArray detailInfo = new JSONArray();
-                detailInfo.addAll(recordList.stream().map(SecondTradeRecord::getId).collect(Collectors.toList()));
-                riskControlRecord.setDetailInfo(detailInfo.toJSONString());
-                secondRiskControlRecordMapper.insert(riskControlRecord);
+                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<SecondUserCreditRecord> num = secondUserCreditRecordMapper.selectList(new LambdaQueryWrapper<SecondUserCreditRecord>()
+                        .eq(SecondUserCreditRecord::getUserId, trade.getSellerId())
+                        .eq(SecondUserCreditRecord::getPointsType, SecondUserCreditScoreEnum.SUSPECTED_OF_MONEY_LAUNDERING.getCode())
+                        .ge(SecondUserCreditRecord::getCreatedTime, startDate)
+                        .le(SecondUserCreditRecord::getCreatedTime, endDate));
+                if (num.size() <= 0) {
+                    LambdaQueryWrapper<SecondUserCredit> queryWrapper = new LambdaQueryWrapper<>();
+                    queryWrapper.eq(SecondUserCredit::getUserId, trade.getSellerId())
+                            .orderByDesc(SecondUserCredit::getCreatedTime).last("LIMIT 1");
+                    SecondUserCredit secondUserCredit = secondUserCreditMapper.selectOne(queryWrapper);
+                    int score = secondUserCredit.getUserPoints() + SecondUserCreditScoreEnum.SUSPECTED_OF_MONEY_LAUNDERING.getScore();
+                    secondUserCredit.setUserPoints(score);
+                    secondUserCreditMapper.updateById(secondUserCredit);
+
+                    SecondUserCreditRecord record = new SecondUserCreditRecord();
+                    record.setUserId(trade.getSellerId());
+                    record.setPointsType(SecondUserCreditScoreEnum.SUSPECTED_OF_MONEY_LAUNDERING.getCode());
+                    record.setPoints(SecondUserCreditScoreEnum.SUSPECTED_OF_MONEY_LAUNDERING.getScore());
+                    record.setCurrentScoreCount(score);
+                    record.setCreatedTime(new Date());
+                    secondUserCreditRecordMapper.insert(record);
+                }
+
+//                SecondRiskControlRecord riskControlRecord = new SecondRiskControlRecord();
+//                riskControlRecord.setRuleType(1);
+//                riskControlRecord.setUserId(trade.getSellerId());
+//                riskControlRecord.setBusinessId(String.valueOf(trade.getSellerId()));
+//                riskControlRecord.setRuleName(riskControlProperties.getMoneyLaundering().getRiskType());
+//                JSONArray detailInfo = new JSONArray();
+//                detailInfo.addAll(recordList.stream().map(SecondTradeRecord::getId).collect(Collectors.toList()));
+//                riskControlRecord.setDetailInfo(detailInfo.toJSONString());
+//                secondRiskControlRecordMapper.insert(riskControlRecord);
             }
 
             return true;