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);
/**
* 修改asic 矿机售出数量
* @param gpuMachines
* @param list
* @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 矿机出售数量
if (!asicMachines.isEmpty()){
int asicUpdate = leaseMachineMapper.updateLockNumbers(asicMachines);
i += asicUpdate;
// 合并相同 id 的机器,避免 SQL CASE WHEN 只执行第一条的问题
List<LeaseMachine> mergedAsicMachines = mergeMachines(asicMachines);
System.out.println("打印"+JSONUtil.toJsonPrettyStr(mergedAsicMachines));
leaseMachineMapper.updateBatchLockNumbers(mergedAsicMachines);
i += asicMachines.size();
}
if (i != machineIds.size()){
throw new OrderException("订单中已有商品售出,请刷新购物车删除已售出商品,重新结算生成订单");
@@ -915,8 +918,11 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl<LeaseOrderInfoMapper,
//if(!checkGpuMachine(gpuMachines)){
// throw new OrderException("购买的GPU商品中,存在客户端不在线的矿机!");
//}
//发送消息
//gpu矿机处理 发送消息
sendMessageToClientAndInsertPurchasedMachine(SecurityUtils.getUserId(),userEmail,gpuMachines,orderMiningInfoDtoList,endMiningMap,machineOrderIdMap,machineOrderItemIdMap);
//TODO asic 矿机处理
return Result.success("订单生成成功");
}
@@ -971,7 +977,7 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl<LeaseOrderInfoMapper,
StringBuilder errors = new StringBuilder();
String addressVerify = "";
List<OrderMiningInfoDto> addressInfos = new ArrayList();
if(!orderMiningInfoDtos.isEmpty()){
Map<String, List<OrderMiningInfoDto>> collect = orderMiningInfoDtos.stream().collect(Collectors.groupingBy(OrderMiningInfoDto::getWalletAddress));
collect.forEach((address,list)->{
@@ -980,14 +986,13 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl<LeaseOrderInfoMapper,
errors.append(orderMiningInfoDto.getWorkerId()).append(" ");
}
errors.append("请重新输入矿工号\n");
addressInfos.add(list.get(0));
});
}
if (StringUtils.isNotEmpty(errors.toString())){
return errors.toString();
}
for (OrderMiningInfoDto addressInfo : addressInfos) {
for (OrderMiningInfoDto addressInfo : orderMiningInfoDtoList) {
if (!WalletRuleCheckUtils.checkAddress(addressInfo.getCoin(),addressInfo.getWalletAddress())){
addressVerify = addressInfo.getWalletAddress() + "钱包地址格式错误";
break;
@@ -1122,4 +1127,35 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl<LeaseOrderInfoMapper,
info.setPurchasedMachines(list);
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())
.distinct()
.collect(Collectors.toList());
//查询到对应商铺对应的 chain 然后比较上面的链对应的地址是否改变
List<ShopConfigDelDto> shopConfigList = leaseShopConfigMapper.selectShopConfigByShopIdAndSymbolAndChain(collect);
List<LeaseOrderItem> updateOrderItemList = new ArrayList<>();
// 遍历 orderItemList
for (LeaseOrderItem orderItem : orderItemList) {
for (ShopConfigDelDto shopConfig : shopConfigList) {
// 检查 chain 和 shopId 是否相同
if (orderItem.getShopId().equals(shopConfig.getShopId()) &&
orderItem.getChain().equals(shopConfig.getChain())) {
// 检查 address 是否
if (!orderItem.getAddress().equals(shopConfig.getPayAddress())) {
// 更新 orderItem 的 address
orderItem.setAddress(shopConfig.getPayAddress());
updateOrderItemList.add(orderItem);
if (!collect.isEmpty()){
//查询到对应商铺对应的 chain 然后比较上面的链对应的地址是否改变
List<ShopConfigDelDto> shopConfigList = leaseShopConfigMapper.selectShopConfigByShopIdAndSymbolAndChain(collect);
// 遍历 orderItemList
for (LeaseOrderItem orderItem : orderItemList) {
for (ShopConfigDelDto shopConfig : shopConfigList) {
// 检查 chain 和 shopId 是否
if (orderItem.getShopId().equals(shopConfig.getShopId()) &&
orderItem.getChain().equals(shopConfig.getChain())) {
// 检查 address 是否不同
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;
}
@@ -796,7 +798,7 @@ public class OrderAndPayTask {
/**
*订单完成后---发送支付消息到mq 一个买家对应一个卖家
*订单全部已完成
* @param orderIds
*/
public void sendMessageToMq(List<Long> orderIds){

View File

@@ -149,8 +149,8 @@ public class WalletRuleCheckUtils {
}
// ---------------NEXA校验-------------------
private static final Pattern NEXA_PATTERN = Pattern.compile("^nexa:[0-9a-zA-Z]{40}$");
private static final Pattern NEXA_PATTERN2 = Pattern.compile("^[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]{48}$");
public static boolean checkNEXA(String address) {
if (address.startsWith("nexa:")){
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();
}
public static void main(String[] args) {
System.out.println(checkNEXA("0x550de999a4d8bd33dc5856d80ea3d196eac97427"));
}
}

View File

@@ -349,20 +349,6 @@
</foreach>
and sale_state = 0
</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,
@@ -480,6 +466,37 @@
)
</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
COUNT(*)