Browse Source

优化扫码订单轮询上报功能

zk 1 year ago
parent
commit
465f1b9439

+ 9 - 2
app/src/main/java/com/datarecovery/master/data/repositories/MemberRepository.java

@@ -10,6 +10,7 @@ import com.datarecovery.master.data.api.response.MemberPayResponse;
 import com.datarecovery.master.data.api.response.PaymentStatusResponse;
 import com.datarecovery.master.module.member.MemberType;
 import com.datarecovery.master.utils.BoxingUtil;
+import com.datarecovery.master.utils.OrderReportHelper;
 import com.datarecovery.master.utils.RxHttpHandler;
 
 import java.util.concurrent.TimeUnit;
@@ -54,20 +55,26 @@ public class MemberRepository {
      * 3-支付关闭
      * 4-已退款
      */
-    public Single<Boolean> getPayStatus(String orderId) {
+    public Single<Boolean> getPayStatus(String orderId, int maxReyTimes, long retryInterval) {
         return atmobApi.getPayStatus(new PaymentStatusRequest(orderId))
                 .compose(RxHttpHandler.handle(false))
                 .map(PaymentStatusResponse::getStatus)
+                .doOnSuccess(status -> {
+                    if (status != 0 && status != 1) {
+                        OrderReportHelper.removeOderId(orderId);
+                    }
+                })
                 .map(integer -> {
                     if (BoxingUtil.boxing(integer) == 0 || BoxingUtil.boxing(integer) == 1) {
                         throw new Exception("支付未完成, status ==> " + integer);
                     }
                     return integer;
                 })
-                .retryWhen(RxJavaUtil.retryWhen(null, 100, 3, TimeUnit.SECONDS))
+                .retryWhen(RxJavaUtil.retryWhen(null, maxReyTimes, retryInterval, TimeUnit.SECONDS))
                 .onErrorReturnItem(0)
                 .map(integer -> integer == 2)
                 .compose(RxJavaUtil.SingleSchedule.io2Main())
                 .doOnTerminate(deviceFuncRepository::refreshFuncAuths);
     }
+
 }

+ 1 - 1
app/src/main/java/com/datarecovery/master/module/member/MemberViewModel.java

@@ -454,7 +454,7 @@ public class MemberViewModel extends BaseViewModel {
         if (memberBean != null && isReportPay) {
             OrderReportHelper.recordOrderId(memberBean.getAmount(), orderId, payWay, memberBean.getName());
         }
-        return memberRepository.getPayStatus(orderId)
+        return memberRepository.getPayStatus(orderId, 100, 3)
                 .doOnSubscribe(disposable -> {
                     if (showLoading) {
                         showLoadingEvent.setValue(true);

+ 18 - 10
app/src/main/java/com/datarecovery/master/utils/OrderReportHelper.java

@@ -12,6 +12,7 @@ import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
 
 import java.util.HashMap;
+import java.util.Iterator;
 
 import javax.inject.Singleton;
 
@@ -31,7 +32,7 @@ public class OrderReportHelper {
     private static Gson gson;
     private static MemberRepository memberRepository;
 
-    private static final long MAX_QUERY_TIME = 60 * 1000L;
+    private static final long MAX_QUERY_TIME = 30 * 60 * 1000L;
 
     private OrderReportHelper() {
 
@@ -58,16 +59,22 @@ public class OrderReportHelper {
         if (notReportedPayMap.size() == 0 || memberRepository == null) {
             return;
         }
-        for (String orderId : notReportedPayMap.keySet()) {
+        Iterator<String> iterator = notReportedPayMap.keySet().iterator();
+        while (iterator.hasNext()) {
+            String orderId = iterator.next();
             PayInfo payInfo = notReportedPayMap.get(orderId);
             if (payInfo == null) {
                 continue;
             }
+            if (TextUtils.isEmpty(orderId)) {
+                return;
+            }
             if (System.currentTimeMillis() - payInfo.getPayTime() > MAX_QUERY_TIME) {
-                removeOderId(orderId);
+                iterator.remove();
+                save();
                 continue;
             }
-            memberRepository.getPayStatus(orderId).subscribe(new SingleObserver<Boolean>() {
+            memberRepository.getPayStatus(orderId, 10, 3).subscribe(new SingleObserver<Boolean>() {
                 @Override
                 public void onSubscribe(@NonNull Disposable d) {
 
@@ -77,7 +84,7 @@ public class OrderReportHelper {
                 public void onSuccess(@NonNull Boolean paySuccess) {
                     Log.d(TAG, "onSuccess: " + paySuccess + "--orderId:" + orderId);
                     if (BoxingUtil.boxing(paySuccess)) {
-//                        EventHelper.reportPay(payInfo.getPayAmount(), payInfo.getOrderId(), payInfo.getPayWay(), payInfo.getProduct());
+                        EventHelper.reportPay(payInfo.getPayAmount(), payInfo.getOrderId(), payInfo.getPayWay(), payInfo.getProduct());
                     }
                 }
 
@@ -85,11 +92,8 @@ public class OrderReportHelper {
                 public void onError(@NonNull Throwable e) {
 
                 }
-
-
             });
         }
-
     }
 
     private static HashMap<String, PayInfo> toGsonMap(String jsonStr) {
@@ -112,9 +116,10 @@ public class OrderReportHelper {
             return;
         }
         notReportedPayMap.put(orderId, new PayInfo(payAmount, orderId, payWay, product));
-        KVUtils.getDefault().putString(RECORD_PAY_ORDER_ID_LIST, gson.toJson(notReportedPayMap));
+        save();
     }
 
+
     public static void removeOderId(String orderId) {
         if (TextUtils.isEmpty(orderId)) {
             return;
@@ -122,9 +127,12 @@ public class OrderReportHelper {
         boolean contains = notReportedPayMap.containsKey(orderId);
         if (contains) {
             notReportedPayMap.remove(orderId);
-            KVUtils.getDefault().putString(RECORD_PAY_ORDER_ID_LIST, gson.toJson(notReportedPayMap));
+            save();
         }
     }
 
+    private static void save() {
+        KVUtils.getDefault().putString(RECORD_PAY_ORDER_ID_LIST, gson.toJson(notReportedPayMap));
+    }
 
 }