提交 5e2309f9 authored 作者: liuhaiquan's avatar liuhaiquan

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

# Conflicts: # performance-web/src/main/java/com/clx/performance/service/impl/OrderGoodsServiceImpl.java # performance-web/src/main/java/com/clx/performance/service/impl/settle/SettlementMqHandlerServiceImpl.java
...@@ -69,6 +69,9 @@ public class CarrierPageSettlementDriverVO { ...@@ -69,6 +69,9 @@ public class CarrierPageSettlementDriverVO {
private String createTime; private String createTime;
@ApiModelProperty(value = "结算平台 1:马上来 2:网运平台") @ApiModelProperty(value = "结算平台 1:马上来 2:网运平台")
private String settlementPlatform; private String settlementPlatform;
@ApiModelProperty(value = "支付失败原因")
private String payErrorMsg;
......
...@@ -5,5 +5,9 @@ public class RedissonConstants { ...@@ -5,5 +5,9 @@ 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_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 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,6 +309,7 @@ public class OrderGoodsServiceImpl implements OrderGoodsService { ...@@ -309,6 +309,7 @@ public class OrderGoodsServiceImpl implements OrderGoodsService {
if (orderGoodsParams.getExtractWeight().compareTo(oldOrderGoods.getAlreadyTransportWeight()) < 0) { if (orderGoodsParams.getExtractWeight().compareTo(oldOrderGoods.getAlreadyTransportWeight()) < 0) {
throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR, "当前货单提取吨数不能小于货单已拉运吨数"); throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR, "当前货单提取吨数不能小于货单已拉运吨数");
} }
//考虑到借吨、恢复吨数的货单,逻辑判断实际的提取吨数 //考虑到借吨、恢复吨数的货单,逻辑判断实际的提取吨数
BigDecimal realExtractWeight = oldOrderGoods.getResidueTransportWeight().compareTo(BigDecimal.ZERO) == 0? BigDecimal realExtractWeight = oldOrderGoods.getResidueTransportWeight().compareTo(BigDecimal.ZERO) == 0?
oldOrderGoods.getAlreadyTransportWeight():oldOrderGoods.getAlreadyTransportWeight().add(oldOrderGoods.getResidueTransportWeight()); oldOrderGoods.getAlreadyTransportWeight():oldOrderGoods.getAlreadyTransportWeight().add(oldOrderGoods.getResidueTransportWeight());
...@@ -365,6 +366,7 @@ public class OrderGoodsServiceImpl implements OrderGoodsService { ...@@ -365,6 +366,7 @@ public class OrderGoodsServiceImpl implements OrderGoodsService {
log.info("回填吨数:{}", JSONUtil.parse(rollbackOrderWeightParam)); log.info("回填吨数:{}", JSONUtil.parse(rollbackOrderWeightParam));
orderFeign.rollbackOrderWeight(rollbackOrderWeightParam); orderFeign.rollbackOrderWeight(rollbackOrderWeightParam);
} else { } else {
//当编辑吨数等于0 的时候,不进行拦截
orderGoodsParams.setResidueTransportWeight(oldOrderGoods.getResidueTransportWeight()); orderGoodsParams.setResidueTransportWeight(oldOrderGoods.getResidueTransportWeight());
} }
......
package com.clx.performance.service.impl.breakcontract; package com.clx.performance.service.impl.breakcontract;
import com.clx.performance.constant.RedissonConstants;
import com.clx.performance.dao.breakcontract.BreakContractSettlementDriverDao; import com.clx.performance.dao.breakcontract.BreakContractSettlementDriverDao;
import com.clx.performance.enums.BreakContractSettlementDriverEnum; import com.clx.performance.enums.BreakContractSettlementDriverEnum;
import com.clx.performance.enums.PerformanceResultEnum; 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.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.UUID;
@Slf4j @Slf4j
@Service @Service
...@@ -24,25 +28,42 @@ public class BreakContractJobHandlerServiceImpl implements BreakContractJobHandl ...@@ -24,25 +28,42 @@ public class BreakContractJobHandlerServiceImpl implements BreakContractJobHandl
@Autowired @Autowired
private PayService payService; private PayService payService;
@Autowired
RedisUtil redisUtil;
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Override @Override
public String pay(Integer settlementId){ public String pay(Integer settlementId){
String uuid = UUID.randomUUID().toString();
String key = RedissonConstants.BREAK_CONTRACT_SETTLEMENT_OWNER_BATCH_PAY_ID_LOCK + settlementId;
try{
boolean flag = redisUtil.lock(key, uuid,180);
if(!flag){
return "获取支付锁失败,操作频繁,请稍后重试";
}
String msg = null;
BreakContractSettlementDriver breakContractSettlementDriver = breakContractSettlementDriverDao.getEntityByKey(settlementId).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
String msg = null; if (Objects.equals(breakContractSettlementDriver.getSettleStatus(), BreakContractSettlementDriverEnum.SettleStatus.YES.getMsg())){
BreakContractSettlementDriver breakContractSettlementDriver = breakContractSettlementDriverDao.getEntityByKey(settlementId).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND); return msg;
}
if (Objects.equals(breakContractSettlementDriver.getSettleStatus(), BreakContractSettlementDriverEnum.SettleStatus.YES)){ try {
pay(breakContractSettlementDriver);
}catch (ServiceSystemException e){
breakContractSettlementDriver.setPayRemark(e.getMessage());
breakContractSettlementDriverDao.updatePayFail(breakContractSettlementDriver);
msg = e.getMessage();
}
return msg; return msg;
}catch (Exception e){
log.warn("违约结算单支付上锁失败,结算单ID:{},异常原因:{}", settlementId, ExceptionUtils.getStackTrace(e));
//解锁
redisUtil.unlock(key,uuid);
throw new ServiceSystemException(PerformanceResultEnum.TRY_LOCK_ERROR);
} }
try {
pay(breakContractSettlementDriver);
}catch (ServiceSystemException e){
breakContractSettlementDriver.setPayRemark(e.getMessage());
breakContractSettlementDriverDao.updatePayFail(breakContractSettlementDriver);
msg = e.getMessage();
}
return msg;
} }
......
...@@ -134,7 +134,6 @@ public class BreakContractSettlementDriverServiceImpl implements BreakContractSe ...@@ -134,7 +134,6 @@ public class BreakContractSettlementDriverServiceImpl implements BreakContractSe
String msg = breakContractJobHandlerService.pay(item.getId()); String msg = breakContractJobHandlerService.pay(item.getId());
if(StringUtils.isNotBlank(msg)){ if(StringUtils.isNotBlank(msg)){
log.warn("违约结算单对应的的运单编号:{} 进行结算,结算失败,返回结果:{}",item.getChildNo(),msg); log.warn("违约结算单对应的的运单编号:{} 进行结算,结算失败,返回结果:{}",item.getChildNo(),msg);
throw new ServiceSystemException(PerformanceResultEnum.DATA_NOT_FIND,msg);
} }
}); });
......
...@@ -65,7 +65,6 @@ public class SettlementDriverServiceImpl implements SettlementDriverService { ...@@ -65,7 +65,6 @@ public class SettlementDriverServiceImpl implements SettlementDriverService {
String msg = settlementMqHandlerService.paySettlementDriver(item); String msg = settlementMqHandlerService.paySettlementDriver(item);
if(StringUtils.isNotBlank(msg)){ if(StringUtils.isNotBlank(msg)){
log.warn("结算单对应的的运单编号:{} 进行结算,结算失败,返回结果:{}",item.getChildNo(),msg); log.warn("结算单对应的的运单编号:{} 进行结算,结算失败,返回结果:{}",item.getChildNo(),msg);
throw new ServiceSystemException(PerformanceResultEnum.DATA_NOT_FIND,msg);
} }
}); });
} }
......
package com.clx.performance.service.impl.settle; package com.clx.performance.service.impl.settle;
import com.clx.performance.config.MslPaymentConfig; import com.clx.performance.config.MslPaymentConfig;
import com.clx.performance.constant.RedissonConstants;
import com.clx.performance.dao.OrderChildDao; import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.dao.OrderGoodsDao; import com.clx.performance.dao.OrderGoodsDao;
import com.clx.performance.dao.settle.SettlementDriverDao; import com.clx.performance.dao.settle.SettlementDriverDao;
...@@ -33,13 +34,16 @@ import com.clx.performance.service.settle.SettlementLogService; ...@@ -33,13 +34,16 @@ 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;
import com.clx.user.vo.feign.OwnerInfoFeignVO; import com.clx.user.vo.feign.OwnerInfoFeignVO;
import com.msl.common.enums.ResultCodeEnum; import com.msl.common.enums.ResultCodeEnum;
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.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;
...@@ -48,6 +52,7 @@ import java.math.BigDecimal; ...@@ -48,6 +52,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.UUID;
@Slf4j @Slf4j
@Service @Service
...@@ -96,6 +101,9 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic ...@@ -96,6 +101,9 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
@Autowired @Autowired
private OrderChildSyncTransportRecordService childSyncTransportRecordService; private OrderChildSyncTransportRecordService childSyncTransportRecordService;
@Autowired
RedisUtil redisUtil;
@Override @Override
...@@ -227,41 +235,55 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic ...@@ -227,41 +235,55 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
* 车主结算单自动支付 * 车主结算单自动支付
*/ */
public String paySettlementDriver(SettlementDriverDetail detail){ public String paySettlementDriver(SettlementDriverDetail detail){
DriverInfoFeignVo driverInfoFeignVo = driverService.getDriverInfo(detail.getDriverUserNo()).orElseThrow(ResultCodeEnum.FAIL); String uuid = UUID.randomUUID().toString();
PayParam noCheckPwd = null ; String key = RedissonConstants.SETTLEMENT_OWNER_BATCH_PAY_ID_LOCK + detail.getId();
if(detail.getSettlementFreight().compareTo(BigDecimal.ZERO) > 0){
noCheckPwd = PayParam.builder().from(mslPaymentConfig.getTransportWalletCode())
.to(driverInfoFeignVo.getWalletCode())
.figure(detail.getSettlementFreight().intValue())
.tradeNo(detail.getChildNo())
.tradeId(detail.getChildNo())
.pwd("noCheckPwd")
.remark(PayRemarkEnum.toString(PayRemarkEnum.FREIGHT_TO_OWNER.getValue()))
.build();
}else{
BigDecimal freight = detail.getSettlementFreight().abs();
noCheckPwd = PayParam.builder().from(driverInfoFeignVo.getWalletCode())
.to(mslPaymentConfig.getTransportWalletCode())
.figure(freight.intValue())
.tradeNo(detail.getChildNo())
.tradeId(detail.getChildNo())
.pwd("noCheckPwd")
.remark(PayRemarkEnum.toString(PayRemarkEnum.FREIGHT_TO_OWNER.getValue()))
.build();
}
Result result = null;
String msg = null;
try{ try{
result = paymentService.paymentWallet(noCheckPwd); boolean flag = redisUtil.lock(key, uuid,180);
if(!flag){
return "获取支付锁失败,操作频繁,请稍后重试";
}
DriverInfoFeignVo driverInfoFeignVo = driverService.getDriverInfo(detail.getDriverUserNo()).orElseThrow(ResultCodeEnum.FAIL);
PayParam noCheckPwd = null ;
if(detail.getSettlementFreight().compareTo(BigDecimal.ZERO) > 0){
noCheckPwd = PayParam.builder().from(mslPaymentConfig.getTransportWalletCode())
.to(driverInfoFeignVo.getWalletCode())
.figure(detail.getSettlementFreight().intValue())
.tradeNo(detail.getChildNo())
.tradeId(detail.getChildNo())
.pwd("noCheckPwd")
.remark(PayRemarkEnum.toString(PayRemarkEnum.FREIGHT_TO_OWNER.getValue()))
.build();
}else{
BigDecimal freight = detail.getSettlementFreight().abs();
noCheckPwd = PayParam.builder().from(driverInfoFeignVo.getWalletCode())
.to(mslPaymentConfig.getTransportWalletCode())
.figure(freight.intValue())
.tradeNo(detail.getChildNo())
.tradeId(detail.getChildNo())
.pwd("noCheckPwd")
.remark(PayRemarkEnum.toString(PayRemarkEnum.FREIGHT_TO_OWNER.getValue()))
.build();
}
Result result = null;
String msg = null;
try{
result = paymentService.paymentWallet(noCheckPwd);
}catch (Exception e){
settlementDriverNotify(detail.getChildNo(),0,e.getMessage());
msg = e.getMessage();
}
if(Objects.nonNull(result)){
settlementDriverNotify(detail.getChildNo(),0,result.getMsg());
}
return msg;
}catch (Exception e){ }catch (Exception e){
settlementDriverNotify(detail.getChildNo(),0,e.getMessage()); log.warn("结算单支付上锁失败,结算单ID:{},异常原因:{}", detail.getId(), ExceptionUtils.getStackTrace(e));
msg = e.getMessage(); //解锁
} redisUtil.unlock(key,uuid);
if(Objects.nonNull(result)){ throw new ServiceSystemException(PerformanceResultEnum.TRY_LOCK_ERROR);
settlementDriverNotify(detail.getChildNo(),0,result.getMsg());
} }
return msg;
} }
/** /**
......
...@@ -22,6 +22,7 @@ public interface BreakContractSettlementDriverStruct { ...@@ -22,6 +22,7 @@ public interface BreakContractSettlementDriverStruct {
@Mapping(target = "settleStatusMsg", expression = "java(BreakContractSettlementDriverEnum.SettleStatus.getMsgByCode(detail.getSettleStatus()))") @Mapping(target = "settleStatusMsg", expression = "java(BreakContractSettlementDriverEnum.SettleStatus.getMsgByCode(detail.getSettleStatus()))")
@Mapping(target = "settlePlatformMsg", expression = "java(BreakContractSettlementDriverEnum.SettlePlatform.getMsgByCode(detail.getSettlePlatform()))") @Mapping(target = "settlePlatformMsg", expression = "java(BreakContractSettlementDriverEnum.SettlePlatform.getMsgByCode(detail.getSettlePlatform()))")
@Mapping(target = "breakContractPartyTypeMsg", expression = "java(BreakContractSettlementDriverEnum.BreakContractPartyType.getMsgByCode(detail.getBreakContractPartyType()))") @Mapping(target = "breakContractPartyTypeMsg", expression = "java(BreakContractSettlementDriverEnum.BreakContractPartyType.getMsgByCode(detail.getBreakContractPartyType()))")
@Mapping(target = "payRemark", expression = "java(if(Objects.equals(settleStatus,BreakContractSettlementDriverEnum.SettleStatus.YES.getCode())){return null}else{return payRemark})")
PageCarrierBreakContractSettlementDriverVO convert(BreakContractSettlementDriver detail); PageCarrierBreakContractSettlementDriverVO convert(BreakContractSettlementDriver detail);
@IterableMapping(qualifiedByName = "toBaseVo") @IterableMapping(qualifiedByName = "toBaseVo")
......
...@@ -4,11 +4,21 @@ import com.clx.performance.model.settle.SettlementDriver; ...@@ -4,11 +4,21 @@ import com.clx.performance.model.settle.SettlementDriver;
import com.clx.performance.vo.pc.carrier.settle.CarrierPageSettlementDriverVO; import com.clx.performance.vo.pc.carrier.settle.CarrierPageSettlementDriverVO;
import com.msl.common.utils.DateStructUtil; import com.msl.common.utils.DateStructUtil;
import com.msl.common.utils.DateUtils; import com.msl.common.utils.DateUtils;
import org.mapstruct.IterableMapping;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Named;
import java.util.List; import java.util.List;
@Mapper(componentModel = "spring", uses = DateStructUtil.class, imports = {DateUtils.class}) @Mapper(componentModel = "spring", uses = DateStructUtil.class, imports = {DateUtils.class})
public interface SettlementDriverStruct { public interface SettlementDriverStruct {
@Named("toBaseVo")
@Mapping(target = "payErrorMsg", expression = "java(if(Objects.equals(status,SettlementDriverEnum.Status.SETTLED.getCode())){return null}else{return payRemark})")
CarrierPageSettlementDriverVO convert(SettlementDriver detail);
@IterableMapping(qualifiedByName = "toBaseVo")
List<CarrierPageSettlementDriverVO> covertList(List<SettlementDriver> records); List<CarrierPageSettlementDriverVO> covertList(List<SettlementDriver> records);
} }
...@@ -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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论