diff --git a/src/main/java/com/m2pool/lease/task/OrderAndPayTask.java b/src/main/java/com/m2pool/lease/task/OrderAndPayTask.java index 6eb985e..7e235a5 100644 --- a/src/main/java/com/m2pool/lease/task/OrderAndPayTask.java +++ b/src/main/java/com/m2pool/lease/task/OrderAndPayTask.java @@ -219,33 +219,9 @@ public class OrderAndPayTask { Map> userMapItem = needPayInfos.stream() .collect(Collectors.groupingBy(LeaseOrderItem::getOrderId)); - List recordMessageInfoList = new ArrayList<>(); List saleIngList = new ArrayList<>(); // 按照订单分组 userMapItem.forEach((orderId, items) -> { - LeaseOrderItem leaseOrderItem = items.get(0); - //因为同一个订单的queueId相同,所以这里直接使用订单id - LeaseOrderInfo orderInfo = queueIdMap.get(orderId); - //买方信息 - LeasePayRecordMessageInfo build = LeasePayRecordMessageInfo.builder() - .orderId(String.valueOf(orderId)) - .orderNumber(orderInfo.getOrderNumber()) - .queueId(orderInfo.getOrderNumber()) - .fromAddress(leaseOrderItem.getFromAddress()) - .toAddress(leaseOrderItem.getAddress()) - .amount(BigDecimal.ZERO) - .realAmount(BigDecimal.ZERO) - .needAmount(BigDecimal.ZERO) - .blockAmount(BigDecimal.ZERO) - .fromChain(leaseOrderItem.getChain()) - .fromSymbol(leaseOrderItem.getSymbol()) - .shopId(leaseOrderItem.getShopId()) - .userId(leaseOrderItem.getUserId()) - .toChain(leaseOrderItem.getChain()) - .toSymbol(leaseOrderItem.getSymbol()) - .authId(orderInfo.getAuthId()) - .build(); - for (LeaseOrderItem item : items) { BigDecimal realAmount = orderItemToPriceMap.get(item.getId()); BigDecimal practicalPower = orderIdToHashrateMap.get(item.getId()); @@ -256,24 +232,12 @@ public class OrderAndPayTask { item.setSettlePayRealAmount(item.getSettlePayRealAmount().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())))); - // 实际支付金额 + 理论实际应支付金额 - build.setRealAmount(build.getRealAmount().add(realPayAmount)); - build.setNeedAmount(build.getNeedAmount().add(realPayAmount)); saleIngList.add(item); } - //实际支付金额即使为0也要记录 - recordMessageInfoList.add(build); }); //修改订单支付金额等相关信息 leaseOrderItemService.updateBatchById(saleIngList); - //保存支付信息到支付记录表中 - if (!recordMessageInfoList.isEmpty()){ - leasePayRecordMessageInfoService.saveBatch(recordMessageInfoList); - } } //2.处理完成的订单 (订单部分完成) if(!itemCompleteIds.isEmpty()){ @@ -796,92 +760,84 @@ public class OrderAndPayTask { * @param orderIds */ public void sendMessageToMq(List orderIds){ - List leasePayRecordMessages = leasePayRecordMessageInfoService.list(new LambdaQueryWrapper() - .in(LeasePayRecordMessageInfo::getOrderId, orderIds)); + //从订单详情表查询所有订单项 + List leaseOrderItems = leaseOrderItemMapper.selectList(new LambdaQueryWrapper() + .in(LeaseOrderItem::getOrderId, orderIds)); - // 合并后的处理 - Map> infoMap = new HashMap<>(); - Set shopIds = new HashSet<>(); - for (LeasePayRecordMessageInfo message : leasePayRecordMessages) { - // 处理分组逻辑 - infoMap.computeIfAbsent(message.getOrderId(), k -> new ArrayList<>()).add(message); - // 收集shopId - shopIds.add(message.getShopId()); + System.out.println("yyb-订单原始信息:"+JSONUtil.toJsonPrettyStr(leaseOrderItems)); + if (leaseOrderItems.isEmpty()){ + return; } + + //按订单ID分组 + Map> orderItemMap = leaseOrderItems.stream() + .collect(Collectors.groupingBy(LeaseOrderItem::getOrderId)); + + //获取订单信息 + List leaseOrderInfos = leaseOrderInfoMapper.selectList(new LambdaQueryWrapper() + .in(LeaseOrderInfo::getId, orderIds)); + Map orderInfoMap = leaseOrderInfos.stream() + .collect(Collectors.toMap(LeaseOrderInfo::getId, Function.identity())); + + //收集shopId + Set shopIds = leaseOrderItems.stream().map(LeaseOrderItem::getShopId).collect(Collectors.toSet()); //获取卖家邮箱和用户id信息 List leaseShops = leaseShopMapper.selectBatchIds(shopIds); Map sellerInfoMap = leaseShops.stream().collect(Collectors.toMap(LeaseShop::getId, Function.identity())); List reocrdList = new ArrayList<>(); //遍历按订单id分组后的map - infoMap.forEach((orderId, payRecordMessagesList) -> { - LeasePayRecordMessageInfo initForm = payRecordMessagesList.get(0); - //long timestamp = System.currentTimeMillis()/1000; - //RabbitmqPayAutoMessage build = RabbitmqPayAutoMessage.builder() - // .queue_id(initForm.getQueueId()) - // .chain(initForm.getFromChain()) - // .symbol(initForm.getFromSymbol()) - // .from_address(initForm.getFromAddress()) - // .to_address(initForm.getToAddress()) - // .fee(feeMap.get(orderId)) - // .amount(BigDecimal.ZERO) - // .blockAmount(BigDecimal.ZERO) - // .needAmount(BigDecimal.ZERO) - // .timestamp(timestamp) - // .sign(HashUtils.sha256(timestamp)) - // .build(); - LeaseShop leaseShop = sellerInfoMap.get(initForm.getShopId()); + orderItemMap.forEach((orderId, orderItemList) -> { + LeaseOrderItem firstItem = orderItemList.get(0); + LeaseOrderInfo orderInfo = orderInfoMap.get(orderId); + LeaseShop leaseShop = sellerInfoMap.get(firstItem.getShopId()); + + //计算该订单的总支付金额 + BigDecimal totalAmount = BigDecimal.ZERO; + BigDecimal totalBlockAmount = BigDecimal.ZERO; + BigDecimal totalRealAmount = BigDecimal.ZERO; + BigDecimal totalNeedAmount = BigDecimal.ZERO; + + for (LeaseOrderItem item : orderItemList) { + //理论支付金额 = 单价 * 数量 * 租期天数 + BigDecimal itemAmount = item.getPrice().multiply(BigDecimal.valueOf(item.getNumbers())) + .multiply(BigDecimal.valueOf(item.getLeaseTime())); + totalAmount = totalAmount.add(itemAmount); + totalBlockAmount = totalBlockAmount.add(itemAmount); + //实际支付金额 = 累积的实际支付金额 + totalRealAmount = totalRealAmount.add(item.getSettlePayRealAmount()); + totalNeedAmount = totalNeedAmount.add(item.getSettlePayRealAmount()); + } + LeasePayRecordMessage build = LeasePayRecordMessage.builder() - .queueId(initForm.getQueueId()) - .fromAddress(initForm.getFromAddress()) - .toAddress(initForm.getToAddress()) - .orderNumber(initForm.getOrderNumber()) - .orderId(orderId) - .shopId(initForm.getShopId()) - .userId(initForm.getUserId()) - .authId(initForm.getAuthId()) - .blockAmount(BigDecimal.ZERO) - .amount(BigDecimal.ZERO) - .realAmount(BigDecimal.ZERO) - .needAmount(BigDecimal.ZERO) - .fromSymbol(initForm.getFromSymbol()) - .fromChain(initForm.getFromChain()) - .toSymbol(initForm.getToSymbol()) - .toChain(initForm.getToChain()) + .queueId(orderInfo.getOrderNumber()) + .fromAddress(firstItem.getFromAddress()) + .toAddress(firstItem.getAddress()) + .orderNumber(orderInfo.getOrderNumber()) + .orderId(String.valueOf(orderId)) + .shopId(firstItem.getShopId()) + .userId(firstItem.getUserId()) + .authId(orderInfo.getAuthId()) + .blockAmount(totalBlockAmount) + .amount(totalAmount) + .realAmount(totalRealAmount) + .needAmount(totalNeedAmount) + .fromSymbol(firstItem.getFromSymbol()) + .fromChain(firstItem.getFromChain()) + .toSymbol(firstItem.getSymbol()) + .toChain(firstItem.getChain()) .sellerId(leaseShop.getAuthId()) .status(1) .sellerEmail(leaseShop.getUserEmail()) .build(); - for (LeasePayRecordMessageInfo leasePayRecordMessage : payRecordMessagesList) { - build.setAmount(build.getAmount().add(leasePayRecordMessage.getAmount())); - build.setBlockAmount(build.getBlockAmount().add(leasePayRecordMessage.getBlockAmount())); - //现在可以删除NeedAmount这个字段了.新版本不存在需支付真实金额和实际支付真实金额不同的情况 - build.setNeedAmount(build.getNeedAmount().add(leasePayRecordMessage.getNeedAmount())); - build.setRealAmount(build.getRealAmount().add(leasePayRecordMessage.getRealAmount())); - } + reocrdList.add(build); - - - //旧版本 - //订单全部完成后不再需要发送支付信息,直接从买家钱包转账到卖家钱包 - //try { - // rabbitTemplate.convertAndSend(PAY_AUTO_QUEUE, build); - //}catch (Exception e){ - // //设置状态为消息发送失败 - // build1.setStatus(4); - // System.out.println("消息发送失败"+e.getMessage()); - //}finally { - // reocrdList.add(build1); - //} - - //新版本:买家钱包 冻结余额和余额减少 卖家钱包余额增加 - - }); leasePayRecordMessageService.saveBatch(reocrdList); - + System.out.println("yyb-订单信息合并前"+JSONUtil.toJsonPrettyStr(reocrdList)); // 合并修改条件相同数据 List mergedRecordList = mergePayRecordMessages(reocrdList); + System.out.println("yyb-订单信息合并后"+JSONUtil.toJsonPrettyStr(mergedRecordList)); //订单详情结算待结算金额 leaseOrderItemMapper.updateSettleAmount(mergedRecordList); int buyerUpdate = leaseUserWalletDataMapper.updateBalanceAndBlockBalance(mergedRecordList);