Эх сурвалжийг харах

Merge remote-tracking branch 'origin/dev' into dev

lyx 1 сар өмнө
parent
commit
00cf5f9e1c

+ 70 - 0
alien-config/src/main/java/shop/alien/config/properties/RiskControlProperties.java

@@ -0,0 +1,70 @@
+package shop.alien.config.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@RefreshScope
+@ConfigurationProperties(prefix = "risk-control")
+public class RiskControlProperties {
+
+    /**
+     * 洗钱嫌疑规则配置
+     */
+    private MoneyLaundering moneyLaundering = new MoneyLaundering();
+
+    /**
+     * 账号异常规则配置
+     */
+    private AccountAbnormal accountAbnormal = new AccountAbnormal();
+
+    /**
+     * 交易欺诈规则配置
+     */
+    private TradeFraud tradeFraud = new TradeFraud();
+
+    /**
+     * 异常发布规则配置
+     */
+    private AbnormalPublish abnormalPublish = new AbnormalPublish();
+
+    @Data
+    public static class MoneyLaundering {
+        /**
+         * 每天交易次数阈值
+         */
+        private int dailyCount = 5;
+
+        /**
+         * 每笔交易金额阈值(元)
+         */
+        private double amountThreshold = 200.0;
+    }
+
+    @Data
+    public static class AccountAbnormal {
+        /**
+         * 24小时内同一设备/mac注册账号数量阈值
+         */
+        private int regCount24h = 3;
+    }
+
+    @Data
+    public static class TradeFraud {
+        /**
+         * 24小时内发布成功记录次数阈值
+         */
+        private int publishCount24h = 3;
+    }
+
+    @Data
+    public static class AbnormalPublish {
+        /**
+         * 24小时内发布同类商品数量阈值
+         */
+        private int sameCategoryCount24h = 10;
+    }
+}

+ 2 - 1
alien-entity/src/main/java/shop/alien/entity/store/vo/StoreCommentVo.java

@@ -57,5 +57,6 @@ public class StoreCommentVo extends StoreComment {
     @ApiModelProperty(value = "标签")
     private List<String> labels;
 
-
+    @ApiModelProperty(value = "商家or用户(0商家/1用户)")
+    private Integer storeUserFlag;
 }

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

@@ -16,6 +16,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
         "shop.alien.config.http",
         "shop.alien.config.databases",
         "shop.alien.config.feign",
