init
diff --git a/app/src/main/java/com/supwisdom/activities/communicate/CommunicateActivity.kt b/app/src/main/java/com/supwisdom/activities/communicate/CommunicateActivity.kt
new file mode 100644
index 0000000..e511752
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/communicate/CommunicateActivity.kt
@@ -0,0 +1,114 @@
+package com.supwisdom.activities.communicate
+
+import android.os.Bundle
+import android.text.TextUtils
+import android.view.KeyEvent
+import android.view.View
+import android.widget.EditText
+import android.widget.TextView
+import com.supwisdom.R
+import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.auxscreen.AuxScreenController
+import com.supwisdom.utils.CommonUtil
+import com.supwisdom.utils.PublicDef
+import com.supwisdom.view.SWToast
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc 通讯参数配置
+ **/
+class CommunicateActivity : BaseActivity() {
+    private val pos = SPApplication.getInstance().getPos()
+    private lateinit var vDevphyid: TextView
+    private lateinit var vEpayUrl: EditText
+    private lateinit var vEpayUri: EditText
+    private lateinit var vEpayPort: EditText
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_communicate)
+        initView()
+        initData()
+    }
+
+    private fun initView() {
+        vDevphyid = findViewById<View>(R.id.comm_devphyid) as TextView
+        vEpayUrl = findViewById<View>(R.id.comm_epay_url) as EditText
+        vEpayUri = findViewById<View>(R.id.comm_epay_uri) as EditText
+        vEpayPort = findViewById<View>(R.id.comm_epay_port) as EditText
+
+        this.findViewById<View>(R.id.btn_cancel).setOnClickListener { finish() }
+        this.findViewById<View>(R.id.btn_confirm).setOnClickListener(View.OnClickListener {
+            val record = pos.getConfigPara()
+            val url = CommonUtil.getEditView(vEpayUrl)
+            if (TextUtils.isEmpty(url)) {
+                showSWToastInfo("服务器地址不能为空", PublicDef.TOAST_SHOW_CRY)
+                return@OnClickListener
+            }
+            record!!.epayIP = url
+
+            val uri = CommonUtil.getEditView(vEpayUri)
+            if (TextUtils.isEmpty(uri)) {
+                showSWToastInfo("服务器标识不对", PublicDef.TOAST_SHOW_CRY)
+                return@OnClickListener
+            }
+            record.epayUri = uri
+
+            try {
+                val port = Integer.valueOf(CommonUtil.getEditView(vEpayPort))
+                if (port > 0xFFFF) {
+                    showSWToastInfo("服务器端口太大", PublicDef.TOAST_SHOW_CRY)
+                    return@OnClickListener
+                }
+                record.epayPort = port
+            } catch (e: Exception) {
+                showSWToastInfo("服务器端口不对", PublicDef.TOAST_SHOW_CRY)
+                return@OnClickListener
+            }
+
+            if (!pos.replaceConfigPara(record)) {
+                showSWToastInfo("保存失败", PublicDef.TOAST_SHOW_CRY)
+                return@OnClickListener
+            }
+            showSWToastInfo("保存成功", PublicDef.TOAST_SHOW_SMILE)
+            finish()
+        })
+    }
+
+    public override fun onResume() {
+        super.onResume()
+        refresh()
+    }
+
+    private fun initData() {
+        val record = pos.getConfigPara()
+        vDevphyid.text = record!!.devphyid
+        vEpayUrl.setText(record.epayIP)
+        vEpayUri.setText(record.epayUri)
+        vEpayPort.setText(record.epayPort.toString())
+    }
+
+    private fun refresh() {
+        AuxScreenController.getInstance().refreshTitle("通讯参数设置")
+        AuxScreenController.getInstance().refreshBottom("确定键返回上页")
+        AuxScreenController.getInstance().refreshContent(listOf<String>("请到大屏进行配置"))
+    }
+
+    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+        if (event.action == KeyEvent.ACTION_DOWN) {
+            when (event.keyCode) {
+                KeyEvent.KEYCODE_DEL -> {
+                }
+                KeyEvent.KEYCODE_ENTER -> finish()
+            }//cancel
+            //和触屏删除键冲突
+            //                    finish();
+        }
+        return super.dispatchKeyEvent(event)
+    }
+
+    private fun showSWToastInfo(msg: String, showway: Int) {
+        SWToast.show(applicationContext, msg, showway)
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/control/ControlActivity.kt b/app/src/main/java/com/supwisdom/activities/control/ControlActivity.kt
new file mode 100644
index 0000000..e8dacdb
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/control/ControlActivity.kt
@@ -0,0 +1,125 @@
+package com.supwisdom.activities.control
+
+import android.os.Bundle
+import android.view.KeyEvent
+import android.view.View
+import android.widget.RadioButton
+import android.widget.TextView
+import com.supwisdom.R
+import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.auxscreen.AuxScreenController
+import com.supwisdom.entity.ControlParaRecord
+import com.supwisdom.utils.PublicDef
+import com.supwisdom.view.SWToast
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc
+ **/
+class ControlActivity : BaseActivity() {
+    private val pos = SPApplication.getInstance().getPos()
+    private lateinit var vDebugDisable: RadioButton
+    private lateinit var vDebugEnable: RadioButton
+    private lateinit var vOfflineEnable: RadioButton
+    private lateinit var vOfflineDisable: RadioButton
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_control)
+        initView()
+    }
+
+    private fun initData() {
+        var record = pos.getControlPara(PublicDef.CONTROL_OFFLINE_DAY_DISABLE)
+        if (record != null && "1" == record.paraval) {
+            vOfflineDisable.isChecked = true
+        } else {
+            vOfflineEnable.isChecked = true
+        }
+        record = pos.getControlPara(PublicDef.CONTROL_DEBUG_ENABLE)
+        if (record != null && "1" == record.paraval) {
+            vDebugEnable.isChecked = true
+        } else {
+            vDebugDisable.isChecked = true
+        }
+    }
+
+    private fun initView() {
+        vOfflineEnable = this.findViewById<View>(R.id.rb_offline_enable) as RadioButton
+        vOfflineDisable = this.findViewById<View>(R.id.rb_offline_disable) as RadioButton
+        vDebugDisable = this.findViewById<View>(R.id.rb_debug_enable) as RadioButton
+        vDebugEnable = this.findViewById<View>(R.id.rb_debug_disable) as RadioButton
+        val ivBtn = this.findViewById<View>(R.id.btn_cancel) as TextView
+        ivBtn.setOnClickListener { this@ControlActivity.finish() }
+        //确定按钮
+        this.findViewById<TextView>(R.id.btn_save).setOnClickListener {
+            var flag = if (vOfflineDisable.isChecked) {
+                "1"
+            } else {
+                "0"
+            }
+            if (!saveControlPara(PublicDef.CONTROL_OFFLINE_DAY_DISABLE, flag)) {
+                showSWToastInfo("脱机天数判断保存失败", PublicDef.TOAST_SHOW_CRY)
+                return@setOnClickListener
+            }
+
+            flag = if (vDebugEnable.isChecked) {
+                "1"
+            } else {
+                "0"
+            }
+            if (!saveControlPara(PublicDef.CONTROL_DEBUG_ENABLE, flag)) {
+                showSWToastInfo("日志调试保存失败", PublicDef.TOAST_SHOW_CRY)
+                return@setOnClickListener
+            }
+            showSWToastInfo("保存成功", PublicDef.TOAST_SHOW_SMILE)
+            this@ControlActivity.finish()
+        }
+
+    }
+
+    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+        if (event.action == KeyEvent.ACTION_DOWN) {
+            when (event.keyCode) {
+                KeyEvent.KEYCODE_DEL -> {
+                }
+                KeyEvent.KEYCODE_ENTER -> finish()
+            }//cancel
+            //和触屏删除键冲突
+            //                    finish();
+        }
+        return super.dispatchKeyEvent(event)
+    }
+
+    private fun showSWToastInfo(msg: String, showway: Int) {
+        SWToast.show(applicationContext, msg, showway)
+    }
+
+    override fun onResume() {
+        super.onResume()
+        refresh()
+        initData()
+    }
+
+    override fun onStop() {
+        super.onStop()
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+    }
+
+    private fun refresh() {
+        AuxScreenController.getInstance().refreshTitle("控制参数设置")
+        AuxScreenController.getInstance().refreshBottom("确定键返回上页")
+        AuxScreenController.getInstance().refreshContent(listOf<String>("请到大屏进行配置"))
+    }
+
+    private fun saveControlPara(paraname: String, paraval: String): Boolean {
+        val record = ControlParaRecord()
+        record.paraname = paraname
+        record.paraval = paraval
+        return pos.replaceControlPara(record)
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/manage/IManageView.kt b/app/src/main/java/com/supwisdom/activities/manage/IManageView.kt
new file mode 100644
index 0000000..27bb27f
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/manage/IManageView.kt
@@ -0,0 +1,11 @@
+package com.supwisdom.activities.manage
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc
+ **/
+interface IManageView {
+    fun showOperHint(hint: String, result: String)
+
+    fun showOperResult(hint: String, result: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/manage/ManageActivity.kt b/app/src/main/java/com/supwisdom/activities/manage/ManageActivity.kt
new file mode 100644
index 0000000..1fca144
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/manage/ManageActivity.kt
@@ -0,0 +1,172 @@
+package com.supwisdom.activities.manage
+
+import android.os.Bundle
+import android.os.CountDownTimer
+import android.view.KeyEvent
+import com.supwisdom.R
+import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.communicate.CommunicateActivity
+import com.supwisdom.activities.control.ControlActivity
+import com.supwisdom.auxscreen.AuxScreenController
+import com.supwisdom.utils.DateUtil
+import java.util.*
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc
+ **/
+class ManageActivity : BaseActivity(), IManageView {
+    private var presenter: ManagePresenter? = null
+    private var flag: Boolean = false
+    private var isRunning: Boolean = false
+    private val pos = SPApplication.getInstance().getPos()
+    @Volatile
+    private var keyActive = true
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_manage)
+        initView()
+        initData()
+    }
+
+    private fun initView() {
+
+    }
+
+    private fun initData() {
+        presenter = ManagePresenter(this)
+    }
+
+    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+        if (event.action == KeyEvent.ACTION_DOWN) {
+            if (isRunning || !keyActive) {
+                return super.dispatchKeyEvent(event)
+            }
+            resetCounter(200)
+
+            val keyCode = event.keyCode
+            if (flag) {
+                return if (KeyEvent.KEYCODE_DEL == keyCode) {
+                    refresh()
+                    true
+                } else {
+                    false
+                }
+            }
+            when (keyCode) {
+                KeyEvent.KEYCODE_1 -> {
+                    flag = true
+                    showShopPassword()
+                }
+                KeyEvent.KEYCODE_2 -> jumpActivity(CommunicateActivity::class.java)
+                KeyEvent.KEYCODE_3 -> {
+                    //查询流水
+                    flag = true
+                    AuxScreenController.Companion.getInstance().refreshContent(Arrays.asList<T>("流水查询:", "暂不支持"))
+                }
+                KeyEvent.KEYCODE_4 -> {
+                    flag = true
+                    isRunning = true
+                    AuxScreenController.Companion.getInstance().refreshContent(Arrays.asList<T>("正在导出流水", "请稍等..."))
+                    presenter!!.doOutTransdtl()
+                }
+                KeyEvent.KEYCODE_5 -> jumpActivity(UpgradeActivity::class.java!!)
+                KeyEvent.KEYCODE_6 -> {
+                    CommonUtil.sendBroadcast(applicationContext, false)
+                    AuxScreenController.Companion.getInstance().refreshContent(Arrays.asList<T>("应用程序已退出", "请到大屏操作"))
+                    AppExitUtil.exit()
+                }
+                KeyEvent.KEYCODE_7 -> {
+                    CommonUtil.sendBroadcast(applicationContext, false)
+                    AuxScreenController.Companion.getInstance().refreshContent(Arrays.asList<T>("应用程序已退出", "请到大屏操作"))
+                    CommonUtil.startNetSetting(this)
+                }
+                KeyEvent.KEYCODE_8 -> {
+                    flag = true
+                    isRunning = true
+                    AuxScreenController.Companion.getInstance().refreshContent(Arrays.asList<T>("正在清空黑名单", "请稍等..."))
+                    presenter!!.doClearBlacklist()
+                }
+                KeyEvent.KEYCODE_9 -> jumpActivity(ControlActivity::class.java)
+                KeyEvent.KEYCODE_DEL ->
+                    //cancel
+                    jumpActivity(MenuActivity::class.java!!)
+            }
+        }
+        return super.dispatchKeyEvent(event)
+    }
+
+    override fun showOperHint(hint: String, result: String) {
+        AuxScreenController.getInstance().refreshContent(Arrays.asList<T>(hint, result))
+    }
+
+    override fun showOperResult(hint: String, result: String) {
+        flag = true
+        isRunning = false
+        AuxScreenController.getInstance().refreshContent(Arrays.asList<T>(hint, result))
+    }
+
+    override fun onResume() {
+        super.onResume()
+        keyActive = true
+        refresh()
+    }
+
+    private fun refresh() {
+        flag = false
+        isRunning = false
+        AuxScreenController.getInstance().refreshTitle("设备管理界面")
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDate())
+        AuxScreenController.getInstance().refreshContent(
+            Arrays.asList(
+                getString(R.string.consume_menu_shop_passwd),
+                getString(R.string.consume_menu_comm_set),
+                getString(R.string.consume_menu_unconfirm_transdtl),
+                getString(R.string.consume_menu_out_dtl),
+                getString(R.string.consume_menu_upgrade),
+                getString(R.string.consume_menu_app_exit),
+                getString(R.string.consume_menu_setting),
+                getString(R.string.consume_menu_clear_blklist),
+                getString(R.string.consume_menu_control_set)
+            )
+        )
+    }
+
+    private fun showShopPassword() {
+        AuxScreenController.getInstance()
+            .refreshContent(Arrays.asList("商户密码:", pos!!.getConfigPara().getShopPwd()))
+    }
+
+    private fun showClearBlacklist() {
+        presenter!!.doClearBlacklist()
+    }
+
+    private fun showReloadTransdtl() {
+        presenter!!.doReloadTransdtl()
+    }
+
+    private var counter: ContinuePressTimer? = null
+
+    private fun resetCounter(timems: Long) {
+        if (counter == null) {
+            counter = ContinuePressTimer(timems, 100)
+        }
+        counter!!.cancel()
+        keyActive = false
+        counter!!.start()
+    }
+
+    private inner class ContinuePressTimer internal constructor(millisInFuture: Long, countDownInterval: Long) :
+        CountDownTimer(millisInFuture, countDownInterval) {
+
+        override fun onTick(millisUntilFinished: Long) {
+
+        }
+
+        override fun onFinish() {
+            keyActive = true
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/manage/ManagePresenter.kt b/app/src/main/java/com/supwisdom/activities/manage/ManagePresenter.kt
new file mode 100644
index 0000000..cfc459c
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/manage/ManagePresenter.kt
@@ -0,0 +1,93 @@
+package com.supwisdom.activities.manage
+
+import android.os.AsyncTask
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.bean.BaseResp
+import com.supwisdom.service.EpayApiImpl
+import com.supwisdom.utils.PublicDef
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc
+ **/
+class ManagePresenter constructor(iManageView: IManageView) {
+    private val iManageView = iManageView
+    private val pos = SPApplication.getInstance().getPos()
+
+    fun clearAndUpdateWhitelist() {
+        if (!SPApplication.getInstance().isOnline()) {
+            iManageView.showOperHint("重置黑名单失败", "网络未联通")
+            return
+        }
+        ClearWhiteList().execute()
+    }
+
+    fun reloadTransdtl() {
+        if (!SPApplication.getInstance().isOnline()) {
+            iManageView.showOperHint("补采流水失败", "网络未联通")
+            return
+        }
+        iManageView.showOperHint("正在补采流水", "请稍等...")
+        ReloadTransdtl().execute()
+    }
+
+    fun outTransdtl() {
+        iManageView.showOperHint("正在导出流水", "请稍等...")
+        OutTransdtl().execute()
+    }
+
+    private inner class ReloadTransdtl : AsyncTask<Void, Int, BaseResp>() {
+        override fun onPostExecute(resp: BaseResp) {
+            if (resp.retcode == PublicDef.SUCCESS) {
+                iManageView.showOperResult("补采流水成功", resp.retmsg!!)
+            } else {
+                iManageView.showOperResult("补采流水失败", resp.retmsg!!)
+            }
+        }
+
+        override fun doInBackground(vararg params: Void): BaseResp {
+            return BaseResp(PublicDef.ERROR, "暂未实现")
+        }
+    }
+
+    private inner class ClearWhiteList : AsyncTask<Void, Int, BaseResp>() {
+        override fun onPostExecute(resp: BaseResp) {
+            if (resp.retcode == PublicDef.SUCCESS) {
+                iManageView.showOperResult("黑名单更新成功", "")
+            } else {
+                iManageView.showOperResult("黑名单更新失败", resp.retmsg!!)
+            }
+        }
+
+        override fun doInBackground(vararg params: Void): BaseResp {
+            return try {
+                EpayApiImpl().downloadWhitelist("0")
+                BaseResp(PublicDef.ERROR, "更新成功")
+            } catch (ex: Exception) {
+                BaseResp(PublicDef.ERROR, ex.message)
+            }
+        }
+    }
+
+    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())
+//                }
+//            }
+            return BaseResp(PublicDef.SUCCESS, "共导出" + num + "笔")
+        }
+
+        override fun onPostExecute(resp: BaseResp) {
+            if (resp.retcode == PublicDef.SUCCESS) {
+                iManageView.showOperResult("导出流水成功", resp.retmsg!!)
+            } else {
+                iManageView.showOperResult("导出流水失败", resp.retmsg!!)
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/menu/IMenuView.kt b/app/src/main/java/com/supwisdom/activities/menu/IMenuView.kt
new file mode 100644
index 0000000..eefb65f
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/menu/IMenuView.kt
@@ -0,0 +1,11 @@
+package com.supwisdom.activities.menu
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc
+ **/
+interface IMenuView {
+    fun showOperHint(title: String, result: String)
+
+    fun showOperResult(title: String, result: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/menu/MenuActivity.kt b/app/src/main/java/com/supwisdom/activities/menu/MenuActivity.kt
new file mode 100644
index 0000000..2dd7b47
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/menu/MenuActivity.kt
@@ -0,0 +1,10 @@
+package com.supwisdom.activities.menu
+
+import com.supwisdom.activities.BaseActivity
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc
+ **/
+class MenuActivity : BaseActivity() {
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/menu/MenuPresenter.kt b/app/src/main/java/com/supwisdom/activities/menu/MenuPresenter.kt
new file mode 100644
index 0000000..119018b
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/menu/MenuPresenter.kt
@@ -0,0 +1,232 @@
+package com.supwisdom.activities.menu
+
+import android.content.Intent
+import android.os.AsyncTask
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.bean.AuthRetBean
+import com.supwisdom.bean.BaseResp
+import com.supwisdom.service.AuthEpay
+import com.supwisdom.service.EpayApiImpl
+import com.supwisdom.utils.CommonUtil
+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 = AuthEpay().login()
+            if (retBean.retcode == PublicDef.SUCCESS) {
+                val cfgRecord = pos.getConfigPara()
+                cfgRecord!!.deviceid = retBean.deviceid
+                cfgRecord.merchaccno = retBean.merchaccno
+                cfgRecord.shopname = retBean.shopname
+                pos.replaceConfigPara(cfgRecord)
+
+                SPApplication.getInstance().setEpayLinking(true)
+            } else {
+                SPApplication.getInstance().setEpayLinking(false)
+            }
+            return retBean
+        }
+
+        override fun onPostExecute(retBean: AuthRetBean?) {
+            if (retBean == null) {
+                iMenuView.showOperResult("签到结果", "请求超时")
+            } else {
+                iMenuView.showOperResult("签到结果", retBean.retmsg!!)
+            }
+        }
+    }
+
+    private inner class AsyncLink : AsyncTask<Void, Void, BaseResp>() {
+        override fun doInBackground(vararg voids: Void): BaseResp {
+//             EpayApiImpl().linkCheck()
+            return BaseResp(PublicDef.ERROR, "暂未实现")
+        }
+
+        override fun onPostExecute(baseResp: BaseResp) {
+            SPApplication.getInstance().setEpayLinking(baseResp.retcode == PublicDef.SUCCESS)
+            iMenuView.showOperResult("检测结果", baseResp.retmsg!!)
+        }
+    }
+
+    fun doReverse() {
+        val record = pos.getTransdtlUnionAll(DateUtil.getNowDateNoFormat(), 0)
+        if (record == null) {
+            iMenuView.showOperResult("冲正失败", "未找到消费记录")
+            return
+        }
+        if (PublicDef.CONSUME_TYPE_BAR.equals(record!!.getConsumetype())) {
+            iMenuView.showOperResult("冲正失败", "正扫不能冲正")
+        } else if (PublicDef.CONSUME_TYPE_SCAN.equals(record!!.getConsumetype()) ||
+            PublicDef.CONSUME_TYPE_OFFBAR.equals(record!!.getConsumetype()) ||
+            PublicDef.CONSUME_TYPE_VIRTUAL.equals(record!!.getConsumetype())
+        ) {
+            if (record!!.getFlag() and 0x80 == PublicDef.TRANSFLAG_REVERSE_CONSUME) {
+                iMenuView.showOperResult("冲正失败", "已冲正")
+                return
+            }
+            if (record!!.getFlag() and PublicDef.TRANSFLAG_UNWRITE_CARD !== PublicDef.TRANSFLAG_WRITE_CARD_SUCCESS) {
+                iMenuView.showOperResult("冲正失败", "消费失败不能冲正")
+                return
+            }
+            val t1 = DateUtil.dateFormatConvertToLong(record!!.getTransdate() + record!!.getTranstime())
+            val t2 = System.currentTimeMillis()
+            if (t2 - t1 > PublicDef.REVERSE_MS_GAP) {
+                iMenuView.showOperResult("冲正失败", "消费已过期")
+                return
+            }
+            val intent = Intent()
+            intent.putExtra("datetime", CommonUtil.getSystemMills())
+            intent.putExtra("amount", record!!.getPayamt() + "")
+            intent.putExtra("consumeType", PublicDef.CONSUME_TYPE_REVERSE)
+            intent.putExtra("transdtlType", record!!.getConsumetype())
+            intent.setClass(context, CheckShoppwdActivity::class.java!!)
+            context.startActivity(intent)
+        } else if (PublicDef.CONSUME_TYPE_CRD.equals(record!!.getConsumetype()) || PublicDef.CONSUME_TYPE_ONL.equals(
+                record!!.getConsumetype()
+            )
+        ) {
+            val intent = Intent()
+            intent.putExtra("datetime", CommonUtil.getSystemMills())
+            intent.putExtra("amount", record!!.getPayamt() + "")
+            intent.putExtra("consumeType", PublicDef.CONSUME_TYPE_REVERSE)
+
+            if (pos.getConfigPara().getMode() === PublicDef.TERMINAL_THIRD_PAY_MODE) {
+                intent.setClass(context, ThirdPayActivity::class.java!!)
+            } else if (pos.getConfigPara().getMode() === PublicDef.TERMINAL_THIRD_LOGIN_MODE) {
+                intent.setClass(context, ThirdLoginActivity::class.java!!)
+            } else {
+                intent.setClass(context, PayActivity::class.java!!)
+            }
+            context.startActivity(intent)
+        } else {
+            iMenuView.showOperResult("冲正失败", "不支持类型:" + record!!.getConsumetype())
+        }
+    }
+
+    fun doUploadTransdtl() {
+        iMenuView.showOperHint("正在上传流水", "请稍等...")
+        UploadTransdtl().execute()
+    }
+
+    private inner class UploadTransdtl : AsyncTask<Int, Int, BaseResp>() {
+        protected override fun doInBackground(vararg params: Int): BaseResp {
+            val apiInterface = SPApplication.getInstance().getAPIMode()
+            var num = 0
+            val onlList = pos.getTransdtlReverse(null)
+            if (onlList != null) {
+                num += onlList!!.size
+                for (i in onlList!!.indices) {
+                    val record = onlList!!.get(i)
+                    val resp = apiInterface.uploadTransdtl(record)
+                    if (resp == null) {
+                        return BaseResp(PublicDef.ERROR, "通讯超时")
+                    } else if (resp!!.retcode != PublicDef.SUCCESS) {
+                        return BaseResp(PublicDef.ERROR, resp!!.retmsg)
+                    }
+                    record.setUpflag(1)
+                    if (!pos.updateTransdtlReverse(record)) {
+                        return BaseResp(PublicDef.ERROR, "保存流水失败")
+                    }
+                }
+            }
+
+            val crdList = pos.getTransdtlCreditUnconfirm()
+            if (crdList != null) {
+                num += crdList!!.size
+                for (i in crdList!!.indices) {
+                    val record = crdList!!.get(i)
+                    val resp = apiInterface.uploadTransdtl(record, false)
+                    if (resp == null) {
+                        return BaseResp(PublicDef.ERROR, "通讯超时")
+                    } else if (resp!!.retcode != PublicDef.SUCCESS) {
+                        return BaseResp(PublicDef.ERROR, resp!!.retmsg)
+                    }
+                    record.setUpflag(1)
+                    if (!pos.updateTransdtlCredit(record)) {
+                        return BaseResp(PublicDef.ERROR, "保存流水失败")
+                    }
+                }
+            }
+
+            val barcodeList = pos.getTransdtlBarcodeUnconfirm()
+            if (barcodeList != null) {
+                num += barcodeList!!.size
+                for (i in barcodeList!!.indices) {
+                    val record = barcodeList!!.get(i)
+                    val resp = apiInterface.uploadTransdtl(record)
+                    if (resp == null) {
+                        return BaseResp(PublicDef.ERROR, "通讯超时")
+                    } else if (resp!!.retcode != PublicDef.SUCCESS) {
+                        return BaseResp(PublicDef.ERROR, resp!!.retmsg)
+                    }
+                    record.setUpflag(1)
+                    if (!pos.updateTransdtlBarcode(record)) {
+                        return BaseResp(PublicDef.ERROR, "保存流水失败")
+                    }
+                }
+            }
+
+            val bm1List = pos.getTransdtlBM1Unconfirm()
+            if (bm1List != null) {
+                num += bm1List!!.size
+                for (i in bm1List!!.indices) {
+                    val record = bm1List!!.get(i)
+                    val resp = apiInterface.uploadTransdtl(record)
+                    if (resp == null) {
+                        return BaseResp(PublicDef.ERROR, "通讯超时")
+                    } else if (resp!!.retcode != PublicDef.SUCCESS) {
+                        return BaseResp(PublicDef.ERROR, resp!!.retmsg)
+                    }
+                    record.setUpflag(1)
+                    if (!pos.updateTransdtlBM1(record)) {
+                        return BaseResp(PublicDef.ERROR, "保存流水失败")
+                    }
+                }
+            }
+            val gateList = pos.getTransdtlGateUnconfirm()
+            if (gateList != null) {
+                num += gateList!!.size
+                for (i in gateList!!.indices) {
+                    val record = gateList!!.get(i)
+                    val resp = apiInterface.uploadTransdtl(record)
+                    if (resp == null) {
+                        return BaseResp(PublicDef.ERROR, "通讯超时")
+                    } else if (resp!!.retcode != PublicDef.SUCCESS) {
+                        return BaseResp(PublicDef.ERROR, resp!!.retmsg)
+                    }
+                    record.setUpflag(1)
+                    if (!pos.updateTransdtlGate(record)) {
+                        return BaseResp(PublicDef.ERROR, "保存流水失败")
+                    }
+                }
+            }
+            return BaseResp(PublicDef.SUCCESS, "上传共" + num + "条")
+        }
+
+        override fun onPostExecute(resp: BaseResp) {
+            if (resp.retcode == PublicDef.SUCCESS) {
+                iMenuView.showOperResult("上传流水成功", resp.retmsg!!)
+            } else {
+                iMenuView.showOperResult("上传流水失败", resp.retmsg!!)
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt b/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
index fe6dfc9..aaac8dc 100644
--- a/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
+++ b/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
@@ -88,4 +88,15 @@
         flag,
         balance
     }
+
+    enum class TransdtlUnion {
+        transdate,
+        transtime,
+        devseqno,
+        payway,
+        reversalflag,
+        payamt,
+        status,
+        upflag
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt b/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt
index 04f7f6e..6fd57b1 100644
--- a/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt
+++ b/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt
@@ -16,9 +16,9 @@
         private val VERSION = 1
         private var instance: DBTransdtlHelper? = null
 
-        val TABLE_NAME_CONFIGPARA = "tb_configpara"
-        val TABLE_NAME_DTL_ONLINE = "tb_dtl_online"
-        val TABLE_NAME_DTL_OFFLINE = "tb_dtl_offline"
+        const val TABLE_NAME_CONFIGPARA = "tb_configpara"
+        const val TABLE_NAME_DTL_ONLINE = "tb_dtl_online"
+        const val TABLE_NAME_DTL_OFFLINE = "tb_dtl_offline"
 
         fun getInstance(context: Context): DBTransdtlHelper {
             if (null == instance) {
@@ -77,7 +77,7 @@
             + BeanPropEnum.TransdtlOffline.cardphyid + " varchar(32),"
             + BeanPropEnum.TransdtlOffline.payamt + " integer,"
             + BeanPropEnum.TransdtlOffline.extraamt + " integer,"
-            + BeanPropEnum.TransdtlOffline.reversalflag + " integer,"
+            + BeanPropEnum.TransdtlOffline.reversalflag + " varchar(8),"
             + BeanPropEnum.TransdtlOffline.reversalseqno + " integer,"
             + BeanPropEnum.TransdtlOffline.reversaltransdate + " char(8),"
             + BeanPropEnum.TransdtlOffline.reversaltranstime + " char(6),"
diff --git a/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt b/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt
index c2f158b..20bcec1 100644
--- a/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt
+++ b/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt
@@ -3,6 +3,8 @@
 import android.content.ContentValues
 import android.content.Context
 import android.database.Cursor
+import com.supwisdom.entity.PayStatus
+import com.supwisdom.entity.ReversalFlag
 import com.supwisdom.entity.TransdtlOfflineRecord
 import java.util.concurrent.locks.Lock
 
@@ -125,15 +127,26 @@
         record.cardphyid = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.cardphyid.toString()))
         record.payamt = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.payamt.toString()))
         record.extraamt = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.extraamt.toString()))
-        val flag = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.reversalflag.toString()))
-        record.reversalflag = flag == 1
+        var flag = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.reversalflag.toString()))
+        when (flag) {
+            ReversalFlag.NONE.toString() -> record.reversalflag = ReversalFlag.NONE
+            ReversalFlag.AUTO.toString() -> record.reversalflag = ReversalFlag.AUTO
+            ReversalFlag.MANUAL.toString() -> record.reversalflag = ReversalFlag.MANUAL
+            else -> record.reversalflag = ReversalFlag.NONE
+        }
         record.reversalseqno =
             cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.reversalseqno.toString()))
         record.reversaltransdate =
             cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.reversaltransdate.toString()))
         record.reversaltranstime =
             cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.reversaltranstime.toString()))
