Просмотр исходного кода

1:保险箱全量同步的时候只同步昨天的数据
2:保险箱搜索同步半天内的数据

kongxiangyang 1 день назад
Родитель
Сommit
35f8187da5

+ 106 - 2
crm-manager/src/main/java/com/crm/manager/service/impl/VaultodyServiceImpl.java

@@ -17,6 +17,8 @@ import com.crm.rely.backend.core.exception.ServiceException;
 import com.crm.rely.backend.core.pojo.table.SysConfigTable;
 import com.crm.rely.backend.model.config.VaultodyConfig;
 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.VaultTransaction;
 import com.crm.rely.backend.model.dto.vaultody.vaults.VaultodyVaultsListDto;
@@ -44,6 +46,7 @@ import org.springframework.util.ObjectUtils;
 import javax.crypto.Mac;
 import javax.crypto.spec.SecretKeySpec;
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.nio.charset.StandardCharsets;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -381,7 +384,7 @@ public class VaultodyServiceImpl implements VaultodyService {
     public BaseResultDto searchList(VaultTransactionsSearchEntity entity) throws Exception {
         List<TransactionItemTable> tables = new LinkedList<>();
         VaultodyConfig vaultodyConfig = getVaultodyConfig(entity.getVaultId());
-        List<TransactionItemDto> list = queryWithFilter(vaultodyConfig);
+        List<TransactionItemDto> list = queryWithFilterHalfDay(vaultodyConfig);
         if(!CollectionUtils.isEmpty(list)){
             for (TransactionItemDto transactionItemDto : list) {
                 TransactionItemTable table = new TransactionItemTable() ;
@@ -414,7 +417,28 @@ public class VaultodyServiceImpl implements VaultodyService {
             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 {
@@ -499,6 +523,86 @@ public class VaultodyServiceImpl implements VaultodyService {
         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;
+
+        List<TransactionItemDto> result = new ArrayList<>();
+        List<String> existingItemIds = recordByVaultId(config.getVaultId());
+        Set<String> existingIdSet = new HashSet<>(existingItemIds);
+
+        VaultTransaction vaultTransaction = query3Items(entity, config);
+
+        // 第一页过滤
+        if (vaultTransaction.getList() != null && !vaultTransaction.getList().isEmpty()) {
+            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);
+
+            // 本页最小时间早于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())
+                && vaultTransaction.getList() != null
+                && !vaultTransaction.getList().isEmpty()) {
+
+            String lastId = vaultTransaction.getList().get(vaultTransaction.getList().size() - 1).getId();
+            entity.setStartingAfter(lastId);
+
+            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);
+
+            long minPageTs = pageList.stream()
+                    .map(TransactionItemDto::getCreatedTimestamp)
+                    .filter(Objects::nonNull)
+                    .mapToLong(Long::longValue)
+                    .min()
+                    .orElse(0L);
+            if (minPageTs < startTs) {
+                break;
+            }
+        }
+
+        return result;
+    }
+
     private List<TransactionItemDto> filterExistingItems(List<TransactionItemDto> items, Set<String> existingIdSet) {
         if (items == null || items.isEmpty()) {
             return Collections.emptyList();

+ 16 - 0
crm-model/src/main/java/com/crm/rely/backend/model/dto/vaultody/TransactionItemResultDto.java

@@ -0,0 +1,16 @@
+package com.crm.rely.backend.model.dto.vaultody;
+
+import com.crm.rely.backend.core.dto.base.PageDto;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class TransactionItemResultDto {
+    private PageDto page;
+    private List<TransactionItemSearchDto> list;
+    private BigDecimal totalSenderAmount;
+    private BigDecimal totalRecipientAmount;
+    private BigDecimal totalFeeAmount;
+}

+ 36 - 0
crm-model/src/main/java/com/crm/rely/backend/model/dto/vaultody/TransactionItemSearchDto.java

@@ -0,0 +1,36 @@
+package com.crm.rely.backend.model.dto.vaultody;
+
+import com.crm.rely.backend.core.pojo.BaseTable;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class TransactionItemSearchDto extends BaseTable {
+    private String requestId;
+    private String itemId;
+    private String vaultId;
+    private String transactionId;
+    private String status;
+    private Long createdTimestamp;
+
+    private String senderAddress;
+    private String senderIsVaultAddress;
+    private String senderAmountUnit;
+    private String senderAmount;
+    private String senderLabel;
+
+    private String recipientAddress;
+    private String recipientIsVaultAddress;
+    private String recipientAmountUnit;
+    private String recipientAmount;
+    private String recipientLabel;
+
+    private String blockchain;
+    private String minedInBlockHeight;
+    private String feeAmount;
+    private String feeAmountUnit;
+    private BigDecimal totalSenderAmount;
+    private BigDecimal totalRecipientAmount;
+    private BigDecimal totalFeeAmount;
+}