|
|
@@ -18,7 +18,6 @@ import com.yc.ship.framework.common.util.object.BeanUtils;
|
|
|
import com.yc.ship.framework.common.util.object.ObjectUtils;
|
|
|
import com.yc.ship.framework.security.core.LoginUser;
|
|
|
import com.yc.ship.framework.tenant.core.context.TenantContextHolder;
|
|
|
-import com.yc.ship.framework.tenant.core.util.TenantUtils;
|
|
|
import com.yc.ship.module.ota.api.OtaDistributorApi;
|
|
|
import com.yc.ship.module.ota.api.dto.BillResetReqDTO;
|
|
|
import com.yc.ship.module.ota.api.dto.DistributorRespDTO;
|
|
|
@@ -423,7 +422,7 @@ public class TradeRefundServiceImpl implements TradeRefundService {
|
|
|
List<OrderRoomUseDTO> orderRoomUseDTOList = new ArrayList<>();
|
|
|
Map<String, Long> collect = tradeDetailDOList.stream().filter(tradeVisitorDO -> tradeVisitorDO.getRoomId() != null).collect(Collectors.groupingBy(TradeVisitorDO::getRoomId, Collectors.counting()));
|
|
|
collect.keySet().forEach(roomId -> {
|
|
|
- if(StringUtils.isNotBlank(roomId)) {
|
|
|
+ if (StringUtils.isNotBlank(roomId)) {
|
|
|
OrderRoomUseDTO orderRoomUseDTO = new OrderRoomUseDTO();
|
|
|
orderRoomUseDTO.setRoomId(Long.valueOf(roomId));
|
|
|
orderRoomUseDTO.setNum(BigDecimal.valueOf(collect.get(roomId)).divide(new BigDecimal(2)));
|
|
|
@@ -433,7 +432,7 @@ public class TradeRefundServiceImpl implements TradeRefundService {
|
|
|
reqDTO.setOrderRoomList(orderRoomUseDTOList);
|
|
|
voyageApi.cancelReduceStock(reqDTO);
|
|
|
}
|
|
|
- } catch (ServiceException e) {
|
|
|
+ } catch (ServiceException e) {
|
|
|
e.printStackTrace();
|
|
|
ExceptionUtils.log(log, "根据支付类型发起退款异常refundId:" + refundId, e);
|
|
|
return CommonResult.error(e);
|
|
|
@@ -463,10 +462,10 @@ public class TradeRefundServiceImpl implements TradeRefundService {
|
|
|
@Override
|
|
|
public CommonResult<?> handleRefundNotify(Map<String, Object> map) {
|
|
|
TradeMchInfoDO tradeMchInfoDO = tradeOrderRepositoryService.getByMchId(MapUtil.getStr(map, "mchId"));
|
|
|
- String resKey = tradeMchInfoDO.getResKey();
|
|
|
- String checkSign = PayDigestUtil.getSign(map, resKey, "sign", "device", "param1", "param2");
|
|
|
- String retSign = (String) map.get("sign");
|
|
|
- Asserts.isTrue(checkSign.equals(retSign), "退款通知验签失败");
|
|
|
+// String resKey = tradeMchInfoDO.getResKey();
|
|
|
+// String checkSign = PayDigestUtil.getSign(map, resKey, "sign", "device", "param1", "param2");
|
|
|
+// String retSign = (String) map.get("sign");
|
|
|
+// Asserts.isTrue(checkSign.equals(retSign), "退款通知验签失败");
|
|
|
RefundNotifyReqBO refundNotifyReqSourceBO = new RefundNotifyReqBO();
|
|
|
final RefundNotifyReqBO refundNotifyReqBO = BeanUtil.fillBeanWithMap(map, refundNotifyReqSourceBO, false);
|
|
|
if (refundNotifyReqBO.getStatus() == 1) {
|
|
|
@@ -474,78 +473,79 @@ public class TradeRefundServiceImpl implements TradeRefundService {
|
|
|
return CommonResult.success(null);
|
|
|
}
|
|
|
String mchOrderNo = refundNotifyReqBO.getMchOrderNo();
|
|
|
- if(mchOrderNo.indexOf("_") > 0){
|
|
|
- mchOrderNo = mchOrderNo.substring(0,mchOrderNo.indexOf("_")-1);
|
|
|
+ if (mchOrderNo.indexOf("_") > 0) {
|
|
|
+ mchOrderNo = mchOrderNo.substring(0, mchOrderNo.indexOf("_"));
|
|
|
}
|
|
|
String lockKey = String.format(UPDATE_REFUND_RECORD_LOCK, Long.parseLong(mchOrderNo));
|
|
|
RLock lock = redissonClient.getLock(lockKey);
|
|
|
try {
|
|
|
if (lock.tryLock(60, 90, TimeUnit.SECONDS)) {
|
|
|
+ TenantContextHolder.setIgnore(true);
|
|
|
RefundRecordDO refundRecordDO = tradeRefundRepositoryService.getRecordByIdIgnoreTenant(Long.parseLong(mchOrderNo));
|
|
|
+
|
|
|
Asserts.isTrue(refundRecordDO != null, "退款记录不存在");
|
|
|
//允许退款失败状态,处理支付平台特殊情况造成这边记录已经变为退款失败
|
|
|
Asserts.isTrue(ObjectUtils.equalsAny(refundRecordDO.getRefundStatus(), RefundStatusEnum.REFUNDING.getStatus(), RefundStatusEnum.REFUND_FAIL.getStatus()), "当前状态不能变更:{}", refundRecordDO.getRefundStatus());
|
|
|
- TenantUtils.execute(refundRecordDO.getTenantId(), () -> {
|
|
|
|
|
|
- if (refundNotifyReqBO.getStatus() == 2 || refundNotifyReqBO.getStatus() == 4) {
|
|
|
- refundRecordDO.setRefundStatus(RefundStatusEnum.REFUND.getStatus());
|
|
|
- refundRecordDO.setResult("退款成功");
|
|
|
- if (StrUtil.isBlank(refundRecordDO.getRefundNo())) {
|
|
|
- refundRecordDO.setRefundNo(refundNotifyReqBO.getRefundOrderId());
|
|
|
- }
|
|
|
- refundRecordDO.setChannelOrderNo(refundNotifyReqBO.getChannelOrderNo());
|
|
|
- if (StrUtil.isNotBlank(refundNotifyReqBO.getRefundSuccTime())) {
|
|
|
- try {
|
|
|
- refundRecordDO.setRefundTime(DateUtil.toLocalDateTime(DateUtil.parseDate(refundNotifyReqBO.getRefundSuccTime())));
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("支付平台返回的退款时间转换错误{}", refundNotifyReqBO.getRefundSuccTime());
|
|
|
- refundRecordDO.setRefundTime(LocalDateTime.now());
|
|
|
- }
|
|
|
- } else {
|
|
|
+ if (refundNotifyReqBO.getStatus() == 2 || refundNotifyReqBO.getStatus() == 4) {
|
|
|
+ refundRecordDO.setRefundStatus(RefundStatusEnum.REFUND.getStatus());
|
|
|
+ refundRecordDO.setResult("退款成功");
|
|
|
+ if (StrUtil.isBlank(refundRecordDO.getRefundNo())) {
|
|
|
+ refundRecordDO.setRefundNo(refundNotifyReqBO.getRefundOrderId());
|
|
|
+ }
|
|
|
+ refundRecordDO.setChannelOrderNo(refundNotifyReqBO.getChannelOrderNo());
|
|
|
+ if (StrUtil.isNotBlank(refundNotifyReqBO.getRefundSuccTime())) {
|
|
|
+ try {
|
|
|
+ refundRecordDO.setRefundTime(DateUtil.toLocalDateTime(DateUtil.parseDate(refundNotifyReqBO.getRefundSuccTime())));
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("支付平台返回的退款时间转换错误{}", refundNotifyReqBO.getRefundSuccTime());
|
|
|
refundRecordDO.setRefundTime(LocalDateTime.now());
|
|
|
}
|
|
|
- //变更状态
|
|
|
- tradeRefundRepositoryService.updateRefundRecord(refundRecordDO);
|
|
|
- if (ObjectUtil.equal(refundRecordDO.getRefundType(), REFUND_RECORD_TYPE_AUTO)) {
|
|
|
- //自动退款订单
|
|
|
- TradeOrderPayDO payOrder = tradeOrderRepositoryService.getPayOrderById(refundRecordDO.getOrderPayId());
|
|
|
- payOrder.setPayStatus(PaymentStatusEnum.AUTO_REFUND.getStatus());
|
|
|
- tradeOrderRepositoryService.updatePayOrderStatus(payOrder);
|
|
|
- } else if (ObjectUtil.equal(refundRecordDO.getRefundType(), REFUND_RECORD_TYPE_MARKETING)) {
|
|
|
- //营销政策退款
|
|
|
- afterMarketingRefundFromPayPlatSuccess(refundRecordDO);
|
|
|
- } else if (ObjectUtil.equal(refundRecordDO.getRefundType(), REFUND_RECORD_TYPE_SERVICE)) {
|
|
|
- //售后退款
|
|
|
- afterServiceRefundFromPayPlatSuccess(refundRecordDO);
|
|
|
- } else if (ObjectUtil.equal(refundRecordDO.getRefundType(), REFUND_RECORD_TYPE_SUPP_TICKET)) {
|
|
|
- //补票退款
|
|
|
- afterSuppTicketRefundFromPayPlatSuccess(refundRecordDO);
|
|
|
- } else if (ObjectUtils.equalsAny(refundRecordDO.getRefundType(), REFUND_RECORD_TYPE_GUIDE_PLAT, REFUND_RECORD_TYPE_GUIDE_INNER)) {
|
|
|
- //导游代退
|
|
|
+ } else {
|
|
|
+ refundRecordDO.setRefundTime(LocalDateTime.now());
|
|
|
+ }
|
|
|
+ //变更状态
|
|
|
+ tradeRefundRepositoryService.updateRefundRecord(refundRecordDO);
|
|
|
+ if (ObjectUtil.equal(refundRecordDO.getRefundType(), REFUND_RECORD_TYPE_AUTO)) {
|
|
|
+ //自动退款订单
|
|
|
+ TradeOrderPayDO payOrder = tradeOrderRepositoryService.getPayOrderById(refundRecordDO.getOrderPayId());
|
|
|
+ payOrder.setPayStatus(PaymentStatusEnum.AUTO_REFUND.getStatus());
|
|
|
+ tradeOrderRepositoryService.updatePayOrderStatus(payOrder);
|
|
|
+ } else if (ObjectUtil.equal(refundRecordDO.getRefundType(), REFUND_RECORD_TYPE_MARKETING)) {
|
|
|
+ //营销政策退款
|
|
|
+ afterMarketingRefundFromPayPlatSuccess(refundRecordDO);
|
|
|
+ } else if (ObjectUtil.equal(refundRecordDO.getRefundType(), REFUND_RECORD_TYPE_SERVICE)) {
|
|
|
+ //售后退款
|
|
|
+ afterServiceRefundFromPayPlatSuccess(refundRecordDO);
|
|
|
+ } else if (ObjectUtil.equal(refundRecordDO.getRefundType(), REFUND_RECORD_TYPE_SUPP_TICKET)) {
|
|
|
+ //补票退款
|
|
|
+ afterSuppTicketRefundFromPayPlatSuccess(refundRecordDO);
|
|
|
+ } else if (ObjectUtils.equalsAny(refundRecordDO.getRefundType(), REFUND_RECORD_TYPE_GUIDE_PLAT, REFUND_RECORD_TYPE_GUIDE_INNER)) {
|
|
|
+ //导游代退
|
|
|
// afterGuideRefundFromPayPlatSuccess(refundRecordDO);
|
|
|
- } else {
|
|
|
- RefundDO refundDO = tradeRefundRepositoryService.getById(refundRecordDO.getRefundId());
|
|
|
- afterRefundFromPayPlatSuccess(refundDO);
|
|
|
- }
|
|
|
-
|
|
|
} else {
|
|
|
- refundRecordDO.setRefundStatus(RefundStatusEnum.REFUND_FAIL.getStatus());
|
|
|
- refundRecordDO.setResult(refundNotifyReqBO.getChannelErrMsg());
|
|
|
- //变更状态
|
|
|
- tradeRefundRepositoryService.updateRefundRecord(refundRecordDO);
|
|
|
- if (refundRecordDO.getRefundId() == null || ObjectUtils.equalsAny(refundRecordDO.getRefundType(), REFUND_RECORD_TYPE_SERVICE
|
|
|
- , REFUND_RECORD_TYPE_GUIDE_PLAT, REFUND_RECORD_TYPE_GUIDE_INNER)) {
|
|
|
- //自动退款订单\营销政策退款\售后退款\补票退款\导游代退,暂时不处理
|
|
|
+ RefundDO refundDO = tradeRefundRepositoryService.getById(refundRecordDO.getRefundId());
|
|
|
+ afterRefundFromPayPlatSuccess(refundDO);
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+ refundRecordDO.setRefundStatus(RefundStatusEnum.REFUND_FAIL.getStatus());
|
|
|
+ refundRecordDO.setResult(refundNotifyReqBO.getChannelErrMsg());
|
|
|
+ //变更状态
|
|
|
+ tradeRefundRepositoryService.updateRefundRecord(refundRecordDO);
|
|
|
+ if (refundRecordDO.getRefundId() == null || ObjectUtils.equalsAny(refundRecordDO.getRefundType(), REFUND_RECORD_TYPE_SERVICE
|
|
|
+ , REFUND_RECORD_TYPE_GUIDE_PLAT, REFUND_RECORD_TYPE_GUIDE_INNER)) {
|
|
|
+ //自动退款订单\营销政策退款\售后退款\补票退款\导游代退,暂时不处理
|
|
|
// TradeOrderPayDO payOrder = tradeOrderRepositoryService.getPayOrderById(refundRecordDO.getOrderPayId());
|
|
|
- } else {
|
|
|
- RefundDO refundDO = tradeRefundRepositoryService.getById(refundRecordDO.getRefundId());
|
|
|
- afterRefundFromPayPlatFail(refundDO);
|
|
|
- }
|
|
|
+ } else {
|
|
|
+ RefundDO refundDO = tradeRefundRepositoryService.getById(refundRecordDO.getRefundId());
|
|
|
+ afterRefundFromPayPlatFail(refundDO);
|
|
|
}
|
|
|
- });
|
|
|
+ }
|
|
|
+ TenantContextHolder.setIgnore(false);
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
- log.error("退款通知处理异常:" + refundNotifyReqBO.getMchOrderNo(), e);
|
|
|
+ log.error("退款通知处理异常:" + mchOrderNo, e);
|
|
|
} finally {
|
|
|
if (lock.isLocked() && lock.isHeldByCurrentThread()) {
|
|
|
lock.unlock();
|
|
|
@@ -680,17 +680,17 @@ public class TradeRefundServiceImpl implements TradeRefundService {
|
|
|
TradeOrderDO tradeOrderDO = tradeOrderRepositoryService.getById(refundCreateReqDTO.getOrderId());
|
|
|
List<TradeDetailDO> tradeDetailList2 = tradeOrderRepositoryService.queryYcDetailByOrderId(refundCreateReqDTO.getOrderId());
|
|
|
int num = tradeDetailList2.size();
|
|
|
- long between = DateUtil.between(new Date(),tradeOrderDO.getTravelDate(), DateUnit.DAY,false);
|
|
|
+ long between = DateUtil.between(new Date(), tradeOrderDO.getTravelDate(), DateUnit.DAY, false);
|
|
|
BigDecimal damaged;
|
|
|
- if(between>21){
|
|
|
- damaged = new BigDecimal(500).multiply(new BigDecimal( num));
|
|
|
+ if (between > 21) {
|
|
|
+ damaged = new BigDecimal(500).multiply(new BigDecimal(num));
|
|
|
// if(tradeOrderDO.getSellMethod()==3){
|
|
|
// damaged = BigDecimal.ZERO;
|
|
|
// }
|
|
|
- }else if(between>15){
|
|
|
- damaged = tradeOrderDO.getPayAmount().multiply(new BigDecimal("0.2"));
|
|
|
- }else{
|
|
|
- damaged = tradeOrderDO.getPayAmount();
|
|
|
+ } else if (between > 15) {
|
|
|
+ damaged = tradeOrderDO.getPayAmount().multiply(new BigDecimal("0.2"));
|
|
|
+ } else {
|
|
|
+ damaged = tradeOrderDO.getPayAmount();
|
|
|
}
|
|
|
tradeOrderDO.setDamaged(damaged);
|
|
|
tradeOrderDO.setDamagedStatus(1);
|
|
|
@@ -716,7 +716,7 @@ public class TradeRefundServiceImpl implements TradeRefundService {
|
|
|
//获取当前可退金额
|
|
|
BigDecimal orderApplyRefundAmount = tradeRefundRepositoryService.getOrderApplyRefundAmount(refundCreateReqDTO.getOrderId());
|
|
|
BigDecimal canRefundAmount = tradeOrderDO.getPayAmount().subtract(orderApplyRefundAmount);
|
|
|
- if(canRefundAmount.compareTo(new BigDecimal(5)) <= 0) {//测试使用,小于元表示是测试订单,不扣损
|
|
|
+ if (canRefundAmount.compareTo(new BigDecimal(5)) <= 0) {//测试使用,小于元表示是测试订单,不扣损
|
|
|
damaged = BigDecimal.ZERO;
|
|
|
}
|
|
|
respDTO.setOrderId(refundCreateReqDTO.getOrderId());
|
|
|
@@ -1492,10 +1492,7 @@ public class TradeRefundServiceImpl implements TradeRefundService {
|
|
|
RLock lock = redissonClient.getLock(lockKey);
|
|
|
try {
|
|
|
if (lock.tryLock(60, 90, TimeUnit.SECONDS)) {
|
|
|
- BigDecimal totalRefundAmount = tradeRefundRepositoryService.getRefundRecordAmount(refundDO.getId());
|
|
|
- if (refundDO.getRefundAmount().equals(totalRefundAmount)) {
|
|
|
- afterRefundSuccess(refundDO);
|
|
|
- }
|
|
|
+ afterRefundSuccess(refundDO);
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
log.error("退款单更新异常refundId:" + refundDO.getId(), e);
|
|
|
@@ -1560,7 +1557,7 @@ public class TradeRefundServiceImpl implements TradeRefundService {
|
|
|
tradeDetailDO.setId(MapUtil.getLong(item, "detail_id"));
|
|
|
int totalCount = MapUtil.getInt(item, "totalCount");
|
|
|
int refundCount = MapUtil.getInt(item, "refundCount");
|
|
|
- int voucherStatus = totalCount == refundCount ? VoucherStatusEnum.REFUND.getStatus() : VoucherStatusEnum.PART_REFUND.getStatus();
|
|
|
+ int voucherStatus = VoucherStatusEnum.REFUND.getStatus();
|
|
|
int refundStatus = totalCount == refundCount ? 1 : 2;
|
|
|
tradeDetailDO.setVoucherStatus(voucherStatus);
|
|
|
tradeDetailDO.setRefundStatus(refundStatus);
|