|
|
@@ -5,6 +5,7 @@ namespace App\Services;
|
|
|
|
|
|
use App\Services\BaseService;
|
|
|
use App\Models\Collect;
|
|
|
+use App\Models\Recharge;
|
|
|
use Illuminate\Support\Facades\DB;
|
|
|
use Illuminate\Support\Collection;
|
|
|
use Illuminate\Support\Facades\Cache;
|
|
|
@@ -136,6 +137,105 @@ class CollectService extends BaseService
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * @description: 按会员补建或刷新待归集记录,不执行链上归集
|
|
|
+ * @param {*} $memberId
|
|
|
+ * @return array
|
|
|
+ */
|
|
|
+ public static function syncMemberCollectRecords($memberId)
|
|
|
+ {
|
|
|
+ $recharges = Recharge::where('member_id', $memberId)
|
|
|
+ ->where('status', Recharge::STATUS_SUCCESS)
|
|
|
+ ->where('type', Recharge::TYPE_AUTO)
|
|
|
+ ->orderByDesc('id')
|
|
|
+ ->get();
|
|
|
+
|
|
|
+ $result = [
|
|
|
+ 'success' => true,
|
|
|
+ 'member_id' => $memberId,
|
|
|
+ 'recharge_count' => $recharges->count(),
|
|
|
+ 'processed_count' => 0,
|
|
|
+ 'created_count' => 0,
|
|
|
+ 'updated_count' => 0,
|
|
|
+ 'skipped_count' => 0,
|
|
|
+ 'failed_count' => 0,
|
|
|
+ 'items' => [],
|
|
|
+ ];
|
|
|
+
|
|
|
+ if ($recharges->isEmpty()) {
|
|
|
+ $result['success'] = false;
|
|
|
+ $result['message'] = '未找到已确认的自动充值记录';
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
+
|
|
|
+ $seen = [];
|
|
|
+ foreach ($recharges as $recharge) {
|
|
|
+ $address = $recharge->to_address;
|
|
|
+ if (empty($address) || isset($seen[$address])) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ $seen[$address] = true;
|
|
|
+ $item = [
|
|
|
+ 'from_address' => $address,
|
|
|
+ 'recharge_txid' => $recharge->txid,
|
|
|
+ 'action' => 'pending',
|
|
|
+ 'collect_id' => null,
|
|
|
+ 'amount' => null,
|
|
|
+ 'error' => null,
|
|
|
+ ];
|
|
|
+
|
|
|
+ $openCollect = self::model()::where('from_address', $address)
|
|
|
+ ->whereIn('status', [self::model()::STATUS_STAY, self::model()::STATUS_START])
|
|
|
+ ->orderByDesc('id')
|
|
|
+ ->first();
|
|
|
+
|
|
|
+ if ($openCollect && intval($openCollect->status) === self::model()::STATUS_START) {
|
|
|
+ $item['action'] = 'skipped_started';
|
|
|
+ $item['collect_id'] = $openCollect->id;
|
|
|
+ $item['amount'] = $openCollect->amount;
|
|
|
+ $result['skipped_count']++;
|
|
|
+ $result['processed_count']++;
|
|
|
+ $result['items'][] = $item;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ $hadPending = $openCollect && intval($openCollect->status) === self::model()::STATUS_STAY;
|
|
|
+
|
|
|
+ try {
|
|
|
+ self::createCollect($address, $recharge->coin, $recharge->net);
|
|
|
+ $collect = self::model()::where('from_address', $address)
|
|
|
+ ->where('status', self::model()::STATUS_STAY)
|
|
|
+ ->orderByDesc('id')
|
|
|
+ ->first();
|
|
|
+
|
|
|
+ $item['action'] = $hadPending ? 'updated' : 'created';
|
|
|
+ $item['collect_id'] = $collect->id ?? null;
|
|
|
+ $item['amount'] = $collect->amount ?? null;
|
|
|
+
|
|
|
+ if ($hadPending) {
|
|
|
+ $result['updated_count']++;
|
|
|
+ } else {
|
|
|
+ $result['created_count']++;
|
|
|
+ }
|
|
|
+ } catch (\Throwable $e) {
|
|
|
+ $item['action'] = 'failed';
|
|
|
+ $item['error'] = $e->getMessage();
|
|
|
+ $result['failed_count']++;
|
|
|
+ }
|
|
|
+
|
|
|
+ $result['processed_count']++;
|
|
|
+ $result['items'][] = $item;
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($result['processed_count'] === 0) {
|
|
|
+ $result['success'] = false;
|
|
|
+ $result['message'] = '未找到可处理的充值地址';
|
|
|
+ }
|
|
|
+
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* @description: 处理待归集的
|
|
|
* @return {*}
|