|
|
@@ -1,18 +1,21 @@
|
|
|
package shop.alien.second.service.impl;
|
|
|
|
|
|
+import com.alibaba.fastjson2.JSONArray;
|
|
|
import com.alibaba.fastjson2.JSONObject;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
|
|
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.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
+import shop.alien.config.properties.RiskControlProperties;
|
|
|
import shop.alien.entity.result.BusinessException;
|
|
|
-import shop.alien.entity.second.SecondGoods;
|
|
|
-import shop.alien.entity.second.SecondGoodsRecord;
|
|
|
-import shop.alien.entity.second.SecondTradeOperation;
|
|
|
-import shop.alien.entity.second.SecondTradeRecord;
|
|
|
+import shop.alien.entity.second.*;
|
|
|
+import shop.alien.mapper.second.SecondRiskControlRecordMapper;
|
|
|
import shop.alien.entity.second.vo.SecondTradeRecordVo;
|
|
|
import shop.alien.entity.store.LifeMessage;
|
|
|
import shop.alien.entity.store.LifeNotice;
|
|
|
@@ -23,10 +26,7 @@ import shop.alien.mapper.LifeMessageMapper;
|
|
|
import shop.alien.mapper.LifeNoticeMapper;
|
|
|
import shop.alien.mapper.LifeUserMapper;
|
|
|
import shop.alien.mapper.StoreDictionaryMapper;
|
|
|
-import shop.alien.mapper.second.SecondGoodsMapper;
|
|
|
-import shop.alien.mapper.second.SecondGoodsRecordMapper;
|
|
|
-import shop.alien.mapper.second.SecondTradeOperationMapper;
|
|
|
-import shop.alien.mapper.second.SecondTradeRecordMapper;
|
|
|
+import shop.alien.mapper.second.*;
|
|
|
import shop.alien.second.feign.AlienStoreFeign;
|
|
|
import shop.alien.second.service.SecondTradeRecordService;
|
|
|
import shop.alien.util.common.JwtUtil;
|
|
|
@@ -35,6 +35,7 @@ import java.time.*;
|
|
|
import java.util.Date;
|
|
|
import java.util.List;
|
|
|
import java.util.Objects;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* <p>
|
|
|
@@ -53,11 +54,16 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
|
|
|
private final SecondTradeOperationMapper secondTradeOperationMapper;
|
|
|
private final SecondGoodsMapper secondGoodsMapper;
|
|
|
private final SecondGoodsRecordMapper secondGoodsRecordMapper;
|
|
|
+ private final SecondRiskControlRecordMapper secondRiskControlRecordMapper;
|
|
|
+ private final SecondUserCreditMapper secondUserCreditMapper;
|
|
|
+ private final SecondUserCreditRecordMapper secondUserCreditRecordMapper;
|
|
|
private final LifeMessageMapper lifeMessageMapper;
|
|
|
private final LifeNoticeMapper lifeNoticeMapper;
|
|
|
private final LifeUserMapper lifeUserMapper;
|
|
|
private final AlienStoreFeign alienStoreFeign;
|
|
|
private final StoreDictionaryMapper storeDictionaryMapper;
|
|
|
+ @Autowired
|
|
|
+ private RiskControlProperties riskControlProperties;
|
|
|
|
|
|
private final Object lock = new Object();
|
|
|
|
|
|
@@ -263,6 +269,26 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
|
|
|
sendSignInMessage(trade);
|
|
|
}
|
|
|
|
|
|
+ // 风控机制 - 高频高价交易
|
|
|
+ LambdaQueryWrapper<SecondTradeRecord> wrapper = new LambdaQueryWrapper<>();
|
|
|
+ wrapper.eq(SecondTradeRecord::getSellerId, trade.getSellerId());
|
|
|
+ wrapper.in(SecondTradeRecord::getTradeStatus, "3, 4");
|
|
|
+ wrapper.between(SecondTradeRecord::getTransactionTime,
|
|
|
+ trade.getTransactionTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate() + " 00:00:00",
|
|
|
+ trade.getTransactionTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate() + " 23:59:59");
|
|
|
+ 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.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;
|
|
|
} catch (BusinessException e) {
|
|
|
throw new BusinessException(e);
|
|
|
@@ -473,6 +499,12 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
|
|
|
operation.setCreatedTime(new Date());
|
|
|
secondTradeOperationMapper.insert(operation);
|
|
|
|
|
|
+ // 添加信用分
|
|
|
+ if (1 == type) {
|
|
|
+ creditScore(tradeRecord.getBuyerId());
|
|
|
+ creditScore(tradeRecord.getSellerId());
|
|
|
+ }
|
|
|
+
|
|
|
return true;
|
|
|
} catch (Exception e) {
|
|
|
log.error("SecondTradeRecordServiceImpl.tradeCompleteConfirm(): Error Msg={}", e.getMessage());
|
|
|
@@ -480,6 +512,26 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 增加交易信用分
|
|
|
+ * @param userId 用户id
|
|
|
+ */
|
|
|
+ private void creditScore(Integer userId) {
|
|
|
+ LambdaQueryWrapper<SecondUserCreditRecord> wrapper = new LambdaQueryWrapper<>();
|
|
|
+ wrapper.eq(SecondUserCreditRecord::getUserId, userId);
|
|
|
+ wrapper.eq(SecondUserCreditRecord::getPointsType, 3);
|
|
|
+ List<SecondUserCreditRecord> records = secondUserCreditRecordMapper.selectList(wrapper);
|
|
|
+ int userPoints = records.stream().mapToInt(SecondUserCreditRecord::getPoints).sum();
|
|
|
+ if (userPoints < 500) {
|
|
|
+ SecondUserCreditRecord record = new SecondUserCreditRecord();
|
|
|
+ record.setUserId(userId);
|
|
|
+ record.setPoints(50);
|
|
|
+ record.setPointsType(3);
|
|
|
+ secondUserCreditRecordMapper.insert(record);
|
|
|
+ secondUserCreditMapper.updatePointsByUserId(userId, 50);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public List<SecondTradeRecordVo> getTradeRecord(int sideId) throws Exception {
|
|
|
try {
|