|
@@ -6,10 +6,16 @@ import com.bex.proto.staking.*;
|
|
|
import com.bex.proto.user.*;
|
|
import com.bex.proto.user.*;
|
|
|
import com.bex.staking.entity.StakingOrder;
|
|
import com.bex.staking.entity.StakingOrder;
|
|
|
import com.bex.staking.entity.StakingProduct;
|
|
import com.bex.staking.entity.StakingProduct;
|
|
|
|
|
+import com.bex.staking.entity.StakingProfitJournal;
|
|
|
import com.bex.staking.enums.ProductStatus;
|
|
import com.bex.staking.enums.ProductStatus;
|
|
|
import com.bex.staking.mapper.StakingOrderMapper;
|
|
import com.bex.staking.mapper.StakingOrderMapper;
|
|
|
import com.bex.staking.mapper.StakingProductMapper;
|
|
import com.bex.staking.mapper.StakingProductMapper;
|
|
|
|
|
+import com.bex.staking.mapper.StakingProfitJournalMapper;
|
|
|
|
|
+import com.bex.staking.model.dto.NetworkPeriodAmountDTO;
|
|
|
|
|
+import com.bex.staking.model.dto.NetworkUserAmountDTO;
|
|
|
import com.bex.staking.util.ProductDisplayMapper;
|
|
import com.bex.staking.util.ProductDisplayMapper;
|
|
|
|
|
+
|
|
|
|
|
+import java.time.Instant;
|
|
|
import io.grpc.stub.StreamObserver;
|
|
import io.grpc.stub.StreamObserver;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
@@ -35,6 +41,7 @@ public class StakingGrpcService extends StakingServiceGrpc.StakingServiceImplBas
|
|
|
private final StakingProductMapper stakingProductMapper;
|
|
private final StakingProductMapper stakingProductMapper;
|
|
|
private final StakingOrderMapper stakingOrderMapper;
|
|
private final StakingOrderMapper stakingOrderMapper;
|
|
|
private final UserServiceGrpc.UserServiceBlockingStub userStub;
|
|
private final UserServiceGrpc.UserServiceBlockingStub userStub;
|
|
|
|
|
+ private final StakingProfitJournalMapper stakingProfitJournalMapper;
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public void listProducts(ListProductsRequest request, StreamObserver<ListProductsResponse> responseObserver) {
|
|
public void listProducts(ListProductsRequest request, StreamObserver<ListProductsResponse> responseObserver) {
|
|
@@ -377,6 +384,42 @@ public class StakingGrpcService extends StakingServiceGrpc.StakingServiceImplBas
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 按 journal id 查询单笔收益派发流水(佣金对账专用)
|
|
|
|
|
+ * <p>
|
|
|
|
|
+ * 用于 commission 服务在 T+1 对账阶段重算质押返佣,输入参数为
|
|
|
|
|
+ * {@code commission_records.sourceTradeId}(即 {@code staking_profit_journal.id}),
|
|
|
|
|
+ * 返回该笔流水的 {@code profit_usdt_amount} 作为重算 sourceFee。
|
|
|
|
|
+ * </p>
|
|
|
|
|
+ */
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void getProfitJournal(GetProfitJournalRequest request, StreamObserver<GetProfitJournalResponse> responseObserver) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ long journalId = request.getJournalId();
|
|
|
|
|
+ log.info("【质押对账】gRPC GetProfitJournal 收到请求:journalId={}", journalId);
|
|
|
|
|
+
|
|
|
|
|
+ StakingProfitJournal journal = stakingProfitJournalMapper.selectById(journalId);
|
|
|
|
|
+ GetProfitJournalResponse.Builder builder = GetProfitJournalResponse.newBuilder();
|
|
|
|
|
+ if (journal == null) {
|
|
|
|
|
+ log.info("【质押对账】gRPC GetProfitJournal 未找到流水:journalId={}", journalId);
|
|
|
|
|
+ builder.setFound(false).setProfitAmount("0").setUserId(0L);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ BigDecimal profitUsdt = journal.getProfitAmount() != null
|
|
|
|
|
+ ? journal.getProfitAmount() : BigDecimal.ZERO;
|
|
|
|
|
+ builder.setFound(true)
|
|
|
|
|
+ .setProfitAmount(profitUsdt.toPlainString())
|
|
|
|
|
+ .setUserId(journal.getUserId() != null ? journal.getUserId() : 0L);
|
|
|
|
|
+ log.info("【质押对账】gRPC GetProfitJournal 查询成功:journalId={}, userId={}, profitAmount={}",
|
|
|
|
|
+ journalId, journal.getUserId(), profitUsdt);
|
|
|
|
|
+ }
|
|
|
|
|
+ responseObserver.onNext(builder.build());
|
|
|
|
|
+ responseObserver.onCompleted();
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("【质押对账】gRPC GetProfitJournal 异常:journalId={}", request.getJournalId(), e);
|
|
|
|
|
+ responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(e.getMessage()).asRuntimeException());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private StakingProductInfo toProductInfo(StakingProduct p) {
|
|
private StakingProductInfo toProductInfo(StakingProduct p) {
|
|
|
StakingProductInfo.Builder builder = StakingProductInfo.newBuilder()
|
|
StakingProductInfo.Builder builder = StakingProductInfo.newBuilder()
|
|
|
.setId(p.getId() != null ? p.getId() : 0L)
|
|
.setId(p.getId() != null ? p.getId() : 0L)
|
|
@@ -460,4 +503,104 @@ public class StakingGrpcService extends StakingServiceGrpc.StakingServiceImplBas
|
|
|
|
|
|
|
|
return builder.build();
|
|
return builder.build();
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // ==================== 网体统计 RPC ====================
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void getStakingParticipatedUserIds(NetworkParticipatedUserIdsRequest request,
|
|
|
|
|
+ StreamObserver<NetworkParticipatedUserIdsResponse> responseObserver) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ List<Long> userIds = request.getUserIdsList();
|
|
|
|
|
+ NetworkParticipatedUserIdsResponse.Builder builder = NetworkParticipatedUserIdsResponse.newBuilder();
|
|
|
|
|
+ if (userIds == null || userIds.isEmpty()) {
|
|
|
|
|
+ responseObserver.onNext(builder.build());
|
|
|
|
|
+ responseObserver.onCompleted();
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ List<Long> participated = stakingOrderMapper.findParticipatedUserIds(userIds);
|
|
|
|
|
+ if (participated != null) {
|
|
|
|
|
+ builder.addAllParticipatedUserIds(participated);
|
|
|
|
|
+ }
|
|
|
|
|
+ responseObserver.onNext(builder.build());
|
|
|
|
|
+ responseObserver.onCompleted();
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("getStakingParticipatedUserIds gRPC error: {}", e.getMessage(), e);
|
|
|
|
|
+ responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(e.getMessage()).asRuntimeException());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void sumStakingAmountByUserIds(NetworkSumAmountRequest request,
|
|
|
|
|
+ StreamObserver<NetworkSumAmountResponse> responseObserver) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ List<Long> userIds = request.getUserIdsList();
|
|
|
|
|
+ NetworkSumAmountResponse.Builder builder = NetworkSumAmountResponse.newBuilder()
|
|
|
|
|
+ .setTotalAmount("0");
|
|
|
|
|
+ if (userIds == null || userIds.isEmpty()) {
|
|
|
|
|
+ responseObserver.onNext(builder.build());
|
|
|
|
|
+ responseObserver.onCompleted();
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (request.getGroupByUser()) {
|
|
|
|
|
+ List<NetworkUserAmountDTO> list = stakingOrderMapper.sumStakeAmountGroupByUser(userIds);
|
|
|
|
|
+ BigDecimal total = BigDecimal.ZERO;
|
|
|
|
|
+ if (list != null) {
|
|
|
|
|
+ for (NetworkUserAmountDTO dto : list) {
|
|
|
|
|
+ if (dto.getUserId() == null) continue;
|
|
|
|
|
+ BigDecimal amt = dto.getAmount() != null ? dto.getAmount() : BigDecimal.ZERO;
|
|
|
|
|
+ builder.putAmountByUser(dto.getUserId(), amt.toPlainString());
|
|
|
|
|
+ total = total.add(amt);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ builder.setTotalAmount(total.toPlainString());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ LocalDateTime startTime = request.getStartTimeMs() > 0
|
|
|
|
|
+ ? LocalDateTime.ofInstant(Instant.ofEpochMilli(request.getStartTimeMs()), ZoneId.systemDefault())
|
|
|
|
|
+ : null;
|
|
|
|
|
+ LocalDateTime endTime = request.getEndTimeMs() > 0
|
|
|
|
|
+ ? LocalDateTime.ofInstant(Instant.ofEpochMilli(request.getEndTimeMs()), ZoneId.systemDefault())
|
|
|
|
|
+ : null;
|
|
|
|
|
+ BigDecimal sum = stakingOrderMapper.sumStakeAmountByUserIds(userIds, startTime, endTime);
|
|
|
|
|
+ builder.setTotalAmount(sum != null ? sum.toPlainString() : "0");
|
|
|
|
|
+ }
|
|
|
|
|
+ responseObserver.onNext(builder.build());
|
|
|
|
|
+ responseObserver.onCompleted();
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("sumStakingAmountByUserIds gRPC error: {}", e.getMessage(), e);
|
|
|
|
|
+ responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(e.getMessage()).asRuntimeException());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void sumStakingAmountByPeriod(NetworkSumAmountByPeriodRequest request,
|
|
|
|
|
+ StreamObserver<NetworkSumAmountByPeriodResponse> responseObserver) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ List<Long> userIds = request.getUserIdsList();
|
|
|
|
|
+ NetworkSumAmountByPeriodResponse.Builder builder = NetworkSumAmountByPeriodResponse.newBuilder();
|
|
|
|
|
+ if (userIds == null || userIds.isEmpty()) {
|
|
|
|
|
+ responseObserver.onNext(builder.build());
|
|
|
|
|
+ responseObserver.onCompleted();
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ LocalDateTime startTime = LocalDateTime.ofInstant(
|
|
|
|
|
+ Instant.ofEpochMilli(request.getStartTimeMs()), ZoneId.systemDefault());
|
|
|
|
|
+ LocalDateTime endTime = LocalDateTime.ofInstant(
|
|
|
|
|
+ Instant.ofEpochMilli(request.getEndTimeMs()), ZoneId.systemDefault());
|
|
|
|
|
+ List<NetworkPeriodAmountDTO> list = stakingOrderMapper.sumStakeAmountByPeriod(
|
|
|
|
|
+ userIds, request.getPeriod(), startTime, endTime);
|
|
|
|
|
+ if (list != null) {
|
|
|
|
|
+ for (NetworkPeriodAmountDTO dto : list) {
|
|
|
|
|
+ builder.addItems(NetworkPeriodAmount.newBuilder()
|
|
|
|
|
+ .setPeriodKey(dto.getPeriodKey() != null ? dto.getPeriodKey() : "")
|
|
|
|
|
+ .setAmount(dto.getAmount() != null ? dto.getAmount().toPlainString() : "0")
|
|
|
|
|
+ .build());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ responseObserver.onNext(builder.build());
|
|
|
|
|
+ responseObserver.onCompleted();
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("sumStakingAmountByPeriod gRPC error: {}", e.getMessage(), e);
|
|
|
|
|
+ responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(e.getMessage()).asRuntimeException());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|