update 订单详情接口新增理论算力,理论算力和实际算力的比值,实际支付金额
This commit is contained in:
@@ -208,8 +208,8 @@ public class OrderAndPayTask {
|
||||
dto.getMiner() + "_" + dto.getCoin() + "_" + dto.getAlgorithm()
|
||||
));
|
||||
|
||||
//订单id 与 实时算力 映射
|
||||
Map<Long, List<RealHashrateInfoDto>> orderIdToHashrateMap = new HashMap<>();
|
||||
//订单id 与 当天平均算力 映射
|
||||
Map<Long, BigDecimal> orderIdToHashrateMap = new HashMap<>();
|
||||
getOrderItemIdToHashrateMap(orderIdToHashrateMap,miningAnditemIdMap,groupedData);
|
||||
|
||||
//根据实时算力波动情况 求得订单实际支付金额
|
||||
@@ -248,11 +248,14 @@ public class OrderAndPayTask {
|
||||
|
||||
for (LeaseOrderItem item : items) {
|
||||
BigDecimal realAmount = orderItemToPriceMap.get(item.getId());
|
||||
BigDecimal practicalPower = orderIdToHashrateMap.get(item.getId());
|
||||
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.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.setAmount(build.getAmount().add(item.getPrice().multiply(BigDecimal.valueOf(item.getNumbers()))));
|
||||
@@ -357,37 +360,22 @@ public class OrderAndPayTask {
|
||||
* @param orderIdToPriceMap 订单id 与价格映射
|
||||
* @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<>();
|
||||
|
||||
orderIdToHashrateMap.forEach((orderItemId, realPowerList) -> {
|
||||
orderIdToHashrateMap.forEach((orderItemId, realPower) -> {
|
||||
|
||||
LeaseOrderItem itemInfo = orderIdToPriceMap.get(orderItemId);
|
||||
|
||||
|
||||
// 计算每个数据点 理论算力的比值
|
||||
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 ratio = realPower.divide(itemInfo.getTheoryPower(), 4, RoundingMode.HALF_UP);
|
||||
|
||||
BigDecimal payAmount = itemInfo.getPrice()
|
||||
.multiply(BigDecimal.valueOf(itemInfo.getNumbers()));
|
||||
|
||||
if (finalValue.compareTo(BigDecimal.valueOf(0.95)) <= 0){
|
||||
payAmount = payAmount.multiply(finalValue);
|
||||
if (ratio.compareTo(BigDecimal.valueOf(0.95)) <= 0){
|
||||
payAmount = payAmount.multiply(ratio);
|
||||
}
|
||||
orderItemIdToWaveMap.put(orderItemId, payAmount);
|
||||
});
|
||||
@@ -397,16 +385,22 @@ public class OrderAndPayTask {
|
||||
/**
|
||||
* 获取订单项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()) {
|
||||
String key = entry.getKey();
|
||||
List<RealHashrateInfoDto> hashrateList = entry.getValue();
|
||||
|
||||
// 从第一个映射中获取对应的订单信息
|
||||
PurchasedMachineListDto orderInfo = miningAnditemIdMap.get(key);
|
||||
|
||||
//计算平均算力
|
||||
if (orderInfo != null) {
|
||||
// 将订单ID与实时算力关联起来
|
||||
orderIdToHashrateMap.put(orderInfo.getOrderItemId(), hashrateList);
|
||||
BigDecimal totalPracticalPower = BigDecimal.ZERO;
|
||||
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