左晓为主开发手持机充值管理机
zuoxiao
4 天以前 1690ddce15cc489a76726eccee740d5beaef79e9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
package com.dayu.general.activity
 
import android.content.Intent
import android.os.Bundle
import androidx.lifecycle.lifecycleScope
import com.dayu.baselibrary.net.subscribers.SubscriberListener
import com.dayu.baselibrary.tools.nfc.NFCCallBack
import com.dayu.baselibrary.utils.ToastUtil
import com.dayu.general.bean.card.ClearCard
import com.dayu.general.bean.card.UserCard
import com.dayu.general.tool.CardCommon
import com.dayu.general.tool.CardOperationType
import com.dayu.general.databinding.ActivityNfcWriteGeBinding
import com.dayu.general.net.ApiManager
import com.dayu.general.net.BaseResponse
import com.dayu.general.tool.NfcReadHelper
import com.dayu.general.tool.NfcWreatHelper
import com.dayu.general.dao.BaseDaoSingleton
import com.tencent.bugly.crashreport.CrashReport
import kotlinx.coroutines.launch
import java.lang.StringBuilder
 
/**
 * @author: zuo
 * @date: 2021/3/30
 * @description:写卡界面
 */
class NfcWreatActivity : BaseNfcActivity() {
    var binding: ActivityNfcWriteGeBinding? = null
    var cardType = ""
    var orderId = ""
    var cardAddr = ""
    var cardFee = 0
 
    //订单编号
    var orderNumber = ""
    private lateinit var userCard: UserCard
    private var operationTypeCode = -1;
    private var operationType: CardOperationType? = null
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityNfcWriteGeBinding.inflate(layoutInflater)
        setContentView(binding?.root)
        getInitData()
    }
 
    /**
     * 获取数据
     */
    private fun getInitData() {
        cardType = intent?.getStringExtra("cardType") ?: ""
        orderId = intent?.getStringExtra("orderId") ?: ""
        cardAddr = intent?.getStringExtra("cardAddr") ?: ""
        operationTypeCode = intent?.getIntExtra("operationTypeCode", -1) ?: -1
        operationType = CardOperationType.fromCode(operationTypeCode)
        if (intent?.hasExtra("cardFee") == true) {
            cardFee = intent?.getIntExtra("cardFee", 0) ?: 0
        }
        if (intent?.hasExtra("userCard") == true) {
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) {
                userCard = intent?.getSerializableExtra("userCard", UserCard::class.java)!!
            } else {
                userCard = (intent?.getSerializableExtra("userCard") as? UserCard)!!
            }
 
        }
        if (operationTypeCode != -1) {
            when (operationType) {
                CardOperationType.CleanCard -> {
                    binding?.cardData?.text = "清零卡写卡"
                }
 
                CardOperationType.OpenCard -> {
                    var textData = StringBuilder()
                    textData.append("用户开卡\n")
                    if (cardFee != 0) {
                        textData.append("工本费:" + cardFee + "元\n")
                    }
                    if (userCard.balance != 0) {
                        textData.append("充值金额:" + userCard.balance + "元")
                    }
 
                    binding?.cardData?.text = textData.toString()
                }
 
                CardOperationType.CancelCard -> TODO()
                CardOperationType.CheckCard -> TODO()
                CardOperationType.DeductCard -> TODO()
                CardOperationType.Recharge -> TODO()
                CardOperationType.ReplaceCard -> TODO()
                null -> TODO()
            }
        }
 
    }
 
 
    override fun onNfcBack(intent: Intent) {
        val nfcReadHelper = NfcReadHelper.getInstance(intent, this)
        // 使用正常的getCardNumber()方法,它会自动关闭连接
        val cardNumber = nfcReadHelper.getCardNumber()
        
        if (cardNumber.isNotEmpty() && cardNumber == cardAddr) {
            val nfcWreatHelper = NfcWreatHelper.getInstance(intent, this)
            when (operationType) {
                CardOperationType.CleanCard -> {
                    var clearCard = ClearCard()
                    nfcWreatHelper.writeData(clearCard.getZeroBytes(), 7, 0) { success, message ->
                        // 确保Toast在主线程中调用
                        runOnUiThread {
                            if (success) {
                                postCardData(cardType, cardAddr)
                                ToastUtil.show("写卡成功!")
                            } else {
                                // 处理写卡失败的情况
                                ToastUtil.show(message)
                            }
                        }
                    }
                }
 
                CardOperationType.OpenCard -> {
                    nfcWreatHelper.writeUserDataAsync(userCard, object : NFCCallBack {
                        override fun isSusses(flag: Boolean, msg: String?) {
                            // 确保Toast在主线程中调用
                            runOnUiThread {
                                if (flag) {
                                    postCardData(cardType, cardAddr)
 
                                } else {
                                    ToastUtil.show("写卡失败: ${msg ?: "未知错误"}")
                                }
                            }
                        }
                    })
 
                }
 
                CardOperationType.CancelCard -> TODO()
                CardOperationType.CheckCard -> TODO()
                CardOperationType.DeductCard -> TODO()
                CardOperationType.Recharge -> TODO()
                CardOperationType.ReplaceCard -> TODO()
                null -> TODO()
            }
        } else {
            ToastUtil.show("卡片错误,当前刷的卡与刚刚的卡不一致")
        }
    }
 
    /**
     * 更新CardRegistrationBean中的isCardWritten状态为true
     */
    private fun updateCardWrittenStatus(cardNumber: String) {
        lifecycleScope.launch {
            try {
                val cardRegistrationDao = BaseDaoSingleton.getInstance(this@NfcWreatActivity)
                    .cardRegistrationDao()
 
                // 根据卡号查找CardRegistrationBean记录
                val cardRegistration = cardRegistrationDao.getByCardNumber(cardNumber)
                if (cardRegistration != null) {
                    // 创建更新后的CardRegistrationBean对象,将isCardWritten设置为true
                    val updatedCardRegistration = cardRegistration.copy(isCardWritten = true)
                    // 更新数据库记录
                    cardRegistrationDao.update(updatedCardRegistration)
                    
                    // 在主线程中关闭Activity
                    runOnUiThread {
                        setResult(RESULT_OK)
                        finish()
                        ToastUtil.show("写卡成功")
                    }
                }
            } catch (e: Exception) {
                CrashReport.postCatchedException(e)
                e.printStackTrace()
                runOnUiThread {
                    ToastUtil.show("更新写卡状态失败: ${e.message}")
                }
            }
        }
    }
 
    fun postCardData(cardType: String, cardAddr: String) {
        when (cardType) {
            CardCommon.CHECK_CARD -> {
                binding?.cardData?.text = "写用户卡"
            }
        }
        val map = mutableMapOf<String, Any>()
 
        if (cardAddr.isNotEmpty()) {
            map["cardAddr"] = cardAddr
        }
 
        map["operateType"] = operationTypeCode
        if (orderNumber.isNotEmpty()) {
            map["orderNumber"] = orderNumber
        }
        // 使用正确的类型参数
        ApiManager.getInstance().requestPostLoading(
            this,
            "terminal/card/termCallBack",
            String::class.java,
            map,
            object : SubscriberListener<BaseResponse<String>>() {
                override fun onNext(t: BaseResponse<String>) {
                    if (t.success) {
 
                        updateCardWrittenStatus(cardAddr)
 
 
                    } else {
                        // 处理搜索失败的情况
                        ToastUtil.show(t.msg)
                    }
                }
 
                override fun onError(e: Throwable?) {
                    super.onError(e)
                    ToastUtil.show("上报失败: ${e?.message ?: "未知错误"}")
                }
            }
        )
    }
 
 
}