package com.crm.manager.controller; import com.crm.manager.service.VaultodyService; import com.crm.rely.backend.core.dto.base.BaseResultDto; 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; import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; import org.hibernate.service.spi.ServiceException; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; 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; @RestController @RequestMapping("/vaultody") public class VaultodyController { @Autowired private VaultodyService vaultodyService; /** * 保险箱列表 * */ @PostMapping("/vaults/list") public BaseResultDto vaultsList() throws Exception { return vaultodyService.vaultsList(); } /** * 保险箱交易详情分页查询 * @param entity * @return * @throws Exception */ @PostMapping("/transaction/search/list") public BaseResultDto searchList(@RequestBody VaultTransactionsSearchEntity entity) throws Exception { if (StringUtils.isBlank(entity.getVaultId())) { throw new ServiceException("vault_id_not_null_error"); } return vaultodyService.searchList(entity); } /** * 导出保险箱交易记录 * @param entity * @param response * @throws Exception */ @PostMapping("/export") public void export(@RequestBody VaultTransactionsEntity entity, HttpServletResponse response) throws Exception { List items = vaultodyService.queryExportItems(entity); List exportDtos = Lists.newArrayList(); for (TransactionItemTable item : items) { TransactionItemExport exportDto = new TransactionItemExport(); BeanUtils.copyProperties(item, exportDto); if("ETH".equals(exportDto.getRecipientAmountUnit())){ exportDto.setTransactionId("https://etherscan.io/tx/"+exportDto.getTransactionId()); }else { exportDto.setTransactionId("https://tronscan.org/#/transaction/"+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); } }