提交 d8d2ff21 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
......@@ -69,6 +69,9 @@ public class CarrierPageSettlementDriverVO {
private String createTime;
@ApiModelProperty(value = "结算平台 1:马上来 2:网运平台")
private String settlementPlatform;
@ApiModelProperty(value = "支付失败原因")
private String payErrorMsg;
......
......@@ -5,5 +5,12 @@ public class RedissonConstants {
// 接单锁
public static final String ORDER_CHILD_SAVE_USER_TRUCK_LOCK = "clx-performance:orderChild:save:userTruck:";
public static final String ORDER_CHILD_SAVE_ORDER_GOODS_NO_LOCK = "clx-performance:orderChild:save:orderGoodsNo:";
//货主结算单支付锁
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:";
}
......@@ -309,10 +309,12 @@ public class OrderGoodsServiceImpl implements OrderGoodsService {
if (orderGoodsParams.getExtractWeight().compareTo(oldOrderGoods.getAlreadyTransportWeight()) < 0) {
throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR, "当前货单提取吨数不能小于货单已拉运吨数");
}
//考虑到借吨、恢复吨数的货单,逻辑判断实际的提取吨数
BigDecimal realExtractWeight = oldOrderGoods.getResidueTransportWeight().compareTo(BigDecimal.ZERO) == 0?
oldOrderGoods.getAlreadyTransportWeight():oldOrderGoods.getAlreadyTransportWeight().add(oldOrderGoods.getResidueTransportWeight());
oldOrderGoods.setExtractWeight(realExtractWeight);
//本次提取增加或者减少的吨数 = 本次提取的吨数 - 货单原实际提取吨数
BigDecimal answer = orderGoodsParams.getExtractWeight().subtract(realExtractWeight);
int flag = answer.compareTo(BigDecimal.ZERO);
//归还吨数
......@@ -364,6 +366,7 @@ public class OrderGoodsServiceImpl implements OrderGoodsService {
log.info("回填吨数:{}", JSONUtil.parse(rollbackOrderWeightParam));
orderFeign.rollbackOrderWeight(rollbackOrderWeightParam);
} else {
//当编辑吨数等于0 的时候,不进行拦截
orderGoodsParams.setResidueTransportWeight(oldOrderGoods.getResidueTransportWeight());
}
......@@ -458,7 +461,8 @@ public class OrderGoodsServiceImpl implements OrderGoodsService {
* 限制货单更新剩余吨数不能小于35吨
**/
private void limitOrderGoodsResidueWeight(BigDecimal residueTransportWeight){
if(residueTransportWeight.compareTo(new BigDecimal("35")) < 0){
if(residueTransportWeight.compareTo(BigDecimal.ZERO) != 0 && residueTransportWeight.compareTo(new BigDecimal("35")) < 0){
throw new ServiceSystemException(PerformanceResultEnum.DATA_NOT_FIND,"当前货单剩余吨数不足35吨,无法挂单");
}
}
......
package com.clx.performance.service.impl.breakcontract;
import com.clx.performance.constant.RedissonConstants;
import com.clx.performance.dao.breakcontract.BreakContractSettlementDriverDao;
import com.clx.performance.enums.BreakContractSettlementDriverEnum;
import com.clx.performance.enums.PerformanceResultEnum;
......@@ -8,11 +9,16 @@ import com.clx.performance.service.breakcontract.BreakContractJobHandlerService;
import com.clx.performance.service.payment.PayService;
import com.msl.common.exception.ServiceSystemException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
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.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
@Slf4j
@Service
......@@ -24,10 +30,19 @@ public class BreakContractJobHandlerServiceImpl implements BreakContractJobHandl
@Autowired
private PayService payService;
@Autowired
private RedissonClient redissonClient;
@Transactional(rollbackFor = Exception.class)
@Override
public String pay(Integer settlementId){
RLock lock = redissonClient.getLock(RedissonConstants.BREAK_CONTRACT_SETTLEMENT_OWNER_BATCH_PAY_ID_LOCK + settlementId);
try{
boolean flag = lock.tryLock(15, 30, TimeUnit.SECONDS);
if (!flag) {
//说明有别的线程发起支付操作
return "车主违约结算单支付,支付操作频繁,稍后重试";
}
String msg = null;
BreakContractSettlementDriver breakContractSettlementDriver = breakContractSettlementDriverDao.getEntityByKey(settlementId).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
......@@ -43,7 +58,14 @@ public class BreakContractJobHandlerServiceImpl implements BreakContractJobHandl
msg = e.getMessage();
}
return msg;
}catch(Exception e){
log.warn("结算单批量支付上锁失败,结算单ID:{},异常原因:{}", settlementId,ExceptionUtils.getStackTrace(e));
throw new ServiceSystemException(PerformanceResultEnum.TRY_LOCK_ERROR);
}finally {
if (lock.isLocked() && lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}
/**
......
......@@ -134,7 +134,6 @@ public class BreakContractSettlementDriverServiceImpl implements BreakContractSe
String msg = breakContractJobHandlerService.pay(item.getId());
if(StringUtils.isNotBlank(msg)){
log.warn("违约结算单对应的的运单编号:{} 进行结算,结算失败,返回结果:{}",item.getChildNo(),msg);
throw new ServiceSystemException(PerformanceResultEnum.DATA_NOT_FIND,msg);
}
});
......
......@@ -65,7 +65,6 @@ public class SettlementDriverServiceImpl implements SettlementDriverService {
String msg = settlementMqHandlerService.paySettlementDriver(item);
if(StringUtils.isNotBlank(msg)){
log.warn("结算单对应的的运单编号:{} 进行结算,结算失败,返回结果:{}",item.getChildNo(),msg);
throw new ServiceSystemException(PerformanceResultEnum.DATA_NOT_FIND,msg);
}
});
}
......
package com.clx.performance.service.impl.settle;
import com.clx.performance.config.MslPaymentConfig;
import com.clx.performance.constant.RedissonConstants;
import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.dao.OrderGoodsDao;
import com.clx.performance.dao.settle.SettlementDriverDao;
......@@ -38,8 +39,13 @@ import com.clx.performance.vo.mq.SettlementDetailInvoiceTypeSyncMqParam;
import com.clx.user.vo.feign.DriverInfoFeignVo;
import com.clx.user.vo.feign.OwnerInfoFeignVO;
import com.msl.common.enums.ResultCodeEnum;
import com.msl.common.exception.ServiceSystemException;
import com.msl.common.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
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.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
......@@ -48,6 +54,7 @@ import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
@Slf4j
@Service
......@@ -96,6 +103,9 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
@Autowired
private OrderChildSyncTransportRecordService childSyncTransportRecordService;
@Autowired
RedissonClient redissonClient;
@Override
......@@ -225,6 +235,13 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
* 车主结算单自动支付
*/
public String paySettlementDriver(SettlementDriverDetail detail){
RLock lock = redissonClient.getLock(RedissonConstants.SETTLEMENT_OWNER_BATCH_PAY_ID_LOCK + detail.getId());
try{
boolean flag = lock.tryLock(15, 30, TimeUnit.SECONDS);
if (!flag) {
//说明有别的线程发起支付操作
return "车主结算单支付,操作频繁,稍后重试";
}
DriverInfoFeignVo driverInfoFeignVo = driverService.getDriverInfo(detail.getDriverUserNo()).orElseThrow(ResultCodeEnum.FAIL);
PayParam noCheckPwd = null ;
if(detail.getSettlementFreight().compareTo(BigDecimal.ZERO) > 0){
......@@ -260,6 +277,14 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
settlementDriverNotify(detail.getChildNo(),0,result.getMsg());
}
return msg;
}catch(Exception e){
log.warn("货主结算单批量支付上锁失败,异常原因:{}", ExceptionUtils.getStackTrace(e));
throw new ServiceSystemException(PerformanceResultEnum.TRY_LOCK_ERROR);
}finally {
if (lock.isLocked() && lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}
/**
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论