|
@@ -1,5 +1,7 @@
|
|
|
package com.crm.manager.service.impl;
|
|
package com.crm.manager.service.impl;
|
|
|
|
|
|
|
|
|
|
+import cn.hutool.core.date.DateTime;
|
|
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
import com.alibaba.fastjson2.JSON;
|
|
import com.alibaba.fastjson2.JSON;
|
|
|
import com.crm.manager.dao.mapper.TransactionItemMapper;
|
|
import com.crm.manager.dao.mapper.TransactionItemMapper;
|
|
|
import com.crm.manager.repository.TransactionItemRepository;
|
|
import com.crm.manager.repository.TransactionItemRepository;
|
|
@@ -16,6 +18,8 @@ import com.crm.rely.backend.core.pojo.table.SysConfigTable;
|
|
|
import com.crm.rely.backend.model.config.VaultodyConfig;
|
|
import com.crm.rely.backend.model.config.VaultodyConfig;
|
|
|
import com.crm.rely.backend.model.config.VaultodyOrderConfig;
|
|
import com.crm.rely.backend.model.config.VaultodyOrderConfig;
|
|
|
import com.crm.rely.backend.model.constant.ConfigConstants;
|
|
import com.crm.rely.backend.model.constant.ConfigConstants;
|
|
|
|
|
+import com.crm.rely.backend.model.dto.vaultody.TransactionItemResultDto;
|
|
|
|
|
+import com.crm.rely.backend.model.dto.vaultody.TransactionItemSearchDto;
|
|
|
import com.crm.rely.backend.model.dto.vaultody.vaults.TransactionItemDto;
|
|
import com.crm.rely.backend.model.dto.vaultody.vaults.TransactionItemDto;
|
|
|
import com.crm.rely.backend.model.dto.vaultody.vaults.VaultTransaction;
|
|
import com.crm.rely.backend.model.dto.vaultody.vaults.VaultTransaction;
|
|
|
import com.crm.rely.backend.model.dto.vaultody.vaults.VaultodyVaultsListDto;
|
|
import com.crm.rely.backend.model.dto.vaultody.vaults.VaultodyVaultsListDto;
|
|
@@ -46,6 +50,7 @@ import org.springframework.util.ObjectUtils;
|
|
|
import javax.crypto.Mac;
|
|
import javax.crypto.Mac;
|
|
|
import javax.crypto.spec.SecretKeySpec;
|
|
import javax.crypto.spec.SecretKeySpec;
|
|
|
import java.io.IOException;
|
|
import java.io.IOException;
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
import java.nio.charset.StandardCharsets;
|
|
import java.nio.charset.StandardCharsets;
|
|
|
import java.util.*;
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
@@ -461,7 +466,7 @@ public class VaultodyServiceImpl implements VaultodyService {
|
|
|
public BaseResultDto searchList(VaultTransactionsSearchEntity entity) throws Exception {
|
|
public BaseResultDto searchList(VaultTransactionsSearchEntity entity) throws Exception {
|
|
|
List<TransactionItemTable> tables = new LinkedList<>();
|
|
List<TransactionItemTable> tables = new LinkedList<>();
|
|
|
VaultodyConfig vaultodyConfig = getVaultodyConfig(entity.getVaultId());
|
|
VaultodyConfig vaultodyConfig = getVaultodyConfig(entity.getVaultId());
|
|
|
- List<TransactionItemDto> list = queryWithFilter(vaultodyConfig);
|
|
|
|
|
|
|
+ List<TransactionItemDto> list = queryWithFilterHalfDay(vaultodyConfig);
|
|
|
if(!CollectionUtils.isEmpty(list)){
|
|
if(!CollectionUtils.isEmpty(list)){
|
|
|
for (TransactionItemDto transactionItemDto : list) {
|
|
for (TransactionItemDto transactionItemDto : list) {
|
|
|
TransactionItemTable table = new TransactionItemTable() ;
|
|
TransactionItemTable table = new TransactionItemTable() ;
|
|
@@ -502,26 +507,158 @@ public class VaultodyServiceImpl implements VaultodyService {
|
|
|
throw new ServiceException(Constants.SYSTEM_ERROR);
|
|
throw new ServiceException(Constants.SYSTEM_ERROR);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return ResultWithPagerDto.success(pageDto, dtos);
|
|
|
|
|
|
|
+ List<TransactionItemSearchDto> r = new ArrayList<>(dtos.size());
|
|
|
|
|
+ // 转出金额
|
|
|
|
|
+ BigDecimal totalSenderAmount = new BigDecimal(0);
|
|
|
|
|
+ // 收到金额
|
|
|
|
|
+ BigDecimal totalRecipientAmount = new BigDecimal(0);
|
|
|
|
|
+ // 手续费
|
|
|
|
|
+ BigDecimal totalFeeAmount = new BigDecimal(0);
|
|
|
|
|
+ for (TransactionItemTable table : dtos) {
|
|
|
|
|
+ TransactionItemSearchDto dto = new TransactionItemSearchDto();
|
|
|
|
|
+ BeanUtils.copyProperties(table, dto);
|
|
|
|
|
+ totalSenderAmount = totalSenderAmount.add(new BigDecimal(table.getSenderAmount()));
|
|
|
|
|
+ totalRecipientAmount = totalRecipientAmount.add(new BigDecimal(table.getRecipientAmount()));
|
|
|
|
|
+ totalFeeAmount = totalFeeAmount.add(new BigDecimal(table.getFeeAmount()));
|
|
|
|
|
+ r.add(dto);
|
|
|
|
|
+ }
|
|
|
|
|
+ TransactionItemResultDto resultDto = new TransactionItemResultDto();
|
|
|
|
|
+ resultDto.setList(r);
|
|
|
|
|
+ resultDto.setTotalSenderAmount(totalSenderAmount);
|
|
|
|
|
+ resultDto.setTotalRecipientAmount(totalRecipientAmount);
|
|
|
|
|
+ resultDto.setTotalFeeAmount(totalFeeAmount);
|
|
|
|
|
+ resultDto.setPage(pageDto);
|
|
|
|
|
+ return BaseResultDto.success(resultDto);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public List<TransactionItemDto> queryWithFilter(VaultodyConfig config) throws Exception {
|
|
public List<TransactionItemDto> queryWithFilter(VaultodyConfig config) throws Exception {
|
|
|
VaultTransactionsEntity entity = new VaultTransactionsEntity();
|
|
VaultTransactionsEntity entity = new VaultTransactionsEntity();
|
|
|
entity.setVaultId(config.getVaultId());
|
|
entity.setVaultId(config.getVaultId());
|
|
|
|
|
+
|
|
|
|
|
+ // 1、查询前天最后一条,用它的itemId做startingAfter
|
|
|
|
|
+ TransactionItemTable lastBeforeYes = transactionItemMapper.getBeforeYesterdayLast(config.getVaultId());
|
|
|
|
|
+ if (lastBeforeYes != null && StringUtils.isNotBlank(lastBeforeYes.getItemId())) {
|
|
|
|
|
+ entity.setStartingAfter(lastBeforeYes.getItemId());
|
|
|
|
|
+ log.info("分页起点:前天最后一条itemId={}", lastBeforeYes.getItemId());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ log.info("无前天数据,从头拉取三方交易");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 2、划定昨天时间范围(秒级时间戳)
|
|
|
|
|
+ DateTime yesZero = DateUtil.beginOfDay(DateUtil.yesterday());
|
|
|
|
|
+ long yesStartTs = yesZero.getTime() / 1000;
|
|
|
|
|
+ DateTime todayZero = DateUtil.beginOfDay(new Date());
|
|
|
|
|
+ long yesEndTs = todayZero.getTime() / 1000;
|
|
|
|
|
+
|
|
|
List<TransactionItemDto> result = new ArrayList<>();
|
|
List<TransactionItemDto> result = new ArrayList<>();
|
|
|
|
|
+ List<String> existItemIds = recordByVaultId(config.getVaultId());
|
|
|
|
|
+ Set<String> existSet = new HashSet<>(existItemIds);
|
|
|
|
|
+
|
|
|
|
|
+ VaultTransaction pageData = query3Items(entity, config);
|
|
|
|
|
+
|
|
|
|
|
+ // 处理第一页
|
|
|
|
|
+ if (pageData.getList() != null && !pageData.getList().isEmpty()) {
|
|
|
|
|
+ List<TransactionItemDto> filterList = pageData.getList().stream()
|
|
|
|
|
+ .filter(dto -> dto != null && dto.getId() != null && dto.getCreatedTimestamp() != null)
|
|
|
|
|
+ // 只昨天数据 + 库不存在
|
|
|
|
|
+ .filter(dto -> dto.getCreatedTimestamp() >= yesStartTs && dto.getCreatedTimestamp() < yesEndTs)
|
|
|
|
|
+ .filter(dto -> !existSet.contains(dto.getId()))
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ result.addAll(filterList);
|
|
|
|
|
+
|
|
|
|
|
+ // 当前页最小时间早于昨天,后面都是更早数据,直接终止
|
|
|
|
|
+ long minTs = pageData.getList().stream()
|
|
|
|
|
+ .map(TransactionItemDto::getCreatedTimestamp)
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
|
|
+ .mapToLong(Long::longValue)
|
|
|
|
|
+ .min()
|
|
|
|
|
+ .orElse(0L);
|
|
|
|
|
+ if (minTs < yesStartTs) {
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 循环分页拉取
|
|
|
|
|
+ while (Boolean.TRUE.equals(pageData.getHasMore())
|
|
|
|
|
+ && pageData.getList() != null
|
|
|
|
|
+ && !pageData.getList().isEmpty()) {
|
|
|
|
|
+
|
|
|
|
|
+ // 拿当前页最后一条id做下一页起点
|
|
|
|
|
+ String lastItemId = pageData.getList().get(pageData.getList().size() - 1).getId();
|
|
|
|
|
+ entity.setStartingAfter(lastItemId);
|
|
|
|
|
+
|
|
|
|
|
+ pageData = query3Items(entity, config);
|
|
|
|
|
+ if (pageData.getList() == null || pageData.getList().isEmpty()) {
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ List<TransactionItemDto> filterList = pageData.getList().stream()
|
|
|
|
|
+ .filter(dto -> dto != null && dto.getId() != null && dto.getCreatedTimestamp() != null)
|
|
|
|
|
+ .filter(dto -> dto.getCreatedTimestamp() >= yesStartTs && dto.getCreatedTimestamp() < yesEndTs)
|
|
|
|
|
+ .filter(dto -> !existSet.contains(dto.getId()))
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ result.addAll(filterList);
|
|
|
|
|
+
|
|
|
|
|
+ long minTs = pageData.getList().stream()
|
|
|
|
|
+ .map(TransactionItemDto::getCreatedTimestamp)
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
|
|
+ .mapToLong(Long::longValue)
|
|
|
|
|
+ .min()
|
|
|
|
|
+ .orElse(0L);
|
|
|
|
|
+ if (minTs < yesStartTs) {
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 同步近半天(12小时)交易数据
|
|
|
|
|
+ * @param config 金库配置
|
|
|
|
|
+ * @return 待入库交易列表
|
|
|
|
|
+ * @throws Exception
|
|
|
|
|
+ */
|
|
|
|
|
+ public List<TransactionItemDto> queryWithFilterHalfDay(VaultodyConfig config) throws Exception {
|
|
|
|
|
+ VaultTransactionsEntity entity = new VaultTransactionsEntity();
|
|
|
|
|
+ entity.setVaultId(config.getVaultId());
|
|
|
|
|
+
|
|
|
|
|
+ // 时间范围:当前时间 -12小时 至 当前时间
|
|
|
|
|
+ DateTime now = DateUtil.date();
|
|
|
|
|
+ DateTime halfDayAgo = DateUtil.offsetHour(now, -12);
|
|
|
|
|
+ long startTs = halfDayAgo.getTime() / 1000;
|
|
|
|
|
+ long endTs = now.getTime() / 1000;
|
|
|
|
|
|
|
|
- // 先获取数据库中已存在的item ID列表
|
|
|
|
|
|
|
+ List<TransactionItemDto> result = new ArrayList<>();
|
|
|
List<String> existingItemIds = recordByVaultId(config.getVaultId());
|
|
List<String> existingItemIds = recordByVaultId(config.getVaultId());
|
|
|
Set<String> existingIdSet = new HashSet<>(existingItemIds);
|
|
Set<String> existingIdSet = new HashSet<>(existingItemIds);
|
|
|
- VaultTransaction vaultTransaction = query3Items(entity,config);
|
|
|
|
|
|
|
|
|
|
- // 处理第一页数据
|
|
|
|
|
|
|
+ VaultTransaction vaultTransaction = query3Items(entity, config);
|
|
|
|
|
+
|
|
|
|
|
+ // 第一页过滤
|
|
|
if (vaultTransaction.getList() != null && !vaultTransaction.getList().isEmpty()) {
|
|
if (vaultTransaction.getList() != null && !vaultTransaction.getList().isEmpty()) {
|
|
|
- List<TransactionItemDto> filteredList = filterExistingItems(vaultTransaction.getList(), existingIdSet);
|
|
|
|
|
|
|
+ List<TransactionItemDto> pageList = vaultTransaction.getList();
|
|
|
|
|
+ List<TransactionItemDto> filteredList = pageList.stream()
|
|
|
|
|
+ .filter(item -> item != null && item.getId() != null && item.getCreatedTimestamp() != null)
|
|
|
|
|
+ .filter(item -> !existingIdSet.contains(item.getId()))
|
|
|
|
|
+ .filter(item -> item.getCreatedTimestamp() >= startTs && item.getCreatedTimestamp() <= endTs)
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
result.addAll(filteredList);
|
|
result.addAll(filteredList);
|
|
|
|
|
+
|
|
|
|
|
+ // 本页最小时间早于12小时起点,后续都是更早数据,直接退出
|
|
|
|
|
+ long minPageTs = pageList.stream()
|
|
|
|
|
+ .map(TransactionItemDto::getCreatedTimestamp)
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
|
|
+ .mapToLong(Long::longValue)
|
|
|
|
|
+ .min()
|
|
|
|
|
+ .orElse(0L);
|
|
|
|
|
+ if (minPageTs < startTs) {
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 分页查询剩余数据
|
|
|
|
|
|
|
+ // 循环分页拉取
|
|
|
while (Boolean.TRUE.equals(vaultTransaction.getHasMore())
|
|
while (Boolean.TRUE.equals(vaultTransaction.getHasMore())
|
|
|
&& vaultTransaction.getList() != null
|
|
&& vaultTransaction.getList() != null
|
|
|
&& !vaultTransaction.getList().isEmpty()) {
|
|
&& !vaultTransaction.getList().isEmpty()) {
|
|
@@ -529,12 +666,26 @@ public class VaultodyServiceImpl implements VaultodyService {
|
|
|
String lastId = vaultTransaction.getList().get(vaultTransaction.getList().size() - 1).getId();
|
|
String lastId = vaultTransaction.getList().get(vaultTransaction.getList().size() - 1).getId();
|
|
|
entity.setStartingAfter(lastId);
|
|
entity.setStartingAfter(lastId);
|
|
|
|
|
|
|
|
- vaultTransaction = query3Items(entity,config);
|
|
|
|
|
|
|
+ vaultTransaction = query3Items(entity, config);
|
|
|
|
|
+ if (vaultTransaction.getList() == null || vaultTransaction.getList().isEmpty()) {
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ List<TransactionItemDto> pageList = vaultTransaction.getList();
|
|
|
|
|
+ List<TransactionItemDto> filteredList = pageList.stream()
|
|
|
|
|
+ .filter(item -> item != null && item.getId() != null && item.getCreatedTimestamp() != null)
|
|
|
|
|
+ .filter(item -> !existingIdSet.contains(item.getId()))
|
|
|
|
|
+ .filter(item -> item.getCreatedTimestamp() >= startTs && item.getCreatedTimestamp() <= endTs)
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ result.addAll(filteredList);
|
|
|
|
|
|
|
|
- if (vaultTransaction.getList() != null && !vaultTransaction.getList().isEmpty()) {
|
|
|
|
|
- List<TransactionItemDto> filteredList = filterExistingItems(vaultTransaction.getList(), existingIdSet);
|
|
|
|
|
- result.addAll(filteredList);
|
|
|
|
|
- } else {
|
|
|
|
|
|
|
+ long minPageTs = pageList.stream()
|
|
|
|
|
+ .map(TransactionItemDto::getCreatedTimestamp)
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
|
|
+ .mapToLong(Long::longValue)
|
|
|
|
|
+ .min()
|
|
|
|
|
+ .orElse(0L);
|
|
|
|
|
+ if (minPageTs < startTs) {
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|