+        "shop.alien.config.properties",
         "shop.alien.config.redis"})
 @MapperScan({
         "shop.alien.mapper",

+ 73 - 0
alien-second/src/main/java/shop/alien/second/service/impl/SecondGoodsServiceImpl.java

@@ -20,6 +20,7 @@ import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
+import shop.alien.config.properties.RiskControlProperties;
 import shop.alien.entity.SecondVideoTask;
 import shop.alien.entity.second.*;
 import shop.alien.entity.second.SecondTradeRecord;
@@ -151,6 +152,9 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
      */
     private final PlatformSecondTradeService platformSecondTradeService;
 
+    @Autowired
+    private RiskControlProperties riskControlProperties;
+
     @Override
     public SecondGoodsRecordDetailVo getAdminGoodsRecordDetail(Integer recordId) {
         // 1. 获取商品操作记录基本信息
@@ -550,6 +554,19 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
             SecondGoods goods = new SecondGoods();
             BeanUtils.copyProperties(goodsDTO, goods);
 
+            // 检查用户是否在24小时内发布商品超过阈值
+            if (!checkUserPublishLimit(goods)) {
+                log.warn("用户 {} 在24小时内发布商品次数超过限制", goodsDTO.getUserId());
+                // TODO 插入风控记录
+
+            }
+            
+            // 检查用户是否在24小时内发布同类商品超过阈值
+            if (!checkUserPublishSameCategoryLimit(goods)) {
+                log.warn("用户 {} 在24小时内发布同类商品次数超过限制", goodsDTO.getUserId());
+                // TODO 插入风控记录
+            }
+
             boolean saveResult;
             if (editFlag == 1) {
                 goods.setId(goodsDTO.getId());
@@ -587,6 +604,62 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
         }
     }
 
+
+    /**
+     * 检查用户在24小时内 频繁修改发布商品的数量是否超过限制
+     * @param goods  用户ID,商品ID
+     * @return 是否未超过限制
+     */
+    private boolean checkUserPublishLimit(SecondGoods goods) {
+        // 获取配置的阈值
+        int publishLimit = riskControlProperties.getTradeFraud().getPublishCount24h();
+
+        // 计算24小时前的时间
+        Date twentyFourHoursAgo = new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000L);
+
+        // 查询用户在24小时内发布的商品数量
+        LambdaQueryWrapper<SecondGoodsRecord> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SecondGoodsRecord::getUserId, goods.getUserId())
+                .eq(SecondGoodsRecord::getId, goods.getId())
+                .ge(SecondGoodsRecord::getReleaseTime, twentyFourHoursAgo)
+                .in(SecondGoodsRecord::getGoodsStatus,
+                        SecondGoodsStatusEnum.LISTED.getCode(),
+                        SecondGoodsStatusEnum.SOLD.getCode());
+
+        int publishCount = secondGoodsRecordMapper.selectCount(queryWrapper);
+
+        // 如果发布数量超过限制,返回false
+        return publishCount < publishLimit;
+    }
+
+    /**
+     * 检查用户在24小时内发布同类商品的数量是否超过限制
+     * @param goods 商品信息
+     * @return 是否未超过限制
+     */
+    private boolean checkUserPublishSameCategoryLimit(SecondGoods goods) {
+        // 获取配置的阈值
+        int sameCategoryLimit = riskControlProperties.getAbnormalPublish().getSameCategoryCount24h();
+        
+        // 计算24小时前的时间
+        Date twentyFourHoursAgo = new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000L);
+        
+        // 查询用户在24小时内发布同类商品的数量
+        LambdaQueryWrapper<SecondGoodsRecord> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SecondGoodsRecord::getUserId, goods.getUserId())
+                .eq(SecondGoodsRecord::getCategoryOneId, goods.getCategoryOneId())
+                .eq(SecondGoodsRecord::getCategoryTwoId, goods.getCategoryTwoId())
+                .ge(SecondGoodsRecord::getReleaseTime, twentyFourHoursAgo)
+                .in(SecondGoodsRecord::getGoodsStatus,
+                        SecondGoodsStatusEnum.LISTED.getCode(),
+                        SecondGoodsStatusEnum.SOLD.getCode());
+        
+        int sameCategoryCount = secondGoodsRecordMapper.selectCount(queryWrapper);
+        
+        // 如果发布数量超过限制,返回false
+        return sameCategoryCount < sameCategoryLimit;
+    }
+
     /**
      * 执行内容审核
      * @param goodsDTO 商品信息

+ 10 - 1
alien-store/src/main/java/shop/alien/store/service/impl/StoreCommentServiceImpl.java

@@ -179,7 +179,6 @@ public class StoreCommentServiceImpl extends ServiceImpl<StoreCommentMapper, Sto
             }
             //低分
             storeCommentVo.setLowScore(records.get(i).getScore() <= 1);
-            storeCommentVoList.add(storeCommentVo);
 
             QueryWrapper<StoreCommentAppealVo> storeCommentAppealVoQueryWrapper = new QueryWrapper<>();
             storeCommentAppealVoQueryWrapper.eq("a.comment_id", storeCommentVo.getId()).eq("a.delete_flag", 0).orderByDesc("a.created_time").last("limit 1");
@@ -191,6 +190,16 @@ public class StoreCommentServiceImpl extends ServiceImpl<StoreCommentMapper, Sto
             }else {
                 storeCommentVo.setAppealFlag(0);
             }
+
+            //商家用户
+            if (StringUtils.isNotEmpty(records.get(i).getPhoneId())) {
+                if (records.get(i).getPhoneId().contains("store_")) {
+                    storeCommentVo.setStoreUserFlag(0);
+                } else {
+                    storeCommentVo.setStoreUserFlag(1);
+                }
+            }
+            storeCommentVoList.add(storeCommentVo);
         }
 
         //塞图片

+ 5 - 0
alien-util/pom.xml

@@ -323,6 +323,11 @@
             <version>3.17.4</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-context</artifactId>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 2 - 0
alien-util/src/main/java/shop/alien/util/common/safe/ImageModerationUtil.java

@@ -8,6 +8,7 @@ import com.aliyun.teautil.models.RuntimeOptions;
 import com.google.common.collect.Lists;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
 import org.springframework.stereotype.Component;
 
 import java.io.IOException;
@@ -18,6 +19,7 @@ import java.util.UUID;
 
 @Slf4j
 @Component
+@RefreshScope
 public class ImageModerationUtil {
 
     @Value("${ali.yundun.accessKeyID}")