update 订单详情接口新增理论算力,理论算力和实际算力的比值,实际支付金额
This commit is contained in:
@@ -34,6 +34,7 @@ public class OrderInfoDto {
|
|||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
@ApiModelProperty(value = "店铺id")
|
@ApiModelProperty(value = "店铺id")
|
||||||
|
@Deprecated
|
||||||
private Long shopId;
|
private Long shopId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -79,15 +80,19 @@ public class OrderInfoDto {
|
|||||||
|
|
||||||
|
|
||||||
@ApiModelProperty(value = "二维码图片")
|
@ApiModelProperty(value = "二维码图片")
|
||||||
|
@Deprecated
|
||||||
private String img;
|
private String img;
|
||||||
|
|
||||||
@ApiModelProperty(value = "需支付总金额")
|
@ApiModelProperty(value = "需支付总金额")
|
||||||
|
@Deprecated
|
||||||
private BigDecimal amount;
|
private BigDecimal amount;
|
||||||
|
|
||||||
@ApiModelProperty(value = "已支付金额")
|
@ApiModelProperty(value = "已支付金额")
|
||||||
|
@Deprecated
|
||||||
private String payAmount;
|
private String payAmount;
|
||||||
|
|
||||||
@ApiModelProperty(value = "未支付金额")
|
@ApiModelProperty(value = "未支付金额")
|
||||||
|
@Deprecated
|
||||||
private Double noPayAmount;
|
private Double noPayAmount;
|
||||||
|
|
||||||
@ApiModelProperty(value = "店铺名称")
|
@ApiModelProperty(value = "店铺名称")
|
||||||
@@ -96,7 +101,23 @@ public class OrderInfoDto {
|
|||||||
@ApiModelProperty(value = "支付币种(单位)")
|
@ApiModelProperty(value = "支付币种(单位)")
|
||||||
private String payCoin;
|
private String payCoin;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------- 一个普通订单对应一个支付订单(多个封装下面四个字段为一个对象,并返回list)- ----------------------------------------------------------------------
|
//---------------------------------------------- 一个普通订单对应一个支付订单(多个封装下面四个字段为一个对象,并返回list)- ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "实际支付总金额")
|
||||||
|
private BigDecimal totalPayAmount;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "理论总算力")
|
||||||
|
private BigDecimal totalTheoryPower;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "实际算力")
|
||||||
|
private BigDecimal totalPracticalPower;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "实际算力/理论算力 比值")
|
||||||
|
private BigDecimal powerRatio;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 订单详情
|
* 订单详情
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -89,4 +89,17 @@ public class OrderItemDto {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "实际支付金额")
|
||||||
|
private BigDecimal payAmount;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "理论算力")
|
||||||
|
private BigDecimal theoryPower;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "实际算力")
|
||||||
|
private BigDecimal practicalPower;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "实际算力/理论算力 比值")
|
||||||
|
private BigDecimal powerRatio;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -118,6 +118,11 @@ public class LeaseOrderItem implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private BigDecimal theoryPower;
|
private BigDecimal theoryPower;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 单机实际算力
|
||||||
|
*/
|
||||||
|
private BigDecimal practicalPower;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 单机理论收益
|
* 单机理论收益
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import org.springframework.stereotype.Service;
|
|||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.math.RoundingMode;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.temporal.ChronoUnit;
|
import java.time.temporal.ChronoUnit;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
@@ -552,19 +553,6 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl<LeaseOrderInfoMapper,
|
|||||||
List<LeaseOrderItem> leaseOrderItems = leaseOrderItemMapper.selectList(new LambdaQueryWrapper<LeaseOrderItem>()
|
List<LeaseOrderItem> leaseOrderItems = leaseOrderItemMapper.selectList(new LambdaQueryWrapper<LeaseOrderItem>()
|
||||||
.eq(LeaseOrderItem::getOrderId, orderVo.getOrderId()));
|
.eq(LeaseOrderItem::getOrderId, orderVo.getOrderId()));
|
||||||
|
|
||||||
List<OrderItemDto> collect1 = leaseOrderItems.stream().map(leaseOrderItem -> OrderItemDto.builder()
|
|
||||||
.orderId(leaseOrderItem.getOrderId())
|
|
||||||
.productId(leaseOrderItem.getProductId())
|
|
||||||
.productMachineId(leaseOrderItem.getProductMachineId())
|
|
||||||
.leaseTime(leaseOrderItem.getLeaseTime())
|
|
||||||
.address(leaseOrderItem.getAddress())
|
|
||||||
.payCoin(leaseOrderItem.getPayCoin())
|
|
||||||
.name(leaseOrderItem.getName())
|
|
||||||
.image(leaseOrderItem.getImage())
|
|
||||||
.price(leaseOrderItem.getPrice())
|
|
||||||
.type(leaseOrderItem.getType() ? 1 : 0)
|
|
||||||
.numbers(leaseOrderItem.getNumbers())
|
|
||||||
.build()).collect(Collectors.toList());
|
|
||||||
|
|
||||||
OrderInfoDto orderInfoDto = OrderInfoDto.builder()
|
OrderInfoDto orderInfoDto = OrderInfoDto.builder()
|
||||||
.id(leaseOrderInfo.getId())
|
.id(leaseOrderInfo.getId())
|
||||||
@@ -575,9 +563,46 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl<LeaseOrderInfoMapper,
|
|||||||
.status(leaseOrderInfo.getStatus())
|
.status(leaseOrderInfo.getStatus())
|
||||||
.createTime(leaseOrderInfo.getCreateTime())
|
.createTime(leaseOrderInfo.getCreateTime())
|
||||||
.endTime(leaseOrderInfo.getUpdateTime())
|
.endTime(leaseOrderInfo.getUpdateTime())
|
||||||
.orderItemDtoList(collect1)
|
.totalTheoryPower(BigDecimal.ZERO)
|
||||||
|
.totalPracticalPower(BigDecimal.ZERO)
|
||||||
|
.totalPayAmount(BigDecimal.ZERO)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
|
||||||
|
List<OrderItemDto> list = new ArrayList<>();
|
||||||
|
for (LeaseOrderItem leaseOrderItem : leaseOrderItems) {
|
||||||
|
BigDecimal theoryPower = leaseOrderItem.getTheoryPower();
|
||||||
|
BigDecimal practicalPower = leaseOrderItem.getPracticalPower();
|
||||||
|
BigDecimal powerRatio = practicalPower.divide(theoryPower, 2, RoundingMode.HALF_UP);
|
||||||
|
BigDecimal alreadyPayRealAmount = leaseOrderItem.getAlreadyPayRealAmount();
|
||||||
|
|
||||||
|
orderInfoDto.setTotalTheoryPower(orderInfoDto.getTotalTheoryPower().add(theoryPower));
|
||||||
|
orderInfoDto.setTotalPracticalPower(orderInfoDto.getTotalPracticalPower().add(practicalPower));
|
||||||
|
orderInfoDto.setTotalPayAmount(orderInfoDto.getTotalPayAmount().add(alreadyPayRealAmount));
|
||||||
|
|
||||||
|
list.add(OrderItemDto.builder()
|
||||||
|
.orderId(leaseOrderItem.getOrderId())
|
||||||
|
.productId(leaseOrderItem.getProductId())
|
||||||
|
.productMachineId(leaseOrderItem.getProductMachineId())
|
||||||
|
.leaseTime(leaseOrderItem.getLeaseTime())
|
||||||
|
.address(leaseOrderItem.getAddress())
|
||||||
|
.payCoin(leaseOrderItem.getPayCoin())
|
||||||
|
.name(leaseOrderItem.getName())
|
||||||
|
.image(leaseOrderItem.getImage())
|
||||||
|
.price(leaseOrderItem.getPrice())
|
||||||
|
.type(leaseOrderItem.getType() ? 1 : 0)
|
||||||
|
.numbers(leaseOrderItem.getNumbers())
|
||||||
|
.theoryPower(theoryPower)
|
||||||
|
.practicalPower(practicalPower)
|
||||||
|
.powerRatio(powerRatio)
|
||||||
|
.payAmount(alreadyPayRealAmount)
|
||||||
|
.build());
|
||||||
|
}
|
||||||
|
orderInfoDto.setPayCoin(list.get(0).getPayCoin());
|
||||||
|
orderInfoDto.setPowerRatio(orderInfoDto.getTotalPracticalPower()
|
||||||
|
.divide(orderInfoDto.getTotalTheoryPower(), 2, RoundingMode.HALF_UP));
|
||||||
|
orderInfoDto.setOrderItemDtoList(list);
|
||||||
|
|
||||||
return Result.success(orderInfoDto);
|
return Result.success(orderInfoDto);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -208,8 +208,8 @@ public class OrderAndPayTask {
|
|||||||
dto.getMiner() + "_" + dto.getCoin() + "_" + dto.getAlgorithm()
|
dto.getMiner() + "_" + dto.getCoin() + "_" + dto.getAlgorithm()
|
||||||
));
|
));
|
||||||
|
|
||||||
//订单id 与 实时算力 映射
|
//订单id 与 当天平均算力 映射
|
||||||
Map<Long, List<RealHashrateInfoDto>> orderIdToHashrateMap = new HashMap<>();
|
Map<Long, BigDecimal> orderIdToHashrateMap = new HashMap<>();
|
||||||
getOrderItemIdToHashrateMap(orderIdToHashrateMap,miningAnditemIdMap,groupedData);
|
getOrderItemIdToHashrateMap(orderIdToHashrateMap,miningAnditemIdMap,groupedData);
|
||||||
|
|
||||||
//根据实时算力波动情况 求得订单实际支付金额
|
//根据实时算力波动情况 求得订单实际支付金额
|
||||||
@@ -248,11 +248,14 @@ public class OrderAndPayTask {
|
|||||||
|
|
||||||
for (LeaseOrderItem item : items) {
|
for (LeaseOrderItem item : items) {
|
||||||
BigDecimal realAmount = orderItemToPriceMap.get(item.getId());
|
BigDecimal realAmount = orderItemToPriceMap.get(item.getId());
|
||||||
|
BigDecimal practicalPower = orderIdToHashrateMap.get(item.getId());
|
||||||
BigDecimal realPayAmount = realAmount== null ? BigDecimal.ZERO : realAmount;
|
BigDecimal realPayAmount = realAmount== null ? BigDecimal.ZERO : realAmount;
|
||||||
//已支付金额 和实际待支付金额
|
practicalPower = practicalPower == null ? BigDecimal.ZERO : practicalPower;
|
||||||
|
//已支付金额 + 实际待支付金额 + 实际平均算力
|
||||||
item.setAlreadyPayAmount(item.getAlreadyPayAmount().add(item.getPrice().multiply(BigDecimal.valueOf(item.getNumbers()))));
|
item.setAlreadyPayAmount(item.getAlreadyPayAmount().add(item.getPrice().multiply(BigDecimal.valueOf(item.getNumbers()))));
|
||||||
item.setSettlePayRealAmount(item.getSettlePayRealAmount().add(realPayAmount));
|
item.setSettlePayRealAmount(item.getSettlePayRealAmount().add(realPayAmount));
|
||||||
item.setAlreadyPayRealAmount(item.getAlreadyPayRealAmount().add(realPayAmount));
|
item.setPracticalPower(item.getPracticalPower().add(practicalPower)
|
||||||
|
.divide(BigDecimal.valueOf(2), 2, RoundingMode.HALF_UP));
|
||||||
//设置理论支付金额 和 冻结金额 额 (冻结金额 = 理论支付金额)
|
//设置理论支付金额 和 冻结金额 额 (冻结金额 = 理论支付金额)
|
||||||
build.setBlockAmount(build.getBlockAmount().add(item.getPrice().multiply(BigDecimal.valueOf(item.getNumbers()))));
|
build.setBlockAmount(build.getBlockAmount().add(item.getPrice().multiply(BigDecimal.valueOf(item.getNumbers()))));
|
||||||
build.setAmount(build.getAmount().add(item.getPrice().multiply(BigDecimal.valueOf(item.getNumbers()))));
|
build.setAmount(build.getAmount().add(item.getPrice().multiply(BigDecimal.valueOf(item.getNumbers()))));
|
||||||
@@ -357,37 +360,22 @@ public class OrderAndPayTask {
|
|||||||
* @param orderIdToPriceMap 订单id 与价格映射
|
* @param orderIdToPriceMap 订单id 与价格映射
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public Map<Long,BigDecimal> orderPaymentWaveAlgorithm(Map<Long, List<RealHashrateInfoDto>> orderIdToHashrateMap, Map<Long, LeaseOrderItem> orderIdToPriceMap){
|
public Map<Long,BigDecimal> orderPaymentWaveAlgorithm(Map<Long, BigDecimal> orderIdToHashrateMap, Map<Long, LeaseOrderItem> orderIdToPriceMap){
|
||||||
|
|
||||||
Map<Long,BigDecimal> orderItemIdToWaveMap = new HashMap<>();
|
Map<Long,BigDecimal> orderItemIdToWaveMap = new HashMap<>();
|
||||||
|
|
||||||
orderIdToHashrateMap.forEach((orderItemId, realPowerList) -> {
|
orderIdToHashrateMap.forEach((orderItemId, realPower) -> {
|
||||||
|
|
||||||
LeaseOrderItem itemInfo = orderIdToPriceMap.get(orderItemId);
|
LeaseOrderItem itemInfo = orderIdToPriceMap.get(orderItemId);
|
||||||
|
|
||||||
|
//计算实际算力和理论算力的比值
|
||||||
// 计算每个数据点 理论算力的比值
|
BigDecimal ratio = realPower.divide(itemInfo.getTheoryPower(), 4, RoundingMode.HALF_UP);
|
||||||
List<BigDecimal> ratios = realPowerList.stream()
|
|
||||||
.map(dto -> dto.getPower()
|
|
||||||
.divide(itemInfo.getTheoryPower(), 4, RoundingMode.HALF_UP))
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
|
|
||||||
// 补零到48个数据点
|
|
||||||
while (ratios.size() < dataPoints) {
|
|
||||||
ratios.add(BigDecimal.ZERO);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 计算总和并除以48
|
|
||||||
BigDecimal finalValue = ratios.stream()
|
|
||||||
.reduce(BigDecimal.ZERO, BigDecimal::add)
|
|
||||||
.divide(BigDecimal.valueOf(dataPoints), 2, RoundingMode.HALF_UP);
|
|
||||||
|
|
||||||
|
|
||||||
BigDecimal payAmount = itemInfo.getPrice()
|
BigDecimal payAmount = itemInfo.getPrice()
|
||||||
.multiply(BigDecimal.valueOf(itemInfo.getNumbers()));
|
.multiply(BigDecimal.valueOf(itemInfo.getNumbers()));
|
||||||
|
|
||||||
if (finalValue.compareTo(BigDecimal.valueOf(0.95)) <= 0){
|
if (ratio.compareTo(BigDecimal.valueOf(0.95)) <= 0){
|
||||||
payAmount = payAmount.multiply(finalValue);
|
payAmount = payAmount.multiply(ratio);
|
||||||
}
|
}
|
||||||
orderItemIdToWaveMap.put(orderItemId, payAmount);
|
orderItemIdToWaveMap.put(orderItemId, payAmount);
|
||||||
});
|
});
|
||||||
@@ -397,16 +385,22 @@ public class OrderAndPayTask {
|
|||||||
/**
|
/**
|
||||||
* 获取订单项id 与实时算力映射
|
* 获取订单项id 与实时算力映射
|
||||||
**/
|
**/
|
||||||
public void getOrderItemIdToHashrateMap(Map<Long, List<RealHashrateInfoDto>> orderIdToHashrateMap,Map<String, PurchasedMachineListDto> miningAnditemIdMap,Map<String, List<RealHashrateInfoDto>> groupedData){
|
public void getOrderItemIdToHashrateMap(Map<Long, BigDecimal> orderIdToHashrateMap,Map<String, PurchasedMachineListDto> miningAnditemIdMap,Map<String, List<RealHashrateInfoDto>> groupedData){
|
||||||
for (Map.Entry<String, List<RealHashrateInfoDto>> entry : groupedData.entrySet()) {
|
for (Map.Entry<String, List<RealHashrateInfoDto>> entry : groupedData.entrySet()) {
|
||||||
String key = entry.getKey();
|
String key = entry.getKey();
|
||||||
List<RealHashrateInfoDto> hashrateList = entry.getValue();
|
List<RealHashrateInfoDto> hashrateList = entry.getValue();
|
||||||
|
|
||||||
// 从第一个映射中获取对应的订单信息
|
// 从第一个映射中获取对应的订单信息
|
||||||
PurchasedMachineListDto orderInfo = miningAnditemIdMap.get(key);
|
PurchasedMachineListDto orderInfo = miningAnditemIdMap.get(key);
|
||||||
|
|
||||||
|
//计算平均算力
|
||||||
if (orderInfo != null) {
|
if (orderInfo != null) {
|
||||||
// 将订单ID与实时算力关联起来
|
BigDecimal totalPracticalPower = BigDecimal.ZERO;
|
||||||
orderIdToHashrateMap.put(orderInfo.getOrderItemId(), hashrateList);
|
for (RealHashrateInfoDto realHashrateInfoDto : hashrateList) {
|
||||||
|
totalPracticalPower = totalPracticalPower.add(realHashrateInfoDto.getPower());
|
||||||
|
}
|
||||||
|
totalPracticalPower = totalPracticalPower.divide(BigDecimal.valueOf(dataPoints), 4, RoundingMode.HALF_UP);
|
||||||
|
orderIdToHashrateMap.put(orderInfo.getOrderItemId(), totalPracticalPower);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user