-        record.status = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.status.toString()))
+        flag = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.status.toString()))
+        when (flag) {
+            PayStatus.INIT.toString() -> record.status = PayStatus.INIT
+            PayStatus.FAIL.toString() -> record.status = PayStatus.FAIL
+            PayStatus.SUC.toString() -> record.status = PayStatus.SUC
+            else -> record.status = PayStatus.INIT
+        }
         record.upflag = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.upflag.toString()))
         return record
     }
@@ -148,15 +161,11 @@
         values.put(BeanPropEnum.TransdtlOffline.cardphyid.toString(), record.cardphyid)
         values.put(BeanPropEnum.TransdtlOffline.payamt.toString(), record.payamt)
         values.put(BeanPropEnum.TransdtlOffline.extraamt.toString(), record.extraamt)
-        if (record.reversalflag) {
-            values.put(BeanPropEnum.TransdtlOffline.reversalflag.toString(), 1)
-        } else {
-            values.put(BeanPropEnum.TransdtlOffline.reversalflag.toString(), 0)
-        }
+        values.put(BeanPropEnum.TransdtlOffline.reversalflag.toString(), record.reversalflag.toString())
         values.put(BeanPropEnum.TransdtlOffline.reversalseqno.toString(), record.reversalseqno)
         values.put(BeanPropEnum.TransdtlOffline.reversaltransdate.toString(), record.reversaltransdate)
         values.put(BeanPropEnum.TransdtlOffline.reversaltranstime.toString(), record.reversaltranstime)
