|
@@ -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.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.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;
|
|
@@ -44,6 +46,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;
|
|
@@ -381,7 +384,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() ;
|
|
@@ -414,7 +417,28 @@ 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 {
|
|
@@ -499,6 +523,86 @@ public class VaultodyServiceImpl implements VaultodyService {
|
|
|
return result;
|
|
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) {
|
|
private List<TransactionItemDto> filterExistingItems(List<TransactionItemDto> items, Set<String> existingIdSet) {
|
|
|
if (items == null || items.isEmpty()) {
|
|
if (items == null || items.isEmpty()) {
|
|
|
return Collections.emptyList();
|
|
return Collections.emptyList();
|