diff --git a/src/main/java/com/sczx/pay/service/WechatPayService.java b/src/main/java/com/sczx/pay/service/WechatPayService.java index 09d3226..67f0445 100644 --- a/src/main/java/com/sczx/pay/service/WechatPayService.java +++ b/src/main/java/com/sczx/pay/service/WechatPayService.java @@ -294,27 +294,33 @@ public class WechatPayService { */ private void recordRefundInfo(RefundRequest request, CompanyWechatConfig companyConfig, Map result,BigDecimal totalFee) { try { - RefundRecord refundRecord = new RefundRecord(); - refundRecord.setCompanyId(request.getCompanyId()); - refundRecord.setOutTradeNo(request.getOutTradeNo()); - refundRecord.setOutRefundNo(request.getOutRefundNo()); - refundRecord.setTotalFee(totalFee); - refundRecord.setRefundFee(new BigDecimal(request.getRefundFee()).divide(new BigDecimal(100))); // 转换为元 - refundRecord.setRefundDesc(request.getRefundDesc()); - refundRecord.setCreateTime(new Date()); - refundRecord.setUpdateTime(new Date()); + RefundRecord refundRecord = refundRecordMapper.getRefundRecordByOutRefundNo(request.getOutRefundNo()); + if (refundRecord == null) { + refundRecord = new RefundRecord(); + refundRecord.setCompanyId(request.getCompanyId()); + refundRecord.setOutTradeNo(request.getOutTradeNo()); + refundRecord.setOutRefundNo(request.getOutRefundNo()); + refundRecord.setTotalFee(totalFee); + refundRecord.setRefundFee(new BigDecimal(request.getRefundFee()).divide(new BigDecimal(100))); // 转换为元 + refundRecord.setRefundDesc(request.getRefundDesc()); + refundRecord.setCreateTime(new Date()); + refundRecord.setUpdateTime(new Date()); - if ("SUCCESS".equals(result.get("result_code"))) { - refundRecord.setRefundStatus("PROCESSING"); // 退款处理中 - refundRecord.setRefundStatusDesc("退款处理中"); - refundRecord.setRefundId(result.get("refund_id")); - } else { - refundRecord.setRefundStatus("FAIL"); // 退款失败 - refundRecord.setRefundStatusDesc(result.get("err_code_des")); + if ("SUCCESS".equals(result.get("result_code"))) { + refundRecord.setRefundStatus("PROCESSING"); // 退款处理中 + refundRecord.setRefundStatusDesc("退款处理中"); + refundRecord.setRefundId(result.get("refund_id")); + } else { + refundRecord.setRefundStatus("FAIL"); // 退款失败 + refundRecord.setRefundStatusDesc(result.get("err_code_des")); + } + + refundRecordMapper.insertRefundRecord(refundRecord); + logger.info("退款记录已保存,退款单号: {}", request.getOutRefundNo()); + } else{ + logger.info("退款记录已存在,退款单号: {}", request.getOutRefundNo()); } - refundRecordMapper.insertRefundRecord(refundRecord); - logger.info("退款记录已保存,退款单号: {}", request.getOutRefundNo()); } catch (Exception e) { logger.error("保存退款记录异常,退款单号: {}", request.getOutRefundNo(), e); } diff --git a/src/main/java/com/sczx/pay/service/impl/AlipayServiceImpl.java b/src/main/java/com/sczx/pay/service/impl/AlipayServiceImpl.java index bf11cae..49122f2 100644 --- a/src/main/java/com/sczx/pay/service/impl/AlipayServiceImpl.java +++ b/src/main/java/com/sczx/pay/service/impl/AlipayServiceImpl.java @@ -15,6 +15,7 @@ import com.sczx.pay.mapper.PaymentRecordMapper; import com.sczx.pay.mapper.RefundRecordMapper; import com.sczx.pay.service.AlipayService; import com.sczx.pay.utils.AlipaySdkUtil; +import com.sczx.pay.utils.ThreadPoolUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -277,6 +278,16 @@ public class AlipayServiceImpl implements AlipayService { response.setSuccess(true); response.setCode("SUCCESS"); response.setMessage("退款成功"); + ThreadPoolUtils.getThreadPool().execute(() -> { + refundRecordMapper.updateRefundStatus( + refundQueryRequest.getOutRequestNo(), + refundQueryResponse.getRefundStatus(), + refundQueryResponse.getRefundReason(), + refundQueryRequest.getOutRequestNo(), + new Date(),// 退款成功时间 + new Date() // 更新时间 + ); + }); } else { response.setSuccess(false); response.setCode("FAIL"); @@ -395,7 +406,7 @@ public class AlipayServiceImpl implements AlipayService { refundStatus, statusDesc, outRequestNo, - "SUCCESS".equals(refundStatus) ? new Date() : null, // 退款成功时间 + "REFUND_SUCCESS".equals(refundStatus) ? new Date() : null, // 退款成功时间 new Date() // 更新时间 ); @@ -442,26 +453,28 @@ public class AlipayServiceImpl implements AlipayService { */ private void recordRefundInfo(AlipayRefundRequest request) { try { - PaymentRecord paymentRecord = paymentRecordMapper.getPaymentRecordByOutTradeNo(request.getOutTradeNo()); + RefundRecord refundRecord = refundRecordMapper.getRefundRecordByOutRefundNo(request.getOutRequestNo()); + if(refundRecord == null){ + PaymentRecord paymentRecord = paymentRecordMapper.getPaymentRecordByOutTradeNo(request.getOutTradeNo()); + refundRecord = new RefundRecord(); + refundRecord.setCompanyId(request.getCompanyId()); + refundRecord.setOutTradeNo(request.getOutTradeNo()); + refundRecord.setOutRefundNo(request.getOutRequestNo()); + refundRecord.setTotalFee(paymentRecord.getTotalFee()); + refundRecord.setRefundFee(new BigDecimal(request.getRefundAmount())); // 转换为元 + refundRecord.setRefundDesc(request.getRefundReason()); + refundRecord.setCreateTime(new Date()); + refundRecord.setUpdateTime(new Date()); - RefundRecord refundRecord = new RefundRecord(); - refundRecord.setCompanyId(request.getCompanyId()); - refundRecord.setOutTradeNo(request.getOutTradeNo()); - refundRecord.setOutRefundNo(request.getOutRequestNo()); - refundRecord.setTotalFee(paymentRecord.getTotalFee()); - refundRecord.setRefundFee(new BigDecimal(request.getRefundAmount())); // 转换为元 - refundRecord.setRefundDesc(request.getRefundReason()); - refundRecord.setCreateTime(new Date()); - refundRecord.setUpdateTime(new Date()); - - refundRecord.setRefundStatus("PROCESSING"); // 退款处理中 - refundRecord.setRefundStatusDesc("退款处理中"); - refundRecord.setRefundId(request.getOutRequestNo()); - refundRecord.setPayChannel(PaymentRecord.PayChannel.ALIPAY.name()); - - - refundRecordMapper.insertRefundRecord(refundRecord); - log.info("退款记录已保存,退款单号: {}", request.getOutRequestNo()); + refundRecord.setRefundStatus("PROCESSING"); // 退款处理中 + refundRecord.setRefundStatusDesc("退款处理中"); + refundRecord.setRefundId(request.getOutRequestNo()); + refundRecord.setPayChannel(PaymentRecord.PayChannel.ALIPAY.name()); + refundRecordMapper.insertRefundRecord(refundRecord); + log.info("退款记录已保存,退款单号: {}", request.getOutRequestNo()); + }else { + log.info("退款记录已存在,退款单号: {}", request.getOutRequestNo()); + } } catch (Exception e) { log.error("保存退款记录异常,退款单号: {}", request.getOutRequestNo(), e); } diff --git a/src/main/java/com/sczx/pay/utils/ThreadPoolUtils.java b/src/main/java/com/sczx/pay/utils/ThreadPoolUtils.java new file mode 100644 index 0000000..0993588 --- /dev/null +++ b/src/main/java/com/sczx/pay/utils/ThreadPoolUtils.java @@ -0,0 +1,57 @@ +package com.sczx.pay.utils; + +import org.springframework.stereotype.Service; + +import java.util.concurrent.*; + +/** + * 线程池工具类,用于执行异步任务 + * Created by zengji on 2019/5/13. + * + */ +@Service +public class ThreadPoolUtils { + + public static ThreadPoolExecutor threadPool; + //核心线程大小 + private static int corePoolSize=120; + //最大线程个数 + private static int maximumPoolSize=180; + //空闲线程存活时间 + private static long keepAliveTime=300; + //队列容量 + private static int capacity=200; + + /** + * 无返回值 + */ + public static void execute(Runnable runnable){ + getThreadPool().execute(runnable); + } + + /** + * 有返回值 + */ + public static Future submit(Callable callable){ + return getThreadPool().submit(callable); + } + + + /** + * dcs获取线程池 + * @return 线程池对象 + */ + public static ThreadPoolExecutor getThreadPool() { + if (threadPool != null) { + return threadPool; + } else { + synchronized (ThreadPoolUtils.class) { + if (threadPool == null) { + threadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, + new LinkedBlockingQueue<>(capacity), new ThreadPoolExecutor.CallerRunsPolicy()); + } + return threadPool; + } + } + } +}