-        values.put(BeanPropEnum.TransdtlOffline.status.toString(), record.status)
+        values.put(BeanPropEnum.TransdtlOffline.status.toString(), record.status.toString())
         values.put(BeanPropEnum.TransdtlOffline.upflag.toString(), record.upflag)
         return values
     }
diff --git a/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt b/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
index c6a4f6d..f40b672 100644
--- a/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
+++ b/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
@@ -3,6 +3,8 @@
 import android.content.ContentValues
 import android.content.Context
 import android.database.Cursor
+import com.supwisdom.entity.PayStatus
+import com.supwisdom.entity.ReversalFlag
 import com.supwisdom.entity.TransdtlOnlineRecord
 import java.util.concurrent.locks.Lock
 
@@ -128,11 +130,22 @@
         record.billno = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.billno.toString()))
         record.payamt = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.payamt.toString()))
         record.extraamt = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.extraamt.toString()))
-        record.reversalflag =
-            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.reversalflag.toString()))
+        var flag = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.reversalflag.toString()))
+        when (flag) {
+            ReversalFlag.NONE.toString() -> record.reversalflag = ReversalFlag.NONE
+            ReversalFlag.AUTO.toString() -> record.reversalflag = ReversalFlag.AUTO
+            ReversalFlag.MANUAL.toString() -> record.reversalflag = ReversalFlag.MANUAL
+            else -> record.reversalflag = ReversalFlag.NONE
+        }
         record.reversalbillno =
             cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.reversalbillno.toString()))
