From 5edfd12deb166302708857515a833d1471a0f208 Mon Sep 17 00:00:00 2001
From: zuoxiao <lf_zuo@163.com>
Date: 星期三, 25 六月 2025 16:15:23 +0800
Subject: [PATCH] feat(database): 增加管理卡相关功能并优化数据库结构- 新增 ManagerCardBean 数据类用于管理卡信息 - 在 AppDataBase 中添加 ManagerCardDao 接口 - 实现管理卡的数据库迁移策略 - 优化支付方式 ID 类型,从 Long改为 String - 重构更新写卡和上报状态的逻辑,支持管理卡和用户卡
---
generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt | 14 +-
generallibrary/src/main/java/com/dayu/general/bean/db/ManagerCardBean.kt | 16 ++++
generallibrary/src/main/java/com/dayu/general/dao/ManagerCardDao.kt | 31 +++++++
generallibrary/src/main/java/com/dayu/general/dao/AppDataBase.kt | 4
generallibrary/src/main/java/com/dayu/general/activity/MainActivity.kt | 55 +++++++++----
generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt | 14 +-
generallibrary/src/main/java/com/dayu/general/bean/net/NewCardInfo.kt | 2
generallibrary/src/main/java/com/dayu/general/dao/BaseDaoSingleton.kt | 24 +++++
generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt | 2
generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt | 77 +++++++++++-------
10 files changed, 172 insertions(+), 67 deletions(-)
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt
index a2a3283..14a7cff 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt
@@ -43,7 +43,7 @@
// 鏀粯鏂瑰紡鐩稿叧灞炴��
private var paymentMethod: String = "鐜伴噾"
- private var paymentId: Long = 0
+ private var paymentId: String = ""
private var paymentMethodList: List<PaymentMethod> = listOf()
companion object {
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/MainActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/MainActivity.kt
index ef6d869..9c52341 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/MainActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/MainActivity.kt
@@ -294,7 +294,7 @@
override fun onNext(t: BaseResponse<String>) {
if (t.success) {
// 涓婃姤鎴愬姛锛屾洿鏂版湰鍦版暟鎹簱isReported涓簍rue
- updateCardReportedStatus(cardAddr, orderNumber)
+ updateCardReportedStatus(cardAddr, orderNumber, operationTypeCode)
} else {
// 涓婃姤澶辫触锛岃褰曢敊璇絾涓嶅奖鍝嶇敤鎴锋搷浣�
CrashReport.postCatchedException(Exception("涓婃姤鍐欏崱缁撴灉澶辫触: ${t.msg}"))
@@ -312,30 +312,49 @@
/**
* 鏇存柊鏈湴鏁版嵁搴撲腑鐨勪笂鎶ョ姸鎬�
- * 灏咰ardRegistrationBean涓殑isReported鐘舵�佽缃负true
+ * 鏍规嵁鎿嶄綔绫诲瀷鍒ゆ柇鏄洿鏂癕anagerCardBean杩樻槸CardRegistrationBean鐨刬sReported鐘舵�佷负true
*
* @param cardNumber 鍗″彿
* @param orderNumber 璁㈠崟鍙�
+ * @param operationTypeCode 鎿嶄綔绫诲瀷浠g爜
*/
- private fun updateCardReportedStatus(cardNumber: String, orderNumber: String = "") {
+ private fun updateCardReportedStatus(cardNumber: String, orderNumber: String = "", operationTypeCode: Int = -1) {
lifecycleScope.launch {
try {
- val cardRegistrationDao = BaseDaoSingleton.getInstance(this@MainActivity)
- .cardRegistrationDao()
-
- // 鏍规嵁璁㈠崟鍙锋煡鎵綜ardRegistrationBean璁板綍
- val cardRegistration = if (orderNumber.isNotEmpty()) {
- cardRegistrationDao.getByOrderId(orderNumber)
- } else {
- // 濡傛灉娌℃湁璁㈠崟鍙凤紝鍒欓�氳繃鍗″彿鏌ユ壘
- cardRegistrationDao.getByCardNumber(cardNumber)
- }
+ val baseDaoSingleton = BaseDaoSingleton.getInstance(this@MainActivity)
- if (cardRegistration != null) {
- // 鍒涘缓鏇存柊鍚庣殑CardRegistrationBean瀵硅薄锛屽皢isReported璁剧疆涓簍rue
- val updatedCardRegistration = cardRegistration.copy(isReported = true)
- // 鏇存柊鏁版嵁搴撹褰�
- cardRegistrationDao.update(updatedCardRegistration)
+ // 鏍规嵁鎿嶄綔绫诲瀷鍒ゆ柇鏄鐞嗗崱杩樻槸鐢ㄦ埛鍗℃搷浣�
+ val isManagerCardOperation = operationTypeCode in 100..108
+
+ if (isManagerCardOperation) {
+ // 绠$悊鍗″埗浣滄搷浣滅被鍨嬶紝鏌ヨ鍜屾洿鏂癕anagerCardBean
+ val managerCardDao = baseDaoSingleton.managerCardDao()
+ val managerCard = if (orderNumber.isNotEmpty()) {
+ managerCardDao.getByOrderId(orderNumber)
+ } else {
+ managerCardDao.getByCardAddress(cardNumber)
+ }
+
+ if (managerCard != null) {
+ val updatedManagerCard = managerCard.copy(isReported = true)
+ managerCardDao.update(updatedManagerCard)
+ }
+ } else {
+ // 鐢ㄦ埛鍗℃搷浣滅被鍨嬶紝鏌ヨ鍜屾洿鏂癈ardRegistrationBean
+ val cardRegistrationDao = baseDaoSingleton.cardRegistrationDao()
+ val cardRegistration = if (orderNumber.isNotEmpty()) {
+ cardRegistrationDao.getByOrderId(orderNumber)
+ } else {
+ // 濡傛灉娌℃湁璁㈠崟鍙凤紝鍒欓�氳繃鍗″彿鏌ユ壘
+ cardRegistrationDao.getByCardNumber(cardNumber)
+ }
+
+ if (cardRegistration != null) {
+ // 鍒涘缓鏇存柊鍚庣殑CardRegistrationBean瀵硅薄锛屽皢isReported璁剧疆涓簍rue
+ val updatedCardRegistration = cardRegistration.copy(isReported = true)
+ // 鏇存柊鏁版嵁搴撹褰�
+ cardRegistrationDao.update(updatedCardRegistration)
+ }
}
} catch (e: Exception) {
// 璁板綍寮傚父淇℃伅锛屼絾涓嶅奖鍝嶇敤鎴锋搷浣�
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt b/generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt
index 7d370bd..c2dca73 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt
@@ -47,7 +47,7 @@
private var paymentMethod: String = "鐜伴噾"
// 鏀粯鏂瑰紡ID
- private var paymentId: Long = 0
+ private var paymentId: String = ""
// 鏀粯鏂瑰紡鍒楄〃
private var paymentMethodList: List<PaymentMethod> = listOf()
@@ -172,13 +172,13 @@
ApiManager.getInstance().requestGetLoading(
this,
"terminal/paymentmethod/get",
- PaymentMethodResponse::class.java,
+ Array<PaymentMethod>::class.java,
null,
- object : SubscriberListener<BaseResponse<PaymentMethodResponse>>() {
- override fun onNext(response: BaseResponse<PaymentMethodResponse>) {
+ object : SubscriberListener<BaseResponse<Array<PaymentMethod>>>() {
+ override fun onNext(response: BaseResponse<Array<PaymentMethod>>) {
if (response.success) {
- // 鑾峰彇鏀粯鏂瑰紡鍒楄〃
- val paymentMethods = response.content?.obj ?: listOf()
+ // 鑾峰彇鏀粯鏂瑰紡鍒楄〃锛岀幇鍦╟ontent鐩存帴鏄疨aymentMethod鏁扮粍
+ val paymentMethods = response.content?.toList() ?: listOf()
if (paymentMethods.isNotEmpty()) {
paymentMethodList = paymentMethods
// 鏇存柊鏀粯鏂瑰紡鏄剧ず
@@ -345,7 +345,7 @@
clientId = clientId,
cardFee = cardFee,
remark = binding.newCardRemark.text.toString(),
- paymentMethod = paymentId.toInt(),
+ paymentMethod = paymentId.toLongOrNull()?.toInt() ?: 0,
isReported = true,
isCardWritten = false, // 鍒濆璁剧疆涓篺alse锛屽啓鍗℃垚鍔熷悗鍐嶆洿鏂颁负true
operatorId = orderId,
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
index 8539f83..af95df2 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
@@ -594,7 +594,7 @@
/**
* 鏇存柊鏈湴鏁版嵁搴撲腑鐨勫啓鍗$姸鎬�
- * 灏咰ardRegistrationBean涓殑isCardWritten鐘舵�佽缃负true
+ * 鏍规嵁鎿嶄綔绫诲瀷鍒ゆ柇鏄洿鏂癕anagerCardBean杩樻槸CardRegistrationBean鐨刬sCardWritten鐘舵�佷负true
* 鐒跺悗璺宠浆鍒板啓鍗℃垚鍔熺晫闈紝骞堕�氱煡MainActivity璋冪敤postCardData
*
* @param cardNumber 鍗″彿
@@ -602,37 +602,54 @@
private fun updateCardWrittenStatus(cardNumber: String) {
lifecycleScope.launch {
try {
- val cardRegistrationDao = BaseDaoSingleton.getInstance(this@NfcWreatActivity)
- .cardRegistrationDao()
-
- // 鏍规嵁璁㈠崟鍙锋煡鎵綜ardRegistrationBean璁板綍
- val cardRegistration = cardRegistrationDao.getByOrderId(orderNumber)
-
- if (cardRegistration != null) {
- // 鍒涘缓鏇存柊鍚庣殑CardRegistrationBean瀵硅薄锛屽皢isCardWritten璁剧疆涓簍rue
- val updatedCardRegistration = cardRegistration.copy(isCardWritten = true)
- // 鏇存柊鏁版嵁搴撹褰�
- cardRegistrationDao.update(updatedCardRegistration)
-
- // 鍦ㄤ富绾跨▼涓叧闂瑼ctivity骞惰烦杞埌鎴愬姛椤甸潰
- runOnUiThread {
- setResult(RESULT_OK)
- finish()
-
- // 璺宠浆鍒板啓鍗℃垚鍔熺晫闈�
- Intent(this@NfcWreatActivity, CardWriteSuccessActivity::class.java).apply {
- putExtra("cardNumber", cardNumber)
- if (::userCard.isInitialized) {
- putExtra("userCard", userCard)
- }
- putExtra("operationTypeCode", operationTypeCode)
- startActivity(this)
- }
-
- // 閫氱煡MainActivity璋冪敤postCardData
- notifyMainActivityToPostCardData(cardNumber)
+ val baseDaoSingleton = BaseDaoSingleton.getInstance(this@NfcWreatActivity)
+
+ // 鏍规嵁鎿嶄綔绫诲瀷鍒ゆ柇鏄鐞嗗崱杩樻槸鐢ㄦ埛鍗℃搷浣�
+ val isManagerCardOperation = operationTypeCode in 100..108
+
+ var updateSuccess = false
+
+ if (isManagerCardOperation) {
+ // 绠$悊鍗″埗浣滄搷浣滅被鍨嬶紝鏌ヨ鍜屾洿鏂癕anagerCardBean
+ val managerCardDao = baseDaoSingleton.managerCardDao()
+ val managerCard = managerCardDao.getByOrderId(orderNumber)
+
+ if (managerCard != null) {
+ val updatedManagerCard = managerCard.copy(isCardWritten = true)
+ managerCardDao.update(updatedManagerCard)
+ updateSuccess = true
+ }
+ } else {
+ // 鐢ㄦ埛鍗℃搷浣滅被鍨嬶紝鏌ヨ鍜屾洿鏂癈ardRegistrationBean
+ val cardRegistrationDao = baseDaoSingleton.cardRegistrationDao()
+ val cardRegistration = cardRegistrationDao.getByOrderId(orderNumber)
+
+ if (cardRegistration != null) {
+ val updatedCardRegistration = cardRegistration.copy(isCardWritten = true)
+ cardRegistrationDao.update(updatedCardRegistration)
+ updateSuccess = true
}
}
+
+ // 鏃犺鏄惁鎵惧埌璁板綍锛岄兘璺宠浆鍒版垚鍔熺晫闈�
+ runOnUiThread {
+ setResult(RESULT_OK)
+ finish()
+
+ // 璺宠浆鍒板啓鍗℃垚鍔熺晫闈�
+ Intent(this@NfcWreatActivity, CardWriteSuccessActivity::class.java).apply {
+ putExtra("cardNumber", cardNumber)
+ if (::userCard.isInitialized) {
+ putExtra("userCard", userCard)
+ }
+ putExtra("operationTypeCode", operationTypeCode)
+ startActivity(this)
+ }
+
+ // 閫氱煡MainActivity璋冪敤postCardData
+ notifyMainActivityToPostCardData(cardNumber)
+ }
+
} catch (e: Exception) {
// 璁板綍寮傚父淇℃伅
CrashReport.postCatchedException(e)
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt
index 97ad182..3ec2878 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt
@@ -38,7 +38,7 @@
// 鏀粯鏂瑰紡鐩稿叧灞炴��
private var paymentMethod: String = "鐜伴噾"
- private var paymentId: Long = 0
+ private var paymentId: String = ""
private var paymentMethodList: List<PaymentMethod> = listOf()
companion object {
@@ -155,13 +155,13 @@
ApiManager.getInstance().requestGetLoading(
this,
"terminal/paymentmethod/get",
- PaymentMethodResponse::class.java,
+ Array<PaymentMethod>::class.java,
null,
- object : SubscriberListener<BaseResponse<PaymentMethodResponse>>() {
- override fun onNext(response: BaseResponse<PaymentMethodResponse>) {
+ object : SubscriberListener<BaseResponse<Array<PaymentMethod>>>() {
+ override fun onNext(response: BaseResponse<Array<PaymentMethod>>) {
if (response.success) {
- // 鑾峰彇鏀粯鏂瑰紡鍒楄〃
- val paymentMethods = response.content?.obj ?: listOf()
+ // 鑾峰彇鏀粯鏂瑰紡鍒楄〃锛岀幇鍦╟ontent鐩存帴鏄疨aymentMethod鏁扮粍
+ val paymentMethods = response.content?.toList() ?: listOf()
if (paymentMethods.isNotEmpty()) {
paymentMethodList = paymentMethods
// 鏇存柊鏀粯鏂瑰紡鏄剧ず
@@ -365,7 +365,7 @@
money = String.format("%.0f", rechargeAmount),
amount = String.format("%.0f", bonusAmount),
gift = String.format("%.0f", bonusAmount),
- paymentId = paymentId.toString(),
+ paymentId = paymentId,
price = String.format("%.2f", currentWaterPrice), // 浣跨敤缁熶竴鑾峰彇鐨勬按浠�
remarks = "鍏呭��",
operator = BaseApplication.userId // 榛樿鎿嶄綔鍛業D锛屽彲浠ユ牴鎹疄闄呮儏鍐佃皟鏁�
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/db/ManagerCardBean.kt b/generallibrary/src/main/java/com/dayu/general/bean/db/ManagerCardBean.kt
new file mode 100644
index 0000000..310d5a2
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/bean/db/ManagerCardBean.kt
@@ -0,0 +1,16 @@
+package com.dayu.general.bean.db
+
+import androidx.room.Entity
+import androidx.room.PrimaryKey
+
+@Entity(tableName = "manager_card")
+data class ManagerCardBean(
+ @PrimaryKey(autoGenerate = true)
+ val id: Long = 0,
+ val cardAddress: String, // 鍗″湴鍧�
+ val orderId: String, // 璁㈠崟id
+ val isReported: Boolean = false, // 鏄惁涓婃姤鎴愬姛
+ val isCardWritten: Boolean = false, // 鏄惁鍐欏崱鎴愬姛
+ val operatorId: String = "", // 鎿嶄綔浜篿d
+ val createTime: Long = System.currentTimeMillis() // 鍒涘缓鏃堕棿
+)
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/net/NewCardInfo.kt b/generallibrary/src/main/java/com/dayu/general/bean/net/NewCardInfo.kt
index dd85942..fabf9a7 100644
--- a/generallibrary/src/main/java/com/dayu/general/bean/net/NewCardInfo.kt
+++ b/generallibrary/src/main/java/com/dayu/general/bean/net/NewCardInfo.kt
@@ -2,7 +2,7 @@
// 鏀粯鏂瑰紡鏁版嵁绫�
data class PaymentMethod(
- val id: Long,
+ val id: String,
val name: String
)
diff --git a/generallibrary/src/main/java/com/dayu/general/dao/AppDataBase.kt b/generallibrary/src/main/java/com/dayu/general/dao/AppDataBase.kt
index f8cfcb7..5b1d8d6 100644
--- a/generallibrary/src/main/java/com/dayu/general/dao/AppDataBase.kt
+++ b/generallibrary/src/main/java/com/dayu/general/dao/AppDataBase.kt
@@ -4,14 +4,16 @@
import androidx.room.RoomDatabase
import com.dayu.general.bean.db.CardData
import com.dayu.general.bean.db.CardRegistrationBean
+import com.dayu.general.bean.db.ManagerCardBean
import com.dayu.general.bean.db.PassWordCardBean
import com.dayu.general.bean.db.ProjectDataBean
import com.dayu.general.bean.db.RechargeRecordBean
-@Database(entities = [PassWordCardBean::class, CardData::class, ProjectDataBean::class, CardRegistrationBean::class, RechargeRecordBean::class], version = 4, exportSchema = false)
+@Database(entities = [PassWordCardBean::class, CardData::class, ProjectDataBean::class, CardRegistrationBean::class, RechargeRecordBean::class, ManagerCardBean::class], version = 5, exportSchema = false)
abstract class AppDataBase : RoomDatabase() {
abstract fun cardDataDao(): CardDataDao
abstract fun projectDataDao(): ProjectDataDao
abstract fun cardRegistrationDao(): CardRegistrationDao
abstract fun rechargeRecordDao(): RechargeRecordDao
+ abstract fun managerCardDao(): ManagerCardDao
}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/dao/BaseDaoSingleton.kt b/generallibrary/src/main/java/com/dayu/general/dao/BaseDaoSingleton.kt
index a58d63f..cb56c7a 100644
--- a/generallibrary/src/main/java/com/dayu/general/dao/BaseDaoSingleton.kt
+++ b/generallibrary/src/main/java/com/dayu/general/dao/BaseDaoSingleton.kt
@@ -24,13 +24,33 @@
}
}
+ // 鏁版嵁搴撹縼绉荤瓥鐣ワ細浠庣増鏈�4杩佺Щ鍒扮増鏈�5
+ private val MIGRATION_4_5 = object : Migration(4, 5) {
+ override fun migrate(database: SupportSQLiteDatabase) {
+ // 鍒涘缓绠$悊鍗¤〃
+ database.execSQL("""
+ CREATE TABLE IF NOT EXISTS `manager_card` (
+ `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+ `cardAddress` TEXT NOT NULL,
+ `orderId` TEXT NOT NULL,
+ `isReported` INTEGER NOT NULL DEFAULT 0,
+ `isCardWritten` INTEGER NOT NULL DEFAULT 0,
+ `operatorId` TEXT NOT NULL DEFAULT '',
+ `createTime` INTEGER NOT NULL
+ )
+ """.trimIndent())
+ }
+ }
+
fun getInstance(context: Context): AppDataBase {
if (baseDao == null) {
baseDao = Room.databaseBuilder<AppDataBase>(
context,
AppDataBase::class.java,
SqlitePath + "ConfigurationData_generalV1"
- ).allowMainThreadQueries().build()
+ ).allowMainThreadQueries()
+ .addMigrations(MIGRATION_3_4, MIGRATION_4_5) // 娣诲姞杩佺Щ绛栫暐
+ .build()
}
return baseDao as AppDataBase
}
@@ -43,7 +63,7 @@
AppDataBase::class.java,
"GeneralLibrary.db"
)
- .addMigrations(MIGRATION_3_4) // 娣诲姞杩佺Щ绛栫暐
+ .addMigrations(MIGRATION_3_4, MIGRATION_4_5) // 娣诲姞杩佺Щ绛栫暐
.build()
}
}
diff --git a/generallibrary/src/main/java/com/dayu/general/dao/ManagerCardDao.kt b/generallibrary/src/main/java/com/dayu/general/dao/ManagerCardDao.kt
new file mode 100644
index 0000000..2ca2c19
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/dao/ManagerCardDao.kt
@@ -0,0 +1,31 @@
+package com.dayu.general.dao
+
+import androidx.room.*
+import com.dayu.general.bean.db.ManagerCardBean
+
+@Dao
+interface ManagerCardDao {
+ @Insert
+ suspend fun insert(managerCard: ManagerCardBean): Long
+
+ @Update
+ suspend fun update(managerCard: ManagerCardBean)
+
+ @Delete
+ suspend fun delete(managerCard: ManagerCardBean)
+
+ @Query("SELECT * FROM manager_card WHERE cardAddress = :cardAddress")
+ suspend fun getByCardAddress(cardAddress: String): ManagerCardBean?
+
+ @Query("SELECT * FROM manager_card WHERE orderId = :orderId")
+ suspend fun getByOrderId(orderId: String): ManagerCardBean?
+
+ @Query("SELECT * FROM manager_card WHERE isReported = 0")
+ suspend fun getUnreportedCards(): List<ManagerCardBean>
+
+ @Query("SELECT * FROM manager_card WHERE isCardWritten = 0")
+ suspend fun getUnwrittenCards(): List<ManagerCardBean>
+
+ @Query("SELECT * FROM manager_card ORDER BY createTime DESC")
+ suspend fun getAllCards(): List<ManagerCardBean>
+}
\ No newline at end of file
--
Gitblit v1.8.0