package com.bgycc.smartcanteen.data; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import androidx.annotation.NonNull; import androidx.room.RoomDatabase; import androidx.sqlite.db.SupportSQLiteDatabase; import com.bgycc.smartcanteen.entity.PayData; import com.blankj.utilcode.util.LogUtils; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; // 数据库启动时,将标记为"在线支付"的订单统一改为"离线支付" // 避免某个在线支付订单在支付过程中App因特殊状况强制退出导致漏支付 public class ForceToPayOffline extends RoomDatabase.Callback { private static final String TAG = "ForceToPayOffline"; private static final int UPDATE_MAX_TIMES = 5; @Override public void onOpen(@NonNull SupportSQLiteDatabase db) { Cursor cursor = db.query("select * from " + PayData.TABLE_NAME + " where payState == 0"); if (cursor == null || cursor.getCount() <= 0) return; cursor.moveToFirst(); List<PayData> list = selectPayOnlineData(cursor); forceToPayOffline(db, list); } @NotNull private static List<PayData> selectPayOnlineData(Cursor cursor) { List<PayData> list = new ArrayList<>(); do { PayData payData = new PayData(); payData.setEquipmentNo(cursor.getString(cursor.getColumnIndex("equipmentNo"))); payData.setPayCode(cursor.getString(cursor.getColumnIndex("payCode"))); payData.setTerminalType(cursor.getString(cursor.getColumnIndex("terminalType"))); payData.setTime(cursor.getLong(cursor.getColumnIndex("time"))); payData.setPayState(cursor.getInt(cursor.getColumnIndex("payState"))); list.add(payData); } while (cursor.moveToNext()); return list; } private static void forceToPayOffline(@NonNull SupportSQLiteDatabase db, List<PayData> list) { StringBuilder ids = new StringBuilder(); db.beginTransaction(); try { for (PayData payData : list) { payData.payOffline(); ContentValues values = new ContentValues(); values.put("payState", payData.getPayState()); int r; int count = 0; do { r = db.update(PayData.TABLE_NAME, SQLiteDatabase.CONFLICT_REPLACE, values, "payCode=?", new String[]{payData.getPayCode()}); count++; if (count == UPDATE_MAX_TIMES) { LogUtils.file(TAG, "订单: " + payData.toString() + "支付状态修改异常"); } } while (r <= 0 && count < UPDATE_MAX_TIMES); ids.append(payData.getPayCode()) .append(","); } db.setTransactionSuccessful(); } catch (Exception e) { LogUtils.e(TAG, "异常在线支付订单处理失败: " + e.getMessage(), e); } db.endTransaction(); if (ids.length() > 0) { LogUtils.d(TAG, "由于设备异常关闭,订单号: " + ids.substring(0, ids.length() - 1) + "已强制标记为离线支付"); } } }