-        record.status = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.status.toString()))
+        flag = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.status.toString()))
+        when (flag) {
+            PayStatus.INIT.toString() -> record.status = PayStatus.INIT
+            PayStatus.FAIL.toString() -> record.status = PayStatus.FAIL
+            PayStatus.SUC.toString() -> record.status = PayStatus.SUC
+            else -> record.status = PayStatus.INIT
+        }
         record.upflag = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.upflag.toString()))
         return record
     }
@@ -150,9 +163,9 @@
         values.put(BeanPropEnum.TransdtlOnline.payamt.toString(), record.payamt)
         values.put(BeanPropEnum.TransdtlOnline.extraamt.toString(), record.extraamt)
         values.put(BeanPropEnum.TransdtlOnline.billno.toString(), record.billno)
-        values.put(BeanPropEnum.TransdtlOnline.reversalflag.toString(), record.reversalflag)
+        values.put(BeanPropEnum.TransdtlOnline.reversalflag.toString(), record.reversalflag.toString())
         values.put(BeanPropEnum.TransdtlOnline.reversalbillno.toString(), record.reversalbillno)
-        values.put(BeanPropEnum.TransdtlOnline.status.toString(), record.status)
+        values.put(BeanPropEnum.TransdtlOnline.status.toString(), record.status.toString())
         values.put(BeanPropEnum.TransdtlOnline.upflag.toString(), record.upflag)
         return values
     }
