update 订单详情完成后,待结算金额,未扣除,已支付金额未增加问题修复

This commit is contained in:
yyb
2026-01-20 17:08:55 +08:00
parent d8d8a3da15
commit 6681a33940
3 changed files with 68 additions and 30 deletions

View File

@@ -419,7 +419,7 @@ public class MessageReceiver {
.id(leasePayWithdrawMessage.getId())
.amount(payWithdrawReturnMessage.getAmount().add(payWithdrawReturnMessage.getFee()))
.status(payWithdrawReturnMessage.getStatus())
.blockHeight(payWithdrawReturnMessage.getBlock_height())
.blockHeight(payWithdrawReturnMessage.getBlock_height() != null ? payWithdrawReturnMessage.getBlock_height() : 0)
.txHash(payWithdrawReturnMessage.getTx_hash())
.build());
}

View File

@@ -56,6 +56,9 @@ public class ServerChannelHandler extends SimpleChannelInboundHandler<ClientMess
@Resource
private LeaseOrderItemMapper leaseOrderItemMapper;
@Resource
private LeaseOrderInfoMapper leaseOrderInfoMapper;
@Resource
private LeaseOrderMiningMapper leaseOrderMiningMapper;
@@ -76,6 +79,7 @@ public class ServerChannelHandler extends SimpleChannelInboundHandler<ClientMess
System.out.println("Netty tcp 服务端收到客户端开始挖矿信息");
handlerClientMiningMessage(ctx,msg);
}else{
//客户端心跳pong 或其它未知消息
System.out.println("未知消息方法");
}
}
@@ -201,7 +205,7 @@ public class ServerChannelHandler extends SimpleChannelInboundHandler<ClientMess
LocalDateTime effectTime = leaseOrderItem.getCreateTime().plusDays(leaseOrderItem.getLeaseTime());
needUpdateInfo.forEach(item-> item.setEffectTime(effectTime));
List<MachineConfigDto> realMachineList = needCheckInfo.get(false);
List<MachineConfigDto> tempMachineList = needCheckInfo.get(true);
List<MachineConfigDto> tempMachineList = needCheckInfo.get(true) != null ? needCheckInfo.get(true) : new ArrayList<>();
boolean realCheck = compare(needUpdateInfo, realMachineList);
//主表信息和本次客户端发送消息不相同 + 并且临时表没有信息
if(!realCheck && tempMachineList.isEmpty()){
@@ -209,20 +213,24 @@ public class ServerChannelHandler extends SimpleChannelInboundHandler<ClientMess
leaseMachineTempConfigMapper.insertBatch(needUpdateInfo);
return;
}
boolean tempCheck = compare(needUpdateInfo, tempMachineList);
if (!realCheck && !tempCheck){
//删除临时表数据 + 新增临时表数据
leaseMachineTempConfigMapper.delete(new LambdaQueryWrapper<LeaseMachineTempConfig>()
.eq(LeaseMachineTempConfig::getMachineId, machineId));
leaseMachineTempConfigMapper.insertBatch(needUpdateInfo);
return;
}
//ABA
if (realCheck && !tempCheck){
//删除临时表数据
leaseMachineTempConfigMapper.delete(new LambdaQueryWrapper<LeaseMachineTempConfig>()
.eq(LeaseMachineTempConfig::getMachineId, machineId));
if (!tempMachineList.isEmpty()){
boolean tempCheck = compare(needUpdateInfo, tempMachineList);
if (!realCheck && !tempCheck){
//删除临时表数据 + 新增临时表数据
leaseMachineTempConfigMapper.delete(new LambdaQueryWrapper<LeaseMachineTempConfig>()
.eq(LeaseMachineTempConfig::getMachineId, machineId));
leaseMachineTempConfigMapper.insertBatch(needUpdateInfo);
return;
}
//ABA
if (realCheck && !tempCheck){
//删除临时表数据
leaseMachineTempConfigMapper.delete(new LambdaQueryWrapper<LeaseMachineTempConfig>()
.eq(LeaseMachineTempConfig::getMachineId, machineId));
}
}
}else{
//删除主表信息 + 新增主表数据
leaseMachineConfigService.remove(new LambdaUpdateWrapper<LeaseMachineConfig>()
@@ -283,9 +291,34 @@ public class ServerChannelHandler extends SimpleChannelInboundHandler<ClientMess
if (checkMessage(ctx,msg.getId())){
String[] split = msg.getId().split("::");
Object params = msg.getParams();
ClientConfigurationMining clientConfigurationMining = JSONUtil.toBean(params.toString(), ClientConfigurationMining.class);
//修改 当前邮箱账户 对应的该矿池的 一些基本信息 TODO 这里可以设置真实开始时间 和 状态改为1
leaseOrderMiningMapper.updateOrderMining(split[0],clientConfigurationMining);
ClientConfigurationMining clientConfigurationMining = null;
try {
clientConfigurationMining = JSONUtil.toBean(params.toString(), ClientConfigurationMining.class);
//修改 当前邮箱账户 对应的该矿池的 一些基本信息 TODO 这里可以设置真实开始时间 和 状态改为1
leaseOrderMiningMapper.updateOrderMining(split[0],clientConfigurationMining);
} catch (Exception e) {
System.out.println("错误信息"+e.getMessage());
System.err.println("params 内容: " + params);
//订单失败
//1.获取到订单id 和订单详情id
LeaseOrderMining leaseOrderMining = leaseOrderMiningMapper.selectOne(new LambdaQueryWrapper<LeaseOrderMining>()
.select(LeaseOrderMining::getOrderId,LeaseOrderMining::getOrderItemId)
.eq(LeaseOrderMining::getWalletAddress, clientConfigurationMining.getWallet_address())
.eq(LeaseOrderMining::getWorkerId, clientConfigurationMining.getWorker_id())
);
//1.1订单主表状态改为11矿池连接失败,订单已取消 和详情表 状态改为0 租约过期
leaseOrderItemMapper.updateById(LeaseOrderItem.builder()
.id(leaseOrderMining.getOrderId())
.status(0)
.build());
leaseOrderInfoMapper.updateById(LeaseOrderInfo.builder()
.id(leaseOrderMining.getOrderId())
.status(11)
.build());
//TODO 1.2修改买家和卖家钱包余额
}
}
}

View File

@@ -140,8 +140,8 @@ public class OrderAndPayTask {
}
@Scheduled(cron = "0 0/30 * * * ? ")
//@Scheduled(cron = "0 40 2 * * ? ")
@Scheduled(cron = "0 0/1 * * * ? ")
//@Scheduled(cron = "0 0/30 * * * ? ")
@Async("scheduledTaskExecutor")
@DSTransactional
public void paymentTaskV2(){
@@ -252,6 +252,7 @@ public class OrderAndPayTask {
//已支付金额 和实际待支付金额
item.setAlreadyPayAmount(item.getAlreadyPayAmount().add(item.getPrice().multiply(BigDecimal.valueOf(item.getNumbers()))));
item.setSettlePayRealAmount(item.getSettlePayRealAmount().add(realPayAmount));
item.setAlreadyPayRealAmount(item.getAlreadyPayRealAmount().add(realPayAmount));
//设置理论支付金额 和 冻结金额 额 (冻结金额 = 理论支付金额)
build.setBlockAmount(build.getBlockAmount().add(item.getPrice().multiply(BigDecimal.valueOf(item.getNumbers()))));
build.setAmount(build.getAmount().add(item.getPrice().multiply(BigDecimal.valueOf(item.getNumbers()))));
@@ -302,10 +303,10 @@ public class OrderAndPayTask {
for (LeaseOrderItem orderTimeInfoDto : oneDayApartOrder) {
orderCompleteMap.putIfAbsent(orderTimeInfoDto.getOrderId(), true);
// 计算订单结束时间startTime + leaseTime天
LocalDateTime endTime = orderTimeInfoDto.getCreateTime().plusDays(orderTimeInfoDto.getLeaseTime());
//LocalDateTime endTime = orderTimeInfoDto.getCreateTime().plusDays(orderTimeInfoDto.getLeaseTime());
// 开发环境 测试用1分钟当一天 差值改为差1分钟
//LocalDateTime endTime = orderTimeInfoDto.getCreateTime().plusMinutes(orderTimeInfoDto.getLeaseTime());
LocalDateTime endTime = orderTimeInfoDto.getCreateTime().plusMinutes(orderTimeInfoDto.getLeaseTime() * 30);
// 获取订单完成的订单详情:比较 now 和 endTime 的年月日时分秒差值是否小于30分
long minuteTime = Duration.between(now, endTime).toMinutes();
if (minuteTime <= 0) {
@@ -326,14 +327,16 @@ public class OrderAndPayTask {
LocalDate nowDate = now.toLocalDate();
LocalDate startDate = orderTimeInfoDto.getCreateTime().toLocalDate();
long minuteDate = Duration.between(startTime, nowTime).toMinutes();
if (!nowDate.equals(startDate) && minuteDate <= 30 && minuteDate >= 0) {
//if (!nowDate.equals(startDate) && minuteDate <= 30 && minuteDate >= 0) {
// needPayIds.add(orderTimeInfoDto.getId());
// needPayInfos.add(orderTimeInfoDto);
//}
//开发环境
if ( minuteDate >= 30) {
needPayIds.add(orderTimeInfoDto.getId());
needPayInfos.add(orderTimeInfoDto);
}
//开发环境
// needPayIds.add(orderTimeInfoDto.getId());
// needPayInfos.add(orderTimeInfoDto);
//记录某个订单下所有子项目是否都完成
orderCompleteMap.put(orderTimeInfoDto.getOrderId(), false);
}
@@ -346,6 +349,7 @@ public class OrderAndPayTask {
);
}
private static Integer dataPoints = 6;
/**
* 获取各orderItemId 所需支付的金额
@@ -369,19 +373,19 @@ public class OrderAndPayTask {
.collect(Collectors.toList());
// 补零到48个数据点
while (ratios.size() < 48) {
while (ratios.size() < dataPoints) {
ratios.add(BigDecimal.ZERO);
}
// 计算总和并除以48
BigDecimal finalValue = ratios.stream()
.reduce(BigDecimal.ZERO, BigDecimal::add)
.divide(BigDecimal.valueOf(48), 2, RoundingMode.HALF_UP);
.divide(BigDecimal.valueOf(dataPoints), 2, RoundingMode.HALF_UP);
BigDecimal payAmount = itemInfo.getPrice()
.multiply(BigDecimal.valueOf(itemInfo.getNumbers()));
if (finalValue.compareTo(BigDecimal.valueOf(0.95)) <= 0){
payAmount = payAmount.multiply(finalValue);
}
@@ -888,9 +892,10 @@ public class OrderAndPayTask {
// 合并相同查询条件的记录,避免 SQL CASE WHEN 只执行第一条的问题
List<LeasePayRecordMessage> mergedRecordList = mergePayRecordMessages(reocrdList);
//订单详情结算待结算金额
leaseOrderItemMapper.updateSettleAmount(mergedRecordList);
int buyerUpdate = leaseUserWalletDataMapper.updateBalanceAndBlockBalance(mergedRecordList);
int sellerUpdate = leaseShopConfigMapper.updateBalance(mergedRecordList);
if (buyerUpdate > 0 || sellerUpdate > 0){
for (LeasePayRecordMessage item : reocrdList) {
recordLog(item);