提交 6160d237 authored 作者: liuhaiquan's avatar liuhaiquan

Merge remote-tracking branch 'origin/v7.6_small_version_fix_20231204' into test

# Conflicts: # performance-web/src/main/java/com/clx/performance/service/impl/settle/SettlementMqHandlerServiceImpl.java
...@@ -13,4 +13,9 @@ public class RedissonConstants { ...@@ -13,4 +13,9 @@ public class RedissonConstants {
//货主结算单支付锁
public static final String SETTLEMENT_OWNER_BATCH_PAY_ID_LOCK = "clx-performance:settlementOwner:batchPay:id:";
//货主违约结算单支付锁
public static final String BREAK_CONTRACT_SETTLEMENT_OWNER_BATCH_PAY_ID_LOCK = "clx-performance:breakContractSettlementOwner:batchPay:id:";
} }
...@@ -7,17 +7,16 @@ import com.clx.performance.enums.PerformanceResultEnum; ...@@ -7,17 +7,16 @@ import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.model.breakcontract.BreakContractSettlementDriver; import com.clx.performance.model.breakcontract.BreakContractSettlementDriver;
import com.clx.performance.service.breakcontract.BreakContractJobHandlerService; import com.clx.performance.service.breakcontract.BreakContractJobHandlerService;
import com.clx.performance.service.payment.PayService; import com.clx.performance.service.payment.PayService;
import com.clx.performance.utils.RedisUtil;
import com.msl.common.exception.ServiceSystemException; import com.msl.common.exception.ServiceSystemException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.commons.lang3.exception.ExceptionUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.TimeUnit; import java.util.UUID;
@Slf4j @Slf4j
@Service @Service
...@@ -30,17 +29,17 @@ public class BreakContractJobHandlerServiceImpl implements BreakContractJobHandl ...@@ -30,17 +29,17 @@ public class BreakContractJobHandlerServiceImpl implements BreakContractJobHandl
private PayService payService; private PayService payService;
@Autowired @Autowired
private RedissonClient redissonClient; RedisUtil redisUtil;
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Override @Override
public String pay(Integer settlementId){ public String pay(Integer settlementId){
RLock lock = redissonClient.getLock(RedissonConstants.BREAK_CONTRACT_SETTLEMENT_OWNER_BATCH_PAY_ID_LOCK + settlementId); String uuid = UUID.randomUUID().toString();
String key = RedissonConstants.BREAK_CONTRACT_SETTLEMENT_OWNER_BATCH_PAY_ID_LOCK + settlementId;
try{ try{
boolean flag = lock.tryLock(15, 30, TimeUnit.SECONDS); boolean flag = redisUtil.lock(key, uuid,180);
if (!flag) { if(!flag){
//说明有别的线程发起支付操作 return "获取支付锁失败,操作频繁,请稍后重试";
return "车主违约结算单支付,支付操作频繁,稍后重试";
} }
String msg = null; String msg = null;
BreakContractSettlementDriver breakContractSettlementDriver = breakContractSettlementDriverDao.getEntityByKey(settlementId).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND); BreakContractSettlementDriver breakContractSettlementDriver = breakContractSettlementDriverDao.getEntityByKey(settlementId).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
...@@ -57,14 +56,15 @@ public class BreakContractJobHandlerServiceImpl implements BreakContractJobHandl ...@@ -57,14 +56,15 @@ public class BreakContractJobHandlerServiceImpl implements BreakContractJobHandl
msg = e.getMessage(); msg = e.getMessage();
} }
return msg; return msg;
}catch(Exception e){ }catch (Exception e){
log.warn("结算单批量支付上锁失败,结算单ID:{},异常原因:{}", settlementId,ExceptionUtils.getStackTrace(e)); log.warn("违约结算单支付上锁失败,结算单ID:{},异常原因:{}", settlementId, ExceptionUtils.getStackTrace(e));
//解锁
redisUtil.unlock(key,uuid);
throw new ServiceSystemException(PerformanceResultEnum.TRY_LOCK_ERROR); throw new ServiceSystemException(PerformanceResultEnum.TRY_LOCK_ERROR);
}finally {
if (lock.isLocked() && lock.isHeldByCurrentThread()) {
lock.unlock();
}
} }
} }
/** /**
......
...@@ -33,6 +33,7 @@ import com.clx.performance.service.settle.SettlementLogService; ...@@ -33,6 +33,7 @@ import com.clx.performance.service.settle.SettlementLogService;
import com.clx.performance.service.settle.SettlementMqHandlerService; import com.clx.performance.service.settle.SettlementMqHandlerService;
import com.clx.performance.service.settle.SettlementService; import com.clx.performance.service.settle.SettlementService;
import com.clx.performance.utils.LocalDateTimeUtils; import com.clx.performance.utils.LocalDateTimeUtils;
import com.clx.performance.utils.RedisUtil;
import com.clx.performance.vo.mq.SettlementDetailAddMqParam; import com.clx.performance.vo.mq.SettlementDetailAddMqParam;
import com.clx.performance.vo.mq.SettlementDetailInvoiceTypeSyncMqParam; import com.clx.performance.vo.mq.SettlementDetailInvoiceTypeSyncMqParam;
import com.clx.user.vo.feign.DriverInfoFeignVo; import com.clx.user.vo.feign.DriverInfoFeignVo;
...@@ -42,8 +43,6 @@ import com.msl.common.exception.ServiceSystemException; ...@@ -42,8 +43,6 @@ import com.msl.common.exception.ServiceSystemException;
import com.msl.common.result.Result; import com.msl.common.result.Result;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.commons.lang3.exception.ExceptionUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
...@@ -52,7 +51,7 @@ import java.math.BigDecimal; ...@@ -52,7 +51,7 @@ import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.TimeUnit; import java.util.UUID;
@Slf4j @Slf4j
@Service @Service
...@@ -102,7 +101,7 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic ...@@ -102,7 +101,7 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
private OrderChildSyncTransportRecordService childSyncTransportRecordService; private OrderChildSyncTransportRecordService childSyncTransportRecordService;
@Autowired @Autowired
RedissonClient redissonClient; RedisUtil redisUtil;
...@@ -235,13 +234,14 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic ...@@ -235,13 +234,14 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
* 车主结算单自动支付 * 车主结算单自动支付
*/ */
public String paySettlementDriver(SettlementDriverDetail detail){ public String paySettlementDriver(SettlementDriverDetail detail){
RLock lock = redissonClient.getLock(RedissonConstants.SETTLEMENT_OWNER_BATCH_PAY_ID_LOCK + detail.getId()); String uuid = UUID.randomUUID().toString();
String key = RedissonConstants.SETTLEMENT_OWNER_BATCH_PAY_ID_LOCK + detail.getId();
try{ try{
boolean flag = lock.tryLock(15, 30, TimeUnit.SECONDS); boolean flag = redisUtil.lock(key, uuid,180);
if (!flag) { if(!flag){
//说明有别的线程发起支付操作 return "获取支付锁失败,操作频繁,请稍后重试";
return "车主结算单支付,操作频繁,稍后重试";
} }
DriverInfoFeignVo driverInfoFeignVo = driverService.getDriverInfo(detail.getDriverUserNo()).orElseThrow(ResultCodeEnum.FAIL); DriverInfoFeignVo driverInfoFeignVo = driverService.getDriverInfo(detail.getDriverUserNo()).orElseThrow(ResultCodeEnum.FAIL);
PayParam noCheckPwd = null ; PayParam noCheckPwd = null ;
if(detail.getSettlementFreight().compareTo(BigDecimal.ZERO) > 0){ if(detail.getSettlementFreight().compareTo(BigDecimal.ZERO) > 0){
...@@ -277,13 +277,11 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic ...@@ -277,13 +277,11 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
settlementDriverNotify(detail.getChildNo(),0,result.getMsg()); settlementDriverNotify(detail.getChildNo(),0,result.getMsg());
} }
return msg; return msg;
}catch(Exception e){ }catch (Exception e){
log.warn("货主结算单批量支付上锁失败,异常原因:{}", ExceptionUtils.getStackTrace(e)); log.warn("结算单支付上锁失败,结算单ID:{},异常原因:{}", detail.getId(), ExceptionUtils.getStackTrace(e));
//解锁
redisUtil.unlock(key,uuid);
throw new ServiceSystemException(PerformanceResultEnum.TRY_LOCK_ERROR); throw new ServiceSystemException(PerformanceResultEnum.TRY_LOCK_ERROR);
}finally {
if (lock.isLocked() && lock.isHeldByCurrentThread()) {
lock.unlock();
}
} }
} }
......
...@@ -75,11 +75,14 @@ public class RedisUtil { ...@@ -75,11 +75,14 @@ public class RedisUtil {
this.redisTemplate.delete(key); this.redisTemplate.delete(key);
return true; return true;
} }
public boolean lock(String key, String lockSeqId) { public boolean lock(String key, String lockSeqId) {
return setAtomicLockKey(key, lockSeqId); return setAtomicLockKey(key, lockSeqId);
} }
public boolean lock(String key, String lockSeqId, Integer expire) {
return setAtomicLockKey(key, lockSeqId,expire);
}
public boolean lock(String key, String lockSeqId, int second) { public boolean lock(String key, String lockSeqId, int second) {
return setAtomicLockKey(key, lockSeqId, second); return setAtomicLockKey(key, lockSeqId, second);
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论