diff --git a/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt b/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt
new file mode 100644
index 0000000..62bd5d6
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt
@@ -0,0 +1,117 @@
+package com.supwisdom.db
+
+import android.content.Context
+import android.database.Cursor
+import com.supwisdom.entity.PayStatus
+import com.supwisdom.entity.ReversalFlag
+import com.supwisdom.entity.TransdtlUnionRecord
+import java.util.concurrent.locks.Lock
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc
+ **/
+class TransdtlUnionDao constructor(context: Context) {
+    private val tablesql = StringBuilder()
+    private val dbHelper = DBParaHelper.getInstance(context)
+
+    init {
+        tablesql.append("select ")
+            .append(BeanPropEnum.TransdtlOffline.transdate).append(",")
+            .append(BeanPropEnum.TransdtlOffline.transtime).append(",")
+            .append(BeanPropEnum.TransdtlOffline.devseqno).append(",")
+            .append(" 'offcard' as ").append(BeanPropEnum.TransdtlUnion.payway).append(",")
+            .append(BeanPropEnum.TransdtlOffline.reversalflag).append(",")
+            .append(BeanPropEnum.TransdtlOffline.payamt).append(",")
+            .append(BeanPropEnum.TransdtlOffline.status).append(",")
+            .append(BeanPropEnum.TransdtlOffline.upflag)
+            .append(" from ").append(DBTransdtlHelper.TABLE_NAME_DTL_OFFLINE)
+            .append(" UNION ALL select ")
+            .append(BeanPropEnum.TransdtlOnline.transdate).append(",")
+            .append(BeanPropEnum.TransdtlOnline.transtime).append(",")
+            .append(BeanPropEnum.TransdtlOnline.devseqno).append(",")
+            .append(BeanPropEnum.TransdtlOnline.transtype).append(" as ").append(BeanPropEnum.TransdtlUnion.payway)
+            .append(",")
+            .append(BeanPropEnum.TransdtlOnline.reversalflag).append(",")
+            .append(BeanPropEnum.TransdtlOffline.payamt).append(",")
+            .append(BeanPropEnum.TransdtlOffline.status).append(",")
+            .append(BeanPropEnum.TransdtlOffline.upflag)
+            .append(" from ").append(DBTransdtlHelper.TABLE_NAME_DTL_ONLINE)
+    }
+
+    fun getLock(): Lock {
+        return dbHelper.getLock()
+    }
+
+    fun get(date: String, offset: Int, flag: Int): List<TransdtlUnionRecord> {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        var sql = when (flag) {
+            0 -> {
+                ("select * from ("
+                        + tablesql.toString()
+                        + ") where " + BeanPropEnum.TransdtlUnion.transdate + "='" + date
+                        + "' order by " + BeanPropEnum.TransdtlUnion.transtime
+                        + " desc ")
+            }
+            1 -> {
+                ("select * from ("
+                        + tablesql.toString()
+                        + ") where " + BeanPropEnum.TransdtlUnion.transdate + "='" + date
+                        + "' and " + BeanPropEnum.TransdtlUnion.status + "='"
+                        + PayStatus.SUC.toString()
+                        + "' order by " + BeanPropEnum.TransdtlUnion.transtime
+                        + " desc ")
+            }
+            else -> {
+                ("select * from ("
+                        + tablesql.toString()
+                        + ") where " + BeanPropEnum.TransdtlUnion.transdate + "='" + date
+                        + "' and " + BeanPropEnum.TransdtlUnion.status + "='"
+                        + PayStatus.FAIL.toString()
+                        + "' order by " + BeanPropEnum.TransdtlUnion.transtime
+                        + " desc ")
+            }
+        }
+        sql += if (offset > 0) {
+            " limit 1 offset $offset"
+        } else {
+            " limit 1"
+        }
+        try {
+            cursor = db.rawQuery(sql, null)
+            val list = ArrayList<TransdtlUnionRecord>()
+            while (cursor != null && cursor.moveToNext()) {
+                list.add(getRecord(cursor))
+            }
+            return list
+        } finally {
+            cursor?.close()
+        }
+    }
+
+    private fun getRecord(cursor: Cursor): TransdtlUnionRecord {
+        val record = TransdtlUnionRecord()
+        record.transdate = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.transdate.toString()))
+        record.transtime = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.transtime.toString()))
+        record.devseqno = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.devseqno.toString()))
+        record.payway = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.payway.toString()))
+        var flag = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.reversalflag.toString()))
+        when (flag) {
+            ReversalFlag.NONE.toString() -> record.reversalflag = ReversalFlag.NONE
+            ReversalFlag.AUTO.toString() -> record.reversalflag = ReversalFlag.AUTO
+            ReversalFlag.MANUAL.toString() -> record.reversalflag = ReversalFlag.MANUAL
+            else -> record.reversalflag = ReversalFlag.NONE
+        }
+        record.payamt = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.payamt.toString()))
+        flag = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.status.toString()))
+        when (flag) {
+            PayStatus.INIT.toString() -> record.status = PayStatus.INIT
+            PayStatus.FAIL.toString() -> record.status = PayStatus.FAIL
+            PayStatus.SUC.toString() -> record.status = PayStatus.SUC
+            else -> record.status = PayStatus.INIT
+        }
+        record.upflag = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.upflag.toString()))
+        return record
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/entity/TransdtlOfflineRecord.kt b/app/src/main/java/com/supwisdom/entity/TransdtlOfflineRecord.kt
index 9018e4a..ea0e3b4 100644
--- a/app/src/main/java/com/supwisdom/entity/TransdtlOfflineRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/TransdtlOfflineRecord.kt
@@ -14,10 +14,10 @@
     var payamt: Int = 0
     var extraamt: Int = 0
     var managefeetype: String? = null // none,discount,mealer
