|
@@ -1,6 +1,7 @@
|
|
|
package com.jzg.quotation.ansheng.crawler.service.impl;
|
|
package com.jzg.quotation.ansheng.crawler.service.impl;
|
|
|
|
|
|
|
|
import cn.hutool.core.collection.CollectionUtil;
|
|
import cn.hutool.core.collection.CollectionUtil;
|
|
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
import com.alibaba.fastjson2.JSONObject;
|
|
import com.alibaba.fastjson2.JSONObject;
|
|
|
import com.jzg.commons.constants.dict.InsOrderStatusEnum;
|
|
import com.jzg.commons.constants.dict.InsOrderStatusEnum;
|
|
|
import com.jzg.commons.entity.quote.vo.QuoteVo;
|
|
import com.jzg.commons.entity.quote.vo.QuoteVo;
|
|
@@ -37,6 +38,7 @@ import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
import java.util.Optional;
|
|
import java.util.Optional;
|
|
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
import java.util.regex.Matcher;
|
|
import java.util.regex.Matcher;
|
|
|
import java.util.regex.Pattern;
|
|
import java.util.regex.Pattern;
|
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
@@ -59,6 +61,14 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
|
|
|
|
|
|
|
|
private final AnShengCrawlerQuoteProcessService anShengCrawlerQuoteProcessService;
|
|
private final AnShengCrawlerQuoteProcessService anShengCrawlerQuoteProcessService;
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+ /** 最大重试次数:获取支付链接 */
|
|
|
|
|
+ private static final int MAX_PAY_LINK_RETRY = 15;
|
|
|
|
|
+ /** 每次重试间隔休眠毫秒:3秒 */
|
|
|
|
|
+ private static final long RETRY_SLEEP_MILLIS = 3000L;
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
@Override
|
|
@Override
|
|
|
public void login(LoginBase loginBase) {
|
|
public void login(LoginBase loginBase) {
|
|
|
anShengCrawlerLoginService.login(loginBase.getUsername(), loginBase.getPassword());
|
|
anShengCrawlerLoginService.login(loginBase.getUsername(), loginBase.getPassword());
|
|
@@ -248,40 +258,53 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
|
|
|
return underwritingResultsVo;
|
|
return underwritingResultsVo;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 调用接口的业务方法(有返回值)
|
|
|
|
|
|
|
+ * 循环重试获取支付链接
|
|
|
|
|
+ * @param paymentLinkVo 请求参数
|
|
|
|
|
+ * @return 支付链接结果
|
|
|
*/
|
|
*/
|
|
|
private PaymentLinkResultsVo loopAcquisitionPaymentLink(PaymentLinkVo paymentLinkVo) {
|
|
private PaymentLinkResultsVo loopAcquisitionPaymentLink(PaymentLinkVo paymentLinkVo) {
|
|
|
- int retryCount = 0;
|
|
|
|
|
- int maxRetry = 15;
|
|
|
|
|
- long sleepTime = 3000;
|
|
|
|
|
- PaymentLinkResultsVo paymentLink = null;
|
|
|
|
|
- while (retryCount < maxRetry) {
|
|
|
|
|
|
|
+ if (paymentLinkVo == null || paymentLinkVo.getOrder() == null) {
|
|
|
|
|
+ log.error("获取支付链接入参为空");
|
|
|
|
|
+ return new PaymentLinkResultsVo();
|
|
|
|
|
+ }
|
|
|
|
|
+ String ordersNo = paymentLinkVo.getOrder().getOrdersNo();
|
|
|
|
|
+ PaymentLinkResultsVo linkResult = null;
|
|
|
|
|
+ for (int retryCount = 0; retryCount < MAX_PAY_LINK_RETRY; retryCount++) {
|
|
|
try {
|
|
try {
|
|
|
- paymentLink = getPaymentLink(paymentLinkVo);
|
|
|
|
|
- log.info("第{}次获取支付链接信息:{}", retryCount, JSONObject.toJSONString(paymentLink));
|
|
|
|
|
- if (paymentLink != null && StringUtils.isNotEmpty(paymentLink.getPaymentLink())) {
|
|
|
|
|
|
|
+ linkResult = getPaymentLink(paymentLinkVo);
|
|
|
|
|
+ log.info("订单[{}]第{}次获取支付链接,返回结果:{}", ordersNo, retryCount + 1, JSONObject.toJSONString(linkResult));
|
|
|
|
|
+ if (linkResult != null && StrUtil.isNotBlank(linkResult.getPaymentLink())) {
|
|
|
|
|
+ log.info("订单[{}]第{}次成功获取支付链接", ordersNo, retryCount + 1);
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
- Thread.sleep(sleepTime);
|
|
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
|
|
- log.error("安盛支付二维码异常信息:{}",e.getMessage());
|
|
|
|
|
- try {
|
|
|
|
|
- Thread.sleep(sleepTime);
|
|
|
|
|
- } catch (InterruptedException ie) {
|
|
|
|
|
- Thread.currentThread().interrupt();
|
|
|
|
|
|
|
+ log.error("订单[{}]第{}次调用获取支付链接接口异常", ordersNo, retryCount + 1, e);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (retryCount != MAX_PAY_LINK_RETRY - 1) {
|
|
|
|
|
+ boolean sleepSuccess = sleep(RETRY_SLEEP_MILLIS);
|
|
|
|
|
+ if (!sleepSuccess) {
|
|
|
|
|
+ log.warn("订单[{}]支付链接重试休眠被中断,终止重试", ordersNo);
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
- } finally {
|
|
|
|
|
- retryCount++;
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- return paymentLink;
|
|
|
|
|
|
|
+ return linkResult == null ? new PaymentLinkResultsVo() : linkResult;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * @param millis 休眠毫秒数
|
|
|
|
|
+ * @return true=正常休眠完成;false=被中断
|
|
|
|
|
+ */
|
|
|
|
|
+ private boolean sleep(long millis) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ TimeUnit.MILLISECONDS.sleep(millis);
|
|
|
|
|
+ return true;
|
|
|
|
|
+ } catch (InterruptedException ie) {
|
|
|
|
|
+ Thread.currentThread().interrupt();
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -324,7 +347,6 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
|
|
|
// 获取支付链接
|
|
// 获取支付链接
|
|
|
AnShengCrawlerPaymentRequest anShengCrawlerPaymentRequest = new AnShengCrawlerPaymentRequest(anShengCrawlerOrder, userDetailResponse.getDepartmentCode(), anShengCrawlerOrder.getTotalPremium());
|
|
AnShengCrawlerPaymentRequest anShengCrawlerPaymentRequest = new AnShengCrawlerPaymentRequest(anShengCrawlerOrder, userDetailResponse.getDepartmentCode(), anShengCrawlerOrder.getTotalPremium());
|
|
|
String paymentUrl = anShengCrawlerRequestComponent.payment(anShengCrawlerPaymentRequest, httpHeaders);
|
|
String paymentUrl = anShengCrawlerRequestComponent.payment(anShengCrawlerPaymentRequest, httpHeaders);
|
|
|
- log.info("获取安盛支付二维码地址长度:{}", StringUtils.isNotEmpty(paymentUrl) ? paymentUrl.length() : "无法获取支付链接");
|
|
|
|
|
return new PaymentLinkResultsVo(true, paymentUrl, "");
|
|
return new PaymentLinkResultsVo(true, paymentUrl, "");
|
|
|
}
|
|
}
|
|
|
|
|
|