update 修复生成订单,钱包未校验问题

This commit is contained in:
yyb
2026-01-12 14:50:13 +08:00
parent 267c79152c
commit e88ee6357b
5 changed files with 96 additions and 42 deletions

View File

@@ -99,13 +99,12 @@ public interface LeaseMachineMapper extends BaseMapper<LeaseMachine> {
*/ */
int updateLockState(@Param("list") List<LeaseMachine> asicMachines); int updateLockState(@Param("list") List<LeaseMachine> asicMachines);
/** /**
* 修改asic 矿机售出数量 * 修改asic 矿机售出数量
* @param gpuMachines * @param list
* @return * @return
*/ */
int updateLockNumbers(@Param("list") List<LeaseMachine> gpuMachines); boolean updateBatchLockNumbers(@Param("list") List<LeaseMachine> list);

View File

@@ -905,8 +905,11 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl<LeaseOrderInfoMapper,
} }
//修改ASIC 矿机出售数量 //修改ASIC 矿机出售数量
if (!asicMachines.isEmpty()){ if (!asicMachines.isEmpty()){
int asicUpdate = leaseMachineMapper.updateLockNumbers(asicMachines); // 合并相同 id 的机器,避免 SQL CASE WHEN 只执行第一条的问题
i += asicUpdate; List<LeaseMachine> mergedAsicMachines = mergeMachines(asicMachines);
System.out.println("打印"+JSONUtil.toJsonPrettyStr(mergedAsicMachines));
leaseMachineMapper.updateBatchLockNumbers(mergedAsicMachines);
i += asicMachines.size();
} }
if (i != machineIds.size()){ if (i != machineIds.size()){
throw new OrderException("订单中已有商品售出,请刷新购物车删除已售出商品,重新结算生成订单"); throw new OrderException("订单中已有商品售出,请刷新购物车删除已售出商品,重新结算生成订单");
@@ -915,8 +918,11 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl<LeaseOrderInfoMapper,
//if(!checkGpuMachine(gpuMachines)){ //if(!checkGpuMachine(gpuMachines)){
// throw new OrderException("购买的GPU商品中,存在客户端不在线的矿机!"); // throw new OrderException("购买的GPU商品中,存在客户端不在线的矿机!");
//} //}
//发送消息 //gpu矿机处理 发送消息
sendMessageToClientAndInsertPurchasedMachine(SecurityUtils.getUserId(),userEmail,gpuMachines,orderMiningInfoDtoList,endMiningMap,machineOrderIdMap,machineOrderItemIdMap); sendMessageToClientAndInsertPurchasedMachine(SecurityUtils.getUserId(),userEmail,gpuMachines,orderMiningInfoDtoList,endMiningMap,machineOrderIdMap,machineOrderItemIdMap);
//TODO asic 矿机处理
return Result.success("订单生成成功"); return Result.success("订单生成成功");
} }
@@ -971,7 +977,7 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl<LeaseOrderInfoMapper,
StringBuilder errors = new StringBuilder(); StringBuilder errors = new StringBuilder();
String addressVerify = ""; String addressVerify = "";
List<OrderMiningInfoDto> addressInfos = new ArrayList();
if(!orderMiningInfoDtos.isEmpty()){ if(!orderMiningInfoDtos.isEmpty()){
Map<String, List<OrderMiningInfoDto>> collect = orderMiningInfoDtos.stream().collect(Collectors.groupingBy(OrderMiningInfoDto::getWalletAddress)); Map<String, List<OrderMiningInfoDto>> collect = orderMiningInfoDtos.stream().collect(Collectors.groupingBy(OrderMiningInfoDto::getWalletAddress));
collect.forEach((address,list)->{ collect.forEach((address,list)->{
@@ -980,14 +986,13 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl<LeaseOrderInfoMapper,
errors.append(orderMiningInfoDto.getWorkerId()).append(" "); errors.append(orderMiningInfoDto.getWorkerId()).append(" ");
} }
errors.append("请重新输入矿工号\n"); errors.append("请重新输入矿工号\n");
addressInfos.add(list.get(0));
}); });
} }
if (StringUtils.isNotEmpty(errors.toString())){ if (StringUtils.isNotEmpty(errors.toString())){
return errors.toString(); return errors.toString();
} }
for (OrderMiningInfoDto addressInfo : addressInfos) { for (OrderMiningInfoDto addressInfo : orderMiningInfoDtoList) {
if (!WalletRuleCheckUtils.checkAddress(addressInfo.getCoin(),addressInfo.getWalletAddress())){ if (!WalletRuleCheckUtils.checkAddress(addressInfo.getCoin(),addressInfo.getWalletAddress())){
addressVerify = addressInfo.getWalletAddress() + "钱包地址格式错误"; addressVerify = addressInfo.getWalletAddress() + "钱包地址格式错误";
break; break;
@@ -1122,4 +1127,35 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl<LeaseOrderInfoMapper,
info.setPurchasedMachines(list); info.setPurchasedMachines(list);
return Result.success(info); return Result.success(info);
} }
/**
* 合并相同 id 的机器,避免 SQL CASE WHEN 只执行第一条的问题
* @param machines 机器列表
* @return 合并后的机器列表
*/
private List<LeaseMachine> mergeMachines(List<LeaseMachine> machines) {
if (machines == null || machines.isEmpty()) {
return new ArrayList<>();
}
return new ArrayList<>(machines.stream()
.collect(Collectors.groupingBy(
LeaseMachine::getId,
Collectors.collectingAndThen(
Collectors.toList(),
list -> {
LeaseMachine merged = list.get(0);
Integer totalSaleOutNumbers = list.stream()
.mapToInt(m -> m.getSaleOutNumbers() != null ? m.getSaleOutNumbers() : 0)
.sum();
Integer totalCanSaleNumbers = list.stream()
.mapToInt(m -> m.getCanSaleNumbers() != null ? m.getCanSaleNumbers() : 0)
.sum();
merged.setSaleOutNumbers(totalSaleOutNumbers);
merged.setCanSaleNumbers(totalCanSaleNumbers);
return merged;
}
)
))
.values());
}
} }

