Explorar el Código

定时同步保险箱详情数据

kongxiangyang hace 2 meses
padre
commit
50a2fabcbd

+ 12 - 0
crm-manager/src/main/java/com/crm/manager/repository/TransactionItemRepository.java

@@ -0,0 +1,12 @@
+package com.crm.manager.repository;
+
+import com.crm.rely.backend.dao.repository.BaseRepository;
+import com.crm.rely.backend.model.pojo.table.TransactionItemTable;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface TransactionItemRepository extends BaseRepository<TransactionItemTable> {
+    List<TransactionItemTable> findAllByVaultId(String vaultId);
+}

+ 8 - 0
crm-manager/src/main/java/com/crm/manager/service/VaultodyService.java

@@ -2,7 +2,9 @@ package com.crm.manager.service;
 
 import com.crm.rely.backend.core.dto.base.BaseResultDto;
 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.entity.vaultody.vaults.VaultTransactionsEntity;
+import com.crm.rely.backend.model.pojo.table.TransactionItemTable;
 
 import java.util.List;
 
@@ -14,4 +16,10 @@ public interface VaultodyService {
     BaseResultDto vaultsTransactions(VaultTransactionsEntity entity) throws Exception;
 
     List<TransactionItemDto> queryExportItems(VaultTransactionsEntity entity) throws Exception;
+
+    void batchSave(List<TransactionItemTable> tables);
+
+    List<TransactionItemTable> finAllByVaultId(String vaultId);
+
+    VaultTransaction vaultTransaction(VaultTransactionsEntity entity) throws Exception;
 }

+ 19 - 0
crm-manager/src/main/java/com/crm/manager/service/impl/VaultodyServiceImpl.java

@@ -1,6 +1,7 @@
 package com.crm.manager.service.impl;
 
 import com.alibaba.fastjson2.JSON;
+import com.crm.manager.repository.TransactionItemRepository;
 import com.crm.manager.service.SysConfigService;
 import com.crm.manager.service.SysVaultodyConfigService;
 import com.crm.manager.service.VaultodyService;
@@ -16,6 +17,7 @@ import com.crm.rely.backend.model.dto.vaultody.vaults.VaultodyVaultsListDto;
 import com.crm.rely.backend.model.dto.vaultody.vaults.response.*;
 import com.crm.rely.backend.model.entity.vaultody.vaults.VaultTransactionsEntity;
 import com.crm.rely.backend.model.pojo.table.SysVaultodyConfigTable;
+import com.crm.rely.backend.model.pojo.table.TransactionItemTable;
 import com.crm.rely.backend.util.AESUtil;
 import com.crm.rely.backend.util.HttpUtil;
 import com.crm.rely.backend.util.UUIDUtil;