-    var reversalflag = false
+    var reversalflag: ReversalFlag? = null //消费none 手动撤销 manual
     var reversalseqno: Int = 0 //被冲正流水号
     var reversaltransdate: String? = null //被冲正流水日期
     var reversaltranstime: String? = null  //被冲正流水时间
-    var status: String? = null // init,fail,suc
+    var status: PayStatus? = null // init,fail,suc
     var upflag: Int = 0 // 1已上传
 }
\ 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 1037fb9..8114a10 100644
--- a/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt
@@ -19,8 +19,8 @@
     var username: String? = null
     var userid: Int = 0
     var billno: String? = null
-    var reversalflag: String? = null //消费null 自动冲正auto 手动撤销 manual
+    var reversalflag: ReversalFlag? = null //消费none 自动冲正auto 手动撤销 manual
     var reversalbillno: String? = null //被冲正交易参考号
-    var status: String? = null // init,fail,suc
+    var status: PayStatus? = null // init,fail,suc
     var upflag: Int = 0 // 1已上传
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/entity/TransdtlUnionRecord.kt b/app/src/main/java/com/supwisdom/entity/TransdtlUnionRecord.kt
new file mode 100644
index 0000000..184265c
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/entity/TransdtlUnionRecord.kt
@@ -0,0 +1,38 @@
+package com.supwisdom.entity
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc
+ **/
+class TransdtlUnionRecord {
+    var transdate: String? = null
+    var transtime: String? = null
+    var devseqno: Int = 0
+    var payway: String? = null //card,code,offcard
+    var reversalflag: ReversalFlag? = null //消费none 自动冲正auto 手动撤销 manual
+    var payamt: Int = 0
+    var status: PayStatus? = null // init,fail,suc
+    var upflag: Int = 0
+}
+
+/**
+ * NONE -- 正常消费
+ * AUTO -- 自动冲正
+ * MANUAL -- 手动撤销
+ */
+enum class ReversalFlag {
+    NONE,
+    AUTO,
+    MANUAL
+}
+
+/**
+ * INIT -- 初始化
+ * FAIL -- 支付失败
+ * SUC --支付成功
+ */
+enum class PayStatus {
+    INIT,
+    FAIL,
+    SUC
+}
\ 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 17cb4a6..89d6623 100644
--- a/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
+++ b/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
@@ -2,6 +2,7 @@
 
 import com.supwisdom.activities.SPApplication
 import com.supwisdom.activities.YktSession
