离线交易额度限制
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 cde67f4..4f90429 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
@@ -487,6 +487,11 @@
                 "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() {
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 cfc459c..d7ced8c 100644
--- a/app/src/main/java/com/supwisdom/activities/manage/ManagePresenter.kt
+++ b/app/src/main/java/com/supwisdom/activities/manage/ManagePresenter.kt
@@ -3,7 +3,9 @@
 import android.os.AsyncTask
 import com.supwisdom.activities.SPApplication
 import com.supwisdom.bean.BaseResp
+import com.supwisdom.exception.WhiteListError
 import com.supwisdom.service.EpayApiImpl
+import com.supwisdom.utils.FileUtil
 import com.supwisdom.utils.PublicDef
 
 /**
@@ -53,16 +55,22 @@
     private inner class ClearWhiteList : AsyncTask<Void, Int, BaseResp>() {
         override fun onPostExecute(resp: BaseResp) {
             if (resp.retcode == PublicDef.SUCCESS) {
-                iManageView.showOperResult("黑名单更新成功", "")
+                iManageView.showOperResult("白名单更新成功", "")
             } else {
-                iManageView.showOperResult("黑名单更新失败", resp.retmsg!!)
+                iManageView.showOperResult("白名单更新失败", resp.retmsg!!)
             }
         }
 
         override fun doInBackground(vararg params: Void): BaseResp {
+            if (!pos.clearWhiteList()) {
+                return BaseResp(PublicDef.ERROR, "清空白名单失败")
+            }
+            val dyRecord = pos.getDynamicPara()
+            dyRecord!!.cardverno = "0"
+            pos.replaceDynamicPara(dyRecord)
             return try {
                 EpayApiImpl().downloadWhitelist("0")
-                BaseResp(PublicDef.ERROR, "更新成功")
+                BaseResp(PublicDef.SUCCESS, "更新成功")
             } catch (ex: Exception) {
                 BaseResp(PublicDef.ERROR, ex.message)
             }
@@ -72,13 +80,14 @@
     private inner class OutTransdtl : AsyncTask<Void, Int, BaseResp>() {
         override fun doInBackground(vararg params: Void): BaseResp {
             var num = 0
-//            val bm1List = pos.getTransdtlBM1(null)
-//            if (bm1List != null) {
-//                num += bm1List!!.size
-//                for (i in bm1List!!.indices) {
-//                    FileUtil.writeDtlFile(bm1List!!.get(i).toString())
-//                }
-//            }
+            pos.getTransdtlOnline().forEach {
+                num++
+                FileUtil.writeDtlFile(it.toString())
+            }
+            pos.getTransdtlOffline().forEach {
+                num++
+                FileUtil.writeDtlFile(it.toString())
+            }
             return BaseResp(PublicDef.SUCCESS, "共导出" + num + "笔")
         }
 
diff --git a/app/src/main/java/com/supwisdom/activities/syspara/SysparaActivity.kt b/app/src/main/java/com/supwisdom/activities/syspara/SysparaActivity.kt
index 6cf2a8e..ec0c647 100644
--- a/app/src/main/java/com/supwisdom/activities/syspara/SysparaActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/syspara/SysparaActivity.kt
@@ -58,16 +58,17 @@
 //        } else {
 //            kvMap[index++] = ControlParaRecord("长连接使能>>", "启用")
 //        }
-        if (SPApplication.getInstance().isOnline()) {
-            kvMap[index++] = ControlParaRecord("网络状态>>", "联机")
-        } else {
-            kvMap[index++] = ControlParaRecord("网络状态>>", "脱机")
-        }
+//        if (SPApplication.getInstance().isOnline()) {
+//            kvMap[index++] = ControlParaRecord("网络状态>>", "联机")
+//        } else {
+//            kvMap[index++] = ControlParaRecord("网络状态>>", "脱机")
+//        }
         kvMap[index++] = ControlParaRecord("成功显时间>>", "${sysRecord.sucShowtime}s")
         kvMap[index++] = ControlParaRecord("失败显时间>>", "${sysRecord.failShowtime}s")
         kvMap[index++] = ControlParaRecord("联机流水号>>", pos.getTransdtlOnlineMaxSeqno().toString())
         kvMap[index++] = ControlParaRecord("离线流水号>>", pos.getTransdtlOfflineMaxSeqno().toString())
         kvMap[index++] = ControlParaRecord("未上传流水>>", pos.getTransdtlUnconfirmNum().toString())
+        kvMap[index++] = ControlParaRecord("当天离线最大金额>>", String.format("%.02f元", sysRecord.maxDayOfflineAmt / 100.0f))
         kvMap[index++] = ControlParaRecord("定额间隔时间(s)>>", "${sysRecord.fixpayGap}s")
         kvMap[index++] = ControlParaRecord("心跳间隔>>", "${sysRecord.heatBeat}s")
     }
diff --git a/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt b/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
index a89d80e..5182e5f 100644
--- a/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
+++ b/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
@@ -11,6 +11,7 @@
         heatBeat,
         offlineEnable,
         maxOfflineDays,
+        maxDayOfflineAmt,
         mngpasswd,
         fixpayGap,
         consumeShowtime,
diff --git a/app/src/main/java/com/supwisdom/db/DBParaHelper.kt b/app/src/main/java/com/supwisdom/db/DBParaHelper.kt
index 3617287..d2fd01f 100644
--- a/app/src/main/java/com/supwisdom/db/DBParaHelper.kt
+++ b/app/src/main/java/com/supwisdom/db/DBParaHelper.kt
@@ -13,7 +13,7 @@
 class DBParaHelper private constructor(context: Context) : SQLiteOpenHelper(context, DB_NAME, null, VERSION) {
     companion object {
         private val DB_NAME = "db_para"
-        private val VERSION = 1
+        private val VERSION = 2
 
         val TABLE_NAME_SYSPARA = "tb_syspara"
         val TABLE_NAME_DYNAMICPARA = "tb_dynamicpara"
@@ -74,6 +74,7 @@
             + BeanPropEnum.Syspara.heatBeat + " integer, "
             + BeanPropEnum.Syspara.offlineEnable + " integer, "
             + BeanPropEnum.Syspara.maxOfflineDays + " integer, "
+            + BeanPropEnum.Syspara.maxDayOfflineAmt + " integer, "
             + BeanPropEnum.Syspara.mngpasswd + " char(6), "
             + BeanPropEnum.Syspara.fixpayGap + " integer, "
             + BeanPropEnum.Syspara.consumeShowtime + " integer, "
@@ -95,6 +96,9 @@
 
     override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
         if (oldVersion < newVersion) {
+            if (oldVersion < 2 && newVersion >= 2) {
+                db.execSQL("alter table $TABLE_NAME_SYSPARA add column ${BeanPropEnum.Syspara.maxDayOfflineAmt} integer")
+            }
         }
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/Pos.kt b/app/src/main/java/com/supwisdom/db/Pos.kt
index 0f36600..660f201 100644
--- a/app/src/main/java/com/supwisdom/db/Pos.kt
+++ b/app/src/main/java/com/supwisdom/db/Pos.kt
@@ -149,6 +149,15 @@
         }
     }
 
+    fun clearWhiteList(): Boolean {
+        try {
+            whiteListDao.getLock().lock()
+            return whiteListDao.clear()
+        } finally {
+            whiteListDao.getLock().unlock()
+        }
+    }
+
     fun getTransdtlOnlineMaxSeqno(): Int {
         if (onlMaxSeqno == 0) {
             try {
@@ -170,6 +179,15 @@
         }
     }
 
+    fun getTransdtlOnline(): List<TransdtlOnlineRecord> {
+        try {
+            transdtlOnlineDao.getLock().lock()
+            return transdtlOnlineDao.getAll()
+        } finally {
+            transdtlOnlineDao.getLock().unlock()
+        }
+    }
+
     fun getTransdtlOnlineUnconfirm(): List<TransdtlOnlineRecord> {
         try {
             transdtlOnlineDao.getLock().lock()
@@ -248,6 +266,24 @@
         }
     }
 
+    fun getTransdtlOffline(): List<TransdtlOfflineRecord> {
+        try {
+            transdtlOfflineDao.getLock().lock()
+            return transdtlOfflineDao.getAll()
+        } finally {
+            transdtlOfflineDao.getLock().unlock()
+        }
+    }
+
+    fun getTransdtlOfflineAmt(date: String, cardno: String, cardphyid: String): Int {
+        try {
+            transdtlOfflineDao.getLock().lock()
+            return transdtlOfflineDao.getOfflineAmt(date,cardno,cardphyid)
+        } finally {
+            transdtlOfflineDao.getLock().unlock()
+        }
+    }
+
     fun getTransdtlOfflineLast(): TransdtlOfflineRecord? {
         try {
             transdtlOfflineDao.getLock().lock()
diff --git a/app/src/main/java/com/supwisdom/db/SysParaDao.kt b/app/src/main/java/com/supwisdom/db/SysParaDao.kt
index 14872aa..50de288 100644
--- a/app/src/main/java/com/supwisdom/db/SysParaDao.kt
+++ b/app/src/main/java/com/supwisdom/db/SysParaDao.kt
@@ -47,7 +47,6 @@
         } finally {
             db.endTransaction()
         }
-        return false
     }
 
     fun get(): SysParaRecord? {
@@ -88,6 +87,7 @@
         val enable = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.offlineEnable.toString()))
         record.offlineEnable = enable == 1
         record.maxOfflineDays = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.maxOfflineDays.toString()))
+        record.maxDayOfflineAmt = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.maxDayOfflineAmt.toString()))
         record.mngPasswd = cursor.getString(cursor.getColumnIndex(BeanPropEnum.Syspara.mngpasswd.toString()))
         record.fixpayGap = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.fixpayGap.toString()))
         record.sucShowtime = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.consumeShowtime.toString()))
@@ -108,6 +108,7 @@
             values.put(BeanPropEnum.Syspara.offlineEnable.toString(), 0)
         }
         values.put(BeanPropEnum.Syspara.maxOfflineDays.toString(), record.maxOfflineDays)
+        values.put(BeanPropEnum.Syspara.maxDayOfflineAmt.toString(), record.maxDayOfflineAmt)
         values.put(BeanPropEnum.Syspara.mngpasswd.toString(), record.mngPasswd)
         values.put(BeanPropEnum.Syspara.fixpayGap.toString(), record.fixpayGap)
         values.put(BeanPropEnum.Syspara.consumeShowtime.toString(), record.sucShowtime)
diff --git a/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt b/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt
index fb9d0c0..8669aa8 100644
--- a/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt
+++ b/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt
@@ -56,6 +56,61 @@
         return false
     }
 
+    fun getAll(): List<TransdtlOfflineRecord> {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        val orderby = BeanPropEnum.TransdtlOffline.devseqno.toString() + " desc"
+        try {
+            cursor = db.query(TABLE, null, null, null, null, null, orderby)
+            val list = ArrayList<TransdtlOfflineRecord>()
+            while (cursor != null && cursor.moveToNext()) {
+                list.add(getRecord(cursor))
+            }
+            return list
+        } finally {
+            cursor?.close()
+        }
+    }
+
+    fun getOfflineAmt(date: String, cardno: String, cardphyid: String): Int {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        var sql = ("select sum(${BeanPropEnum.TransdtlOffline.payamt}) as sumamt from $TABLE where "
+                + BeanPropEnum.TransdtlOffline.transdate.toString() + "='" + date + "' and "
+                + BeanPropEnum.TransdtlOffline.cardno.toString() + "='" + cardno + "' and "
+                + BeanPropEnum.TransdtlOffline.cardphyid.toString() + "='" + cardphyid + "' and "
+                + BeanPropEnum.TransdtlOffline.reversalflag.toString() + "='" + ReversalFlag.NONE.toString() + "' and "
+                + BeanPropEnum.TransdtlOffline.status.toString() + "='" + PayStatus.SUC.toString() + "'")
+        var sumamt = 0
+        try {
+            cursor = db.rawQuery(sql, null, null)
+            if (cursor != null && cursor.moveToNext()) {
+                sumamt = cursor.getInt(cursor.getColumnIndex("sumamt"))
+            }
+        } finally {
+            cursor?.close()
+        }
+
+        sql = ("select sum(${BeanPropEnum.TransdtlOffline.payamt}) as sumamt from $TABLE where "
+                + BeanPropEnum.TransdtlOffline.transdate.toString() + "='" + date + "' and "
+                + BeanPropEnum.TransdtlOffline.cardno.toString() + "='" + cardno + "' and "
+                + BeanPropEnum.TransdtlOffline.cardphyid.toString() + "='" + cardphyid + "' and "
+                + BeanPropEnum.TransdtlOffline.reversalflag.toString() + "<>'" + ReversalFlag.NONE.toString() + "' and "
+                + BeanPropEnum.TransdtlOffline.status.toString() + "='" + PayStatus.SUC.toString() + "'")
+        try {
+            cursor = db.rawQuery(sql, null, null)
+            if (cursor != null && cursor.moveToNext()) {
+                val reverse = cursor.getInt(cursor.getColumnIndex("sumamt"))
+                if (sumamt > reverse) {
+                    return (sumamt - reverse)
+                }
+            }
+        } finally {
+            cursor?.close()
+        }
+        return 0
+    }
+
     fun getUnconfirm(): List<TransdtlOfflineRecord> {
         val db = dbHelper.readableDatabase
         var cursor: Cursor? = null
diff --git a/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt b/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
index 78a4328..0a76b2b 100644
--- a/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
+++ b/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
@@ -56,6 +56,22 @@
         return false
     }
 
+    fun getAll(): List<TransdtlOnlineRecord> {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        val orderby = BeanPropEnum.TransdtlOnline.devseqno.toString() + " desc"
+        try {
+            cursor = db.query(TABLE, null, null, null, null, null, orderby)
+            val list = ArrayList<TransdtlOnlineRecord>()
+            while (cursor != null && cursor.moveToNext()) {
+                list.add(getRecord(cursor))
+            }
+            return list
+        } finally {
+            cursor?.close()
+        }
+    }
+
     fun getUnconfirm(): List<TransdtlOnlineRecord> {
         val db = dbHelper.readableDatabase
         var cursor: Cursor? = null
diff --git a/app/src/main/java/com/supwisdom/entity/SysParaRecord.kt b/app/src/main/java/com/supwisdom/entity/SysParaRecord.kt
index 65e1640..8829b75 100644
--- a/app/src/main/java/com/supwisdom/entity/SysParaRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/SysParaRecord.kt
@@ -9,6 +9,7 @@
     var heatBeat: Int = 0// 心跳间隔
     var offlineEnable: Boolean = false // 脱机消费时限开关  false-关闭, true-开启
     var maxOfflineDays: Int = 0// 最大脱机天数
+    var maxDayOfflineAmt: Int = 0//同卡当天离线交易最大金额
     var mngPasswd: String? = null// 维护密码
     var sucShowtime: Int = 0// 消费成功显示时间
     var failShowtime: Int = 0 //消费失败显示时间
diff --git a/app/src/main/java/com/supwisdom/entity/TransdtlOfflineRecord.kt b/app/src/main/java/com/supwisdom/entity/TransdtlOfflineRecord.kt
index 347d10a..a471c8f 100644
--- a/app/src/main/java/com/supwisdom/entity/TransdtlOfflineRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/TransdtlOfflineRecord.kt
@@ -27,4 +27,16 @@
         val tmp = GsonUtil.GsonString(this)
         return GsonUtil.GsonToBean(tmp, TransdtlOfflineRecord::class.java)
     }
+
+    override fun toString(): String {
+        val sb = StringBuilder()
+        sb.append("离线流水:").append("devphyid=").append(devphyid).append(",transdate=").append(transdate)
+            .append(",transtime=").append(transtime).append(",seqno=").append(devseqno).append(",cardno=")
+            .append(cardno).append(",payamt=").append(payamt).append(",extraamt=").append(extraamt)
+            .append(",managefeetype=").append(managefeetype).append(",reversalflag=").append(reversalflag)
+            .append(",reversalseqno=").append(reversalseqno).append(",reversaltransdate=").append(reversaltransdate)
+            .append(",reversaltranstime=").append(reversaltranstime).append(",status=").append(status)
+            .append(",upflag=").append(upflag)
+        return sb.toString()
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt b/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt
index 584e629..841ca3a 100644
--- a/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt
@@ -29,4 +29,16 @@
         val tmp = GsonUtil.GsonString(this)
         return GsonUtil.GsonToBean(tmp, TransdtlOnlineRecord::class.java)
     }
+
+    override fun toString(): String {
+        val sb = StringBuilder()
+        sb.append("联机流水:").append("devphyid=").append(devphyid).append(",transdate=").append(transdate)
+            .append(",transtime=").append(transtime).append(",seqno=").append(devseqno).append(",cardno=")
+            .append(cardno).append(",code=").append(qrcode).append(",transtype=").append(transtype)
+            .append(",payamt=").append(payamt).append(",extraamt=").append(extraamt).append(",managefeetype")
+            .append(managefeetype).append(",username=").append(username).append(",billno=").append(billno)
+            .append(",reversalflag=").append(reversalflag).append(",reversalbillno=").append(reversalbillno)
+            .append(",status=").append(status).append(",upflag=").append(upflag)
+        return sb.toString()
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt b/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
index 0cdffea..75a91ab 100644
--- a/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
+++ b/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
@@ -105,6 +105,7 @@
                 it.paraname == "manage_passwd" -> record.mngPasswd = it.paraval
                 it.paraname == "offline_flag" -> record.offlineEnable = it.paraval == "1"
                 it.paraname == "max_offline_days" -> record.maxOfflineDays = it.paraval!!.toInt()
+                it.paraname == "max_day_offline_amt" -> record.maxDayOfflineAmt = it.paraval!!.toInt()
                 it.paraname == "communicate_time" -> record.commTime = it.paraval!!.toInt()
             }
         }
@@ -120,6 +121,9 @@
         if (record.commTime == 0) {
             record.commTime = 3
         }
+        if (record.maxDayOfflineAmt == 0) {
+            record.maxDayOfflineAmt = 10000
+        }
         if (!pos.replaceSysPara(record)) {
             throw SysParaError("保存参数失败")
         }