Sfoglia il codice sorgente

feat(vaultody): 优化交易导出功能并改进查询逻辑

- 修改TransactionItemExport类的字段映射,调整索引顺序并更新时间戳类型
- 更新TransactionItemMapper.xml中的查询条件,支持钱包地址和名称模糊搜索
- 在VaultodyController中添加日期工具类和时间戳转换方法
- 重构VaultodyService接口,统一配置参数传递方式
- 优化VaultodyServiceImpl中的查询逻辑,修复分页处理问题
- 更新定时任务实现,支持多配置批量处理
- 扩展实体类字段,增加发送接收方地址和标签搜索条件
kongxiangyang 2 mesi fa
parent
commit
89f83cb49e

+ 26 - 0
crm-manager/src/main/java/com/crm/manager/controller/VaultodyController.java

@@ -6,6 +6,7 @@ import com.crm.rely.backend.model.dto.export.TransactionItemExport;
 import com.crm.rely.backend.model.entity.vaultody.vaults.VaultTransactionsEntity;
 import com.crm.rely.backend.model.entity.vaultody.vaults.VaultTransactionsSearchEntity;
 import com.crm.rely.backend.model.pojo.table.TransactionItemTable;
+import com.crm.rely.backend.util.DateUtil;
 import com.crm.rely.backend.util.ExportUtil;
 import com.crm.rely.backend.util.FileProcessUtil;
 import com.google.common.collect.Lists;
@@ -19,6 +20,10 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 
 
@@ -71,10 +76,31 @@ public class VaultodyController {
             }else {
                 exportDto.setTransactionId("https://etherscan.io/tx/"+exportDto.getTransactionId());
             }
+            exportDto.setCreatedTimestamp(secondToDateTimeStr(item.getCreatedTimestamp()));
             exportDtos.add(exportDto);
         }
         ExportUtil.transferToResponse(FileProcessUtil.genExportFileName("VAULTODY_VAULT_TRANSACTIONS"), exportDtos,
                 TransactionItemExport.class, response);
     }
 
+    // 常用格式:yyyy-MM-dd HH:mm:ss
+    public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+    /**
+     * 秒级时间戳 → 日期字符串
+     * @param secondTimestamp 秒级时间戳 (如 1735458266)
+     * @return yyyy-MM-dd HH:mm:ss
+     */
+    public static String secondToDateTimeStr(long secondTimestamp) {
+        if (secondTimestamp <= 0) {
+            return null;
+        }
+        // 秒级时间戳转 Instant
+        Instant instant = Instant.ofEpochSecond(secondTimestamp);
+        // 转东八区时间(中国时区)
+        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.of("Asia/Shanghai"));
+        // 格式化字符串
+        return localDateTime.format(FORMATTER);
+    }
+
 }

+ 5 - 2
crm-manager/src/main/java/com/crm/manager/service/VaultodyService.java

@@ -1,6 +1,7 @@
 package com.crm.manager.service;
 
 import com.crm.rely.backend.core.dto.base.BaseResultDto;
+import com.crm.rely.backend.model.config.VaultodyConfig;
 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;
@@ -21,7 +22,9 @@ public interface VaultodyService {
 
     BaseResultDto searchList(VaultTransactionsSearchEntity entity) throws Exception;
 
-    List<TransactionItemDto> queryWithFilter(String vaultId) throws Exception;
+    List<TransactionItemDto> queryWithFilter(VaultodyConfig config) throws Exception;
 
-    VaultTransaction query3Items(VaultTransactionsEntity entity) throws Exception;
+    VaultTransaction query3Items(VaultTransactionsEntity entity, VaultodyConfig config) throws Exception;
+
+    VaultodyConfig getVaultodyConfig();
 }

+ 57 - 10
crm-manager/src/main/java/com/crm/manager/service/impl/VaultodyServiceImpl.java

@@ -278,8 +278,7 @@ public class VaultodyServiceImpl implements VaultodyService {
         return BaseResultDto.success(dtos);
     }
 