@@ -44,6 +46,8 @@ public class VaultodyServiceImpl implements VaultodyService {
     private SysVaultodyConfigService vaultodyConfigService;
     @Autowired
     private SysConfigService sysConfigService;
+    @Autowired
+    private TransactionItemRepository transactionItemRepository;
 
     public static String getSignature(String message, String apiSecret) {
         try {
@@ -330,4 +334,19 @@ public class VaultodyServiceImpl implements VaultodyService {
         VaultTransaction result = (VaultTransaction)vaultsTransactions(entity).getData();
         return result.getList();
     }
+
+    @Override
+    public void batchSave(List<TransactionItemTable> tables) {
+        transactionItemRepository.saveAll(tables);
+    }
+
+    @Override
+    public List<TransactionItemTable> finAllByVaultId(String vaultId) {
+        return transactionItemRepository.findAllByVaultId(vaultId);
+    }
+
+    @Override
+    public VaultTransaction vaultTransaction(VaultTransactionsEntity entity) throws Exception{
+        return (VaultTransaction)vaultsTransactions(entity).getData();
+    }
 }

+ 114 - 0
crm-manager/src/main/java/com/crm/manager/service/job/VaultsJob.java

@@ -0,0 +1,114 @@
+package com.crm.manager.service.job;
+
+import com.crm.manager.service.VaultodyService;
+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;
+import com.crm.rely.backend.model.entity.vaultody.vaults.VaultTransactionsEntity;
+import com.crm.rely.backend.model.pojo.table.TransactionItemTable;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+public class VaultsJob {
+
+    @Autowired
+    private VaultodyService vaultodyService;
+
+    @Scheduled(cron = "0 0 1 * * ?")
+    public void vaultsJob() throws Exception{
+        //TODO: 获取保险箱列表
+        List<VaultodyVaultsListDto> vaultsList = (List<VaultodyVaultsListDto>)vaultodyService.vaultsList().getData();
+        if(CollectionUtils.isEmpty(vaultsList)){
+            log.info("没有获取到保险箱列表");
+            return;
+        }
+        List<TransactionItemTable> tables = new LinkedList<>();
+        List<String> vaultIds = vaultsList.stream().map(VaultodyVaultsListDto::getId).toList();
+        //TODO: 获取保险箱交易记录
+        for (String vaultId : vaultIds) {
+            List<TransactionItemDto> list = queryWithFilter(vaultId);
+            if(CollectionUtils.isEmpty(list)){
+                continue;
+            }
+            for (TransactionItemDto transactionItemDto : list) {
+                TransactionItemTable table = new TransactionItemTable() ;
+                BeanUtils.copyProperties(transactionItemDto, table);
+                table.setVaultId(vaultId);
+                table.setItemId(transactionItemDto.getId());
+                tables.add(table);
+            }
+        }
+
+        if(CollectionUtils.isEmpty(tables)){
+            log.info("没有获取到保险箱交易记录:{},定时任务结束",tables);
+            return;
+        }
+        vaultodyService.batchSave(tables);
+    }
+
+    private List<TransactionItemDto> queryWithFilter(String vaultId) throws Exception {
+        VaultTransactionsEntity entity = new VaultTransactionsEntity();
+        entity.setVaultId(vaultId);
+        List<TransactionItemDto> result = new ArrayList<>();
+
+        // 先获取数据库中已存在的item ID列表
+        List<String> existingItemIds = recordByVaultId(vaultId);
+        Set<String> existingIdSet = new HashSet<>(existingItemIds);
+
+        VaultTransaction vaultTransaction = vaultodyService.vaultTransaction(entity);
+
+        // 处理第一页数据
+        if (vaultTransaction.getList() != null && !vaultTransaction.getList().isEmpty()) {
+            List<TransactionItemDto> filteredList = filterExistingItems(vaultTransaction.getList(), existingIdSet);
+            result.addAll(filteredList);
+        }
+
+        // 分页查询剩余数据
+        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 = vaultodyService.vaultTransaction(entity);
+
+            if (vaultTransaction.getList() != null && !vaultTransaction.getList().isEmpty()) {
+                List<TransactionItemDto> filteredList = filterExistingItems(vaultTransaction.getList(), existingIdSet);
+                result.addAll(filteredList);
+            } else {
+                break;
+            }
+        }
+
+        return result;
+    }
+
+    private List<TransactionItemDto> filterExistingItems(List<TransactionItemDto> items, Set<String> existingIdSet) {
+        if (items == null || items.isEmpty()) {
+            return Collections.emptyList();
+        }
+
+        return items.stream()
+                .filter(item -> item != null && item.getId() != null)
+                .filter(item -> !existingIdSet.contains(item.getId()))
+                .collect(Collectors.toList());
+    }
+
+    private List<String> recordByVaultId(String vaultId){
+        List<TransactionItemTable> list = vaultodyService.finAllByVaultId(vaultId);
+        if(CollectionUtils.isEmpty(list)){
+            return new ArrayList<>();
+        }
+        return list.stream().map(TransactionItemTable::getItemId).toList();
+    }
+}

+ 33 - 0
crm-model/src/main/java/com/crm/rely/backend/model/pojo/table/TransactionItemTable.java

@@ -0,0 +1,33 @@
+package com.crm.rely.backend.model.pojo.table;
+
+import com.crm.rely.backend.core.pojo.BaseTable;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
+import lombok.Data;
+
+@Data
+@Entity
+@Table(name = "transaction_item")
+public class TransactionItemTable 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 recipientAddress;
+    private String recipientIsVaultAddress;
+    private String recipientAmountUnit;
+    private String recipientAmount;
+
+    private String blockchain;
+    private String minedInBlockHeight;
+    private String feeAmount;
+    private String feeAmountUnit;
+}