Pārlūkot izejas kodu

## [1.1.14] version 33 - 2020-08-02
### Changed
- 注册界面增加注册完成按钮,管理员添加完设备后通过点击此按钮进入
- 主界面使用人姓名位置,设置为重载按钮,可重载设备信息

allen 3 gadi atpakaļ
vecāks
revīzija
810ea7f50d

+ 1 - 0
app/src/main/AndroidManifest.xml

@@ -85,6 +85,7 @@
         <meta-data
             android:name="android.max_aspect"
             android:value="2.2" />
+        <meta-data android:name="android.app.background_running" android:value="true"/>
     </application>
 
 </manifest>

+ 2 - 2
build.gradle

@@ -47,12 +47,12 @@ buildscript {
     /**
      * APP版本码
      */
-    ext.app_version_code = 31
+    ext.app_version_code = 33
 
     /**
      * APP版本号
      */
-    ext.app_version = "1.1.12"
+    ext.app_version = "1.1.14"
 
     /**
      * 项目依赖库

+ 107 - 34
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchHome2Activity.kt

@@ -10,6 +10,7 @@ import android.graphics.Color
 import android.media.session.MediaSession
 import android.net.wifi.WifiManager
 import android.os.Bundle
+import android.os.CountDownTimer
 import android.provider.Settings
 import android.support.v4.app.ActivityCompat
 import android.support.v4.content.ContextCompat
@@ -23,6 +24,9 @@ import android.view.KeyEvent
 import android.view.View
 import com.enation.javashop.net.engine.model.NetState
 import com.enation.javashop.net.engine.plugin.permission.RxPermissions
+import com.enation.javashop.utils.base.tool.CommonTool
+import com.enation.javashop.utils.base.widget.LoadingDialog
+import com.google.common.base.Strings
 import com.wdkl.core.consts.Urls
 import com.wdkl.core.socket.IUserState
 import com.wdkl.core.socket.SocketManager
@@ -52,8 +56,10 @@ import com.wdkl.ncs.android.middleware.model.vo.DeviceVO
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
 import com.wdkl.ncs.android.middleware.tcp.TcpClient
 import com.wdkl.ncs.android.middleware.utils.MessageEvent
+import com.wdkl.ncs.keepbackground.utils.SpManager
 import com.wdkl.ncs.keepbackground.work.DaemonEnv
 import io.reactivex.Observable
+import kotlinx.android.synthetic.main.watch_activity_call_records.*
 import kotlinx.android.synthetic.main.watch_activity_home2.*
 import kotlinx.android.synthetic.main.watch_activity_register.*
 import org.greenrobot.eventbus.Subscribe
@@ -72,6 +78,8 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
     lateinit var batteryBroadcastReceiver: BatteryBroadcastReceiver
     lateinit var myMediaButtonReceiver: MyMediaButtonReceiver
     private var isRegister = true
+    lateinit var loadingDialog: LoadingDialog
+    lateinit var countDownTimer: CountDownTimer
 
     private val WRITE_EXTERNAL_STORAGE_REQUEST_CODE = 127//这个值是自定义的一个int值,在申请多个权限时要
 
@@ -103,6 +111,9 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
         //保活守护进程
         DaemonEnv.init(this);
 
+        loadingDialog = CommonTool.createLoadingDialog(this, R.layout.custom_loading,R.id.loadding_image)
+        initCountDownTimer()
+
         //网络强度监听
         teleManager = (applicationContext.getSystemService(Context.TELEPHONY_SERVICE)) as TelephonyManager
         netType = NetHelper.getInstance().getNetworkState(applicationContext)
@@ -131,12 +142,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
             }
             DaemonEnv.startServiceSafelyWithData(this, WdKeepAliveService::class.java)
         } else {
-            val permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
-
-            if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
-                ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_PHONE_STATE), WRITE_EXTERNAL_STORAGE_REQUEST_CODE)
-            } else {
-            }
+            requestPermissions()
 
             Constants.imei = Util.getIMEI(this)
             Log.i(TAG, "IMEI " + Util.getIMEI(this))
@@ -196,30 +202,35 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
             Constants.heartBeat = tcpSeverDTO.readerIdleTime
             tv_server_ip.text = tcpSeverDTO.publicIp
 
-            Thread(Runnable {
-                //连接TCP
-                TcpClient.getInstance().init(Constants.tcpServer, Constants.tcpPort, Constants.heartBeat)
-            }).start()
-
-            AppTool.Time.delay(1500) {
-                requestPermissions()
+            if (SpManager.getInstance().getBoolean(Constants.SYSTEM_REGISTERED)){
+                tv_register_ok.visibility = View.GONE
+                tv_register_status.text = "本机已注册,进入系统中"
+                tv_register_status.setTextColor(Color.GREEN)
+                presenter.getDeviceVO(Constants.imei)
+            } else {
+                tv_register_status.text = "本机未注册,请将识别码发给管理员。管理员注册本机后请点击注册完成进入"
             }
         }
     }
 
     private fun requestPermissions() {
-        Observable.just("").compose(RxPermissions(this).ensure(Manifest.permission.CAMERA,
-                Manifest.permission.READ_EXTERNAL_STORAGE,
-                Manifest.permission.WRITE_EXTERNAL_STORAGE,
-                Manifest.permission.ACCESS_WIFI_STATE,
-                Manifest.permission.BLUETOOTH,
-                Manifest.permission.RECORD_AUDIO,
-                Manifest.permission.READ_PHONE_STATE)).subscribe {
-            if (it) {
-                presenter.getDeviceVO(Constants.imei)// 传imei
-            } else {
+        Observable.just("")
+                .compose(RxPermissions(this)
+                    .ensure(
+                        Manifest.permission.CAMERA,
+                        Manifest.permission.READ_EXTERNAL_STORAGE,
+                        Manifest.permission.WRITE_EXTERNAL_STORAGE,
+                        Manifest.permission.ACCESS_WIFI_STATE,
+                        Manifest.permission.BLUETOOTH,
+                        Manifest.permission.RECORD_AUDIO,
+                        Manifest.permission.READ_PHONE_STATE
+                    )
+                )
+                .subscribe {
+            if (!it) {
                 showMessage("请重新授权,进入App")
-                requestPermissions()
+            } else {
+                showMessage("授权已完成")
             }
         }.joinManager(disposableManager)
     }
@@ -228,9 +239,40 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
      * 返回的设备信息
      */
     override fun setDeviceDo(data: DeviceVO) {
+        if (data.id == null || data.id<=0){
+            loadingDialog.dismiss()
+            showMessage("本机未注册,请将识别码发给管理员")
+            return
+        }
+
+        if (Strings.isNullOrEmpty(data.ethIp)){
+            Thread(Runnable {
+                //连接TCP
+                if (TcpClient.getInstance().channel==null || !TcpClient.getInstance().channel.isActive) {
+                    TcpClient.getInstance().init(Constants.tcpServer, Constants.tcpPort, Constants.heartBeat)
+                }
+                while (!(TcpClient.getInstance().channel==null || !TcpClient.getInstance().channel.isActive)) {
+                    presenter.getDeviceVO(Constants.imei)
+                    Thread.sleep(1000)
+                }
+            }).start()
+            showMessage("获取设备数据中,请稍候")
+            return
+        } else {
+            Thread(Runnable {
+                //连接TCP
+                if (TcpClient.getInstance().channel==null || !TcpClient.getInstance().channel.isActive) {
+                    TcpClient.getInstance().init(Constants.tcpServer, Constants.tcpPort, Constants.heartBeat)
+                }
+            }).start()
+        }
+
+        loadingDialog.dismiss()
         watch_activity_register_layout.visibility = View.GONE
         watch_activity_home_linyout.visibility = View.VISIBLE
 
+        SpManager.getInstance().putBoolean(Constants.SYSTEM_REGISTERED,true)
+
         Log.i(TAG, "收到返回的设备信息 ")
         Constants.partId = data.partId
         Constants.deviceId = data.id
@@ -257,12 +299,27 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
         SocketManager.getInstance().addUserStateCallback(this)
         presenter.getDeviceSettingData(""+Constants.partId)
 
-        watch_name_tv.text = Constants.userName
-        if (Constants.userName!=null){
-            if (Constants.userRoleName!!.contains("腕表")) {
-                watch_role_name_tv.text = Constants.userRoleName!!.substring(0, (Constants.userRoleName)!!.indexOf("腕表"))
-            } else {
-                watch_role_name_tv.text = Constants.userRoleName
+        if (Strings.isNullOrEmpty(Constants.userName)){
+            watch_name_tv.text = "重载"
+            watch_name_tv.setTextColor(Color.BLACK)
+            watch_name_tv.textSize = 13f
+            watch_name_tv.setBackgroundResource(R.drawable.javashop_btn_balck_line_bg)
+            watch_name_tv.setOnClickListener{
+                loadingDialog.show()
+                presenter.getDeviceVO(Constants.imei)
+                return@setOnClickListener
+            }
+
+            watch_role_name_tv.text = "请使用PC设置使用人"
+            watch_role_name_tv.textSize = 12f
+        } else {
+            watch_name_tv.text = Constants.userName
+            if (Constants.userName != null) {
+                if (Constants.userRoleName!!.contains("腕表")) {
+                    watch_role_name_tv.text = Constants.userRoleName!!.substring(0, (Constants.userRoleName)!!.indexOf("腕表"))
+                } else {
+                    watch_role_name_tv.text = Constants.userRoleName
+                }
             }
         }
 
@@ -271,7 +328,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
             startActivity(intent)
         }
 
-        showMessage("初始化完成")
+        showMessage("载入完成")
     }
 
     /**
@@ -325,12 +382,24 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
         user_name_linlyout.setOnClickListener(this)
         state_linlyout.setOnClickListener(this)
         other_linyout.setOnClickListener(this)
-        setting_tv.setOnClickListener({
-            val intent = Intent(Settings.ACTION_SETTINGS)
-            startActivity(intent)
+        tv_register_ok.setOnClickListener({
+            loadingDialog.show()
+            presenter.getDeviceVO(Constants.imei)
+            countDownTimer.start()
         })
     }
 
+    fun initCountDownTimer() {
+        countDownTimer = object : CountDownTimer(1 * 1000L, 1000) {
+            override fun onTick(millisUntilFinished: Long) {
+            }
+            override fun onFinish() {
+                tv_register_ok.isEnabled = true
+                loadingDialog.dismiss()
+            }
+        }
+    }
+
     override fun onError(message: String, type: Int) {
     }
 
@@ -351,6 +420,10 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
         releaseReceiver()
         //停止服务
         DaemonEnv.sendStopWorkBroadcast(this)
+
+        if(countDownTimer != null){
+            countDownTimer.cancel()
+        }
     }
 
     /**

+ 10 - 10
home/src/main/code/com/wdkl/ncs/android/component/home/service/WdKeepAliveService.kt

@@ -258,11 +258,11 @@ class WdKeepAliveService : AbsWorkService() {
                     wakeLock?.release()
                 }).start()
                 Log.w(TAG, "EVENT TCP BREAK")
-                if (TcpClient.getInstance().channel==null || TcpClient.getInstance().bootstrap == null) {
-                    TcpClient.getInstance().init(Constants.tcpServer, Constants.tcpPort, Constants.heartBeat)
-                } else if (!TcpClient.getInstance().channel.isActive){
-                    TcpClient.getInstance().doConnect()
-                }
+//                if (TcpClient.getInstance().channel==null || TcpClient.getInstance().bootstrap == null) {
+//                    TcpClient.getInstance().init(Constants.tcpServer, Constants.tcpPort, Constants.heartBeat)
+//                } else if (!TcpClient.getInstance().channel.isActive){
+//                    TcpClient.getInstance().doConnect()
+//                }
             }
         }
     }
@@ -317,11 +317,11 @@ class WdKeepAliveService : AbsWorkService() {
                             Thread.sleep(1000)
                             wakeLock?.release()
                         })
-                        if (TcpClient.getInstance().channel==null || TcpClient.getInstance().bootstrap == null) {
-                            TcpClient.getInstance().init(Constants.tcpServer, Constants.tcpPort, Constants.heartBeat)
-                        } else if (!TcpClient.getInstance().channel.isActive){
-                            TcpClient.getInstance().doConnect()
-                        }
+//                        if (TcpClient.getInstance().channel==null || TcpClient.getInstance().bootstrap == null) {
+//                            TcpClient.getInstance().init(Constants.tcpServer, Constants.tcpPort, Constants.heartBeat)
+//                        } else if (!TcpClient.getInstance().channel.isActive){
+//                            TcpClient.getInstance().doConnect()
+//                        }
                     }
                 }
             }

+ 77 - 4
home/src/main/code/com/wdkl/ncs/android/component/home/util/Util.kt

@@ -1,26 +1,47 @@
 package com.wdkl.ncs.android.component.home.util
 
+import android.Manifest
 import android.annotation.SuppressLint
 import android.app.KeyguardManager
 import android.content.Context
 import android.content.Context.KEYGUARD_SERVICE
+import android.content.pm.PackageManager
 import android.os.Build
+import android.os.Environment
 import android.os.PowerManager
+import android.support.v4.app.ActivityCompat
 import android.telephony.TelephonyManager
-import android.util.Log
 import com.enation.javashop.utils.base.tool.SystemTool
 import com.google.common.base.Strings
-import java.lang.Exception
+import java.io.File
+import java.io.FileInputStream
+import java.io.FileOutputStream
+import java.io.IOException
+import java.util.*
+
 
 object Util {
 
     var IMEI = ""
+    var UUID_FILE_NAME = "wdkl_uuid.txt"
 
     /*
       激活获取IMEI用
     */
     @SuppressLint("MissingPermission", "PrivateApi")
     fun getIMEI(context: Context): String {
+        if (Build.VERSION.SDK_INT >= 29) {
+            val UUIDStr = readSD()
+            if (UUIDStr == null || UUIDStr.isEmpty()) { //如果为空或者空字符串就生成UUID创建文件并写入UUID
+                val uuid: String = Date().getTime().toString()
+                writeSD(uuid)
+                IMEI = uuid
+            } else {
+                IMEI = UUIDStr
+            }
+            return IMEI
+        }
+
         IMEI = SystemTool.getPhoneImei(context)
         if (Strings.isNullOrEmpty(IMEI)) {
             val tm = (context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager)
@@ -34,8 +55,9 @@ object Util {
             }
 
             if (Strings.isNullOrEmpty(IMEI)) {
-                IMEI = "35" + //we make this look like a valid IMEI
-                        Build.BOARD.length % 10 + Build.BRAND.length % 10 + Build.CPU_ABI.length % 10 + Build.DEVICE.length % 10 + Build.DISPLAY.length % 10 + Build.HOST.length % 10 + Build.ID.length % 10 + Build.MANUFACTURER.length % 10 + Build.MODEL.length % 10 + Build.PRODUCT.length % 10 + Build.TAGS.length % 10 + Build.TYPE.length % 10 + Build.USER.length % 10 //13 digits
+                IMEI = SystemTool.getLocalMacAddress()
+//                IMEI = "35" + //we make this look like a valid IMEI
+//                        Build.BOARD.length % 10 + Build.BRAND.length % 10 + Build.CPU_ABI.length % 10 + Build.DEVICE.length % 10 + Build.DISPLAY.length % 10 + Build.HOST.length % 10 + Build.ID.length % 10 + Build.MANUFACTURER.length % 10 + Build.MODEL.length % 10 + Build.PRODUCT.length % 10 + Build.TAGS.length % 10 + Build.TYPE.length % 10 + Build.USER.length % 10 //13 digits
             }
         }
         return IMEI
@@ -85,4 +107,55 @@ object Util {
         }
         return String(value)
     }
+
+    fun writeSD(content: String): String? {
+        //文件输出流
+        var out: FileOutputStream? = null
+        //设置文件路径
+        val file = File(Environment.getExternalStorageDirectory(), UUID_FILE_NAME)
+        return try {
+            out = FileOutputStream(file)
+            out.write(content.toByteArray())
+            content
+        } catch (e: Exception) {
+            e.printStackTrace()
+            ""
+        } finally {
+            try {
+                if (out != null) {
+                    out.close()
+                }
+            } catch (e: IOException) {
+                e.printStackTrace()
+            }
+        }
+    }
+
+    fun readSD(): String? {
+        //文件输入流
+        var `in`: FileInputStream? = null
+        //设置文件路径
+        val file = File(Environment.getExternalStorageDirectory(), UUID_FILE_NAME)
+        return try {
+            `in` = FileInputStream(file)
+            //使用缓冲来读
+            val buf = ByteArray(1024) //每1024字节读一次
+            val builder = StringBuilder()
+            while (`in`.read(buf) !== -1) {
+                builder.append(String(buf).trim { it <= ' ' })
+            }
+            builder.toString()
+        } catch (e: java.lang.Exception) {
+            e.printStackTrace()
+            ""
+        } finally {
+            try {
+                if (`in` != null) {
+                    `in`.close()
+                }
+            } catch (e: IOException) {
+                e.printStackTrace()
+            }
+        }
+    }
 }

+ 4 - 4
home/src/main/res/layout/watch_activity_home2.xml

@@ -113,18 +113,18 @@
                             android:layout_width="wrap_content"
                             android:layout_height="wrap_content"
                             android:layout_marginTop="10dp"
-                            android:text="王护士"
+                            android:paddingStart="5dp"
+                            android:paddingEnd="5dp"
                             android:textColor="#ffffff"
-                            android:textSize="16dp" />
+                            android:textSize="16sp" />
 
                         <TextView
                             android:id="@+id/watch_role_name_tv"
                             android:layout_width="wrap_content"
                             android:layout_height="wrap_content"
                             android:layout_marginTop="10dp"
-                            android:text="护士"
                             android:textColor="#ffffff"
-                            android:textSize="16dp" />
+                            android:textSize="16sp" />
                     </LinearLayout>
                 </RelativeLayout>
 

+ 17 - 8
home/src/main/res/layout/watch_activity_register.xml

@@ -11,7 +11,7 @@
         android:layout_height="match_parent">
     <LinearLayout
         android:layout_width="match_parent"
-        android:layout_height="match_parent"
+        android:layout_height="wrap_content"
         android:orientation="vertical">
 
         <TextView
@@ -19,14 +19,14 @@
             android:layout_height="wrap_content"
             android:layout_marginTop="10dp"
             android:textColor="@color/grgray"
-            android:textSize="15dp"
+            android:textSize="15sp"
             android:text="服务器IP: "/>00
     <TextView
         android:id="@+id/tv_server_ip"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_marginTop="5dp"
-        android:textSize="20dp"
+        android:textSize="20sp"
         android:text=""/>
     <TextView
         android:id="@+id/tv_mac_addr"
@@ -34,17 +34,26 @@
         android:layout_height="wrap_content"
         android:layout_marginTop="10dp"
         android:textColor="@color/grgray"
-        android:textSize="15dp"
+        android:textSize="15sp"
         android:text="识别码: "/>
     <TextView
         android:id="@+id/tv_feedback_device_info"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_marginTop="5dp"
-        android:textSize="20dp"
+        android:textSize="20sp"
         android:text=""/>
+
+        <TextView
+            android:id="@+id/tv_register_status"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"
+            android:textColor="#F07928"
+            android:textSize="15sp"/>
+
     <TextView
-        android:id="@+id/setting_tv"
+        android:id="@+id/tv_register_ok"
         android:layout_width="match_parent"
         android:layout_marginRight="30dp"
         android:layout_marginLeft="30dp"
@@ -53,8 +62,8 @@
         android:layout_height="40dp"
         android:background="#ffffff"
         android:gravity="center"
-        android:textSize="18dp"
-        android:text="系统设置"/>
+        android:textSize="18sp"
+        android:text="注册完成"/>
     </LinearLayout>
     </ScrollView>
 </LinearLayout>

+ 3 - 1
middleware/src/main/code/com/wdkl/ncs/android/middleware/common/Constants.kt

@@ -7,7 +7,7 @@ class Constants {
         var mac: String =""//设备Mac
         var partId : Int =-1//科室ID
         var frameId: String =""//医院结构ID
-        var ethIp: String ="" //当前设备的IP
+        var ethIp: String? ="" //当前设备的IP
         var deviceId: Int = 0//当前设备的ID
         var sipIp: String? =""//sipip
         var sipId: String? =""//sipid
@@ -22,6 +22,8 @@ class Constants {
 
         var sosActive = false
 
+        const val SYSTEM_REGISTERED = "SYSTEM_REGISTERED"
+
         const val EVENT_BATTERY_PERCENT = 0x07 //电量
         var EVENT_BATTERY_ALARM = true
 

+ 10 - 10
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/home/WatchHomeActivityPresenter.kt

@@ -1,5 +1,6 @@
 package com.wdkl.ncs.android.middleware.logic.presenter.home
 
+import android.util.Log
 import com.enation.javashop.net.engine.model.NetState
 import com.enation.javashop.net.engine.plugin.connection.ConnectionQuality
 import com.enation.javashop.net.engine.plugin.exception.ExceptionHandle
@@ -22,7 +23,7 @@ import io.reactivex.disposables.Disposable
 import javax.inject.Inject
 
 class WatchHomeActivityPresenter @Inject constructor(): RxPresenter<WatchHomeActivityContract.View>(),WatchHomeActivityContract.Presenter{
-
+    val TAG = WatchHomeActivityPresenter::class.java.canonicalName
 
     /**
      *获取当前设备数据api
@@ -45,6 +46,7 @@ class WatchHomeActivityPresenter @Inject constructor(): RxPresenter<WatchHomeAct
         }
 
         override fun onNextWithConnection(result: Any, connectionQuality: ConnectionQuality) {
+            Log.i(TAG, "result === $result")
             providerView().complete()
             when (result) {
                 is DeviceVO -> {
@@ -86,17 +88,15 @@ class WatchHomeActivityPresenter @Inject constructor(): RxPresenter<WatchHomeAct
      *获取当前设备数据
      */
     override fun getDeviceVO(ethMac:String) {
-
         registerDeviceApi.getDeviceMessage(ethMac).map {
-            var deviceVO = DeviceVO()
-
-            var gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
-            deviceVO = gson.fromJson(it.getJsonString(), DeviceVO::class.java)
+            val gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
+            val deviceVO = gson.fromJson(it.getJsonString(), DeviceVO::class.java)
+            if (deviceVO==null){
+                return@map DeviceVO()
+            }
             return@map deviceVO
-        }
-                .compose(ThreadFromUtils.defaultSchedulers())
-                .subscribe(observer)
-
+        }.compose(ThreadFromUtils.defaultSchedulers())
+        .subscribe(observer)
     }
 
     override fun getTcpServerHost() {

+ 7 - 0
readme.md

@@ -26,6 +26,13 @@
 
 ---
 
+## [1.1.14] version 33 - 2020-08-02
+### Changed
+- 注册界面增加注册完成按钮,管理员添加完设备后通过点击此按钮进入
+- 主界面使用人姓名位置,设置为重载按钮,可重载设备信息
+
+---
+
 ## [1.1.12] version 31 - 2020-07-30
 ### Fixed
 - 修复单个客户交互列表刷新加载更多时,加载所有人的交互问题