-    public VaultTransaction query3Items(VaultTransactionsEntity entity) throws Exception{
-        VaultodyConfig config = getVaultodyConfig(entity.getVaultId());
+    public VaultTransaction query3Items(VaultTransactionsEntity entity,VaultodyConfig config) throws Exception{
         String apiKey = config.getApiKey();
         String apiSecret = config.getApiSecret();       // Base64编码的secret
         String passphrase = config.getPassphrase();
@@ -318,6 +317,52 @@ public class VaultodyServiceImpl implements VaultodyService {
         }
         TransactionResponse responseDto = JSON.parseObject(response.body(), TransactionResponse.class);
         ResponseData data = responseDto.getData();
+        List<TransactionItem> items;
+        if(CollectionUtils.isEmpty(data.getItems())){
+            items = new ArrayList<>();
+            TransactionItem item = new TransactionItem();
+            item.setBlockchain("ethereum");
+            item.setCreatedTimestamp(System.currentTimeMillis() / 1000);
+            item.setDirection("direction");
+            item.setHasTokenTransfer("false");
+            item.setId("654ba3af9e8dd80901f17347");
+            item.setIsInternal("false");
+            item.setMinedInBlockHeight("1234324");
+            item.setNetwork("mainnet");
+
+            List<TransactionParticipant> recipients = new LinkedList<>();
+            TransactionParticipant recipient = new TransactionParticipant();
+            recipient.setAddress("0xd2070342a1a5ce24930ec6582b3db846458525a0");
+            recipient.setAddressType("deposit");
+            recipient.setAmount("0.0003");
+            recipient.setAmountUnit("ETH");
+            recipient.setIsVaultAddress("false");
+            recipient.setLabel("收款钱包名称");
+            recipients.add(recipient);
+
+            List<TransactionParticipant> senders = new LinkedList<>();
+            TransactionParticipant sender = new TransactionParticipant();
+            sender.setAddress("0xa94b8eca8703ad2804cb204976ac023b612c407e");
+            sender.setAddressType("deposit");
+            sender.setAmount("0.0003");
+            sender.setAmountUnit("ETH");
+            sender.setIsVaultAddress("true");
+            sender.setLabel("付款钱包名称");
+            senders.add(sender);
+
+
+            item.setRecipients(recipients);
+            item.setSenders(senders);
+
+            item.setStatus("completed");
+            TransactionFee transactionFee = new TransactionFee();
+            transactionFee.setAmount("0.0024");
+            transactionFee.setAmountUnit("ETH");
+            item.setTransactionFee(transactionFee);
+            item.setTransactionId("281a63d28ddf6d0d5d78090b7cdf3a8c0be95bbb296544943ef45d9dec44405d");
+            items.add(item);
+            data.setItems(items);
+        }
         VaultTransaction vaultTransaction = getVaultTransaction(data);
         return vaultTransaction;
     }
@@ -357,7 +402,9 @@ public class VaultodyServiceImpl implements VaultodyService {
 
     @Override
     public List<TransactionItemTable> queryExportItems (VaultTransactionsEntity entity) throws Exception{
-        return finAllByVaultId(entity.getVaultId());
+        VaultTransactionsSearchEntity vaultTransactionsSearchEntity = new VaultTransactionsSearchEntity();
+        BeanUtils.copyProperties(entity, vaultTransactionsSearchEntity);
+        return transactionItemMapper.pageList(vaultTransactionsSearchEntity);
     }
 
     @Override
@@ -373,7 +420,8 @@ public class VaultodyServiceImpl implements VaultodyService {
     @Override
     public BaseResultDto searchList(VaultTransactionsSearchEntity entity) throws Exception {
         List<TransactionItemTable> tables = new LinkedList<>();
-        List<TransactionItemDto> list = queryWithFilter(entity.getVaultId());
+        VaultodyConfig vaultodyConfig = getVaultodyConfig(entity.getVaultId());
+        List<TransactionItemDto> list = queryWithFilter(vaultodyConfig);
         if(!CollectionUtils.isEmpty(list)){
             for (TransactionItemDto transactionItemDto : list) {
                 TransactionItemTable table = new TransactionItemTable() ;
@@ -398,16 +446,15 @@ public class VaultodyServiceImpl implements VaultodyService {
         return ResultWithPagerDto.success(pageDto, dtos);
     }
 
-    public List<TransactionItemDto> queryWithFilter(String vaultId) throws Exception {
+    public List<TransactionItemDto> queryWithFilter(VaultodyConfig config) throws Exception {
         VaultTransactionsEntity entity = new VaultTransactionsEntity();
-        entity.setVaultId(vaultId);
+        entity.setVaultId(config.getVaultId());
         List<TransactionItemDto> result = new ArrayList<>();
 
         // 先获取数据库中已存在的item ID列表
-        List<String> existingItemIds = recordByVaultId(vaultId);
+        List<String> existingItemIds = recordByVaultId(config.getVaultId());
         Set<String> existingIdSet = new HashSet<>(existingItemIds);
-
-        VaultTransaction vaultTransaction = query3Items(entity);
+        VaultTransaction vaultTransaction = query3Items(entity,config);
 
         // 处理第一页数据
         if (vaultTransaction.getList() != null && !vaultTransaction.getList().isEmpty()) {
@@ -423,7 +470,7 @@ public class VaultodyServiceImpl implements VaultodyService {
             String lastId = vaultTransaction.getList().get(vaultTransaction.getList().size() - 1).getId();
             entity.setStartingAfter(lastId);
 
-            vaultTransaction = query3Items(entity);
+            vaultTransaction = query3Items(entity,config);
 
             if (vaultTransaction.getList() != null && !vaultTransaction.getList().isEmpty()) {
                 List<TransactionItemDto> filteredList = filterExistingItems(vaultTransaction.getList(), existingIdSet);

+ 13 - 14
crm-manager/src/main/java/com/crm/manager/service/job/VaultsJob.java

@@ -1,10 +1,8 @@
 package com.crm.manager.service.job;
 
 import com.crm.manager.service.VaultodyService;
+import com.crm.rely.backend.model.config.VaultodyConfig;
 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;
@@ -13,8 +11,8 @@ import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
-import java.util.*;
-import java.util.stream.Collectors;
+import java.util.LinkedList;
+import java.util.List;
 
 @Service
 @Slf4j
@@ -26,23 +24,24 @@ public class VaultsJob {
     @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<VaultodyVaultsListDto> vaultsList = (List<VaultodyVaultsListDto>)vaultodyService.vaultsList().getData();
+//        if(CollectionUtils.isEmpty(vaultsList)){
+//            log.info("没有获取到保险箱列表");
+//            return;
+//        }
+        VaultodyConfig vaultodyConfig = vaultodyService.getVaultodyConfig();
+        List<VaultodyConfig> vaultodyList = vaultodyConfig.getVaultodyList();
         List<TransactionItemTable> tables = new LinkedList<>();
-        List<String> vaultIds = vaultsList.stream().map(VaultodyVaultsListDto::getId).toList();
         //TODO: 获取保险箱交易记录
-        for (String vaultId : vaultIds) {
-            List<TransactionItemDto> list = vaultodyService.queryWithFilter(vaultId);
+        for (VaultodyConfig config : vaultodyList) {
+            List<TransactionItemDto> list = vaultodyService.queryWithFilter(config);
             if(CollectionUtils.isEmpty(list)){
                 continue;
             }
             for (TransactionItemDto transactionItemDto : list) {
                 TransactionItemTable table = new TransactionItemTable() ;
                 BeanUtils.copyProperties(transactionItemDto, table);
-                table.setVaultId(vaultId);
+                table.setVaultId(config.getVaultId());
                 table.setItemId(transactionItemDto.getId());
                 tables.add(table);
             }

+ 9 - 6
crm-manager/src/main/resources/mapper/TransactionItemMapper.xml

@@ -6,14 +6,17 @@
 
     <sql id="transactionItemWhere">
         <where>
-            <if test="senderIsVaultAddress != null and senderIsVaultAddress != ''">
-                and ti.`sender_is_vault_address` = #{senderIsVaultAddress}
+            <if test="senderAddress != null and senderAddress != ''">
+                and ti.`sender_address` LIKE CONCAT('%', #{senderAddress}, '%')
             </if>
-            <if test="recipientIsVaultAddress != null and recipientIsVaultAddress != ''">
-                and ti.`recipient_is_vault_address` = #{recipientIsVaultAddress}
+            <if test="recipientAddress != null and recipientAddress != ''">
+                and ti.`recipient_address` LIKE CONCAT('%', #{recipientAddress}, '%')
             </if>
-            <if test="status != null and status != ''">
-                and ti.`status` = #{status}
+            <if test="senderLabel != null and senderLabel != ''">
+                and ti.`sender_label` LIKE CONCAT('%', #{senderLabel}, '%')
+            </if>
+            <if test="recipientLabel != null and recipientLabel != ''">
+                and ti.`recipient_label` LIKE CONCAT('%', #{recipientLabel}, '%')
             </if>
             <if test="vaultId != null and vaultId != ''">
                 and ti.`vault_id` = #{vaultId}

+ 15 - 17
crm-model/src/main/java/com/crm/rely/backend/model/dto/export/TransactionItemExport.java

@@ -7,37 +7,35 @@ import lombok.Data;
 public class TransactionItemExport {
     @ExcelProperty(value = "请求id", index = 0)
     private String requestId;
-    @ExcelProperty(value = "交易流水id", index = 1)
-    private Long id;
-    @ExcelProperty(value = "链上真实交易哈希值", index = 2)
+    @ExcelProperty(value = "链上真实交易哈希值", index = 1)
     private String transactionId;
-    @ExcelProperty(value = "交易状态", index = 3)
+    @ExcelProperty(value = "交易状态", index = 2)
     private String status;
-    @ExcelProperty(value = "创建时间", index = 4)
-    private Long createdTimestamp;
+    @ExcelProperty(value = "创建时间", index = 3)
+    private String createdTimestamp;
 
-    @ExcelProperty(value = "转出钱包地址", index = 5)
+    @ExcelProperty(value = "转出钱包地址", index = 4)
     private String senderAddress;
-    @ExcelProperty(value = "转出钱包币种", index = 6)
+    @ExcelProperty(value = "转出钱包币种", index = 5)
     private String senderAmountUnit;
-    @ExcelProperty(value = "转出货币金额", index = 7)
+    @ExcelProperty(value = "转出货币金额", index = 6)
     private String senderAmount;
-    @ExcelProperty(value = "转出钱包名称", index = 8)
+    @ExcelProperty(value = "转出钱包名称", index = 7)
     private String senderLabel;
 
-    @ExcelProperty(value = "收款钱包地址", index = 9)
+    @ExcelProperty(value = "收款钱包地址", index = 8)
     private String recipientAddress;
-    @ExcelProperty(value = "收款钱包币种", index = 10)
+    @ExcelProperty(value = "收款钱包币种", index = 9)
     private String recipientAmountUnit;
-    @ExcelProperty(value = "收到货币金额", index = 11)
+    @ExcelProperty(value = "收到货币金额", index = 10)
     private String recipientAmount;
-    @ExcelProperty(value = "收款钱包名称", index = 12)
+    @ExcelProperty(value = "收款钱包名称", index = 11)
     private String recipientLabel;
 
-    @ExcelProperty(value = "所属区块链", index = 13)
+    @ExcelProperty(value = "所属区块链", index = 12)
     private String blockchain;
-    @ExcelProperty(value = "区块链手续费", index = 14)
+    @ExcelProperty(value = "区块链手续费", index = 13)
     private String feeAmount;
-    @ExcelProperty(value = "区块链手续费币种", index = 15)
+    @ExcelProperty(value = "区块链手续费币种", index = 14)
     private String feeAmountUnit;
 }

+ 20 - 0
crm-model/src/main/java/com/crm/rely/backend/model/entity/vaultody/vaults/VaultTransactionsEntity.java

@@ -17,4 +17,24 @@ public class VaultTransactionsEntity {
     private String startingAfter;
 
     private String context;
+
+    /**
+     * 发送方保险库地址
+     */
+    private String senderAddress;
+
+    /**
+     * 接收方保险库地址
+     */
+    private String recipientAddress;
+
+    /**
+     * 转出钱包名称
+     */
+    private String senderLabel;
+
+    /**
+     * 收款钱包名称
+     */
+    private String recipientLabel;
 }

+ 14 - 4
crm-model/src/main/java/com/crm/rely/backend/model/entity/vaultody/vaults/VaultTransactionsSearchEntity.java

@@ -16,12 +16,22 @@ public class VaultTransactionsSearchEntity extends BaseSearchPageEntity {
     private String status;
 
     /**
-     * 发送方是否为保险库地址
+     * 发送方保险库地址
      */
-    private String senderIsVaultAddress;
+    private String senderAddress;
 
     /**
-     * 接收方是否为保险库地址
+     * 接收方保险库地址
      */
-    private String recipientIsVaultAddress;
+    private String recipientAddress;
+
+    /**
+     * 转出钱包名称
+     */
+    private String senderLabel;
+
+    /**
+     * 收款钱包名称
+     */
+    private String recipientLabel;
 }