优化
diff --git a/app/src/main/java/com/supwisdom/activities/cardlib/CardlibActivity.kt b/app/src/main/java/com/supwisdom/activities/cardlib/CardlibActivity.kt
index aeb5ef4..8aa0cd7 100644
--- a/app/src/main/java/com/supwisdom/activities/cardlib/CardlibActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/cardlib/CardlibActivity.kt
@@ -80,7 +80,7 @@
private fun refresh() {
AuxScreenController.getInstance().refreshTitle("卡库初始化")
- AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
+ AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
AuxScreenController.getInstance().refreshContent(listOf("加载硬件驱动", "请稍等..."))
}
@@ -96,7 +96,7 @@
vResult.text = msg
vResult.visibility = View.VISIBLE
AuxScreenController.getInstance().refreshTitle("卡库初始化")
- AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
+ AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
AuxScreenController.getInstance().refreshContent(listOf("请联系管理员", "加载驱动失败", "原因:", msg))
}
isLoading = false
diff --git a/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt b/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
index a000250..39de86e 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
@@ -338,11 +338,10 @@
vCitizenName.text = null
vCitizenCardno.text = null
vCardstatus.text = null
- val tmptime = datetime.substring(0, 16)
- if (lastshowtime != tmptime) {
- lastshowtime = tmptime
- vTime.text = tmptime
- AuxScreenController.getInstance().refreshBottom(tmptime)
+ if (lastshowtime != datetime) {
+ lastshowtime = datetime
+ vTime.text = datetime
+ AuxScreenController.getInstance().refreshBottom(datetime)
if (periodFixPayEnable) {
parsePeriodFixPay()
}
@@ -404,7 +403,7 @@
}
refreshLinkStatus(SPApplication.getInstance().isOnline())
- AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime().substring(0, 16))
+ AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
AuxScreenController.getInstance().refreshContent(Arrays.asList(" 欢迎光临!", " 请刷卡..."))
periodFixPayEnable = false
@@ -491,7 +490,7 @@
override fun showConsumeSuc(info: CardUserInfoBean) {
dialogPurchase!!.showPaySuccess(info)
val auxList = ArrayList<String>()
- auxList.add(info.retmsg!!)
+ auxList.add(info.getErrorMsg())
auxList.add(CommonUtil.showFormatAmount("金额", info.payamt))
when {
info.amount > info.payamt -> {
@@ -530,7 +529,7 @@
override fun showConsumeFail(info: CardUserInfoBean) {
dialogPurchase!!.showPayFail(info)
AuxScreenController.getInstance()
- .refreshContent(Arrays.asList<String>("消费失败", "原因:", info.retmsg))
+ .refreshContent(Arrays.asList<String>("消费失败", "原因:", info.getErrorMsg()))
SoundUtil.playMusic(applicationContext, R.raw.consume_fail)
refreshRecentDtl(info)
}
@@ -540,7 +539,7 @@
AuxScreenController.getInstance()
.refreshContent(
Arrays.asList<String>(
- info.retmsg,
+ info.getErrorMsg(),
CommonUtil.showFormatAmount("金额", info.payamt)
)
)
@@ -551,7 +550,7 @@
override fun showReverseFail(info: CardUserInfoBean) {
dialogPurchase!!.showReverseFail(info)
AuxScreenController.getInstance()
- .refreshContent(Arrays.asList<String>("冲正失败", "原因:", info.retmsg))
+ .refreshContent(Arrays.asList<String>("冲正失败", "原因:", info.getErrorMsg()))
SoundUtil.playMusic(applicationContext, R.raw.reversal_fail)
refreshRecentDtl(info)
}
@@ -595,7 +594,7 @@
}
vLastPayFailll.visibility = View.VISIBLE
vLastPayamtll.visibility = View.GONE
- vLastPayFailreason.text = info.retmsg
+ vLastPayFailreason.text = info.getErrorMsg()
}
vLastCardno.text = info.cardno
vLastPayway.text = if (info.payway == "code") {
diff --git a/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt b/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt
index 11f8580..6ebab3c 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt
@@ -1,748 +1,748 @@
-package com.supwisdom.activities.consume.mode
-
-import android.os.Handler
-import android.os.Message
-import com.supwisdom.activities.SPApplication
-import com.supwisdom.activities.consume.IConsumeView
-import com.supwisdom.activities.consume.bean.*
-import com.supwisdom.entity.*
-import com.supwisdom.epaycard.Cardlib
-import com.supwisdom.exception.CardNotFoundError
-import com.supwisdom.exception.CardPayCancelFailError
-import com.supwisdom.exception.CardPayFailError
-import com.supwisdom.exception.CardPayInterruptError
-import com.supwisdom.okhttp.TransResp
-import com.supwisdom.service.EpayApiImpl
-import com.supwisdom.utils.*
-import org.apache.http.HttpStatus
-
-/**
- ** create by zzq on 2019/7/25
- ** @desc 刷卡消费
- **/
-class CardPayService constructor(private val iConsumeView: IConsumeView, private val handler: Handler) {
- private val TAG = "CardPayService"
- private val pos = SPApplication.getInstance().getPos()
- private val runnable = CardPayRunnable()
- private val consumeApi = ConsumeApi()
- @Volatile
- private var isExist = false
- @Volatile
- private var clickStat = ClickStat.INIT
- @Volatile
- private var amount: Int = 0
- @Volatile
- private var payQueryConfirm = false
- var isFixMode = false
- private var thread: Thread? = null
- private var cardBean: CardBean? = null
- /**
- * 防止定额连续消费
- */
- private val lastPayBean = LastPayBean()
- @Volatile
- private var operation = false
- private val screenSaverBean = ScreenSaverBean()
-
- init {
- screenSaverBean.operationTime = System.currentTimeMillis()
- }
-
- fun start() {
- isExist = false
- if (thread == null) {
- thread = Thread(runnable)
- thread!!.start()
- }
- }
-
- fun stop() {
- isExist = true
- thread?.interrupt()
- thread = null
- }
-
- fun clickNoPay() {
- clickStat = ClickStat.INIT
- amount = 0
- }
-
- fun clickToPay(amount: Int) {
- clickStat = ClickStat.PAY
- this.amount = amount
- }
-
- fun clickToReverse(amount: Int) {
- clickStat = ClickStat.REVERSE
- this.amount = amount
- }
-
- fun clickToInterrupt() {
- clickStat = ClickStat.INIT
- payQueryConfirm = false
- }
-
- fun resetOperationTime() {
- operation = true
- }
-
- private inner class CardPayRunnable : Runnable {
- private lateinit var onlRecord: TransdtlOnlineRecord
- private lateinit var onlRvsRecord: TransdtlOnlineRecord
- private lateinit var offRecord: TransdtlOfflineRecord
- private lateinit var offRvsRecord: TransdtlOfflineRecord
- private var oldcardphyid: String? = null
- private var onlineBalance = false
- private var curLinkStatus = false
- private var lastShowTime: Long = 0
- private var lastUserInfoTime: Long = 0
- private var curLinkRefreshTime: Long = 0
- override fun run() {
- while (!isExist) {
- iConsumeView.cardPayingStatus(false)
- checkShowScreen()
- if (iConsumeView.isBackRunning()) {
- CommonUtil.doSleep(1000)
- continue
- }
- CommonUtil.doSleep(100)
- try {
- val cardphyid = Cardlib.instance.requestCard()
- iConsumeView.cardPayingStatus(true)
- if (oldcardphyid != cardphyid) {
- readCard()
- cardBean!!.cardphyid = cardphyid
- oldcardphyid = cardphyid
- operation = true
- }
- when (clickStat) {
- ClickStat.PAY -> {
- try {
- doConsume()
- } catch (ex: CardPayFailError) {
- sendMsg(PublicDef.MSG_CARD_PAY_FAIL, getErrorInfo(ex.message))
- } catch (ex: CardPayInterruptError) {
- sendMsg(PublicDef.MSG_PAYING_INTERRUPT, getErrorInfo(ex.message))
- } catch (ex: Exception) {
- ex.printStackTrace()
- LogUtil.d(
- TAG, "card pay exception: cardphyid=$cardphyid"
- + "exception=${CommonUtil.getExceptionStack(ex)}"
- )
- sendMsg(PublicDef.MSG_CARD_PAY_FAIL, getErrorInfo("程序异常"))
- }
- clickStat = ClickStat.INIT
- }
- ClickStat.REVERSE -> {
- try {
- doReverse()
- } catch (ex: CardPayCancelFailError) {
- sendMsg(PublicDef.MSG_CARD_REVERSE_FAIL, getRvsErrorInfo(ex.message))
- } catch (ex: Exception) {
- ex.printStackTrace()
- LogUtil.d(
- TAG, "card pay cancel exception: cardphyid=$cardphyid"
- + "exception=${CommonUtil.getExceptionStack(ex)}"
- )
- sendMsg(PublicDef.MSG_CARD_REVERSE_FAIL, getRvsErrorInfo("程序异常"))
- }
- clickStat = ClickStat.INIT
- }
- ClickStat.INIT -> {
- if (SPApplication.getInstance().isOnline() && !onlineBalance) {
- onlineBalance = true
- getAccountInfoByCard()
- }
- val curtime = System.currentTimeMillis()
- if (curtime < lastUserInfoTime ||
- curtime - lastUserInfoTime > 1000
- ) {
- lastUserInfoTime = curtime
- showCardUserInfo()
- }
- }
- }
- } catch (ex: CardNotFoundError) {
- ex.printStackTrace()
- doClear()
- } catch (ex: Exception) {
- ex.printStackTrace()
- doClear()
- }
- }
- }
-
- private fun getAccountInfoByCard() {
- val resp = consumeApi.accQuery(
- pos.getConfigPara()!!.devphyid!!,
- cardBean!!.cardphyid!!,
- cardBean!!.cardNo!!
- )
- if (resp != null && resp.retcode == HttpStatus.SC_OK) {
- try {
- val retBean = GsonUtil.GsonToBean(resp.retjson!!, CardAccountRetBean::class.java)
- if (retBean.retcode == PublicDef.SUCCESS) {
- cardBean!!.username = retBean.username
- cardBean!!.userid = retBean.userid
- cardBean!!.balance = retBean.balance
- when {
- "normal" == retBean.status -> cardBean!!.cardstatus = CardStatus.NORMAL
- "expire" == retBean.status -> cardBean!!.cardstatus = CardStatus.EXPIRE
- "lost" == retBean.status -> cardBean!!.cardstatus = CardStatus.LOCK
- "logout" == retBean.status -> cardBean!!.cardstatus = CardStatus.LOGOUT
- "frozen" == retBean.status -> cardBean!!.cardstatus = CardStatus.FROZEN
- "lock" == retBean.status -> cardBean!!.cardstatus = CardStatus.LOST
- }
- }
- } catch (ex: Exception) {
- ex.printStackTrace()
- }
- }
- }
-
- private fun checkShowScreen() {
- val tt = System.currentTimeMillis()
- if (operation) {
- operation = false
- screenSaverBean.operationTime = tt
- screenSaverBean.operationFlag = true
- }
- if (tt > screenSaverBean.operationTime &&
- tt - screenSaverBean.operationTime > PublicDef.SCREEN_SAVER_GAP
- ) {
- /**
- * 连续半小时无操作屏保
- */
- screenSaverBean.operationTime = tt
- screenSaverBean.flag = true
- screenSaverBean.operationFlag = false
- sendMsg(PublicDef.MSG_SCREEN_SAVER, "on")
- } else {
- if (screenSaverBean.operationFlag && screenSaverBean.flag) {
- screenSaverBean.flag = false
- sendMsg(PublicDef.MSG_SCREEN_SAVER, "off")
- }
- }
- }
-
- private fun showCardUserInfo() {
- val info = CardUserInfoBean(PublicDef.SUCCESS, "账户信息")
- if (cardBean!!.username != cardBean!!.cardNo) {
- info.username = cardBean!!.username
- }
- info.cardno = cardBean!!.cardNo
- info.cardstatus = cardBean!!.cardstatus
- sendMsg(PublicDef.MSG_USER_INFO_SHOW, info)
- }
-
- private fun readCard() {
- val cardinfo = Cardlib.instance.readCard()
- cardBean = CardBean()
- cardBean!!.cardNo = cardinfo.cardNo
- cardBean!!.idCard = cardinfo.idCard
- cardBean!!.expireDate = cardinfo.expireDate
- cardBean!!.amount = amount
- cardBean!!.datetime = DateUtil.getNowDateTimeFormat()
- /**
- * 用户名默认用卡号代替,在线查询更新为用户名
- */
- cardBean!!.username = cardBean!!.cardNo
- }
-
- private fun doConsume() {
- if (isFixMode) {
- if (lastPayBean.cardphyid == cardBean!!.cardphyid) {
- val gap = (pos.getSysPara()?.fixpayGap ?: 10).toLong()
- if (System.currentTimeMillis() - lastPayBean.suctime < gap * 1000) {
- throw CardPayFailError("${gap}s内不能连续消费")
- }
- }
- }
- sendMsg(PublicDef.MSG_CARD_PAYING, "正在扣款...")
- if (SPApplication.getInstance().isOnline()) {
- if (!doOnlineConsume()) {
- /**
- * 由于不写卡,联机消费失败直接转离线
- */
- doOfflineConsume()
- }
- } else {
- doOfflineConsume()
- }
- }
-
- private fun doReverse() {
- val list = pos.getTransdtlUnion(DateUtil.getNowDateNoFormat(), 0, 0, 1)
- if (list.isEmpty()) {
- throw CardPayCancelFailError("未找到消费记录")
- }
- if (list[0].payway == "offcard") {
- doOfflineReverse(list[0])
- } else {
- doOnlineReverse(list[0])
- }
- }
-
- private fun doOnlineReverse(unionRecord: TransdtlUnionRecord) {
- val record = pos.getTransdtlOnlineLast() ?: throw CardPayCancelFailError("未找到联机记录")
- checkOnlineReverseVaild(unionRecord, record)
- saveTransdtlOnlineReverse(record)
- showRvsOnlSucInfo()
- asyncUpload(onlRvsRecord)
- }
-
- private fun doOfflineReverse(unionRecord: TransdtlUnionRecord) {
- val record = pos.getTransdtlOfflineLast() ?: throw CardPayCancelFailError("未找到离线记录")
- checkOfflineReverseVaild(unionRecord, record)
- saveTransdtlOfflineReverse(record)
- showRvsOffSucInfo()
- asyncUpload(offRvsRecord)
- }
-
- private fun saveTransdtlOfflineReverse(record: TransdtlOfflineRecord) {
- offRvsRecord = record.clone()
- offRvsRecord.devseqno += 1
- offRvsRecord.transdate = DateUtil.getNowDateNoFormat()
- offRvsRecord.transtime = DateUtil.getNowTimeNoFormat()
- offRvsRecord.reversalflag = ReversalFlag.MANUAL
- offRvsRecord.reversalseqno = record.devseqno
- offRvsRecord.reversaltransdate = record.transdate
- offRvsRecord.reversaltranstime = record.transtime
- offRvsRecord.upflag = 0
- if (!pos.saveTransdtlOffline(offRvsRecord)) {
- throw CardPayCancelFailError("保存流水失败")
- }
- }
-
- private fun saveTransdtlOnlineReverse(record: TransdtlOnlineRecord) {
- onlRvsRecord = record.clone()
- onlRvsRecord.devseqno += 1
- onlRvsRecord.transdate = DateUtil.getNowDateNoFormat()
- onlRvsRecord.transtime = DateUtil.getNowTimeNoFormat()
- onlRvsRecord.reversalflag = ReversalFlag.MANUAL
- onlRvsRecord.reversalbillno = record.billno
- onlRvsRecord.upflag = 0
- if (!pos.saveTransdtlOnline(onlRvsRecord)) {
- throw CardPayCancelFailError("保存流水失败")
- }
- }
-
- private fun checkOnlineReverseVaild(unionRecord: TransdtlUnionRecord, record: TransdtlOnlineRecord) {
- if (record.cardphyid != cardBean!!.cardphyid) {
- throw CardPayCancelFailError("该卡不是最后消费")
- }
- if (unionRecord.transdate != record.transdate ||
- unionRecord.transtime != record.transtime
- ) {
- throw CardPayCancelFailError("联机记录时间异常")
- }
- if (record.reversalflag == ReversalFlag.AUTO
- ) {
- throw CardPayCancelFailError("已撤销")
- }
- if (record.reversalflag == ReversalFlag.MANUAL) {
- throw CardPayCancelFailError("已冲正")
- }
- if (record.status != PayStatus.SUC) {
- throw CardPayCancelFailError("消费失败不能冲正")
- }
- val t1 = DateUtil.dateFormatConvertToLong(record.transdate + record.transtime)
- val t2 = System.currentTimeMillis()
- if (t2 - t1 > PublicDef.REVERSE_MS_GAP) {
- throw CardPayCancelFailError("消费已过期")
- }
- }
-
- private fun checkOfflineReverseVaild(unionRecord: TransdtlUnionRecord, record: TransdtlOfflineRecord) {
- if (record.cardphyid != cardBean!!.cardphyid) {
- throw CardPayCancelFailError("该卡不是最后消费")
- }
- if (unionRecord.transdate != record.transdate ||
- unionRecord.transtime != record.transtime
- ) {
- throw CardPayCancelFailError("离线记录时间异常")
- }
- if (record.reversalflag == ReversalFlag.MANUAL ||
- record.reversalflag == ReversalFlag.AUTO
- ) {
- throw CardPayCancelFailError("已冲正")
- }
- if (record.status != PayStatus.SUC) {
- throw CardPayCancelFailError("消费失败不能冲正")
- }
- val t1 = DateUtil.dateFormatConvertToLong(record.transdate + record.transtime)
- val t2 = System.currentTimeMillis()
- if (t2 - t1 > PublicDef.REVERSE_MS_GAP) {
- throw CardPayCancelFailError("消费已过期")
- }
- }
-
- private fun doOnlineConsume(): Boolean {
- initTransdtlOnline()
- var resp = consumeApi.payInit(onlRecord)
- var result = parseInitResult(resp)
- if (!result) {
- return result
- }
- resp = consumeApi.payConfirm(onlRecord)
- result = parseConfirmResult(resp)
- payQueryConfirm = false
- if (!result) {
- payQueryConfirm = true
- result = doOnlineConsumeQuery()
- }
- updateTransdtlOnline(result)
- if (result) {
- showOnlSucInfo()
- }
- return result
- }
-
- private fun doOnlineConsumeQuery(): Boolean {
- var queryCnt = 1
- LogUtil.e(
- TAG,
- "pay timeout and query result,cardphyid=[${onlRecord.cardphyid}],billno=[${onlRecord.billno}]"
- )
- sleepWithCancel(1000)
- while (payQueryConfirm) {
- sendMsg(PublicDef.MSG_CARD_PAY_QUERY, "消费确认中[$queryCnt]")
- val resp = consumeApi.payQuery(onlRecord)
- val result = parseConfirmResult(resp)
- if (result) {
- return result
- }
- queryCnt += 1
- sleepWithCancel(3000)
- }
- /**
- * 手动取消交易
- */
- LogUtil.e(TAG, "manual cancel pay,cardphyid=[${onlRecord.cardphyid}],billno=[${onlRecord.billno}]")
- throw CardPayInterruptError("交易取消")
- }
-
- private fun sleepWithCancel(ms: Long) {
- var time = 0
- while (payQueryConfirm) {
- CommonUtil.doSleep(20)
- time += 20
- if (time > ms) {
- return
- }
- }
- }
-
- private fun parseInitResult(resp: TransResp?): Boolean {
- if (resp == null || resp.retcode != HttpStatus.SC_OK) {
- SPApplication.getInstance().setEpayLinking(false)
- return false
- }
- val retBean = try {
- GsonUtil.GsonToBean(resp.retjson!!, CardPayInitRetBean::class.java)
- } catch (ex: java.lang.Exception) {
- throw CardPayFailError("json异常:${ex.message}")
- }
- if (retBean.retcode != PublicDef.SUCCESS) {
- throw CardPayFailError(retBean.getErrorMsg())
- }
- onlRecord.billno = retBean.billno
- onlRecord.username = retBean.username
- return true
- }
-
- private fun parseConfirmResult(resp: TransResp?): Boolean {
- if (resp == null || resp.retcode != HttpStatus.SC_OK) {
- return false
- }
- val retBean = try {
- GsonUtil.GsonToBean(resp.retjson!!, CardPayConfirmRetBean::class.java)
- } catch (ex: Exception) {
- throw CardPayFailError("json异常:${ex.message}")
- }
- if (retBean.retcode != PublicDef.SUCCESS) {
- throw CardPayFailError(retBean.getErrorMsg())
- }
- if (retBean.require_query) {
- return false
- }
- onlRecord.payamt = retBean.amount
- onlRecord.extraamt = retBean.extraamt
- return true
- }
-
- private fun initTransdtlOnline() {
- onlRecord = TransdtlOnlineRecord()
- var seqno = pos.getTransdtlOnlineMaxSeqno()
- if (seqno == 0) {
- seqno = pos.getDynamicPara()?.onlineseqno ?: 0
- }
- onlRecord.devphyid = pos.getConfigPara()!!.devphyid
- onlRecord.transdate = cardBean!!.datetime!!.substring(0, 8)
- onlRecord.transtime = cardBean!!.datetime!!.substring(8)
- onlRecord.devseqno = seqno + 1
- onlRecord.cardno = cardBean!!.cardNo
- onlRecord.cardphyid = cardBean!!.cardphyid
- onlRecord.payamt = cardBean!!.amount
- onlRecord.reversalflag = ReversalFlag.NONE
- onlRecord.extraamt = 0
- onlRecord.transtype = "card"
- onlRecord.status = PayStatus.INIT
- onlRecord.upflag = 1
- if (!pos.saveTransdtlOnline(onlRecord)) {
- throw CardPayFailError("保存流水失败")
- }
- }
-
- private fun updateTransdtlOnline(issuccess: Boolean) {
- if (issuccess) {
- onlRecord.status = PayStatus.SUC
- } else {
- onlRecord.status = PayStatus.FAIL
- }
- onlRecord.upflag = 1
- pos.updateTransdtlOnline(onlRecord)
- }
-
- private fun doOfflineConsume() {
- initTransdtlOffline()
- checkCardValid()
- updateTransdtlOffline(true)
- showOffSucInfo()
- }
-
- private fun checkCardValid() {
- val sysRecord = pos.getSysPara()
- if (!sysRecord!!.offlineEnable) {
- throw CardPayFailError("禁止离线交易")
- }
- val ctlRecord = pos.getControlPara(PublicDef.CONTROL_OFFLINE_DAY_DISABLE)
- if (ctlRecord == null || ctlRecord.paraval != "1") {
- val offdate = DateUtil.getDayDateNoFormatBefore(sysRecord.maxOfflineDays)
- val validdate = pos.getDynamicPara()!!.jwtExpire?.substring(0, 8) ?: "00000000"
- if (offdate > validdate) {
- throw CardPayFailError("设备已脱机${sysRecord.maxOfflineDays}天")
- }
- }
-
- val whiteRecord =
- pos.getWhiteList(offRecord.cardphyid!!, offRecord.cardno!!) ?: throw CardPayFailError("卡无权限")
- when (whiteRecord.status) {
- "normal" -> {
-
- }
- "expire" -> throw CardPayFailError("卡已过期")
- "lost" -> throw CardPayFailError("卡已挂失")
- "logout" -> throw CardPayFailError("卡已注销")
- "frozen" -> throw CardPayFailError("卡已冻结")
- "lock" -> throw CardPayFailError("卡已锁定")
- else -> throw CardPayFailError("卡状态:${whiteRecord.status}")
- }
-
- val payamt = pos.getTransdtlOfflineAmt(offRecord.transdate!!, offRecord.cardno!!, offRecord.cardphyid!!)
- if ((payamt + offRecord.payamt) > sysRecord.maxDayOfflineAmt) {
- throw CardPayFailError("已离线交易" + String.format("%.02f元", payamt / 100.0f))
- }
- }
-
- private fun initTransdtlOffline() {
- offRecord = TransdtlOfflineRecord()
- var seqno = pos.getTransdtlOfflineMaxSeqno()
- if (seqno == 0) {
- seqno = pos.getDynamicPara()?.offlineseqno ?: 0
- }
- offRecord.devphyid = pos.getConfigPara()!!.devphyid
- offRecord.transdate = cardBean!!.datetime!!.substring(0, 8)
- offRecord.transtime = cardBean!!.datetime!!.substring(8)
- offRecord.devseqno = seqno + 1
- offRecord.cardno = cardBean!!.cardNo
- offRecord.cardphyid = cardBean!!.cardphyid
- offRecord.payamt = cardBean!!.amount
- offRecord.reversalflag = ReversalFlag.NONE
- offRecord.extraamt = 0
- offRecord.managefeetype = "none"
- offRecord.status = PayStatus.INIT
- offRecord.upflag = 1
- if (!pos.saveTransdtlOffline(offRecord)) {
- throw CardPayFailError("保存流水失败")
- }
- }
-
- private fun updateTransdtlOffline(issuccess: Boolean) {
- if (issuccess) {
- offRecord.status = PayStatus.SUC
- } else {
- offRecord.status = PayStatus.FAIL
- }
- offRecord.upflag = 0
- if (!pos.updateTransdtlOffline(offRecord)) {
- throw CardPayFailError("更新流水失败")
- }
- asyncUpload(offRecord)
- }
-
- private fun showOnlSucInfo() {
- lastPayBean.cardphyid = cardBean!!.cardphyid
- lastPayBean.suctime = System.currentTimeMillis()
- val info = CardUserInfoBean(PublicDef.SUCCESS, "消费成功")
- info.showtime = pos.getSysPara()!!.sucShowtime
- info.amount = onlRecord.payamt
- info.payamt = onlRecord.payamt
- info.username = onlRecord.username
- info.cardno = onlRecord.cardno
- info.transdate = onlRecord.transdate
- info.transtime = onlRecord.transtime
- info.payway = onlRecord.transtype
- info.status = onlRecord.status
- info.reversalFlag = onlRecord.reversalflag
- sendMsg(PublicDef.MSG_CARD_PAY_SUC, info)
- }
-
- private fun showOffSucInfo() {
- lastPayBean.cardphyid = cardBean!!.cardphyid
- lastPayBean.suctime = System.currentTimeMillis()
- val info = CardUserInfoBean(PublicDef.SUCCESS, "消费成功")
- info.showtime = pos.getSysPara()!!.sucShowtime
- info.amount = offRecord.payamt
- info.payamt = offRecord.payamt
- info.cardno = offRecord.cardno
- info.transdate = offRecord.transdate
- info.transtime = offRecord.transtime
- info.payway = "card"
- info.status = offRecord.status
- info.reversalFlag = offRecord.reversalflag
- sendMsg(PublicDef.MSG_CARD_PAY_SUC, info)
- }
-
- private fun showRvsOnlSucInfo() {
- val info = CardUserInfoBean(PublicDef.SUCCESS, "冲正成功")
- info.showtime = pos.getSysPara()!!.sucShowtime
- info.amount = onlRvsRecord.payamt
- info.payamt = onlRvsRecord.payamt
- info.username = onlRvsRecord.username
- info.cardno = onlRvsRecord.cardno
- info.transdate = onlRvsRecord.transdate
- info.transtime = onlRvsRecord.transtime
- info.payway = onlRvsRecord.transtype
- info.status = onlRvsRecord.status
- info.reversalFlag = onlRvsRecord.reversalflag
- sendMsg(PublicDef.MSG_CARD_REVERSE_SUC, info)
- }
-
- private fun showRvsOffSucInfo() {
- val info = CardUserInfoBean(PublicDef.SUCCESS, "冲正成功")
- info.showtime = pos.getSysPara()!!.sucShowtime
- info.amount = offRvsRecord.payamt
- info.payamt = offRvsRecord.payamt
- info.cardno = offRvsRecord.cardno
- info.transdate = offRvsRecord.transdate
- info.transtime = offRvsRecord.transtime
- info.payway = "card"
- info.status = offRvsRecord.status
- info.reversalFlag = offRvsRecord.reversalflag
- sendMsg(PublicDef.MSG_CARD_REVERSE_SUC, info)
- }
-
- private fun asyncUpload(dtl: TransdtlOfflineRecord) {
- ThreadPool.getShortPool().execute(Runnable {
- try {
- EpayApiImpl().uploadTransdtl(dtl)
- dtl.upflag = 1
- pos.updateTransdtlOffline(dtl)
- } catch (ex: java.lang.Exception) {
- ex.printStackTrace()
- }
- })
- }
-
- private fun asyncUpload(dtl: TransdtlOnlineRecord) {
- ThreadPool.getShortPool().execute(Runnable {
- try {
- EpayApiImpl().uploadTransdtl(dtl)
- dtl.upflag = 1
- pos.updateTransdtlOnline(dtl)
- } catch (ex: java.lang.Exception) {
- ex.printStackTrace()
- }
- })
- }
-
- private fun doClear() {
- oldcardphyid = null
- onlineBalance = false
- val curtime = System.currentTimeMillis()
- if (curtime < lastShowTime ||
- curtime - lastShowTime > 1000
- ) {
- lastShowTime = curtime
- sendMsg(PublicDef.MSG_USER_INFO_CLEAR, DateUtil.getNowDateTime())
- showLinkStatus()
- }
- }
-
- private fun showLinkStatus() {
- if (SPApplication.getInstance().isOnline()) {
- if (!curLinkStatus) {
- curLinkRefreshTime = System.currentTimeMillis()
- curLinkStatus = true
- sendMsg(PublicDef.MSG_LINK_STATUS, true)
- return
- }
- } else {
- if (curLinkStatus) {
- curLinkStatus = false
- curLinkRefreshTime = System.currentTimeMillis()
- sendMsg(PublicDef.MSG_LINK_STATUS, false)
- return
- }
- }
- val t = System.currentTimeMillis()
- if (t < curLinkRefreshTime ||
- t - curLinkRefreshTime > 30000
- ) {
- curLinkRefreshTime = t
- sendMsg(PublicDef.MSG_LINK_STATUS, SPApplication.getInstance().isOnline())
- }
- }
-
- private fun getErrorInfo(errmsg: String?): CardUserInfoBean {
- val info = CardUserInfoBean(PublicDef.ERROR, errmsg ?: "null")
- info.showtime = pos.getSysPara()!!.failShowtime
- info.status = PayStatus.FAIL
- info.amount = amount
- info.payamt = amount
- info.payway = "card"
- info.cardno = cardBean?.cardNo
- info.transdate = DateUtil.getNowDateNoFormat()
- info.transtime = DateUtil.getNowTimeNoFormat()
- return info
- }
-
- private fun getRvsErrorInfo(errmsg: String?): CardUserInfoBean {
- val info = CardUserInfoBean(PublicDef.ERROR, errmsg ?: "null")
- info.showtime = pos.getSysPara()!!.failShowtime
- info.status = PayStatus.FAIL
- info.amount = amount
- info.payamt = amount
- info.cardno = cardBean?.cardNo
- info.payway = "card"
- info.transdate = DateUtil.getNowDateNoFormat()
- info.transtime = DateUtil.getNowTimeNoFormat()
- info.reversalFlag = ReversalFlag.MANUAL
- return info
- }
-
- private fun sendMsg(code: Int, obj: Any) {
- val msg = Message()
- msg.what = code
- msg.obj = obj
- handler.sendMessage(msg)
- }
- }
-}
-
-enum class ClickStat {
- INIT,
- PAY,
- REVERSE
+package com.supwisdom.activities.consume.mode
+
+import android.os.Handler
+import android.os.Message
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.consume.IConsumeView
+import com.supwisdom.activities.consume.bean.*
+import com.supwisdom.entity.*
+import com.supwisdom.epaycard.Cardlib
+import com.supwisdom.exception.CardNotFoundError
+import com.supwisdom.exception.CardPayCancelFailError
+import com.supwisdom.exception.CardPayFailError
+import com.supwisdom.exception.CardPayInterruptError
+import com.supwisdom.okhttp.TransResp
+import com.supwisdom.service.EpayApiImpl
+import com.supwisdom.utils.*
+import org.apache.http.HttpStatus
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc 刷卡消费
+ **/
+class CardPayService constructor(private val iConsumeView: IConsumeView, private val handler: Handler) {
+ private val TAG = "CardPayService"
+ private val pos = SPApplication.getInstance().getPos()
+ private val runnable = CardPayRunnable()
+ private val consumeApi = ConsumeApi()
+ @Volatile
+ private var isExist = false
+ @Volatile
+ private var clickStat = ClickStat.INIT
+ @Volatile
+ private var amount: Int = 0
+ @Volatile
+ private var payQueryConfirm = false
+ var isFixMode = false
+ private var thread: Thread? = null
+ private var cardBean: CardBean? = null
+ /**
+ * 防止定额连续消费
+ */
+ private val lastPayBean = LastPayBean()
+ @Volatile
+ private var operation = false
+ private val screenSaverBean = ScreenSaverBean()
+
+ init {
+ screenSaverBean.operationTime = System.currentTimeMillis()
+ }
+
+ fun start() {
+ isExist = false
+ if (thread == null) {
+ thread = Thread(runnable)
+ thread!!.start()
+ }
+ }
+
+ fun stop() {
+ isExist = true
+ thread?.interrupt()
+ thread = null
+ }
+
+ fun clickNoPay() {
+ clickStat = ClickStat.INIT
+ amount = 0
+ }
+
+ fun clickToPay(amount: Int) {
+ clickStat = ClickStat.PAY
+ this.amount = amount
+ }
+
+ fun clickToReverse(amount: Int) {
+ clickStat = ClickStat.REVERSE
+ this.amount = amount
+ }
+
+ fun clickToInterrupt() {
+ clickStat = ClickStat.INIT
+ payQueryConfirm = false
+ }
+
+ fun resetOperationTime() {
+ operation = true
+ }
+
+ private inner class CardPayRunnable : Runnable {
+ private lateinit var onlRecord: TransdtlOnlineRecord
+ private lateinit var onlRvsRecord: TransdtlOnlineRecord
+ private lateinit var offRecord: TransdtlOfflineRecord
+ private lateinit var offRvsRecord: TransdtlOfflineRecord
+ private var oldcardphyid: String? = null
+ private var onlineBalance = false
+ private var curLinkStatus = false
+ private var lastShowTime: Long = 0
+ private var lastUserInfoTime: Long = 0
+ private var curLinkRefreshTime: Long = 0
+ override fun run() {
+ while (!isExist) {
+ iConsumeView.cardPayingStatus(false)
+ checkShowScreen()
+ if (iConsumeView.isBackRunning()) {
+ CommonUtil.doSleep(1000)
+ continue
+ }
+ CommonUtil.doSleep(100)
+ try {
+ val cardphyid = Cardlib.instance.requestCard()
+ iConsumeView.cardPayingStatus(true)
+ if (oldcardphyid != cardphyid) {
+ readCard()
+ cardBean!!.cardphyid = cardphyid
+ oldcardphyid = cardphyid
+ operation = true
+ }
+ when (clickStat) {
+ ClickStat.PAY -> {
+ try {
+ doConsume()
+ } catch (ex: CardPayFailError) {
+ sendMsg(PublicDef.MSG_CARD_PAY_FAIL, getErrorInfo(ex.message))
+ } catch (ex: CardPayInterruptError) {
+ sendMsg(PublicDef.MSG_PAYING_INTERRUPT, getErrorInfo(ex.message))
+ } catch (ex: Exception) {
+ ex.printStackTrace()
+ LogUtil.d(
+ TAG, "card pay exception: cardphyid=$cardphyid"
+ + "exception=${CommonUtil.getExceptionStack(ex)}"
+ )
+ sendMsg(PublicDef.MSG_CARD_PAY_FAIL, getErrorInfo("程序异常"))
+ }
+ clickStat = ClickStat.INIT
+ }
+ ClickStat.REVERSE -> {
+ try {
+ doReverse()
+ } catch (ex: CardPayCancelFailError) {
+ sendMsg(PublicDef.MSG_CARD_REVERSE_FAIL, getRvsErrorInfo(ex.message))
+ } catch (ex: Exception) {
+ ex.printStackTrace()
+ LogUtil.d(
+ TAG, "card pay cancel exception: cardphyid=$cardphyid"
+ + "exception=${CommonUtil.getExceptionStack(ex)}"
+ )
+ sendMsg(PublicDef.MSG_CARD_REVERSE_FAIL, getRvsErrorInfo("程序异常"))
+ }
+ clickStat = ClickStat.INIT
+ }
+ ClickStat.INIT -> {
+ if (SPApplication.getInstance().isOnline() && !onlineBalance) {
+ onlineBalance = true
+ getAccountInfoByCard()
+ }
+ val curtime = System.currentTimeMillis()
+ if (curtime < lastUserInfoTime ||
+ curtime - lastUserInfoTime > 1000
+ ) {
+ lastUserInfoTime = curtime
+ showCardUserInfo()
+ }
+ }
+ }
+ } catch (ex: CardNotFoundError) {
+ ex.printStackTrace()
+ doClear()
+ } catch (ex: Exception) {
+ ex.printStackTrace()
+ doClear()
+ }
+ }
+ }
+
+ private fun getAccountInfoByCard() {
+ val resp = consumeApi.accQuery(
+ pos.getConfigPara()!!.devphyid!!,
+ cardBean!!.cardphyid!!,
+ cardBean!!.cardNo!!
+ )
+ if (resp != null && resp.retcode == HttpStatus.SC_OK) {
+ try {
+ val retBean = GsonUtil.GsonToBean(resp.retjson!!, CardAccountRetBean::class.java)
+ if (retBean.retcode == PublicDef.SUCCESS) {
+ cardBean!!.username = retBean.username
+ cardBean!!.userid = retBean.userid
+ cardBean!!.balance = retBean.balance
+ when {
+ "normal" == retBean.status -> cardBean!!.cardstatus = CardStatus.NORMAL
+ "expire" == retBean.status -> cardBean!!.cardstatus = CardStatus.EXPIRE
+ "lost" == retBean.status -> cardBean!!.cardstatus = CardStatus.LOCK
+ "logout" == retBean.status -> cardBean!!.cardstatus = CardStatus.LOGOUT
+ "frozen" == retBean.status -> cardBean!!.cardstatus = CardStatus.FROZEN
+ "lock" == retBean.status -> cardBean!!.cardstatus = CardStatus.LOST
+ }
+ }
+ } catch (ex: Exception) {
+ ex.printStackTrace()
+ }
+ }
+ }
+
+ private fun checkShowScreen() {
+ val tt = System.currentTimeMillis()
+ if (operation) {
+ operation = false
+ screenSaverBean.operationTime = tt
+ screenSaverBean.operationFlag = true
+ }
+ if (tt > screenSaverBean.operationTime &&
+ tt - screenSaverBean.operationTime > PublicDef.SCREEN_SAVER_GAP
+ ) {
+ /**
+ * 连续半小时无操作屏保
+ */
+ screenSaverBean.operationTime = tt
+ screenSaverBean.flag = true
+ screenSaverBean.operationFlag = false
+ sendMsg(PublicDef.MSG_SCREEN_SAVER, "on")
+ } else {
+ if (screenSaverBean.operationFlag && screenSaverBean.flag) {
+ screenSaverBean.flag = false
+ sendMsg(PublicDef.MSG_SCREEN_SAVER, "off")
+ }
+ }
+ }
+
+ private fun showCardUserInfo() {
+ val info = CardUserInfoBean(PublicDef.SUCCESS, "账户信息")
+ if (cardBean!!.username != cardBean!!.cardNo) {
+ info.username = cardBean!!.username
+ }
+ info.cardno = cardBean!!.cardNo
+ info.cardstatus = cardBean!!.cardstatus
+ sendMsg(PublicDef.MSG_USER_INFO_SHOW, info)
+ }
+
+ private fun readCard() {
+ val cardinfo = Cardlib.instance.readCard()
+ cardBean = CardBean()
+ cardBean!!.cardNo = cardinfo.cardNo
+ cardBean!!.idCard = cardinfo.idCard
+ cardBean!!.expireDate = cardinfo.expireDate
+ cardBean!!.amount = amount
+ cardBean!!.datetime = DateUtil.getNowDateTimeFormat()
+ /**
+ * 用户名默认用卡号代替,在线查询更新为用户名
+ */
+ cardBean!!.username = cardBean!!.cardNo
+ }
+
+ private fun doConsume() {
+ if (isFixMode) {
+ if (lastPayBean.cardphyid == cardBean!!.cardphyid) {
+ val gap = (pos.getSysPara()?.fixpayGap ?: 10).toLong()
+ if (System.currentTimeMillis() - lastPayBean.suctime < gap * 1000) {
+ throw CardPayFailError("${gap}s内不能连续消费")
+ }
+ }
+ }
+ sendMsg(PublicDef.MSG_CARD_PAYING, "正在扣款...")
+ if (SPApplication.getInstance().isOnline()) {
+ if (!doOnlineConsume()) {
+ /**
+ * 由于不写卡,联机消费失败直接转离线
+ */
+ doOfflineConsume()
+ }
+ } else {
+ doOfflineConsume()
+ }
+ }
+
+ private fun doReverse() {
+ val list = pos.getTransdtlUnion(DateUtil.getNowDateNoFormat(), 0, 0, 1)
+ if (list.isEmpty()) {
+ throw CardPayCancelFailError("未找到消费记录")
+ }
+ if (list[0].payway == "offcard") {
+ doOfflineReverse(list[0])
+ } else {
+ doOnlineReverse(list[0])
+ }
+ }
+
+ private fun doOnlineReverse(unionRecord: TransdtlUnionRecord) {
+ val record = pos.getTransdtlOnlineLast() ?: throw CardPayCancelFailError("未找到联机记录")
+ checkOnlineReverseVaild(unionRecord, record)
+ saveTransdtlOnlineReverse(record)
+ showRvsOnlSucInfo()
+ asyncUpload(onlRvsRecord)
+ }
+
+ private fun doOfflineReverse(unionRecord: TransdtlUnionRecord) {
+ val record = pos.getTransdtlOfflineLast() ?: throw CardPayCancelFailError("未找到离线记录")
+ checkOfflineReverseVaild(unionRecord, record)
+ saveTransdtlOfflineReverse(record)
+ showRvsOffSucInfo()
+ asyncUpload(offRvsRecord)
+ }
+
+ private fun saveTransdtlOfflineReverse(record: TransdtlOfflineRecord) {
+ offRvsRecord = record.clone()
+ offRvsRecord.devseqno += 1
+ offRvsRecord.transdate = DateUtil.getNowDateNoFormat()
+ offRvsRecord.transtime = DateUtil.getNowTimeNoFormat()
+ offRvsRecord.reversalflag = ReversalFlag.MANUAL
+ offRvsRecord.reversalseqno = record.devseqno
+ offRvsRecord.reversaltransdate = record.transdate
+ offRvsRecord.reversaltranstime = record.transtime
+ offRvsRecord.upflag = 0
+ if (!pos.saveTransdtlOffline(offRvsRecord)) {
+ throw CardPayCancelFailError("保存流水失败")
+ }
+ }
+
+ private fun saveTransdtlOnlineReverse(record: TransdtlOnlineRecord) {
+ onlRvsRecord = record.clone()
+ onlRvsRecord.devseqno += 1
+ onlRvsRecord.transdate = DateUtil.getNowDateNoFormat()
+ onlRvsRecord.transtime = DateUtil.getNowTimeNoFormat()
+ onlRvsRecord.reversalflag = ReversalFlag.MANUAL
+ onlRvsRecord.reversalbillno = record.billno
+ onlRvsRecord.upflag = 0
+ if (!pos.saveTransdtlOnline(onlRvsRecord)) {
+ throw CardPayCancelFailError("保存流水失败")
+ }
+ }
+
+ private fun checkOnlineReverseVaild(unionRecord: TransdtlUnionRecord, record: TransdtlOnlineRecord) {
+ if (record.cardphyid != cardBean!!.cardphyid) {
+ throw CardPayCancelFailError("该卡不是最后消费")
+ }
+ if (unionRecord.transdate != record.transdate ||
+ unionRecord.transtime != record.transtime
+ ) {
+ throw CardPayCancelFailError("联机记录时间异常")
+ }
+ if (record.reversalflag == ReversalFlag.AUTO
+ ) {
+ throw CardPayCancelFailError("已撤销")
+ }
+ if (record.reversalflag == ReversalFlag.MANUAL) {
+ throw CardPayCancelFailError("已冲正")
+ }
+ if (record.status != PayStatus.SUC) {
+ throw CardPayCancelFailError("消费失败不能冲正")
+ }
+ val t1 = DateUtil.dateFormatConvertToLong(record.transdate + record.transtime)
+ val t2 = System.currentTimeMillis()
+ if (t2 - t1 > PublicDef.REVERSE_MS_GAP) {
+ throw CardPayCancelFailError("消费已过期")
+ }
+ }
+
+ private fun checkOfflineReverseVaild(unionRecord: TransdtlUnionRecord, record: TransdtlOfflineRecord) {
+ if (record.cardphyid != cardBean!!.cardphyid) {
+ throw CardPayCancelFailError("该卡不是最后消费")
+ }
+ if (unionRecord.transdate != record.transdate ||
+ unionRecord.transtime != record.transtime
+ ) {
+ throw CardPayCancelFailError("离线记录时间异常")
+ }
+ if (record.reversalflag == ReversalFlag.MANUAL ||
+ record.reversalflag == ReversalFlag.AUTO
+ ) {
+ throw CardPayCancelFailError("已冲正")
+ }
+ if (record.status != PayStatus.SUC) {
+ throw CardPayCancelFailError("消费失败不能冲正")
+ }
+ val t1 = DateUtil.dateFormatConvertToLong(record.transdate + record.transtime)
+ val t2 = System.currentTimeMillis()
+ if (t2 - t1 > PublicDef.REVERSE_MS_GAP) {
+ throw CardPayCancelFailError("消费已过期")
+ }
+ }
+
+ private fun doOnlineConsume(): Boolean {
+ initTransdtlOnline()
+ var resp = consumeApi.payInit(onlRecord)
+ var result = parseInitResult(resp)
+ if (!result) {
+ return result
+ }
+ resp = consumeApi.payConfirm(onlRecord)
+ result = parseConfirmResult(resp)
+ payQueryConfirm = false
+ if (!result) {
+ payQueryConfirm = true
+ result = doOnlineConsumeQuery()
+ }
+ updateTransdtlOnline(result)
+ if (result) {
+ showOnlSucInfo()
+ }
+ return result
+ }
+
+ private fun doOnlineConsumeQuery(): Boolean {
+ var queryCnt = 1
+ LogUtil.e(
+ TAG,
+ "pay timeout and query result,cardphyid=[${onlRecord.cardphyid}],billno=[${onlRecord.billno}]"
+ )
+ sleepWithCancel(1000)
+ while (payQueryConfirm) {
+ sendMsg(PublicDef.MSG_CARD_PAY_QUERY, "消费确认中[$queryCnt]")
+ val resp = consumeApi.payQuery(onlRecord)
+ val result = parseConfirmResult(resp)
+ if (result) {
+ return result
+ }
+ queryCnt += 1
+ sleepWithCancel(3000)
+ }
+ /**
+ * 手动取消交易
+ */
+ LogUtil.e(TAG, "manual cancel pay,cardphyid=[${onlRecord.cardphyid}],billno=[${onlRecord.billno}]")
+ throw CardPayInterruptError("交易取消")
+ }
+
+ private fun sleepWithCancel(ms: Long) {
+ var time = 0
+ while (payQueryConfirm) {
+ CommonUtil.doSleep(20)
+ time += 20
+ if (time > ms) {
+ return
+ }
+ }
+ }
+
+ private fun parseInitResult(resp: TransResp?): Boolean {
+ if (resp == null || resp.retcode != HttpStatus.SC_OK) {
+ SPApplication.getInstance().setEpayLinking(false)
+ return false
+ }
+ val retBean = try {
+ GsonUtil.GsonToBean(resp.retjson!!, CardPayInitRetBean::class.java)
+ } catch (ex: java.lang.Exception) {
+ throw CardPayFailError("json异常:${ex.message}")
+ }
+ if (retBean.retcode != PublicDef.SUCCESS) {
+ throw CardPayFailError(retBean.getErrorMsg())
+ }
+ onlRecord.billno = retBean.billno
+ onlRecord.username = retBean.username
+ return true
+ }
+
+ private fun parseConfirmResult(resp: TransResp?): Boolean {
+ if (resp == null || resp.retcode != HttpStatus.SC_OK) {
+ return false
+ }
+ val retBean = try {
+ GsonUtil.GsonToBean(resp.retjson!!, CardPayConfirmRetBean::class.java)
+ } catch (ex: Exception) {
+ throw CardPayFailError("json异常:${ex.message}")
+ }
+ if (retBean.retcode != PublicDef.SUCCESS) {
+ throw CardPayFailError(retBean.getErrorMsg())
+ }
+ if (retBean.require_query) {
+ return false
+ }
+ onlRecord.payamt = retBean.amount
+ onlRecord.extraamt = retBean.extraamt
+ return true
+ }
+
+ private fun initTransdtlOnline() {
+ onlRecord = TransdtlOnlineRecord()
+ var seqno = pos.getTransdtlOnlineMaxSeqno()
+ if (seqno == 0) {
+ seqno = pos.getDynamicPara()?.onlineseqno ?: 0
+ }
+ onlRecord.devphyid = pos.getConfigPara()!!.devphyid
+ onlRecord.transdate = cardBean!!.datetime!!.substring(0, 8)
+ onlRecord.transtime = cardBean!!.datetime!!.substring(8)
+ onlRecord.devseqno = seqno + 1
+ onlRecord.cardno = cardBean!!.cardNo
+ onlRecord.cardphyid = cardBean!!.cardphyid
+ onlRecord.payamt = cardBean!!.amount
+ onlRecord.reversalflag = ReversalFlag.NONE
+ onlRecord.extraamt = 0
+ onlRecord.transtype = "card"
+ onlRecord.status = PayStatus.INIT
+ onlRecord.upflag = 1
+ if (!pos.saveTransdtlOnline(onlRecord)) {
+ throw CardPayFailError("保存流水失败")
+ }
+ }
+
+ private fun updateTransdtlOnline(issuccess: Boolean) {
+ if (issuccess) {
+ onlRecord.status = PayStatus.SUC
+ } else {
+ onlRecord.status = PayStatus.FAIL
+ }
+ onlRecord.upflag = 1
+ pos.updateTransdtlOnline(onlRecord)
+ }
+
+ private fun doOfflineConsume() {
+ initTransdtlOffline()
+ checkCardValid()
+ updateTransdtlOffline(true)
+ showOffSucInfo()
+ }
+
+ private fun checkCardValid() {
+ val sysRecord = pos.getSysPara()
+ if (!sysRecord!!.offlineEnable) {
+ throw CardPayFailError("禁止离线交易")
+ }
+ val ctlRecord = pos.getControlPara(PublicDef.CONTROL_OFFLINE_DAY_DISABLE)
+ if (ctlRecord == null || ctlRecord.paraval != "1") {
+ val offdate = DateUtil.getDayDateNoFormatBefore(sysRecord.maxOfflineDays)
+ val validdate = pos.getDynamicPara()!!.jwtExpire?.substring(0, 8) ?: "00000000"
+ if (offdate > validdate) {
+ throw CardPayFailError("设备已脱机${sysRecord.maxOfflineDays}天")
+ }
+ }
+
+ val whiteRecord =
+ pos.getWhiteList(offRecord.cardphyid!!, offRecord.cardno!!) ?: throw CardPayFailError("卡无权限")
+ when (whiteRecord.status) {
+ "normal" -> {
+
+ }
+ "expire" -> throw CardPayFailError("卡已过期")
+ "lost" -> throw CardPayFailError("卡已挂失")
+ "logout" -> throw CardPayFailError("卡已注销")
+ "frozen" -> throw CardPayFailError("卡已冻结")
+ "lock" -> throw CardPayFailError("卡已锁定")
+ else -> throw CardPayFailError("卡状态:${whiteRecord.status}")
+ }
+
+ val payamt = pos.getTransdtlOfflineAmt(offRecord.transdate!!, offRecord.cardno!!, offRecord.cardphyid!!)
+ if ((payamt + offRecord.payamt) > sysRecord.maxDayOfflineAmt) {
+ throw CardPayFailError("已离线交易" + String.format("%.02f元", payamt / 100.0f))
+ }
+ }
+
+ private fun initTransdtlOffline() {
+ offRecord = TransdtlOfflineRecord()
+ var seqno = pos.getTransdtlOfflineMaxSeqno()
+ if (seqno == 0) {
+ seqno = pos.getDynamicPara()?.offlineseqno ?: 0
+ }
+ offRecord.devphyid = pos.getConfigPara()!!.devphyid
+ offRecord.transdate = cardBean!!.datetime!!.substring(0, 8)
+ offRecord.transtime = cardBean!!.datetime!!.substring(8)
+ offRecord.devseqno = seqno + 1
+ offRecord.cardno = cardBean!!.cardNo
+ offRecord.cardphyid = cardBean!!.cardphyid
+ offRecord.payamt = cardBean!!.amount
+ offRecord.reversalflag = ReversalFlag.NONE
+ offRecord.extraamt = 0
+ offRecord.managefeetype = "none"
+ offRecord.status = PayStatus.INIT
+ offRecord.upflag = 1
+ if (!pos.saveTransdtlOffline(offRecord)) {
+ throw CardPayFailError("保存流水失败")
+ }
+ }
+
+ private fun updateTransdtlOffline(issuccess: Boolean) {
+ if (issuccess) {
+ offRecord.status = PayStatus.SUC
+ } else {
+ offRecord.status = PayStatus.FAIL
+ }
+ offRecord.upflag = 0
+ if (!pos.updateTransdtlOffline(offRecord)) {
+ throw CardPayFailError("更新流水失败")
+ }
+ asyncUpload(offRecord)
+ }
+
+ private fun showOnlSucInfo() {
+ lastPayBean.cardphyid = cardBean!!.cardphyid
+ lastPayBean.suctime = System.currentTimeMillis()
+ val info = CardUserInfoBean(PublicDef.SUCCESS, "消费成功")
+ info.showtime = pos.getSysPara()!!.sucShowtime
+ info.amount = onlRecord.payamt
+ info.payamt = onlRecord.payamt
+ info.username = onlRecord.username
+ info.cardno = onlRecord.cardno
+ info.transdate = onlRecord.transdate
+ info.transtime = onlRecord.transtime
+ info.payway = onlRecord.transtype
+ info.status = onlRecord.status
+ info.reversalFlag = onlRecord.reversalflag
+ sendMsg(PublicDef.MSG_CARD_PAY_SUC, info)
+ }
+
+ private fun showOffSucInfo() {
+ lastPayBean.cardphyid = cardBean!!.cardphyid
+ lastPayBean.suctime = System.currentTimeMillis()
+ val info = CardUserInfoBean(PublicDef.SUCCESS, "消费成功")
+ info.showtime = pos.getSysPara()!!.sucShowtime
+ info.amount = offRecord.payamt
+ info.payamt = offRecord.payamt
+ info.cardno = offRecord.cardno
+ info.transdate = offRecord.transdate
+ info.transtime = offRecord.transtime
+ info.payway = "card"
+ info.status = offRecord.status
+ info.reversalFlag = offRecord.reversalflag
+ sendMsg(PublicDef.MSG_CARD_PAY_SUC, info)
+ }
+
+ private fun showRvsOnlSucInfo() {
+ val info = CardUserInfoBean(PublicDef.SUCCESS, "冲正成功")
+ info.showtime = pos.getSysPara()!!.sucShowtime
+ info.amount = onlRvsRecord.payamt
+ info.payamt = onlRvsRecord.payamt
+ info.username = onlRvsRecord.username
+ info.cardno = onlRvsRecord.cardno
+ info.transdate = onlRvsRecord.transdate
+ info.transtime = onlRvsRecord.transtime
+ info.payway = onlRvsRecord.transtype
+ info.status = onlRvsRecord.status
+ info.reversalFlag = onlRvsRecord.reversalflag
+ sendMsg(PublicDef.MSG_CARD_REVERSE_SUC, info)
+ }
+
+ private fun showRvsOffSucInfo() {
+ val info = CardUserInfoBean(PublicDef.SUCCESS, "冲正成功")
+ info.showtime = pos.getSysPara()!!.sucShowtime
+ info.amount = offRvsRecord.payamt
+ info.payamt = offRvsRecord.payamt
+ info.cardno = offRvsRecord.cardno
+ info.transdate = offRvsRecord.transdate
+ info.transtime = offRvsRecord.transtime
+ info.payway = "card"
+ info.status = offRvsRecord.status
+ info.reversalFlag = offRvsRecord.reversalflag
+ sendMsg(PublicDef.MSG_CARD_REVERSE_SUC, info)
+ }
+
+ private fun asyncUpload(dtl: TransdtlOfflineRecord) {
+ ThreadPool.getShortPool().execute(Runnable {
+ try {
+ EpayApiImpl().uploadTransdtl(dtl)
+ dtl.upflag = 1
+ pos.updateTransdtlOffline(dtl)
+ } catch (ex: java.lang.Exception) {
+ ex.printStackTrace()
+ }
+ })
+ }
+
+ private fun asyncUpload(dtl: TransdtlOnlineRecord) {
+ ThreadPool.getShortPool().execute(Runnable {
+ try {
+ EpayApiImpl().uploadTransdtl(dtl)
+ dtl.upflag = 1
+ pos.updateTransdtlOnline(dtl)
+ } catch (ex: java.lang.Exception) {
+ ex.printStackTrace()
+ }
+ })
+ }
+
+ private fun doClear() {
+ oldcardphyid = null
+ onlineBalance = false
+ val curtime = System.currentTimeMillis()
+ if (curtime < lastShowTime ||
+ curtime - lastShowTime > 1000
+ ) {
+ lastShowTime = curtime
+ sendMsg(PublicDef.MSG_USER_INFO_CLEAR, DateUtil.getNowDateTime1())
+ showLinkStatus()
+ }
+ }
+
+ private fun showLinkStatus() {
+ if (SPApplication.getInstance().isOnline()) {
+ if (!curLinkStatus) {
+ curLinkRefreshTime = System.currentTimeMillis()
+ curLinkStatus = true
+ sendMsg(PublicDef.MSG_LINK_STATUS, true)
+ return
+ }
+ } else {
+ if (curLinkStatus) {
+ curLinkStatus = false
+ curLinkRefreshTime = System.currentTimeMillis()
+ sendMsg(PublicDef.MSG_LINK_STATUS, false)
+ return
+ }
+ }
+ val t = System.currentTimeMillis()
+ if (t < curLinkRefreshTime ||
+ t - curLinkRefreshTime > 30000
+ ) {
+ curLinkRefreshTime = t
+ sendMsg(PublicDef.MSG_LINK_STATUS, SPApplication.getInstance().isOnline())
+ }
+ }
+
+ private fun getErrorInfo(errmsg: String?): CardUserInfoBean {
+ val info = CardUserInfoBean(PublicDef.ERROR, errmsg ?: "null")
+ info.showtime = pos.getSysPara()!!.failShowtime
+ info.status = PayStatus.FAIL
+ info.amount = amount
+ info.payamt = amount
+ info.payway = "card"
+ info.cardno = cardBean?.cardNo
+ info.transdate = DateUtil.getNowDateNoFormat()
+ info.transtime = DateUtil.getNowTimeNoFormat()
+ return info
+ }
+
+ private fun getRvsErrorInfo(errmsg: String?): CardUserInfoBean {
+ val info = CardUserInfoBean(PublicDef.ERROR, errmsg ?: "null")
+ info.showtime = pos.getSysPara()!!.failShowtime
+ info.status = PayStatus.FAIL
+ info.amount = amount
+ info.payamt = amount
+ info.cardno = cardBean?.cardNo
+ info.payway = "card"
+ info.transdate = DateUtil.getNowDateNoFormat()
+ info.transtime = DateUtil.getNowTimeNoFormat()
+ info.reversalFlag = ReversalFlag.MANUAL
+ return info
+ }
+
+ private fun sendMsg(code: Int, obj: Any) {
+ val msg = Message()
+ msg.what = code
+ msg.obj = obj
+ handler.sendMessage(msg)
+ }
+ }
+}
+
+enum class ClickStat {
+ INIT,
+ PAY,
+ REVERSE
}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/consumeMode/ConsumeModeActivity.kt b/app/src/main/java/com/supwisdom/activities/consumeMode/ConsumeModeActivity.kt
index 79e632a..3accf97 100644
--- a/app/src/main/java/com/supwisdom/activities/consumeMode/ConsumeModeActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/consumeMode/ConsumeModeActivity.kt
@@ -422,7 +422,7 @@
private fun refreshToCheckPasswd() {
AuxScreenController.getInstance().refreshTitle("消费模式设置")
- AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
+ AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("请输入商户密码:", " "))
}
@@ -509,7 +509,7 @@
private fun screenShowAmt() {
AuxScreenController.getInstance().refreshTitle("消费模式设置 F1-特殊模式")
- AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
+ AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
AuxScreenController.getInstance().refreshContent(
Arrays.asList<String>(
PayMode.NORMAL.desc + "-普通消费",
diff --git a/app/src/main/java/com/supwisdom/activities/init/InitActivity.kt b/app/src/main/java/com/supwisdom/activities/init/InitActivity.kt
index ea5626d..79845f9 100644
--- a/app/src/main/java/com/supwisdom/activities/init/InitActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/init/InitActivity.kt
@@ -138,7 +138,7 @@
private fun refresh() {
AuxScreenController.getInstance().refreshTitle("通讯参数设置")
- AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
+ AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
AuxScreenController.getInstance()
.refreshContent(Arrays.asList("设备第一次使用", "请联系管理员", "在大屏配置参数"))
}
@@ -148,7 +148,7 @@
try {
val ret = NsdClientApi(nsdServiceIp!!, nsdServicePort).getNsdServerConfigList()
runOnUiThread {
- vNsdResult.text = ret.retmsg
+ vNsdResult.text = ret.getErrorMsg()
if (ret.retcode == PublicDef.SUCCESS) {
if (ret.list!!.isEmpty()) {
vNsdResult.text = "未找到配置项"
@@ -198,7 +198,7 @@
NsdClientApi(nsdServiceIp!!, nsdServicePort).getEcardConfigParam(configName)
NtpClient().startCalibrateTime(ret.systime)
runOnUiThread {
- vNsdResult.text = ret.retmsg
+ vNsdResult.text = ret.getErrorMsg()
if (ret.retcode == PublicDef.SUCCESS) {
vNsdResult.setTextColor(resources.getColor(R.color.light_blue2))
if (ret.mode == 0) {
diff --git a/app/src/main/java/com/supwisdom/activities/load/LoadActivity.kt b/app/src/main/java/com/supwisdom/activities/load/LoadActivity.kt
index 33a11b5..f3c6bb3 100644
--- a/app/src/main/java/com/supwisdom/activities/load/LoadActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/load/LoadActivity.kt
@@ -42,7 +42,7 @@
procontent.setLength(0)
auxList.clear()
AuxScreenController.getInstance().refreshTitle("设备参数加载")
- AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
+ AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
AuxScreenController.getInstance().refreshContent(auxList)
}
diff --git a/app/src/main/java/com/supwisdom/activities/load/LoadPresenter.kt b/app/src/main/java/com/supwisdom/activities/load/LoadPresenter.kt
index 95f6739..1ce8330 100644
--- a/app/src/main/java/com/supwisdom/activities/load/LoadPresenter.kt
+++ b/app/src/main/java/com/supwisdom/activities/load/LoadPresenter.kt
@@ -62,10 +62,10 @@
AuthRetBean(PublicDef.ERROR, ex.message ?: "null")
}
if (bean.retcode != PublicDef.SUCCESS) {
- sendMessage(LOAD_DONE, bean.retmsg!!)
+ sendMessage(LOAD_DONE, bean.getErrorMsg())
loading = false
if (!hasInit) {
- sendMessage(JUMP_TO_UNREGISTER, "签到失败:${bean.retmsg}")
+ sendMessage(JUMP_TO_UNREGISTER, "签到失败:${bean.getErrorMsg()}")
return@Runnable
}
} else {
diff --git a/app/src/main/java/com/supwisdom/activities/manage/ManageActivity.kt b/app/src/main/java/com/supwisdom/activities/manage/ManageActivity.kt
index c2021bf..d07836b 100644
--- a/app/src/main/java/com/supwisdom/activities/manage/ManageActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/manage/ManageActivity.kt
@@ -4,6 +4,9 @@
import android.os.Bundle
import android.os.CountDownTimer
import android.view.KeyEvent
+import android.view.View
+import android.widget.LinearLayout
+import android.widget.TextView
import com.supwisdom.R
import com.supwisdom.activities.BaseActivity
import com.supwisdom.activities.SPApplication
@@ -15,6 +18,7 @@
import com.supwisdom.utils.AppExitUtil
import com.supwisdom.utils.CommonUtil
import com.supwisdom.utils.DateUtil
+import com.supwisdom.utils.PublicDef
import java.util.*
/**
@@ -22,12 +26,14 @@
** @desc
**/
class ManageActivity : BaseActivity(), IManageView {
- private var presenter: ManagePresenter? = null
+ private lateinit var presenter: ManagePresenter
private var flag: Boolean = false
private var isRunning: Boolean = false
private val pos = SPApplication.getInstance().getPos()
-
- @Volatile
+ private lateinit var vOperateHint: TextView
+ private lateinit var vOperateResult: TextView
+ private lateinit var llOperate: LinearLayout
+ private lateinit var llMenu: LinearLayout
private var keyActive = true
override fun onCreate(savedInstanceState: Bundle?) {
@@ -38,7 +44,10 @@
}
private fun initView() {
-
+ llOperate = findViewById<View>(R.id.ll_operate) as LinearLayout
+ llMenu = findViewById<View>(R.id.ll_menu) as LinearLayout
+ vOperateHint = findViewById<View>(R.id.tv_operate_hint) as TextView
+ vOperateResult = findViewById<View>(R.id.tv_operate_result) as TextView
}
private fun initData() {
@@ -63,37 +72,30 @@
}
when (keyCode) {
KeyEvent.KEYCODE_1 -> {
- flag = true
- showShopPassword()
+ showOperHint(
+ "商户密码:",
+ pos.getConfigPara()!!.shopPwd ?: PublicDef.PASSWD_SHOP_DEFAULT
+ )
}
KeyEvent.KEYCODE_2 -> jumpActivity(CommunicateActivity::class.java)
KeyEvent.KEYCODE_3 -> {
//查询流水
- flag = true
- AuxScreenController.getInstance()
- .refreshContent(Arrays.asList<String>("流水查询:", "暂不支持"))
+ showOperHint("流水查询:", "暂不支持")
}
KeyEvent.KEYCODE_4 -> {
- flag = true
- presenter!!.doSynoActive()
+ presenter.doSynoActive()
}
KeyEvent.KEYCODE_5 -> jumpActivity(UpgradeActivity::class.java)
KeyEvent.KEYCODE_6 -> {
- AuxScreenController.getInstance()
- .refreshContent(Arrays.asList<String>("应用程序已退出", "请到大屏操作"))
+ showOperHint("应用程序已退出", "请到大屏操作")
AppExitUtil.exit()
}
KeyEvent.KEYCODE_7 -> {
- AuxScreenController.getInstance()
- .refreshContent(Arrays.asList<String>("应用程序已退出", "请到大屏操作"))
+ showOperHint("应用程序已退出", "请到大屏操作")
CommonUtil.startNetSetting(this)
}
KeyEvent.KEYCODE_8 -> {
- flag = true
- isRunning = true
- AuxScreenController.getInstance()
- .refreshContent(Arrays.asList<String>("正在清空白名单", "请稍等..."))
- presenter!!.clearAndUpdateWhitelist()
+ presenter.clearAndUpdateWhitelist()
}
KeyEvent.KEYCODE_9 -> jumpActivity(ControlActivity::class.java)
KeyEvent.KEYCODE_DEL ->
@@ -105,12 +107,18 @@
}
override fun showOperHint(hint: String, result: String) {
+ flag = true
+ isRunning = false
+ llOperate.visibility = View.VISIBLE
+ llMenu.visibility = View.GONE
+ vOperateHint.text = hint
+ vOperateResult.text = result
AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(hint, result))
}
override fun showOperResult(hint: String, result: String) {
- flag = true
- isRunning = false
+ vOperateHint.text = hint
+ vOperateResult.text = result
AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(hint, result))
}
@@ -123,8 +131,10 @@
private fun refresh() {
flag = false
isRunning = false
+ llMenu.visibility = View.VISIBLE
+ llOperate.visibility = View.GONE
AuxScreenController.getInstance().refreshTitle("设备管理界面")
- AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
+ AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
AuxScreenController.getInstance().refreshContent(
Arrays.asList(
getString(R.string.consume_menu_shop_passwd),
@@ -140,11 +150,6 @@
)
}
- private fun showShopPassword() {
- AuxScreenController.getInstance()
- .refreshContent(Arrays.asList<String>("商户密码:", pos.getConfigPara()!!.shopPwd))
- }
-
override fun getActivity(): Activity {
return this
}
diff --git a/app/src/main/java/com/supwisdom/activities/manage/ManagePresenter.kt b/app/src/main/java/com/supwisdom/activities/manage/ManagePresenter.kt
index bab3996..9e3be40 100644
--- a/app/src/main/java/com/supwisdom/activities/manage/ManagePresenter.kt
+++ b/app/src/main/java/com/supwisdom/activities/manage/ManagePresenter.kt
@@ -52,6 +52,7 @@
iManageView.showOperHint("重置黑名单失败", "网络未联通")
return
}
+ iManageView.showOperHint("正在清空白名单", "请稍等...")
ClearWhiteList().execute()
}
@@ -72,9 +73,9 @@
private inner class ReloadTransdtl : AsyncTask<Void, Int, BaseResp>() {
override fun onPostExecute(resp: BaseResp) {
if (resp.retcode == PublicDef.SUCCESS) {
- iManageView.showOperResult("补采流水成功", resp.retmsg!!)
+ iManageView.showOperResult("补采流水成功", resp.getErrorMsg())
} else {
- iManageView.showOperResult("补采流水失败", resp.retmsg!!)
+ iManageView.showOperResult("补采流水失败", resp.getErrorMsg())
}
}
@@ -88,7 +89,7 @@
if (resp.retcode == PublicDef.SUCCESS) {
iManageView.showOperResult("白名单更新成功", "")
} else {
- iManageView.showOperResult("白名单更新失败", resp.retmsg!!)
+ iManageView.showOperResult("白名单更新失败", resp.getErrorMsg())
}
}
@@ -124,9 +125,9 @@
override fun onPostExecute(resp: BaseResp) {
if (resp.retcode == PublicDef.SUCCESS) {
- iManageView.showOperResult("导出流水成功", resp.retmsg!!)
+ iManageView.showOperResult("导出流水成功", resp.getErrorMsg())
} else {
- iManageView.showOperResult("导出流水失败", resp.retmsg!!)
+ iManageView.showOperResult("导出流水失败", resp.getErrorMsg())
}
}
}
diff --git a/app/src/main/java/com/supwisdom/activities/menu/MenuActivity.kt b/app/src/main/java/com/supwisdom/activities/menu/MenuActivity.kt
index 63ef0ed..43f1bc9 100644
--- a/app/src/main/java/com/supwisdom/activities/menu/MenuActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/menu/MenuActivity.kt
@@ -6,6 +6,7 @@
import android.os.CountDownTimer
import android.view.KeyEvent
import android.view.View
+import android.widget.LinearLayout
import android.widget.TextView
import com.supwisdom.R
import com.supwisdom.activities.BaseActivity
@@ -30,6 +31,10 @@
private var isRunning: Boolean = false
private var flag: Boolean = false
private lateinit var vReverse: TextView
+ private lateinit var vOperateHint: TextView
+ private lateinit var vOperateResult: TextView
+ private lateinit var llOperate: LinearLayout
+ private lateinit var llMenu: LinearLayout
private var keyActive = true
override fun onCreate(savedInstanceState: Bundle?) {
@@ -44,7 +49,11 @@
}
private fun initView() {
+ llOperate = findViewById<View>(R.id.ll_operate) as LinearLayout
+ llMenu = findViewById<View>(R.id.ll_menu) as LinearLayout
vReverse = this.findViewById<View>(R.id.tv_reverse) as TextView
+ vOperateHint = findViewById<View>(R.id.tv_operate_hint) as TextView
+ vOperateResult = findViewById<View>(R.id.tv_operate_result) as TextView
}
override fun dispatchKeyEvent(event: KeyEvent): Boolean {
@@ -105,14 +114,20 @@
refresh()
}
- override fun showOperHint(title: String, result: String) {
- AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(title, result))
- }
-
- override fun showOperResult(title: String, result: String) {
+ override fun showOperHint(hint: String, result: String) {
flag = true
isRunning = false
- AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(title, result))
+ llOperate.visibility = View.VISIBLE
+ llMenu.visibility = View.GONE
+ vOperateHint.text = hint
+ vOperateResult.text = result
+ AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(hint, result))
+ }
+
+ override fun showOperResult(hint: String, result: String) {
+ vOperateHint.text = hint
+ vOperateResult.text = result
+ AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(hint, result))
}
override fun getActivity(): Activity {
@@ -122,6 +137,8 @@
private fun refresh() {
isRunning = false
flag = false
+ llMenu.visibility = View.VISIBLE
+ llOperate.visibility = View.GONE
val secList = ArrayList<String>()
secList.add(getString(R.string.consume_menu_revenue))
secList.add(getString(R.string.consume_menu_transdtl_upload))
@@ -138,7 +155,7 @@
vReverse.visibility = View.GONE
}
AuxScreenController.getInstance().refreshTitle("设备管理界面")
- AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
+ AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
AuxScreenController.getInstance().refreshContent(secList)
}
diff --git a/app/src/main/java/com/supwisdom/activities/menu/MenuPresenter.kt b/app/src/main/java/com/supwisdom/activities/menu/MenuPresenter.kt
index 8f49136..0171852 100644
--- a/app/src/main/java/com/supwisdom/activities/menu/MenuPresenter.kt
+++ b/app/src/main/java/com/supwisdom/activities/menu/MenuPresenter.kt
@@ -1,151 +1,154 @@
-package com.supwisdom.activities.menu
-
-import android.content.Intent
-import android.os.AsyncTask
-import com.supwisdom.activities.SPApplication
-import com.supwisdom.activities.consume.ConsumeActivity
-import com.supwisdom.bean.AuthRetBean
-import com.supwisdom.bean.BaseResp
-import com.supwisdom.entity.PayStatus
-import com.supwisdom.entity.ReversalFlag
-import com.supwisdom.exception.AuthEpayError
-import com.supwisdom.exception.HeartBeatError
-import com.supwisdom.exception.TransdtlUploadError
-import com.supwisdom.service.AuthEpay
-import com.supwisdom.service.EpayApiImpl
-import com.supwisdom.utils.DateUtil
-import com.supwisdom.utils.PublicDef
-
-/**
- ** create by zzq on 2019/7/25
- ** @desc
- **/
-class MenuPresenter constructor(iMenuView: IMenuView) {
- private val iMenuView = iMenuView
- private val pos = SPApplication.getInstance().getPos()
- fun manualAuth() {
- iMenuView.showOperHint("正在签到", "请稍等...")
- AsyncAuth().execute()
- }
-
- fun linkCheck() {
- iMenuView.showOperHint("正在链路检测", "请稍等...")
- AsyncLink().execute()
- }
-
- private inner class AsyncAuth : AsyncTask<Void, Void, AuthRetBean>() {
- override fun doInBackground(vararg voids: Void): AuthRetBean {
- val retBean = try {
- AuthEpay().login()
- } catch (ex: AuthEpayError) {
- AuthRetBean(PublicDef.ERROR, ex.message ?: "null")
- }
- if (retBean.retcode == PublicDef.SUCCESS) {
- val record = pos.getDynamicPara()
- record!!.deviceid = retBean.deviceid
- record.merchaccno = retBean.merchaccno
- record.shopname = retBean.shopname
- record.paragroupid = retBean.paragroupid
- pos.replaceDynamicPara(record)
-
- SPApplication.getInstance().setEpayLinking(true)
- } else {
- SPApplication.getInstance().setEpayLinking(false)
- }
- return retBean
- }
-
- override fun onPostExecute(retBean: AuthRetBean?) {
- when {
- retBean == null -> iMenuView.showOperResult("签到失败", "请求超时")
- retBean.retcode != PublicDef.SUCCESS -> iMenuView.showOperResult("签到失败", retBean.retmsg ?: "null")
- else -> iMenuView.showOperResult("签到成功", " ")
- }
- }
- }
-
- private inner class AsyncLink : AsyncTask<Void, Void, BaseResp>() {
- override fun doInBackground(vararg voids: Void): BaseResp {
- return try {
- EpayApiImpl().linkCheck()
- BaseResp(PublicDef.SUCCESS, "连接成功")
- } catch (ex: HeartBeatError) {
- BaseResp(PublicDef.ERROR, ex.message)
- }
- }
-
- override fun onPostExecute(baseResp: BaseResp) {
- SPApplication.getInstance().setEpayLinking(baseResp.retcode == PublicDef.SUCCESS)
- iMenuView.showOperResult("检测结果", baseResp.retmsg!!)
- }
- }
-
- fun doReverse() {
- val list = pos.getTransdtlUnion(DateUtil.getNowDateNoFormat(), 0, 0, 1)
- if (list.isEmpty()) {
- iMenuView.showOperResult("冲正失败", "未找到消费记录")
- return
- }
- val record = list[0]
- if (record.reversalflag == ReversalFlag.AUTO ||
- record.reversalflag == ReversalFlag.MANUAL
- ) {
- iMenuView.showOperResult("冲正失败", "已冲正")
- return
- }
- if (record.status != PayStatus.SUC) {
- iMenuView.showOperResult("冲正失败", "消费失败不能冲正")
- return
- }
- val t1 = DateUtil.dateFormatConvertToLong(record.transdate + record.transtime)
- val t2 = System.currentTimeMillis()
- if (t2 - t1 > PublicDef.REVERSE_MS_GAP) {
- iMenuView.showOperResult("冲正失败", "消费已过期")
- return
- }
- val intent = Intent()
- intent.putExtra("datetime", DateUtil.getNowDateNoFormat())
- intent.putExtra("amount", record.payamt.toString())
- intent.putExtra("payway", record.payway)
- intent.putExtra("operation", "reverse")
- intent.setClass(iMenuView.getActivity(), ConsumeActivity::class.java)
- iMenuView.getActivity().startActivity(intent)
- }
-
- fun uploadTransdtl() {
- iMenuView.showOperHint("正在上传流水", "请稍等...")
- UploadTransdtl().execute()
- }
-
- private inner class UploadTransdtl : AsyncTask<Void, Void, BaseResp>() {
- override fun doInBackground(vararg voids: Void): BaseResp {
- val apiInterface = EpayApiImpl()
- var num = 0
- try {
- pos.getTransdtlOfflineUnconfirm().forEach {
- apiInterface.uploadTransdtl(it)
- it.upflag = 1
- pos.updateTransdtlOffline(it)
- num += 1
- }
- pos.getTransdtlOnlineUnconfirm().forEach {
- apiInterface.uploadTransdtl(it)
- it.upflag = 1
- pos.updateTransdtlOnline(it)
- num += 1
- }
- return BaseResp(PublicDef.SUCCESS, "上传共" + num + "条")
- } catch (ex: TransdtlUploadError) {
- return BaseResp(PublicDef.ERROR, ex.message)
- }
- }
-
- override fun onPostExecute(resp: BaseResp) {
- if (resp.retcode == PublicDef.SUCCESS) {
- iMenuView.showOperResult("上传流水成功", resp.retmsg!!)
- } else {
- iMenuView.showOperResult("上传流水失败", resp.retmsg!!)
- }
- }
- }
+package com.supwisdom.activities.menu
+
+import android.content.Intent
+import android.os.AsyncTask
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.consume.ConsumeActivity
+import com.supwisdom.bean.AuthRetBean
+import com.supwisdom.bean.BaseResp
+import com.supwisdom.entity.PayStatus
+import com.supwisdom.entity.ReversalFlag
+import com.supwisdom.exception.AuthEpayError
+import com.supwisdom.exception.HeartBeatError
+import com.supwisdom.exception.TransdtlUploadError
+import com.supwisdom.service.AuthEpay
+import com.supwisdom.service.EpayApiImpl
+import com.supwisdom.utils.DateUtil
+import com.supwisdom.utils.PublicDef
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc
+ **/
+class MenuPresenter constructor(iMenuView: IMenuView) {
+ private val iMenuView = iMenuView
+ private val pos = SPApplication.getInstance().getPos()
+ fun manualAuth() {
+ iMenuView.showOperHint("正在签到", "请稍等...")
+ AsyncAuth().execute()
+ }
+
+ fun linkCheck() {
+ iMenuView.showOperHint("正在链路检测", "请稍等...")
+ AsyncLink().execute()
+ }
+
+ private inner class AsyncAuth : AsyncTask<Void, Void, AuthRetBean>() {
+ override fun doInBackground(vararg voids: Void): AuthRetBean {
+ val retBean = try {
+ AuthEpay().login()
+ } catch (ex: AuthEpayError) {
+ AuthRetBean(PublicDef.ERROR, ex.message ?: "null")
+ }
+ if (retBean.retcode == PublicDef.SUCCESS) {
+ val record = pos.getDynamicPara()
+ record!!.deviceid = retBean.deviceid
+ record.merchaccno = retBean.merchaccno
+ record.shopname = retBean.shopname
+ record.paragroupid = retBean.paragroupid
+ pos.replaceDynamicPara(record)
+
+ SPApplication.getInstance().setEpayLinking(true)
+ } else {
+ SPApplication.getInstance().setEpayLinking(false)
+ }
+ return retBean
+ }
+
+ override fun onPostExecute(retBean: AuthRetBean?) {
+ when {
+ retBean == null -> iMenuView.showOperResult("签到失败", "请求超时")
+ retBean.retcode != PublicDef.SUCCESS -> iMenuView.showOperResult(
+ "签到失败",
+ retBean.getErrorMsg()
+ )
+ else -> iMenuView.showOperResult("签到成功", " ")
+ }
+ }
+ }
+
+ private inner class AsyncLink : AsyncTask<Void, Void, BaseResp>() {
+ override fun doInBackground(vararg voids: Void): BaseResp {
+ return try {
+ EpayApiImpl().linkCheck()
+ BaseResp(PublicDef.SUCCESS, "连接成功")
+ } catch (ex: HeartBeatError) {
+ BaseResp(PublicDef.ERROR, ex.message)
+ }
+ }
+
+ override fun onPostExecute(baseResp: BaseResp) {
+ SPApplication.getInstance().setEpayLinking(baseResp.retcode == PublicDef.SUCCESS)
+ iMenuView.showOperResult("检测结果", baseResp.getErrorMsg())
+ }
+ }
+
+ fun doReverse() {
+ val list = pos.getTransdtlUnion(DateUtil.getNowDateNoFormat(), 0, 0, 1)
+ if (list.isEmpty()) {
+ iMenuView.showOperResult("冲正失败", "未找到消费记录")
+ return
+ }
+ val record = list[0]
+ if (record.reversalflag == ReversalFlag.AUTO ||
+ record.reversalflag == ReversalFlag.MANUAL
+ ) {
+ iMenuView.showOperResult("冲正失败", "已冲正")
+ return
+ }
+ if (record.status != PayStatus.SUC) {
+ iMenuView.showOperResult("冲正失败", "消费失败不能冲正")
+ return
+ }
+ val t1 = DateUtil.dateFormatConvertToLong(record.transdate + record.transtime)
+ val t2 = System.currentTimeMillis()
+ if (t2 - t1 > PublicDef.REVERSE_MS_GAP) {
+ iMenuView.showOperResult("冲正失败", "消费已过期")
+ return
+ }
+ val intent = Intent()
+ intent.putExtra("datetime", DateUtil.getNowDateNoFormat())
+ intent.putExtra("amount", record.payamt.toString())
+ intent.putExtra("payway", record.payway)
+ intent.putExtra("operation", "reverse")
+ intent.setClass(iMenuView.getActivity(), ConsumeActivity::class.java)
+ iMenuView.getActivity().startActivity(intent)
+ }
+
+ fun uploadTransdtl() {
+ iMenuView.showOperHint("正在上传流水", "请稍等...")
+ UploadTransdtl().execute()
+ }
+
+ private inner class UploadTransdtl : AsyncTask<Void, Void, BaseResp>() {
+ override fun doInBackground(vararg voids: Void): BaseResp {
+ val apiInterface = EpayApiImpl()
+ var num = 0
+ try {
+ pos.getTransdtlOfflineUnconfirm().forEach {
+ apiInterface.uploadTransdtl(it)
+ it.upflag = 1
+ pos.updateTransdtlOffline(it)
+ num += 1
+ }
+ pos.getTransdtlOnlineUnconfirm().forEach {
+ apiInterface.uploadTransdtl(it)
+ it.upflag = 1
+ pos.updateTransdtlOnline(it)
+ num += 1
+ }
+ return BaseResp(PublicDef.SUCCESS, "上传共" + num + "条")
+ } catch (ex: TransdtlUploadError) {
+ return BaseResp(PublicDef.ERROR, ex.message)
+ }
+ }
+
+ override fun onPostExecute(resp: BaseResp) {
+ if (resp.retcode == PublicDef.SUCCESS) {
+ iMenuView.showOperResult("上传流水成功", resp.getErrorMsg())
+ } else {
+ iMenuView.showOperResult("上传流水失败", resp.getErrorMsg())
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/passwd/PasswdActivity.kt b/app/src/main/java/com/supwisdom/activities/passwd/PasswdActivity.kt
index 88d8b56..4fd3122 100644
--- a/app/src/main/java/com/supwisdom/activities/passwd/PasswdActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/passwd/PasswdActivity.kt
@@ -155,7 +155,7 @@
tmpPwd = ""
passwdHint = "输入原密码"
AuxScreenController.getInstance().refreshTitle("商户密码修改")
- AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
+ AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(passwdHint, " "))
}
diff --git a/app/src/main/java/com/supwisdom/activities/splash/SplashActivity.kt b/app/src/main/java/com/supwisdom/activities/splash/SplashActivity.kt
index b4710ba..1446525 100644
--- a/app/src/main/java/com/supwisdom/activities/splash/SplashActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/splash/SplashActivity.kt
@@ -39,7 +39,7 @@
private fun refresh() {
AuxScreenController.getInstance().refreshTitle("新开普智能设备")
- AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
+ AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
AuxScreenController.getInstance().refreshContent(listOf<String>("欢迎使用智能设备"))
}
diff --git a/app/src/main/java/com/supwisdom/activities/unregister/UnregisterActivity.kt b/app/src/main/java/com/supwisdom/activities/unregister/UnregisterActivity.kt
index 8eff856..ecbf57a 100644
--- a/app/src/main/java/com/supwisdom/activities/unregister/UnregisterActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/unregister/UnregisterActivity.kt
@@ -49,7 +49,7 @@
private fun refresh(errmsg: String) {
AuxScreenController.getInstance().refreshTitle("设备注册状态")
- AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
+ AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
AuxScreenController.getInstance().refreshContent(listOf("设备未注册", errmsg))
}
diff --git a/app/src/main/java/com/supwisdom/activities/upgrade/UpgradeActivity.kt b/app/src/main/java/com/supwisdom/activities/upgrade/UpgradeActivity.kt
index e271bdb..5449f29 100644
--- a/app/src/main/java/com/supwisdom/activities/upgrade/UpgradeActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/upgrade/UpgradeActivity.kt
@@ -91,7 +91,7 @@
private fun refresh() {
isUpgrading = false
AuxScreenController.getInstance().refreshTitle("应用在线升级")
- AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
+ AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
AuxScreenController.getInstance().refreshContent(
Arrays.asList(
"当前版本>>", CommonUtil.getVersionName(applicationContext),
diff --git a/app/src/main/java/com/supwisdom/activities/upgrade/mode/EpayUpgradeApi.kt b/app/src/main/java/com/supwisdom/activities/upgrade/mode/EpayUpgradeApi.kt
index 110f204..d593610 100644
--- a/app/src/main/java/com/supwisdom/activities/upgrade/mode/EpayUpgradeApi.kt
+++ b/app/src/main/java/com/supwisdom/activities/upgrade/mode/EpayUpgradeApi.kt
@@ -1,178 +1,185 @@
-package com.supwisdom.activities.upgrade.mode
-
-import android.text.TextUtils
-import com.supwisdom.activities.YktSession
-import com.supwisdom.bean.UpgradeInfoRetBean
-import com.supwisdom.okhttp.WebParams
-import com.supwisdom.utils.*
-import org.apache.http.HttpStatus
-import java.io.File
-import java.io.FileInputStream
-import java.io.FileOutputStream
-import java.net.HttpURLConnection
-import java.net.URL
-import java.util.*
-
-/**
- * @author zzq
- * @date 2019/4/9
- * @desc 在线升级
- */
-class EpayUpgradeApi constructor(private val callback: CallbackInterface) {
- private val TIMEOUT = 5 * 1000// 超时
- private val POSID = "posa711dali"
-
- fun upgrade(devphyid: String, version: String) {
- val resp = getAppVersion(devphyid, version)
- if (resp.retcode != PublicDef.SUCCESS) {
- callback.failed(resp.retmsg!!)
- return
- }
- val updateFile = FileUtil.getUpdateFile("$POSID.zip")
- if (updateFile == null) {
- callback.failed("创建本地文件失败")
- return
- }
- if (!downloadUpdateFile(resp.upgrade_url!!, updateFile, resp.upgrade_version!!)) {
- return
- }
- parseDownloadFile(updateFile.absolutePath, resp.upgrade_version!!)
- }
-
- private fun downloadUpdateFile(downUrl: String, file: File, versionName: String): Boolean {
- var downStep = 0// 提示step
- val totalSize: Int// 文件总大小
- var downloadCount = 0// 已经下载好的大小
- try {
- val url = URL(downUrl)
- val urlConnection = url.openConnection() as HttpURLConnection
- urlConnection.connectTimeout = TIMEOUT
- urlConnection.readTimeout = TIMEOUT
- urlConnection.doOutput = true
- urlConnection.doInput = true
- urlConnection.useCaches = false
- // setting serialized
- urlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object")
- //default is GET
- urlConnection.requestMethod = "POST"
- urlConnection.setRequestProperty("Charsert", "UTF-8")
- urlConnection.setRequestProperty("connection", "Keep-Alive")
- urlConnection.addRequestProperty("version", versionName)
-
- urlConnection.addRequestProperty("username", "supwisdom")
- urlConnection.addRequestProperty("password", "supwisdom")
- urlConnection.addRequestProperty("filename", "$POSID.apk")
-
- //connect to server (tcp)
- urlConnection.connect()
- // 获取下载文件的size
- totalSize = urlConnection.contentLength
- if (urlConnection.responseCode != HttpStatus.SC_OK) {
- urlConnection.disconnect()
- callback.failed("下载文件失败:错误码=${urlConnection.responseCode}")
- return false
- }
- val inputStream = urlConnection.inputStream
- val outputStream = FileOutputStream(file, false)// 文件存在则覆盖掉
- val buffer = ByteArray(1024)
- while (true) {
- val readSize = inputStream.read(buffer)
- if (readSize < 0) {
- break
- }
- outputStream.write(buffer, 0, readSize)
- downloadCount += readSize// 实时获取下载到的大小
-
- val progress = downloadCount * 1.0 / totalSize
- val pro = Math.round(progress * 100).toInt()
- if (pro - downStep >= 1) {
- downStep++
- CommonUtil.doSleep(100)
- callback.progresss(pro)
- }
- }
- urlConnection.disconnect()
- inputStream.close()
- outputStream.close()
- return true
- } catch (e: Exception) {
- e.printStackTrace()
- callback.failed("下载文件异常:${e.message}")
- return false
- }
- }
-
- private fun parseDownloadFile(zipFilePath: String, versionName: String): Boolean {
- try {
- val index = zipFilePath.lastIndexOf("/")
- val unZipFilePath = zipFilePath.substring(0, index)
- ZipUtil.unzip(zipFilePath, unZipFilePath, false)
- val apkFile = File("$unZipFilePath/$POSID.apk")
- if (!apkFile.exists()) {
- callback.failed("未找到文件$POSID.apk")
- return false
- }
-
- val fileHash256 = CryptUtil.HASH256(FileInputStream(apkFile), "nzoqPYMIu91VViA/mEIG5FtJXi8=")
- if (fileHash256 == null) {
- callback.failed("计算文件校验数据错误")
- return false
- }
- val signFile = FileInputStream("$unZipFilePath/hash256.sign")
- val buffer = ByteArray(1024)
- val length = signFile.read(buffer, 0, buffer.size)
- if (length < 0) {
- callback.failed("读取校验文件失败")
- return false
- }
- signFile.close()
- val signHash256 = String(Arrays.copyOfRange(buffer, 0, length))
- if (!fileHash256.equals(signHash256, ignoreCase = true)) {
- callback.failed("文件校验错误")
- return false
- }
- callback.success("$unZipFilePath/$POSID.apk")
- return true
- } catch (e: Exception) {
- e.printStackTrace()
- callback.failed("文件校验异常:${e.message}")
- return false
- }
- }
-
- private fun getAppVersion(devphyid: String, version: String): UpgradeInfoRetBean {
- val params = WebParams()
- params.setParameter("upgrade_url", POSID)
- .setParameter("upgrade_version", version)
- .setParameter("devphyid", devphyid)
- .setParameter("sourcetype", "pos")
-
- val resp = YktSession.getInstance().sendYktRequestPost("/api/pos/globalparam", "", params)
- ?: return UpgradeInfoRetBean(PublicDef.ERROR, "获取版本超时")
- if (resp.retcode != HttpStatus.SC_OK) {
- return UpgradeInfoRetBean(resp.retcode, "获取版本错误码=${resp.retcode}")
- }
- return try {
- val bean = GsonUtil.GsonToBean(resp.retjson!!, UpgradeInfoRetBean::class.java)
- if (bean.retcode != PublicDef.SUCCESS) {
- return UpgradeInfoRetBean(resp.retcode, "获取版本错误=" + bean.retmsg)
- }
- when {
- TextUtils.isEmpty(bean.upgrade_version) -> UpgradeInfoRetBean(PublicDef.ERROR, "获取版本为空")
- TextUtils.isEmpty(bean.upgrade_url) -> UpgradeInfoRetBean(PublicDef.ERROR, "获取升级地址为空")
- else -> bean
- }
- } catch (e: Exception) {
- e.printStackTrace()
- UpgradeInfoRetBean(PublicDef.ERROR, "获取版本JSON异常:${e.message}")
- }
- }
-
- interface CallbackInterface {
- fun progresss(pro: Int)
-
- fun success(filepath: String)
-
- fun failed(errmsg: String)
- }
+package com.supwisdom.activities.upgrade.mode
+
+import android.text.TextUtils
+import com.supwisdom.activities.YktSession
+import com.supwisdom.bean.UpgradeInfoRetBean
+import com.supwisdom.okhttp.WebParams
+import com.supwisdom.utils.*
+import org.apache.http.HttpStatus
+import java.io.File
+import java.io.FileInputStream
+import java.io.FileOutputStream
+import java.net.HttpURLConnection
+import java.net.URL
+import java.util.*
+
+/**
+ * @author zzq
+ * @date 2019/4/9
+ * @desc 在线升级
+ */
+class EpayUpgradeApi constructor(private val callback: CallbackInterface) {
+ private val TIMEOUT = 5 * 1000// 超时
+ private val POSID = "posa711dali"
+
+ fun upgrade(devphyid: String, version: String) {
+ val resp = getAppVersion(devphyid, version)
+ if (resp.retcode != PublicDef.SUCCESS) {
+ callback.failed(resp.getErrorMsg())
+ return
+ }
+ val updateFile = FileUtil.getUpdateFile("$POSID.zip")
+ if (updateFile == null) {
+ callback.failed("创建本地文件失败")
+ return
+ }
+ if (!downloadUpdateFile(resp.upgrade_url!!, updateFile, resp.upgrade_version!!)) {
+ return
+ }
+ parseDownloadFile(updateFile.absolutePath, resp.upgrade_version!!)
+ }
+
+ private fun downloadUpdateFile(downUrl: String, file: File, versionName: String): Boolean {
+ var downStep = 0// 提示step
+ val totalSize: Int// 文件总大小
+ var downloadCount = 0// 已经下载好的大小
+ try {
+ val url = URL(downUrl)
+ val urlConnection = url.openConnection() as HttpURLConnection
+ urlConnection.connectTimeout = TIMEOUT
+ urlConnection.readTimeout = TIMEOUT
+ urlConnection.doOutput = true
+ urlConnection.doInput = true
+ urlConnection.useCaches = false
+ // setting serialized
+ urlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object")
+ //default is GET
+ urlConnection.requestMethod = "POST"
+ urlConnection.setRequestProperty("Charsert", "UTF-8")
+ urlConnection.setRequestProperty("connection", "Keep-Alive")
+ urlConnection.addRequestProperty("version", versionName)
+
+ urlConnection.addRequestProperty("username", "supwisdom")
+ urlConnection.addRequestProperty("password", "supwisdom")
+ urlConnection.addRequestProperty("filename", "$POSID.apk")
+
+ //connect to server (tcp)
+ urlConnection.connect()
+ // 获取下载文件的size
+ totalSize = urlConnection.contentLength
+ if (urlConnection.responseCode != HttpStatus.SC_OK) {
+ urlConnection.disconnect()
+ callback.failed("下载文件失败:错误码=${urlConnection.responseCode}")
+ return false
+ }
+ val inputStream = urlConnection.inputStream
+ val outputStream = FileOutputStream(file, false)// 文件存在则覆盖掉
+ val buffer = ByteArray(1024)
+ while (true) {
+ val readSize = inputStream.read(buffer)
+ if (readSize < 0) {
+ break
+ }
+ outputStream.write(buffer, 0, readSize)
+ downloadCount += readSize// 实时获取下载到的大小
+
+ val progress = downloadCount * 1.0 / totalSize
+ val pro = Math.round(progress * 100).toInt()
+ if (pro - downStep >= 1) {
+ downStep++
+ CommonUtil.doSleep(100)
+ callback.progresss(pro)
+ }
+ }
+ urlConnection.disconnect()
+ inputStream.close()
+ outputStream.close()
+ return true
+ } catch (e: Exception) {
+ e.printStackTrace()
+ callback.failed("下载文件异常:${e.message}")
+ return false
+ }
+ }
+
+ private fun parseDownloadFile(zipFilePath: String, versionName: String): Boolean {
+ try {
+ val index = zipFilePath.lastIndexOf("/")
+ val unZipFilePath = zipFilePath.substring(0, index)
+ ZipUtil.unzip(zipFilePath, unZipFilePath, false)
+ val apkFile = File("$unZipFilePath/$POSID.apk")
+ if (!apkFile.exists()) {
+ callback.failed("未找到文件$POSID.apk")
+ return false
+ }
+
+ val fileHash256 =
+ CryptUtil.HASH256(FileInputStream(apkFile), "nzoqPYMIu91VViA/mEIG5FtJXi8=")
+ if (fileHash256 == null) {
+ callback.failed("计算文件校验数据错误")
+ return false
+ }
+ val signFile = FileInputStream("$unZipFilePath/hash256.sign")
+ val buffer = ByteArray(1024)
+ val length = signFile.read(buffer, 0, buffer.size)
+ if (length < 0) {
+ callback.failed("读取校验文件失败")
+ return false
+ }
+ signFile.close()
+ val signHash256 = String(Arrays.copyOfRange(buffer, 0, length))
+ if (!fileHash256.equals(signHash256, ignoreCase = true)) {
+ callback.failed("文件校验错误")
+ return false
+ }
+ callback.success("$unZipFilePath/$POSID.apk")
+ return true
+ } catch (e: Exception) {
+ e.printStackTrace()
+ callback.failed("文件校验异常:${e.message}")
+ return false
+ }
+ }
+
+ private fun getAppVersion(devphyid: String, version: String): UpgradeInfoRetBean {
+ val params = WebParams()
+ params.setParameter("upgrade_url", POSID)
+ .setParameter("upgrade_version", version)
+ .setParameter("devphyid", devphyid)
+ .setParameter("sourcetype", "pos")
+
+ val resp = YktSession.getInstance().sendYktRequestPost("/api/pos/globalparam", "", params)
+ ?: return UpgradeInfoRetBean(PublicDef.ERROR, "获取版本超时")
+ if (resp.retcode != HttpStatus.SC_OK) {
+ return UpgradeInfoRetBean(resp.retcode, "获取版本错误码=${resp.retcode}")
+ }
+ return try {
+ val bean = GsonUtil.GsonToBean(resp.retjson!!, UpgradeInfoRetBean::class.java)
+ if (bean.retcode != PublicDef.SUCCESS) {
+ return UpgradeInfoRetBean(resp.retcode, "获取版本错误=" + bean.getErrorMsg())
+ }
+ when {
+ TextUtils.isEmpty(bean.upgrade_version) -> UpgradeInfoRetBean(
+ PublicDef.ERROR,
+ "获取版本为空"
+ )
+ TextUtils.isEmpty(bean.upgrade_url) -> UpgradeInfoRetBean(
+ PublicDef.ERROR,
+ "获取升级地址为空"
+ )
+ else -> bean
+ }
+ } catch (e: Exception) {
+ e.printStackTrace()
+ UpgradeInfoRetBean(PublicDef.ERROR, "获取版本JSON异常:${e.message}")
+ }
+ }
+
+ interface CallbackInterface {
+ fun progresss(pro: Int)
+
+ fun success(filepath: String)
+
+ fun failed(errmsg: String)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/utils/DateUtil.kt b/app/src/main/java/com/supwisdom/utils/DateUtil.kt
index a65a9ce..0430400 100644
--- a/app/src/main/java/com/supwisdom/utils/DateUtil.kt
+++ b/app/src/main/java/com/supwisdom/utils/DateUtil.kt
@@ -1,335 +1,352 @@
-package com.supwisdom.utils
-
-import java.text.ParseException
-import java.text.SimpleDateFormat
-import java.util.*
-
-/**
- ** create by zzq on 2019/7/23
- ** @desc
- **/
-object DateUtil {
- private val FORMAT_yyyyMMdd = org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyyMMdd")
- private val FORMAT_yyMMddHHmmss = org.apache.commons.lang3.time.FastDateFormat.getInstance("yyMMddHHmmss")
- private val FORMAT_yyMMddHHmmss2 = org.apache.commons.lang3.time.FastDateFormat.getInstance("yy-MM-dd HH:mm:ss")
- private val FORMAT_HHmmss = org.apache.commons.lang3.time.FastDateFormat.getInstance("HHmmss")
- private val FORMAT_MMdd = org.apache.commons.lang3.time.FastDateFormat.getInstance("MMdd")
- private val FORMAT_MM_dd = org.apache.commons.lang3.time.FastDateFormat.getInstance("MM-dd")
- private val FORMAT_yyyyMMddHHmmss = org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyyMMddHHmmss")
- private val FORMAT_yyyyMMddHHmm = org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyyMMddHHmm")
- private val FORMAT_MMddHHmmyy = org.apache.commons.lang3.time.FastDateFormat.getInstance("MMddHHmmyy")
- private val FORMAT_yyyy_MM_dd_HH_mm_ss =
- org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss")
- private val FORMAT_yyyy_MM_dd = org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd")
- private val FORMAT_HH_mm_ss = org.apache.commons.lang3.time.FastDateFormat.getInstance("HH:mm:ss")
-
- /**
- * @return yyyy-MM-dd HH:mm:ss
- */
- fun getNow(): String {
- return FORMAT_yyyy_MM_dd_HH_mm_ss.format(Date())
- }
-
- fun getNowDateSpecFormat(): String {
- return FORMAT_yyyy_MM_dd.format(Date())
- }
-
- fun utcToLocal(utctime: String): String {
- val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
- sdf.timeZone = TimeZone.getTimeZone("UTC")
- return try {
- val utcDate = sdf.parse(utctime)
- sdf.timeZone = TimeZone.getDefault()
- val localTime = sdf.format(utcDate.time)
- val localDate = sdf.parse(localTime)
- FORMAT_yyyyMMddHHmmss.format(localDate.time)
- } catch (ex: ParseException) {
- ex.printStackTrace()
- ""
- }
- }
-
- /**
- * @param date yyyyMMdd
- * @return yyyy-MM-dd
- */
- fun getNowDateFromNoFormat(date: String): String {
- try {
- return date.substring(0, 4) + "-" +
- date.substring(4, 6) + "-" +
- date.substring(6, 8)
- } catch (ex: Exception) {
- }
- return ""
- }
-
- /**
- * @return HH:mm:ss
- */
- fun getNowTimeWithArg(date: Date): String? {
- return try {
- FORMAT_HH_mm_ss.format(date)
- } catch (e: Exception) {
- null
- }
- }
-
- /**
- * @param time HHmm
- * @return HH:mm
- */
- fun formatTime(time: String): String? {
- return try {
- val sb = StringBuilder()
- sb.append(time.substring(0, 2)).append(":")
- .append(time.substring(2, 4))
- sb.toString()
- } catch (e: Exception) {
- null
- }
- }
-
- /**
- * @return MMdd
- */
- fun getDateMMdd(): String? {
- return try {
- FORMAT_MMdd.format(Date())
- } catch (e: Exception) {
- e.printStackTrace()
- null
- }
- }
-
- /**
- * @return MM-dd
- */
- fun getDate_MMdd(): String? {
- try {
- return FORMAT_MM_dd.format(Date())
- } catch (e: Exception) {
- e.printStackTrace()
- }
- return null
- }
-
- /**
- * @return yyyy-MM-dd HH:mm:ss
- */
- fun getNowDateTime(): String {
- return FORMAT_yyyy_MM_dd_HH_mm_ss.format(Date())
- }
-
- /**
- * @return yyyy-MM-dd
- */
- fun getNowDate(): String {
- return FORMAT_yyyy_MM_dd.format(Date())
- }
-
- /**
- * @param dateStr yyyy-MM-dd
- * @return
- */
- fun getNowDateTime(dateStr: String): Date? {
- try {
- return FORMAT_yyyy_MM_dd.parse(dateStr)
- } catch (e: ParseException) {
- e.printStackTrace()
- }
- return null
- }
-
- /**
- * @return HH:mm:ss
- */
- fun getNowTime(): String {
- return FORMAT_HH_mm_ss.format(Date())
- }
-
- /**
- * @return format
- */
- fun getDayofWeek(offsetWeek: Int, dayOfWeek: Int, format: String): String {
- val cal = Calendar.getInstance()
- // n为推迟的周数,1本周,-1向前推迟一周,2下周,依次类推
- val retday: String
- cal.add(Calendar.DATE, offsetWeek * 7)
- cal.set(Calendar.DAY_OF_WEEK, dayOfWeek)
- retday = org.apache.commons.lang3.time.FastDateFormat.getInstance(format).format(cal.time)
- return retday
- }
-
- /**
- * 计算超时时间,精确到毫秒
- *
- * @param milliSeconds
- * @return L
- */
- fun getExpireTime(milliSeconds: Long): Long {
- return Date().time + milliSeconds
- }
-
- /**
- * @return yyyyMMddHHmmss
- */
- fun getNowDateTimeNoFormat(): String {
- return FORMAT_yyyyMMddHHmmss.format(Date())
- }
-
- /**
- * @return yyyyMMdd
- */
- fun getNowDateNoFormat(): String {
- return FORMAT_yyyyMMdd.format(Date())
- }
-
- /**
- * @param date
- * @return yyyyMMdd
- */
- fun getNowDateNoFormat(date: Date): String? {
- try {
- return FORMAT_yyyyMMdd.format(date)
- } catch (e: Exception) {
- e.printStackTrace()
- }
- return null
- }
-
- /**
- * @return HHmmss
- */
- fun getNowTimeNoFormat(): String {
- return FORMAT_HHmmss.format(Date())
- }
-
- /**
- * @param datetime yyyyMMddHHmmss
- * @return ms
- * @desc 将日期格式的字符串转换为长整型
- */
- fun dateFormatConvertToLong(datetime: String): Long {
- return try {
- FORMAT_yyyyMMddHHmmss.parse(datetime).time
- } catch (ex: ParseException) {
- 0L
- }
- }
-
- /**
- * @param time HHmmss
- * @return ms
- * @desc 将时间格式的字符串转换为长整型
- */
- fun timeFormatConvertToLong(time: String): Long {
- return try {
- FORMAT_HHmmss.parse(time).time
- } catch (ex: ParseException) {
- 0L
- }
- }
-
- /**
- * @param time ms
- * @return yyyyMMddHHmmss
- * @desc 将长整型数字转换为日期格式的字符串
- */
- fun dateLongConvertToFormat(time: Long): String {
- return if (time > 0L) {
- FORMAT_yyyyMMddHHmmss.format(Date(time))
- } else ""
- }
-
- /**
- * @param time ms
- * @return MMddHHmmyy
- * @desc 将长整型数字转换为日期格式的字符串
- */
- fun dateLongConvertToFormat2(time: Long): String {
- return if (time > 0L) {
- FORMAT_MMddHHmmyy.format(Date(time))
- } else ""
- }
-
- /**
- * @param datetime yyyy-MM-dd HH:mm:ss
- * @return
- * @desc 将日期格式的字符串转换为长整型
- */
- fun dateFormatConvertToDate(datetime: String): Date? {
- return try {
- FORMAT_yyyy_MM_dd_HH_mm_ss.parse(datetime)
- } catch (ex: ParseException) {
- null
- }
- }
-
- /**
- * @param daynum 天数
- * @return 返回当前日期的第 daynum 天前的日期 yyyyMMdd
- */
- fun getDayDateNoFormatBefore(daynum: Int): String {
- val calendar = Calendar.getInstance()
- calendar.add(Calendar.DATE, -daynum)
- return FORMAT_yyyyMMdd.format(calendar.time)
- }
-
- /**
- * 获得指定日期的前一天
- *
- * @param specifiedDay yyyyMMdd
- * @return yyyyMMdd
- */
- fun getSpecifiedDayBefore(specifiedDay: String): String {
- return try {
- val c = Calendar.getInstance()
- val date = FORMAT_yyyyMMdd.parse(specifiedDay)
- c.time = date
- val day = c.get(Calendar.DATE)
- c.set(Calendar.DATE, day - 1)
- FORMAT_yyyyMMdd.format(c.time)
- } catch (e: ParseException) {
- ""
- }
- }
-
- /**
- * 获得指定日期的前一天
- *
- * @param dayBefore 往前推迟的天数
- * @return Date
- */
- fun getSomeDayBefore(dayBefore: Int): Date {
- val c = Calendar.getInstance()
- c.add(Calendar.DAY_OF_MONTH, -dayBefore)
- return c.time
- }
-
- /**
- * 获得指定日期的后一天
- *
- * @param specifiedDay yyyyMMdd
- * @return yyyyMMdd
- */
- fun getSpecifiedDayAfter(specifiedDay: String): String {
- return try {
- val c = Calendar.getInstance()
- val date = FORMAT_yyyyMMdd.parse(specifiedDay)
- c.time = date
- val day = c.get(Calendar.DATE)
- c.set(Calendar.DATE, day + 1)
- FORMAT_yyyyMMdd.format(c.time)
- } catch (e: ParseException) {
- ""
- }
- }
-
- /**
- * @return yyyyMMddHHmmss
- */
- fun getNowDateTimeFormat(): String {
- return FORMAT_yyyyMMddHHmmss.format(Date())
- }
-
+package com.supwisdom.utils
+
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.*
+
+/**
+ ** create by zzq on 2019/7/23
+ ** @desc
+ **/
+object DateUtil {
+ private val FORMAT_yyyyMMdd =
+ org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyyMMdd")
+ private val FORMAT_yyMMddHHmmss =
+ org.apache.commons.lang3.time.FastDateFormat.getInstance("yyMMddHHmmss")
+ private val FORMAT_yyMMddHHmmss2 =
+ org.apache.commons.lang3.time.FastDateFormat.getInstance("yy-MM-dd HH:mm:ss")
+ private val FORMAT_HHmmss = org.apache.commons.lang3.time.FastDateFormat.getInstance("HHmmss")
+ private val FORMAT_MMdd = org.apache.commons.lang3.time.FastDateFormat.getInstance("MMdd")
+ private val FORMAT_MM_dd = org.apache.commons.lang3.time.FastDateFormat.getInstance("MM-dd")
+ private val FORMAT_yyyyMMddHHmmss =
+ org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyyMMddHHmmss")
+ private val FORMAT_yyyyMMddHHmm =
+ org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyyMMddHHmm")
+ private val FORMAT_MMddHHmmyy =
+ org.apache.commons.lang3.time.FastDateFormat.getInstance("MMddHHmmyy")
+ private val FORMAT_yyyy_MM_dd_HH_mm_ss =
+ org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss")
+ private val FORMAT_yyyy_MM_dd_HH_mm =
+ org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd HH:mm")
+ private val FORMAT_yyyy_MM_dd =
+ org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd")
+ private val FORMAT_HH_mm_ss =
+ org.apache.commons.lang3.time.FastDateFormat.getInstance("HH:mm:ss")
+
+ /**
+ * @return yyyy-MM-dd HH:mm:ss
+ */
+ fun getNow(): String {
+ return FORMAT_yyyy_MM_dd_HH_mm_ss.format(Date())
+ }
+
+ fun getNowDateSpecFormat(): String {
+ return FORMAT_yyyy_MM_dd.format(Date())
+ }
+
+ fun utcToLocal(utctime: String): String {
+ val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
+ sdf.timeZone = TimeZone.getTimeZone("UTC")
+ return try {
+ val utcDate = sdf.parse(utctime)
+ sdf.timeZone = TimeZone.getDefault()
+ val localTime = sdf.format(utcDate.time)
+ val localDate = sdf.parse(localTime)
+ FORMAT_yyyyMMddHHmmss.format(localDate.time)
+ } catch (ex: ParseException) {
+ ex.printStackTrace()
+ ""
+ }
+ }
+
+ /**
+ * @param date yyyyMMdd
+ * @return yyyy-MM-dd
+ */
+ fun getNowDateFromNoFormat(date: String): String {
+ try {
+ return date.substring(0, 4) + "-" +
+ date.substring(4, 6) + "-" +
+ date.substring(6, 8)
+ } catch (ex: Exception) {
+ }
+ return ""
+ }
+
+ /**
+ * @return HH:mm:ss
+ */
+ fun getNowTimeWithArg(date: Date): String? {
+ return try {
+ FORMAT_HH_mm_ss.format(date)
+ } catch (e: Exception) {
+ null
+ }
+ }
+
+ /**
+ * @param time HHmm
+ * @return HH:mm
+ */
+ fun formatTime(time: String): String? {
+ return try {
+ val sb = StringBuilder()
+ sb.append(time.substring(0, 2)).append(":")
+ .append(time.substring(2, 4))
+ sb.toString()
+ } catch (e: Exception) {
+ null
+ }
+ }
+
+ /**
+ * @return MMdd
+ */
+ fun getDateMMdd(): String? {
+ return try {
+ FORMAT_MMdd.format(Date())
+ } catch (e: Exception) {
+ e.printStackTrace()
+ null
+ }
+ }
+
+ /**
+ * @return MM-dd
+ */
+ fun getDate_MMdd(): String? {
+ try {
+ return FORMAT_MM_dd.format(Date())
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ return null
+ }
+
+ /**
+ * @return yyyy-MM-dd HH:mm:ss
+ */
+ fun getNowDateTime(): String {
+ return FORMAT_yyyy_MM_dd_HH_mm_ss.format(Date())
+ }
+
+ /**
+ * @return yyyy-MM-dd HH:mm:ss
+ */
+ fun getNowDateTime1(): String {
+ return FORMAT_yyyy_MM_dd_HH_mm.format(Date())
+ }
+
+ /**
+ * @return yyyy-MM-dd
+ */
+ fun getNowDate(): String {
+ return FORMAT_yyyy_MM_dd.format(Date())
+ }
+
+ /**
+ * @param dateStr yyyy-MM-dd
+ * @return
+ */
+ fun getNowDateTime(dateStr: String): Date? {
+ try {
+ return FORMAT_yyyy_MM_dd.parse(dateStr)
+ } catch (e: ParseException) {
+ e.printStackTrace()
+ }
+ return null
+ }
+
+ /**
+ * @return HH:mm:ss
+ */
+ fun getNowTime(): String {
+ return FORMAT_HH_mm_ss.format(Date())
+ }
+
+ /**
+ * @return format
+ */
+ fun getDayofWeek(offsetWeek: Int, dayOfWeek: Int, format: String): String {
+ val cal = Calendar.getInstance()
+ // n为推迟的周数,1本周,-1向前推迟一周,2下周,依次类推
+ val retday: String
+ cal.add(Calendar.DATE, offsetWeek * 7)
+ cal.set(Calendar.DAY_OF_WEEK, dayOfWeek)
+ retday = org.apache.commons.lang3.time.FastDateFormat.getInstance(format).format(cal.time)
+ return retday
+ }
+
+ /**
+ * 计算超时时间,精确到毫秒
+ *
+ * @param milliSeconds
+ * @return L
+ */
+ fun getExpireTime(milliSeconds: Long): Long {
+ return Date().time + milliSeconds
+ }
+
+ /**
+ * @return yyyyMMddHHmmss
+ */
+ fun getNowDateTimeNoFormat(): String {
+ return FORMAT_yyyyMMddHHmmss.format(Date())
+ }
+
+ /**
+ * @return yyyyMMdd
+ */
+ fun getNowDateNoFormat(): String {
+ return FORMAT_yyyyMMdd.format(Date())
+ }
+
+ /**
+ * @param date
+ * @return yyyyMMdd
+ */
+ fun getNowDateNoFormat(date: Date): String? {
+ try {
+ return FORMAT_yyyyMMdd.format(date)
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ return null
+ }
+
+ /**
+ * @return HHmmss
+ */
+ fun getNowTimeNoFormat(): String {
+ return FORMAT_HHmmss.format(Date())
+ }
+
+ /**
+ * @param datetime yyyyMMddHHmmss
+ * @return ms
+ * @desc 将日期格式的字符串转换为长整型
+ */
+ fun dateFormatConvertToLong(datetime: String): Long {
+ return try {
+ FORMAT_yyyyMMddHHmmss.parse(datetime).time
+ } catch (ex: ParseException) {
+ 0L
+ }
+ }
+
+ /**
+ * @param time HHmmss
+ * @return ms
+ * @desc 将时间格式的字符串转换为长整型
+ */
+ fun timeFormatConvertToLong(time: String): Long {
+ return try {
+ FORMAT_HHmmss.parse(time).time
+ } catch (ex: ParseException) {
+ 0L
+ }
+ }
+
+ /**
+ * @param time ms
+ * @return yyyyMMddHHmmss
+ * @desc 将长整型数字转换为日期格式的字符串
+ */
+ fun dateLongConvertToFormat(time: Long): String {
+ return if (time > 0L) {
+ FORMAT_yyyyMMddHHmmss.format(Date(time))
+ } else ""
+ }
+
+ /**
+ * @param time ms
+ * @return MMddHHmmyy
+ * @desc 将长整型数字转换为日期格式的字符串
+ */
+ fun dateLongConvertToFormat2(time: Long): String {
+ return if (time > 0L) {
+ FORMAT_MMddHHmmyy.format(Date(time))
+ } else ""
+ }
+
+ /**
+ * @param datetime yyyy-MM-dd HH:mm:ss
+ * @return
+ * @desc 将日期格式的字符串转换为长整型
+ */
+ fun dateFormatConvertToDate(datetime: String): Date? {
+ return try {
+ FORMAT_yyyy_MM_dd_HH_mm_ss.parse(datetime)
+ } catch (ex: ParseException) {
+ null
+ }
+ }
+
+ /**
+ * @param daynum 天数
+ * @return 返回当前日期的第 daynum 天前的日期 yyyyMMdd
+ */
+ fun getDayDateNoFormatBefore(daynum: Int): String {
+ val calendar = Calendar.getInstance()
+ calendar.add(Calendar.DATE, -daynum)
+ return FORMAT_yyyyMMdd.format(calendar.time)
+ }
+
+ /**
+ * 获得指定日期的前一天
+ *
+ * @param specifiedDay yyyyMMdd
+ * @return yyyyMMdd
+ */
+ fun getSpecifiedDayBefore(specifiedDay: String): String {
+ return try {
+ val c = Calendar.getInstance()
+ val date = FORMAT_yyyyMMdd.parse(specifiedDay)
+ c.time = date
+ val day = c.get(Calendar.DATE)
+ c.set(Calendar.DATE, day - 1)
+ FORMAT_yyyyMMdd.format(c.time)
+ } catch (e: ParseException) {
+ ""
+ }
+ }
+
+ /**
+ * 获得指定日期的前一天
+ *
+ * @param dayBefore 往前推迟的天数
+ * @return Date
+ */
+ fun getSomeDayBefore(dayBefore: Int): Date {
+ val c = Calendar.getInstance()
+ c.add(Calendar.DAY_OF_MONTH, -dayBefore)
+ return c.time
+ }
+
+ /**
+ * 获得指定日期的后一天
+ *
+ * @param specifiedDay yyyyMMdd
+ * @return yyyyMMdd
+ */
+ fun getSpecifiedDayAfter(specifiedDay: String): String {
+ return try {
+ val c = Calendar.getInstance()
+ val date = FORMAT_yyyyMMdd.parse(specifiedDay)
+ c.time = date
+ val day = c.get(Calendar.DATE)
+ c.set(Calendar.DATE, day + 1)
+ FORMAT_yyyyMMdd.format(c.time)
+ } catch (e: ParseException) {
+ ""
+ }
+ }
+
+ /**
+ * @return yyyyMMddHHmmss
+ */
+ fun getNowDateTimeFormat(): String {
+ return FORMAT_yyyyMMddHHmmss.format(Date())
+ }
+
}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/view/DialogPurchase.kt b/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
index e167606..4566945 100644
--- a/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
+++ b/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
@@ -222,7 +222,7 @@
fun showPaySuccess(info: CardUserInfoBean) {
payQueryConfirm = false
- vPayhint.text = info.retmsg
+ vPayhint.text = info.getErrorMsg()
vPayhint.setTextColor(Color.GREEN)
vPayamt.text = CommonUtil.showFormatAmount("金额", info.payamt)
vPayamt.visibility = View.VISIBLE
@@ -247,7 +247,7 @@
payQueryConfirm = false
vPayhint.text = "消费失败"
vPayhint.setTextColor(Color.RED)
- vPayamt.text = info.retmsg
+ vPayamt.text = info.getErrorMsg()
vPayamt.visibility = View.VISIBLE
vUsername.visibility = View.GONE
show()
@@ -256,7 +256,7 @@
fun showReverseSuccess(info: CardUserInfoBean) {
payQueryConfirm = false
- vPayhint.text = info.retmsg
+ vPayhint.text = info.getErrorMsg()
vPayhint.setTextColor(Color.GREEN)
vPayamt.text = CommonUtil.showFormatAmount("金额", info.amount)
vPayamt.visibility = View.VISIBLE
@@ -269,7 +269,7 @@
payQueryConfirm = false
vPayhint.text = "冲正失败"
vPayhint.setTextColor(Color.RED)
- vPayamt.text = info.retmsg
+ vPayamt.text = info.getErrorMsg()
vPayamt.visibility = View.VISIBLE
vUsername.visibility = View.GONE
show()
diff --git a/app/src/main/res/layout/activity_manage.xml b/app/src/main/res/layout/activity_manage.xml
index 6b979d6..4fb3a1f 100644
--- a/app/src/main/res/layout/activity_manage.xml
+++ b/app/src/main/res/layout/activity_manage.xml
@@ -1,13 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- style="@style/head_title_out_style">
+ style="@style/head_title_out_style">
<LinearLayout style="@style/head_title_inner_style">
+
<TextView
style="@style/head_title_text_style"
- android:text="维护管理界面"/>
+ android:text="维护管理界面" />
<LinearLayout
+ android:id="@+id/ll_operate"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="10dp"
+ android:orientation="vertical"
+ android:padding="10dp"
+ android:visibility="gone">
+
+ <TextView
+ android:id="@+id/tv_operate_hint"
+ style="@style/menu_item_text_style" />
+
+ <TextView
+ android:id="@+id/tv_operate_result"
+ style="@style/menu_item_text_style" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/ll_menu"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
@@ -16,39 +36,39 @@
<TextView
style="@style/menu_item_text_style"
- android:text="@string/consume_menu_shop_passwd"/>
+ android:text="@string/consume_menu_shop_passwd" />
<TextView
style="@style/menu_item_text_style"
- android:text="@string/consume_menu_comm_set"/>
+ android:text="@string/consume_menu_comm_set" />
<TextView
style="@style/menu_item_text_style"
- android:text="@string/consume_menu_unconfirm_transdtl"/>
+ android:text="@string/consume_menu_unconfirm_transdtl" />
<TextView
style="@style/menu_item_text_style"
- android:text="@string/consume_menu_syno_active"/>
+ android:text="@string/consume_menu_syno_active" />
<TextView
style="@style/menu_item_text_style"
- android:text="@string/consume_menu_upgrade"/>
+ android:text="@string/consume_menu_upgrade" />
<TextView
style="@style/menu_item_text_style"
- android:text="@string/consume_menu_app_exit"/>
+ android:text="@string/consume_menu_app_exit" />
<TextView
style="@style/menu_item_text_style"
- android:text="@string/consume_menu_setting"/>
+ android:text="@string/consume_menu_setting" />
<TextView
style="@style/menu_item_text_style"
- android:text="@string/consume_menu_clear_blklist"/>
+ android:text="@string/consume_menu_clear_blklist" />
<TextView
style="@style/menu_item_text_style"
- android:text="@string/consume_menu_control_set"/>
+ android:text="@string/consume_menu_control_set" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
diff --git a/app/src/main/res/layout/activity_menu.xml b/app/src/main/res/layout/activity_menu.xml
index e938845..3c0950a 100644
--- a/app/src/main/res/layout/activity_menu.xml
+++ b/app/src/main/res/layout/activity_menu.xml
@@ -1,69 +1,88 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@color/light_blue2"
- android:orientation="vertical">
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_margin="20dp"
- android:background="@drawable/corner_bg_white"
- android:orientation="vertical">
-
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="10dp"
- android:gravity="center"
- android:text="管理界面"
- android:textColor="@color/light_blue2"
- android:textSize="45sp" />
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginLeft="10dp"
- android:orientation="vertical"
- android:padding="10dp">
-
- <TextView
- style="@style/menu_item_text_style"
- android:text="@string/consume_menu_revenue" />
-
- <TextView
- style="@style/menu_item_text_style"
- android:text="@string/consume_menu_transdtl_upload" />
-
- <TextView
- style="@style/menu_item_text_style"
- android:text="@string/consume_menu_link_check" />
-
- <TextView
- style="@style/menu_item_text_style"
- android:text="@string/consume_menu_auth" />
-
- <TextView
- style="@style/menu_item_text_style"
- android:text="@string/consume_menu_syspara_query" />
-
- <TextView
- style="@style/menu_item_text_style"
- android:text="@string/consume_menu_manage" />
-
- <TextView
- style="@style/menu_item_text_style"
- android:text="@string/consume_menu_shop_password_set" />
-
- <TextView
- style="@style/menu_item_text_style"
- android:text="@string/consume_menu_consume_mode" />
-
- <TextView
- android:id="@+id/tv_reverse"
- style="@style/menu_item_text_style"
- android:text="@string/consume_menu_reverse" />
- </LinearLayout>
- </LinearLayout>
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/light_blue2"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_margin="20dp"
+ android:background="@drawable/corner_bg_white"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="10dp"
+ android:gravity="center"
+ android:text="管理界面"
+ android:textColor="@color/light_blue2"
+ android:textSize="45sp" />
+
+ <LinearLayout
+ android:id="@+id/ll_operate"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="10dp"
+ android:orientation="vertical"
+ android:padding="10dp"
+ android:visibility="gone">
+
+ <TextView
+ android:id="@+id/tv_operate_hint"
+ style="@style/menu_item_text_style" />
+
+ <TextView
+ android:id="@+id/tv_operate_result"
+ style="@style/menu_item_text_style" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/ll_menu"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginLeft="10dp"
+ android:orientation="vertical"
+ android:padding="10dp">
+
+ <TextView
+ style="@style/menu_item_text_style"
+ android:text="@string/consume_menu_revenue" />
+
+ <TextView
+ style="@style/menu_item_text_style"
+ android:text="@string/consume_menu_transdtl_upload" />
+
+ <TextView
+ style="@style/menu_item_text_style"
+ android:text="@string/consume_menu_link_check" />
+
+ <TextView
+ style="@style/menu_item_text_style"
+ android:text="@string/consume_menu_auth" />
+
+ <TextView
+ style="@style/menu_item_text_style"
+ android:text="@string/consume_menu_syspara_query" />
+
+ <TextView
+ style="@style/menu_item_text_style"
+ android:text="@string/consume_menu_manage" />
+
+ <TextView
+ style="@style/menu_item_text_style"
+ android:text="@string/consume_menu_shop_password_set" />
+
+ <TextView
+ style="@style/menu_item_text_style"
+ android:text="@string/consume_menu_consume_mode" />
+
+ <TextView
+ android:id="@+id/tv_reverse"
+ style="@style/menu_item_text_style"
+ android:text="@string/consume_menu_reverse" />
+ </LinearLayout>
+ </LinearLayout>
</LinearLayout>
\ No newline at end of file