|
@@ -1,32 +1,35 @@
|
|
|
package shop.alien.second.service.impl;
|
|
package shop.alien.second.service.impl;
|
|
|
|
|
|
|
|
import com.alibaba.fastjson2.JSONObject;
|
|
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.core.conditions.query.QueryWrapper;
|
|
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
+import org.springframework.context.annotation.Lazy;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
import shop.alien.entity.second.SecondRiskControlRecord;
|
|
import shop.alien.entity.second.SecondRiskControlRecord;
|
|
|
-import shop.alien.entity.second.vo.SecondRiskControlRecordVo;
|
|
|
|
|
-import shop.alien.entity.store.LifeBrandedCard;
|
|
|
|
|
-import shop.alien.entity.store.LifeClassManage;
|
|
|
|
|
|
|
+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.LifeUser;
|
|
|
-import shop.alien.entity.store.vo.LifeUserVo;
|
|
|
|
|
-import shop.alien.mapper.LifeUserMapper;
|
|
|
|
|
|
|
+
|
|
|
import shop.alien.entity.store.LifeNotice;
|
|
import shop.alien.entity.store.LifeNotice;
|
|
|
-import shop.alien.entity.store.LifeUser;
|
|
|
|
|
import shop.alien.entity.store.vo.WebSocketVo;
|
|
import shop.alien.entity.store.vo.WebSocketVo;
|
|
|
import shop.alien.mapper.LifeNoticeMapper;
|
|
import shop.alien.mapper.LifeNoticeMapper;
|
|
|
import shop.alien.mapper.LifeUserMapper;
|
|
import shop.alien.mapper.LifeUserMapper;
|
|
|
import shop.alien.mapper.second.SecondRiskControlRecordMapper;
|
|
import shop.alien.mapper.second.SecondRiskControlRecordMapper;
|
|
|
|
|
+import shop.alien.mapper.second.SecondUserCreditMapper;
|
|
|
import shop.alien.second.feign.AlienStoreFeign;
|
|
import shop.alien.second.feign.AlienStoreFeign;
|
|
|
import shop.alien.second.service.RiskControlService;
|
|
import shop.alien.second.service.RiskControlService;
|
|
|
-import shop.alien.util.common.Constants;
|
|
|
|
|
|
|
|
|
|
-import java.util.ArrayList;
|
|
|
|
|
-import java.util.Arrays;
|
|
|
|
|
-import java.util.Date;
|
|
|
|
|
-import java.util.List;
|
|
|
|
|
|
|
+import java.time.LocalDateTime;
|
|
|
|
|
+import java.time.ZoneId;
|
|
|
|
|
+import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -42,8 +45,14 @@ public class RiskControlServiceImpl extends ServiceImpl<SecondRiskControlRecordM
|
|
|
private final LifeUserMapper lifeUserMapper;
|
|
private final LifeUserMapper lifeUserMapper;
|
|
|
private final AlienStoreFeign alienStoreFeign;
|
|
private final AlienStoreFeign alienStoreFeign;
|
|
|
|
|
|
|
|
- private final LifeUserMapper lifeUserMapper;
|
|
|
|
|
-
|
|
|
|
|
|
|
+ private final RiskControlGoodsServiceImpl riskControlGoodsService;
|
|
|
|
|
+ private final PlatformSecondTradeServiceImpl tradeService;
|
|
|
|
|
+ private final SecondUserCreditMapper secondUserCreditMapper;
|
|
|
|
|
+ private final SecondUserCreditRecordServiceImpl sreditRecordService;
|
|
|
|
|
+
|
|
|
|
|
+ @Lazy
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private SecondGoodsServiceImpl secondGoodsService;
|
|
|
/**
|
|
/**
|
|
|
* 记录风控数据
|
|
* 记录风控数据
|
|
|
*
|
|
*
|
|
@@ -66,8 +75,8 @@ public class RiskControlServiceImpl extends ServiceImpl<SecondRiskControlRecordM
|
|
|
record.setRuleName(ruleName);
|
|
record.setRuleName(ruleName);
|
|
|
record.setBusinessId(businessId);
|
|
record.setBusinessId(businessId);
|
|
|
record.setDetailInfo(detailInfo);
|
|
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.setDeleteFlag(0);
|
|
|
record.setCreatedUserId(userId);
|
|
record.setCreatedUserId(userId);
|
|
|
record.setUpdatedUserId(userId);
|
|
record.setUpdatedUserId(userId);
|
|
@@ -96,64 +105,11 @@ public class RiskControlServiceImpl extends ServiceImpl<SecondRiskControlRecordM
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
- public List<SecondRiskControlRecordVo> queryRiskControlRecords(Integer page, Integer size) {
|
|
|
|
|
|
|
+ public IPage<SecondRiskControlRecordVo> queryRiskControlRecords(Integer page, Integer size) {
|
|
|
try {
|
|
try {
|
|
|
- List<SecondRiskControlRecordVo> list = new ArrayList<>();
|
|
|
|
|
- IPage<SecondRiskControlRecord> brandedPage = new Page<>(page, size);
|
|
|
|
|
-
|
|
|
|
|
- // 获取风险管控信息
|
|
|
|
|
- QueryWrapper<SecondRiskControlRecord> queryWrapper = new QueryWrapper<>();
|
|
|
|
|
- queryWrapper.eq("delete_flag", Constants.DeleteFlag.NOT_DELETED);
|
|
|
|
|
- queryWrapper.orderByDesc("created_time");
|
|
|
|
|
- IPage<SecondRiskControlRecord> brandedCards = secondRiskControlRecordMapper.selectPage(brandedPage, queryWrapper);
|
|
|
|
|
-
|
|
|
|
|
- for (SecondRiskControlRecord card : brandedCards.getRecords()) {
|
|
|
|
|
- SecondRiskControlRecordVo vo = new SecondRiskControlRecordVo();
|
|
|
|
|
- if (1 == card.getRuleType()) {
|
|
|
|
|
- vo.setRuleTypeName("洗钱嫌疑");
|
|
|
|
|
- vo.setRuleName("高频高价交易");
|
|
|
|
|
- vo.setRuleRisk("中风险");
|
|
|
|
|
- vo.setCreatedTime(card.getCreatedTime());
|
|
|
|
|
- } else if (2 == card.getRuleType()) {
|
|
|
|
|
- vo.setRuleTypeName("账号异常");
|
|
|
|
|
- vo.setRuleName("同一设备/mac 24小时内注册超过3个账号");
|
|
|
|
|
- vo.setRuleRisk("中风险");
|
|
|
|
|
- vo.setCreatedTime(card.getCreatedTime());
|
|
|
|
|
- } else if (3 == card.getRuleType()) {
|
|
|
|
|
- vo.setRuleTypeName("交易欺诈");
|
|
|
|
|
- vo.setRuleName("用户频繁修改商品价格");
|
|
|
|
|
- vo.setRuleRisk("高风险");
|
|
|
|
|
- vo.setCreatedTime(card.getCreatedTime());
|
|
|
|
|
- } else if (4 == card.getRuleType()) {
|
|
|
|
|
- vo.setRuleTypeName("异常发布");
|
|
|
|
|
- vo.setRuleName("短时间大量发布同类商品");
|
|
|
|
|
- vo.setRuleRisk("高风险");
|
|
|
|
|
- vo.setCreatedTime(card.getCreatedTime());
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if ( 2 != card.getRuleType()) {
|
|
|
|
|
- // 根据ID查询用户信息
|
|
|
|
|
- QueryWrapper<LifeUserVo> queryWrapperUser = new QueryWrapper<>();
|
|
|
|
|
- queryWrapper.eq("delete_flag", Constants.DeleteFlag.NOT_DELETED)
|
|
|
|
|
- .eq("id", card.getUserId());
|
|
|
|
|
- LifeUserVo userInfoList = lifeUserMapper.getUserById(queryWrapperUser);
|
|
|
|
|
- // 用户手机号
|
|
|
|
|
- vo.setUserPhone(userInfoList.getUserPhone());
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // 处理结果
|
|
|
|
|
- if (card.getRiskStatus().equals(0)) {
|
|
|
|
|
- vo.setRiskStatusName("待处理");
|
|
|
|
|
- } else if (card.getRiskStatus().equals(1)) {
|
|
|
|
|
- vo.setRiskStatusName("已处理");
|
|
|
|
|
- } else if (card.getRiskStatus().equals(2)) {
|
|
|
|
|
- vo.setRiskStatusName("已忽略");
|
|
|
|
|
- }
|
|
|
|
|
- list.add(vo);
|
|
|
|
|
- }
|
|
|
|
|
- return list;
|
|
|
|
|
|
|
+ return secondRiskControlRecordMapper.queryRiskControlRecords(new Page<>(page, size));
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
- log.error("记录风控数据时发生异常: 用户ID={}, 规则类型={},业务id={}", e);
|
|
|
|
|
|
|
+ log.error("记录风控数据时发生异常: ", e);
|
|
|
return null;
|
|
return null;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -192,4 +148,106 @@ public class RiskControlServiceImpl extends ServiceImpl<SecondRiskControlRecordM
|
|
|
alienStoreFeign.sendMsgToClientByPhoneId(phoneId, JSONObject.from(webSocketVo).toJSONString());
|
|
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;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|