RefundIntentService.java 1.4 KB

12345678910111213141516171819202122
  1. package com.cyksj.service.order;
  2. import com.cyksj.common.exception.BusinessRuntimeException;
  3. import lombok.RequiredArgsConstructor;
  4. import org.springframework.jdbc.core.JdbcTemplate;
  5. import org.springframework.stereotype.Service;
  6. import org.springframework.transaction.annotation.Transactional;
  7. import org.springframework.transaction.annotation.Propagation;
  8. import java.math.BigDecimal;
  9. import java.util.Map;
  10. @Service
  11. @RequiredArgsConstructor
  12. public class RefundIntentService {
  13. private final JdbcTemplate jdbc;
  14. /** Persist before any external payment call, even if the caller later rolls back. */
  15. @Transactional(propagation=Propagation.REQUIRES_NEW,rollbackFor=Throwable.class)
  16. public void bind(String refundNo, Long orderId, BigDecimal amount) {
  17. if(amount==null || amount.signum()<=0 || amount.stripTrailingZeros().scale()>0) throw BusinessRuntimeException.getInstance("退款金额必须为正整数分");
  18. jdbc.update("INSERT INTO payment_refund_intent(refund_no,order_id,amount) VALUES(?,?,?) ON DUPLICATE KEY UPDATE refund_no=VALUES(refund_no)",refundNo,orderId,amount);
  19. Map<String,Object> row=jdbc.queryForMap("SELECT order_id,amount FROM payment_refund_intent WHERE refund_no=? FOR UPDATE",refundNo);
  20. if(((Number)row.get("order_id")).longValue()!=orderId || new BigDecimal(row.get("amount").toString()).compareTo(amount)!=0) throw BusinessRuntimeException.getInstance("已有未核实退款请求,金额不可变更,请先核对渠道退款结果");
  21. }
  22. }