+import com.supwisdom.entity.ReversalFlag
 import com.supwisdom.entity.TransdtlOfflineRecord
 import com.supwisdom.entity.TransdtlOnlineRecord
 import com.supwisdom.exception.HeartBeatError
@@ -32,7 +33,7 @@
     }
 
     override fun linkCheck() {
-        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+
     }
 
     @Throws(SysParaError::class)
@@ -70,6 +71,12 @@
     @Throws(TransdtlUploadError::class)
     override fun uploadTransdtl(record: TransdtlOfflineRecord) {
         val params = WebParams()
+        var reversalflag = "false"
+        if (record.reversalflag == ReversalFlag.AUTO ||
+            record.reversalflag == ReversalFlag.MANUAL
+        ) {
+            reversalflag = "true"
+        }
         params.setParameter("devphyid", record.devphyid)
             .setParameter("termseqno", record.devseqno)
             .setParameter("transdate", record.transdate)
@@ -79,11 +86,11 @@
             .setParameter("amount", record.payamt)
             .setParameter("extraamt", record.extraamt)
             .setParameter("managefeetype", record.managefeetype)
-            .setParameter("reversalflag", record.reversalflag.toString())
+            .setParameter("reversalflag", reversalflag)
             .setParameter("reversaltermseqno", record.reversalseqno)
             .setParameter("reversaltransdate", record.reversaltransdate)
             .setParameter("reversaltransdate", record.reversaltranstime)
-            .setParameter("status", record.status)
+            .setParameter("status", record.status.toString())
 
         val resp = YktSession.getInstance().sendYktRequestPost("/api/pos/offlinetransdtl", "", params)
     }
diff --git a/app/src/main/java/com/supwisdom/utils/PublicDef.kt b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
index 7f1204d..d0cf3de 100644
--- a/app/src/main/java/com/supwisdom/utils/PublicDef.kt
+++ b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
@@ -71,6 +71,10 @@
     const val CONTROL_TRANSDTLOFF_SEQNO = "offseqno"
     const val CONTROL_FIXAMT = "fixamt"
     const val CONTROL_HAS_REGISTER = "hasregister"