View File

@@ -769,26 +769,28 @@ public class OrderAndPayTask {
.chain(LeaseOrderItem.getChain()).build()) .chain(LeaseOrderItem.getChain()).build())
.distinct() .distinct()
.collect(Collectors.toList()); .collect(Collectors.toList());
//查询到对应商铺对应的 chain 然后比较上面的链对应的地址是否改变
List<ShopConfigDelDto> shopConfigList = leaseShopConfigMapper.selectShopConfigByShopIdAndSymbolAndChain(collect);
List<LeaseOrderItem> updateOrderItemList = new ArrayList<>(); List<LeaseOrderItem> updateOrderItemList = new ArrayList<>();
// 遍历 orderItemList if (!collect.isEmpty()){
for (LeaseOrderItem orderItem : orderItemList) { //查询到对应商铺对应的 chain 然后比较上面的链对应的地址是否改变
for (ShopConfigDelDto shopConfig : shopConfigList) { List<ShopConfigDelDto> shopConfigList = leaseShopConfigMapper.selectShopConfigByShopIdAndSymbolAndChain(collect);
// 检查 chain 和 shopId 是否相同 // 遍历 orderItemList
if (orderItem.getShopId().equals(shopConfig.getShopId()) && for (LeaseOrderItem orderItem : orderItemList) {
orderItem.getChain().equals(shopConfig.getChain())) { for (ShopConfigDelDto shopConfig : shopConfigList) {
// 检查 address 是否 // 检查 chain 和 shopId 是否
if (!orderItem.getAddress().equals(shopConfig.getPayAddress())) { if (orderItem.getShopId().equals(shopConfig.getShopId()) &&
// 更新 orderItem 的 address orderItem.getChain().equals(shopConfig.getChain())) {
orderItem.setAddress(shopConfig.getPayAddress()); // 检查 address 是否不同
updateOrderItemList.add(orderItem); if (!orderItem.getAddress().equals(shopConfig.getPayAddress())) {
// 更新 orderItem 的 address
orderItem.setAddress(shopConfig.getPayAddress());
updateOrderItemList.add(orderItem);
}
break;
} }
break;
} }
} }
leaseOrderItemService.updateBatchById(updateOrderItemList);
} }
leaseOrderItemService.updateBatchById(updateOrderItemList);
return orderItemList; return orderItemList;
} }
@@ -796,7 +798,7 @@ public class OrderAndPayTask {
/** /**
*订单完成后---发送支付消息到mq 一个买家对应一个卖家 *订单全部已完成
* @param orderIds * @param orderIds
*/ */
public void sendMessageToMq(List<Long> orderIds){ public void sendMessageToMq(List<Long> orderIds){

View File

@@ -149,8 +149,8 @@ public class WalletRuleCheckUtils {
} }
// ---------------NEXA校验------------------- // ---------------NEXA校验-------------------
private static final Pattern NEXA_PATTERN = Pattern.compile("^nexa:[0-9a-zA-Z]{40}$"); private static final Pattern NEXA_PATTERN = Pattern.compile("^nexa:[0-9a-zA-Z]{48}$");
private static final Pattern NEXA_PATTERN2 = Pattern.compile("^[0-9a-zA-Z]{40}$"); private static final Pattern NEXA_PATTERN2 = Pattern.compile("^[0-9a-zA-Z]{48}$");
public static boolean checkNEXA(String address) { public static boolean checkNEXA(String address) {
if (address.startsWith("nexa:")){ if (address.startsWith("nexa:")){
return StringUtils.isNotEmpty(address) && NEXA_PATTERN.matcher(address).matches(); return StringUtils.isNotEmpty(address) && NEXA_PATTERN.matcher(address).matches();
@@ -177,6 +177,6 @@ public class WalletRuleCheckUtils {
return StringUtils.isNotEmpty( address) && CLORE_PATTERN.matcher(address).matches(); return StringUtils.isNotEmpty( address) && CLORE_PATTERN.matcher(address).matches();
} }
public static void main(String[] args) { public static void main(String[] args) {
System.out.println(checkNEXA("0x550de999a4d8bd33dc5856d80ea3d196eac97427"));
} }
} }

View File

@@ -349,20 +349,6 @@
</foreach> </foreach>
and sale_state = 0 and sale_state = 0
</update> </update>
<update id="updateLockNumbers">
<foreach collection="list" item="item" separator=";">
UPDATE lease_machine
SET
sale_out_numbers = #{item.saleOutNumbers},
sale_state = CASE WHEN #{item.saleOutNumbers} = sale_numbers THEN 1 ELSE sale_state END,
can_sale_numbers = #{item.canSaleNumbers}
WHERE
id = #{item.id}
AND sale_out_numbers = #{item.lockNumbers}
</foreach>
</update>
<select id="getCoinAndAlgoById" resultType="com.m2pool.lease.dto.v2.MiningConfigDto"> <select id="getCoinAndAlgoById" resultType="com.m2pool.lease.dto.v2.MiningConfigDto">
select select
id, id,
@@ -480,6 +466,37 @@
) )
</update> </update>
<update id="updateBatchLockNumbers">
UPDATE lease_machine
SET
sale_out_numbers = CASE
<foreach collection="list" item="item">
WHEN id = #{item.id} AND sale_out_numbers = #{item.lockNumbers}
THEN sale_out_numbers + #{item.saleOutNumbers}
</foreach>
ELSE sale_out_numbers
END,
can_sale_numbers = CASE
<foreach collection="list" item="item">
WHEN id = #{item.id} AND sale_out_numbers = #{item.lockNumbers}
THEN can_sale_numbers - #{item.canSaleNumbers}
</foreach>
ELSE can_sale_numbers
END,
sale_state = CASE
<foreach collection="list" item="item">
WHEN id = #{item.id} AND sale_out_numbers = #{item.lockNumbers}
THEN CASE WHEN (sale_out_numbers + #{item.saleOutNumbers}) >= sale_numbers THEN 1 ELSE sale_state END
</foreach>
ELSE sale_state
END
WHERE id IN (
<foreach collection="list" item="item" separator=",">
#{item.id}
</foreach>
)
</update>
<select id="checkHasSaleMachineByShopId" resultType="java.lang.Integer"> <select id="checkHasSaleMachineByShopId" resultType="java.lang.Integer">
SELECT SELECT
COUNT(*) COUNT(*)