|
|
@@ -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;
|
|
|
+ }
|
|
|
+
|
|
|
}
|