-    const val CONTROL_GATEMODE_FLAG = "gatemodeflag"
-    const val CONTROL_REVENUE_WAY = "revenueway"
+    const val CONTROL_OFFLINE_DAY_DISABLE = "offdaydisable"
+    const val CONTROL_DEBUG_ENABLE = "debugenable"
+    /**
+     * 消费冲正时限
+     */
+    const val REVERSE_MS_GAP = 600000
 }
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_communicate.xml b/app/src/main/res/layout/activity_communicate.xml
new file mode 100644
index 0000000..d66e4ca
--- /dev/null
+++ b/app/src/main/res/layout/activity_communicate.xml
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              style="@style/head_title_out_style">
+
+    <LinearLayout style="@style/head_title_inner_style">
+
+        <TextView
+                style="@style/head_title_text_style"
+                android:text="通讯参数设置"/>
+
+        <ScrollView
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+
+            <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:orientation="vertical">
+
+                <LinearLayout style="@style/comm_ll_para_style">
+
+                    <TextView
+                            style="@style/init_param_name_style"
+                            android:text="终端MODE"/>
+
+                    <RadioGroup
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content">
+
+                        <RadioButton
+                                android:id="@+id/rb_pay_mode"
+                                style="@style/comm_rb_para_style"
+                                android:checked="true"
+                                android:text="消费模式"/>
+
+                        <RadioButton
+                                android:id="@+id/rb_deposit_mode"
+                                style="@style/comm_rb_para_style"
+                                android:text="充值模式"
+                                android:visibility="gone"/>
+
+                        <RadioButton
+                                android:id="@+id/rb_third_pay_mode"
+                                style="@style/comm_rb_para_style"
+                                android:text="对接消费模式"
+                                android:visibility="gone"/>
+
+                        <RadioButton
+                                android:id="@+id/rb_third_login_mode"
+                                style="@style/comm_rb_para_style"
+                                android:text="对接签到模式"
+                                android:visibility="gone"/>
+
+                        <RadioButton
+                                android:id="@+id/rb_gate_mode"
+                                style="@style/comm_rb_para_style"
+                                android:visibility="gone"/>
+                    </RadioGroup>
+                </LinearLayout>
+
+                <LinearLayout style="@style/comm_ll_para_style">
+
+                    <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:gravity="start|center"
+                            android:text="设备编号"
+                            android:textColor="@color/light_blue2"
+                            android:textSize="@dimen/enable_devphyid_font_size"/>
+
+                    <TextView
+                            android:id="@+id/comm_devphyid"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:gravity="start|center"
+                            android:inputType="numberDecimal"
+                            android:lines="1"
+                            android:maxLength="8"
+                            android:text="00000000"
+                            android:textColor="@color/light_blue2"
+                            android:textSize="@dimen/enable_devphyid_font_size"/>
+                </LinearLayout>
+                <!--第一行-->
+                <LinearLayout style="@style/comm_ll_para_style">
+
+                    <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:gravity="start|center"
+                            android:text="服务器地址"
+                            android:textColor="@color/light_blue2"
+                            android:textSize="@dimen/enable_devphyid_font_size"/>
+
+                    <EditText
+                            android:id="@+id/comm_epay_url"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginLeft="10dp"
+                            android:gravity="start|center"
+                            android:text="172.28.201.101"
+                            android:textColor="@color/light_blue2"
+                            android:textSize="@dimen/enable_devphyid_font_size"/>
+                </LinearLayout>
+
+                <LinearLayout style="@style/comm_ll_para_style">
+
+                    <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:gravity="start|center"
+                            android:text="服务器标识"
+                            android:textColor="@color/light_blue2"
+                            android:textSize="@dimen/enable_devphyid_font_size"/>
+
+                    <EditText
+                            android:id="@+id/comm_epay_uri"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:text="epayapi"
+                            android:textColor="@color/light_blue2"
+                            android:textSize="@dimen/enable_devphyid_font_size"/>
+                </LinearLayout>
+                <!--第二行-->
+                <LinearLayout style="@style/comm_ll_para_style">
+
+                    <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:text="服务器端口"
+                            android:textColor="@color/light_blue2"
+                            android:textSize="@dimen/enable_devphyid_font_size"/>
+
+                    <EditText
+                            android:id="@+id/comm_epay_port"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:inputType="numberDecimal"
+                            android:lines="1"
+                            android:maxLength="5"
+                            android:text="9116"
+                            android:textColor="@color/light_blue2"
+                            android:textSize="@dimen/enable_devphyid_font_size"/>
+                </LinearLayout>
+
+                <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="horizontal"
+                        android:padding="10dp"
+                        android:weightSum="2">
+
+                    <TextView
+                            android:id="@+id/btn_cancel"
+                            style="@style/param_item_text_btn_style"
+                            android:text="取消"/>
+
+                    <TextView
+                            android:id="@+id/btn_confirm"
+                            style="@style/param_item_text_btn_style"
+                            android:layout_marginLeft="10dp"
+                            android:text="保存"/>
+                </LinearLayout>
+
+                <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="500dp"/>
+            </LinearLayout>
+        </ScrollView>
+    </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_control.xml b/app/src/main/res/layout/activity_control.xml
new file mode 100644
index 0000000..e1168df
--- /dev/null
+++ b/app/src/main/res/layout/activity_control.xml
@@ -0,0 +1,84 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              style="@style/head_title_out_style">
+
+    <LinearLayout style="@style/head_title_inner_style">
+        <TextView
+                style="@style/head_title_text_style"
+                android:text="本地参数设置"/>
+        <ScrollView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:scrollbars="none">
+
+            <LinearLayout android:layout_width="match_parent"
+                          android:layout_height="match_parent"
+                          android:orientation="vertical">
+
+                <LinearLayout style="@style/control_item_ll_style">
+
+                    <TextView
+                            style="@style/init_param_name_style"
+                            android:text="脱机天数判断"/>
+
+                    <RadioGroup
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content">
+
+                        <RadioButton
+                                android:id="@+id/rb_offline_enable"
+                                style="@style/comm_rb_para_style"
+                                android:checked="true"
+                                android:text="开启"/>
+
+                        <RadioButton
+                                android:id="@+id/rb_offline_disable"
+                                style="@style/comm_rb_para_style"
+                                android:text="关闭"/>
+                    </RadioGroup>
+                </LinearLayout>
+
+                <LinearLayout style="@style/control_item_ll_style">
+
+                    <TextView
+                            style="@style/init_param_name_style"
+                            android:text="调试模式"/>
+
+                    <RadioGroup
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content">
+
+                        <RadioButton
+                                android:id="@+id/rb_debug_enable"
+                                style="@style/comm_rb_para_style"
+                                android:text="开启"/>
+
+                        <RadioButton
+                                android:id="@+id/rb_debug_disable"
+                                style="@style/comm_rb_para_style"
+                                android:checked="true"
+                                android:text="关闭"/>
+                    </RadioGroup>
+
+                </LinearLayout>
+            </LinearLayout>
+        </ScrollView>
+
+        <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="20dp"
+                android:orientation="horizontal"
+                android:weightSum="2">
+
+            <TextView
+                    android:id="@+id/btn_cancel"
+                    style="@style/control_text_btn_style"
+                    android:text="取消"/>
+
+            <TextView
+                    android:id="@+id/btn_save"
+                    style="@style/control_text_btn_style"
+                    android:text="保存"/>
+        </LinearLayout>
+    </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_manage.xml b/app/src/main/res/layout/activity_manage.xml
new file mode 100644
index 0000000..7537388
--- /dev/null
+++ b/app/src/main/res/layout/activity_manage.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              style="@style/head_title_out_style">
+
+    <LinearLayout style="@style/head_title_inner_style">
+        <TextView
+                style="@style/head_title_text_style"
+                android:text="维护管理界面"/>
+
+        <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_shop_passwd"/>
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_comm_set"/>
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_unconfirm_transdtl"/>
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_out_dtl"/>
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_upgrade"/>
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_app_exit"/>
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_setting"/>
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_clear_blklist"/>
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_control_set"/>
+        </LinearLayout>
+    </LinearLayout>
+</LinearLayout>
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 6b58d35..2d50789 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -175,7 +175,7 @@
     <dimen name="all_back_img_padtop">60dp</dimen>
     <dimen name="all_back_img_padleft">20dp</dimen>
     <!--本地控制参数-->
-    <dimen name="control_para_gap">20dp</dimen>
+    <dimen name="control_para_gap">10dp</dimen>
     <dimen name="control_para_text_size">28dp</dimen>
     <!--行间间隔-->
     <dimen name="line_divide">20dp</dimen>
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 0e8c119..7f993f9 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -335,6 +335,7 @@
         <item name="android:layout_width">match_parent</item>
         <item name="android:layout_height">wrap_content</item>
         <item name="android:layout_gravity">center_horizontal</item>
+        <item name="android:layout_marginLeft">10dp</item>
         <item name="android:layout_marginTop">@dimen/control_para_gap</item>
         <item name="android:orientation">vertical</item>
     </style>
@@ -480,4 +481,18 @@
         <item name="android:textSize">30sp</item>
         <item name="android:maxLines">1</item>
     </style>
+    <style name="comm_rb_para_style">
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">match_parent</item>
+        <item name="android:gravity">center|start</item>
+        <item name="android:textColor">@color/light_blue2</item>
+        <item name="android:textSize">28sp</item>
+    </style>
+    <style name="comm_ll_para_style">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:orientation">vertical</item>
+        <item name="android:layout_marginLeft">10dp</item>
+        <item name="android:padding">10dp</item>
+    </style>
 </resources>