Przeglądaj źródła

Merge branch 'yz_watch_wdklwebrtc_1.0.0' of http://git.wdklian.com/allen/ncs_android_frame into yz_watch_wdklwebrtc_1.0.0

wjk 4 lat temu
rodzic
commit
c89326e351
27 zmienionych plików z 521 dodań i 109 usunięć
  1. 1 0
      .idea/gradle.xml
  2. 4 4
      app/src/main/code/com/wdkl/app/ncs/application/Application.kt
  3. 0 1
      common/src/main/code/com/wdkl/ncs/android/lib/base/BaseActivity.kt
  4. 1 2
      home/src/main/AndroidManifest.xml
  5. 113 0
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/TakeoverActivity.kt
  6. 7 15
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchHome2Activity.kt
  7. 21 20
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchHomeActivity.kt
  8. 17 11
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchRegisterActivity.kt
  9. 42 0
      home/src/main/code/com/wdkl/ncs/android/component/home/adapter/TakeoverItemAdapter.kt
  10. 2 0
      home/src/main/code/com/wdkl/ncs/android/component/home/di/HomeComponent.kt
  11. 8 3
      home/src/main/code/com/wdkl/ncs/android/component/home/service/TcpHandleService.kt
  12. 24 0
      home/src/main/res/layout/activity_takeover.xml
  13. 26 0
      home/src/main/res/layout/takeover_item.xml
  14. 3 3
      home/src/main/res/layout/watch_activity_home.xml
  15. 1 1
      home/src/main/res/layout/watch_activity_home2.xml
  16. 3 5
      middleware/src/main/code/com/wdkl/ncs/android/middleware/api/UrlManager.kt
  17. 3 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/api/WatchNamedUserApi.kt
  18. 2 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/di/PresenterComponent.kt
  19. 15 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/home/TakeoverContract.kt
  20. 2 1
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/home/WatchDeviceContract.kt
  21. 64 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/home/TakeoverPresenter.kt
  22. 4 3
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/home/WatchDevicePresenter.kt
  23. 89 39
      middleware/src/main/code/com/wdkl/ncs/android/middleware/model/dos/DeviceDO.java
  24. 58 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/model/vo/DeviceVO.java
  25. 1 1
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClientHandler.java
  26. 9 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/DeviceUtil.java
  27. 1 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/enums/TcpAction.java

+ 1 - 0
.idea/gradle.xml

@@ -28,5 +28,6 @@
         <option name="useQualifiedModuleNames" value="true" />
       </GradleProjectSettings>
     </option>
+    <option name="offlineMode" value="true" />
   </component>
 </project>

+ 4 - 4
app/src/main/code/com/wdkl/app/ncs/application/Application.kt

@@ -44,11 +44,11 @@ class Application : BaseApplication() {
         JRouter.openLog()
         JRouter.prepare().create("/welcome/launch").seek()
         JRouter.prepare().create("/home/launch").seek()
-        JRouter.prepare().create("/setting/launch").seek()
-        JRouter.prepare().create("/shop/launch").seek()
-        JRouter.prepare().create("/extra/launch").seek()
+//        JRouter.prepare().create("/setting/launch").seek()
+//        JRouter.prepare().create("/shop/launch").seek()
+//        JRouter.prepare().create("/extra/launch").seek()
 
-        JRouter.prepare().create("/hello/launch").seek()
+//        JRouter.prepare().create("/hello/launch").seek()
     }
 
     /**

+ 0 - 1
common/src/main/code/com/wdkl/ncs/android/lib/base/BaseActivity.kt

@@ -119,7 +119,6 @@ abstract class BaseActivity<PresenterType : BaseContract.BasePresenter, DataBind
         if(!EventBus.getDefault().isRegistered(this)){
             EventBus.getDefault().register(this)
         }
-
     }
 
 

+ 1 - 2
home/src/main/AndroidManifest.xml

@@ -22,8 +22,7 @@
         <activity android:name=".activity.WatchEventDetailActivity" />
         <activity android:name=".activity.WatchUserSettingActivity" />
         <activity android:name=".SOSEmergencyCallActivity" />
-        <activity android:name=".activity.SipVoipAudioActivity" />
-        <activity android:name=".activity.SipVoipAudioRingingActivity"></activity>
+        <activity android:name=".activity.TakeoverActivity" />
         <activity android:name=".activity.WebRTCVoipAudioActivity"></activity>
         <activity android:name=".activity.WebRTCVoipAudioRingingActivity" />
         <activity android:name=".activity.AppUpdateActivity" />

+ 113 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/activity/TakeoverActivity.kt

@@ -0,0 +1,113 @@
+package com.wdkl.ncs.android.component.home.activity
+
+import android.util.Log
+import com.alibaba.android.vlayout.DelegateAdapter
+import com.alibaba.android.vlayout.VirtualLayoutManager
+import com.enation.javashop.net.engine.model.NetState
+import com.google.common.math.IntMath
+import com.google.gson.JsonArray
+import com.google.gson.JsonObject
+import com.wdkl.ncs.android.component.home.R
+import com.wdkl.ncs.android.component.home.adapter.TakeoverItemAdapter
+import com.wdkl.ncs.android.component.home.databinding.ActivityTakeoverBinding
+import com.wdkl.ncs.android.component.home.launch.HomeLaunch
+import com.wdkl.ncs.android.component.nursehome.common.Constants
+import com.wdkl.ncs.android.lib.base.BaseActivity
+import com.wdkl.ncs.android.lib.utils.showMessage
+import com.wdkl.ncs.android.middleware.logic.contract.home.TakeoverContract
+import com.wdkl.ncs.android.middleware.logic.presenter.home.TakeoverPresenter
+import com.wdkl.ncs.android.middleware.tcp.TcpClient
+import com.wdkl.ncs.android.middleware.tcp.channel.DeviceUtil
+import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
+import com.wdkl.ncs.android.middleware.utils.MessageEvent
+import kotlinx.android.synthetic.main.activity_takeover.*
+import kotlinx.android.synthetic.main.watch_contacts_lay.refresh
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+
+class TakeoverActivity: BaseActivity<TakeoverPresenter, ActivityTakeoverBinding>(), TakeoverContract.View {
+    var TAG = TakeoverActivity::class.java.getSimpleName()
+
+    private val adapter = TakeoverItemAdapter(ArrayList())
+    private lateinit var virtualLayoutManager: VirtualLayoutManager
+    private lateinit var delegateAdapter: DelegateAdapter
+    var partId: Int = -1
+
+    override fun getLayId(): Int {
+        return R.layout.activity_takeover
+    }
+
+    override fun bindDagger() {
+        HomeLaunch.component.inject(this)
+    }
+
+    override fun onError(message: String, type: Int) {
+        dismissDialog()
+        showMessage(message)
+    }
+
+    override fun complete(message: String, type: Int) {
+        dismissDialog()
+        showMessage(message)
+    }
+
+    override fun start() {
+        TODO("Not yet implemented")
+    }
+
+    override fun networkMonitor(state: NetState) {
+        TODO("Not yet implemented")
+    }
+
+    override fun init(){
+        /**初始化LayoutMannager*/
+        virtualLayoutManager = VirtualLayoutManager(this.activity)
+
+        /**初始化适配器*/
+        delegateAdapter = DelegateAdapter(virtualLayoutManager)
+        delegateAdapter.addAdapter(adapter)
+        /**配置到RecycleView*/
+        takeover_list.layoutManager = virtualLayoutManager
+        takeover_list.adapter = delegateAdapter
+        partId = Constants.part_id
+        presenter.loadList(partId)
+    }
+
+    override fun renderData(data: JsonArray) {
+        Log.i(TAG,"返回的数据 "+data)
+        refresh.finishRefresh()
+        if (data.size() > 0) {
+            adapter.data.clear()
+            var listData = ArrayList<JsonObject>()
+            for (item in data){
+                val _item = item as JsonObject
+                if (!_item.get("id").asString.equals(Constants.ids)){
+                    listData.add(_item)
+                }
+            }
+            adapter.data.addAll(listData)
+            adapter.notifyDataSetChanged()
+        }
+    }
+
+    override fun bindEvent() {
+        refresh.setOnRefreshListener {
+            presenter.loadList(partId)
+        }
+
+        adapter.setOnItemClickListener { data, position ->
+            var tcpModel = DeviceUtil.deviceChange(Integer.parseInt(Constants.ids), data.get("id").asInt)
+            TcpClient.getInstance().sendMsg(tcpModel.toJson())
+            showMessage("切换中,请稍候")
+            TODO("不可点击3秒")
+        }
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onMoonEvent(messageEvent: MessageEvent) {
+    }
+
+    override fun destory() {
+
+    }
+}

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

@@ -7,7 +7,6 @@ import android.content.Intent
 import android.content.IntentFilter
 import android.graphics.Color
 import android.net.wifi.WifiManager
-import android.os.Handler
 import android.telephony.PhoneStateListener
 import android.telephony.SignalStrength
 import android.telephony.TelephonyManager
@@ -22,7 +21,6 @@ import com.google.gson.Gson
 import com.wdkl.core.consts.Urls
 import com.wdkl.core.socket.IUserState
 import com.wdkl.core.socket.SocketManager
-import com.wdkl.core.voip.VoipEvent
 import com.wdkl.ncs.android.component.home.BuildConfig
 import com.wdkl.ncs.android.component.home.R
 import com.wdkl.ncs.android.component.home.SOSEmergencyCallActivity
@@ -30,7 +28,6 @@ import com.wdkl.ncs.android.component.home.broadcast.BatteryBroadcastReceiver
 import com.wdkl.ncs.android.component.home.databinding.WatchActivityHomeBinding
 import com.wdkl.ncs.android.component.home.launch.HomeLaunch
 import com.wdkl.ncs.android.component.home.service.APPService
-import com.wdkl.ncs.android.component.home.service.TcpHandleService
 import com.wdkl.ncs.android.component.home.util.NetHelper
 import com.wdkl.ncs.android.component.home.util.SpeechUtil
 import com.wdkl.ncs.android.component.home.util.Util
@@ -55,10 +52,7 @@ import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpType
 import com.wdkl.ncs.android.middleware.utils.MessageEvent
-import com.wdkl.skywebrtc.SkyEngineKit
-import com.wdkl.skywebrtc.except.NotInitializedException
 import io.reactivex.Observable
-import kotlinx.android.synthetic.main.watch_activity_home.*
 import kotlinx.android.synthetic.main.watch_activity_home.battery_warning_tv
 import kotlinx.android.synthetic.main.watch_activity_home.call_records_linlyout
 import kotlinx.android.synthetic.main.watch_activity_home.customer_list_linlyout
@@ -67,7 +61,7 @@ import kotlinx.android.synthetic.main.watch_activity_home.list_item_img_icon_num
 import kotlinx.android.synthetic.main.watch_activity_home.other_linyout
 import kotlinx.android.synthetic.main.watch_activity_home.sip_state_tv
 import kotlinx.android.synthetic.main.watch_activity_home.state_linlyout
-import kotlinx.android.synthetic.main.watch_activity_home.user_nume_linlyout
+import kotlinx.android.synthetic.main.watch_activity_home.user_name_linlyout
 import kotlinx.android.synthetic.main.watch_activity_home.watch_name_tv
 import kotlinx.android.synthetic.main.watch_activity_home.watch_role_name_tv
 import kotlinx.android.synthetic.main.watch_activity_home.wifi_rssi_tv
@@ -75,11 +69,9 @@ import kotlinx.android.synthetic.main.watch_activity_home2.*
 import kotlinx.android.synthetic.main.watch_activity_register.*
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
-import java.util.*
 import kotlin.collections.ArrayList
-import kotlin.math.log
 
-@Router(path = "/watch/home")
+//@Router(path = "/watch/home")
 class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivityHomeBinding>(), WatchHomeActivityContract.View, View.OnClickListener, View.OnLongClickListener,
        IUserState {
 
@@ -181,9 +173,9 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
     override fun bindEvent() {
         customer_list_linlyout.setOnClickListener(this)
         call_records_linlyout.setOnClickListener(this)
-        user_nume_linlyout.setOnClickListener(this)
+        user_name_linlyout.setOnClickListener(this)
         state_linlyout.setOnClickListener(this)
-        user_nume_linlyout.setOnLongClickListener(this)
+        user_name_linlyout.setOnLongClickListener(this)
         other_linyout.setOnClickListener(this)
     }
 
@@ -240,7 +232,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
         Constants.sip_ip = "192.168.1.162"
         Constants.sip_id = data.sipId
         Constants.sip_password = data.sipPassword
-        Constants.user_name = data.memberName
+//        Constants.user_name = data.memberName
         Constants.user_role_name = data.name
 
         if (TextUtils.isEmpty(Constants.ids) || TextUtils.isEmpty(Constants.sip_id) || TextUtils.isEmpty(Constants.user_name)
@@ -447,7 +439,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
                 intent.putExtra("customer_id", "")
                 startActivity(intent)
             }
-            R.id.user_nume_linlyout -> {
+            R.id.user_name_linlyout -> {
                 var intent = Intent(this, WatchCallRecordsActivity::class.java)
                 intent.putExtra("action", "UNREAD")
                 intent.putExtra("customer_id", "")
@@ -470,7 +462,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
      */
     override fun onLongClick(p0: View): Boolean {
         when (p0.id) {
-            R.id.user_nume_linlyout -> {
+            R.id.user_name_linlyout -> {
 //                val intent = Intent(this, WatchUserSettingActivity::class.java)
 //                startActivity(intent)
             }

+ 21 - 20
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchHomeActivity.kt

@@ -18,7 +18,6 @@ import com.google.gson.Gson
 import com.wdkl.core.consts.Urls
 import com.wdkl.core.socket.IUserState
 import com.wdkl.core.socket.SocketManager
-import com.wdkl.core.voip.VoipEvent
 import com.wdkl.ncs.android.component.home.BuildConfig
 import com.wdkl.ncs.android.component.home.R
 import com.wdkl.ncs.android.component.home.SOSEmergencyCallActivity
@@ -48,14 +47,10 @@ import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpType
 import com.wdkl.ncs.android.middleware.utils.MessageEvent
-import com.wdkl.skywebrtc.SkyEngineKit
-import com.wdkl.skywebrtc.except.NotInitializedException
 import kotlinx.android.synthetic.main.watch_activity_home.*
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
-import java.util.*
 import kotlin.collections.ArrayList
-import kotlin.math.log
 
 @Router(path = "/watch/home")
 class WatchHomeActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivityHomeBinding>(), WatchHomeActivityContract.View, View.OnClickListener, View.OnLongClickListener,IUserState {
@@ -89,10 +84,12 @@ class WatchHomeActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivity
 
         watch_name_tv.text = Constants.user_name
 
-        if(Constants.user_role_name!!.contains("腕表")){
-            watch_role_name_tv.text = Constants.user_role_name!!.substring(0,(Constants.user_role_name)!!.indexOf("腕表"))
-        }else{
-            watch_role_name_tv.text = Constants.user_role_name
+        if (Constants.user_name!=null){
+            if (Constants.user_role_name!!.contains("腕表")) {
+                watch_role_name_tv.text = Constants.user_role_name!!.substring(0, (Constants.user_role_name)!!.indexOf("腕表"))
+            } else {
+                watch_role_name_tv.text = Constants.user_role_name
+            }
         }
 
          //开始ping网络,30秒ping一次
@@ -185,9 +182,9 @@ class WatchHomeActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivity
     override fun bindEvent() {
         customer_list_linlyout.setOnClickListener(this)
         call_records_linlyout.setOnClickListener(this)
-        user_nume_linlyout.setOnClickListener(this)
+        user_name_linlyout.setOnClickListener(this)
+        user_name_linlyout.setOnLongClickListener(this)
         state_linlyout.setOnClickListener(this)
-        user_nume_linlyout.setOnLongClickListener(this)
         other_linyout.setOnClickListener(this)
     }
 
@@ -262,12 +259,16 @@ class WatchHomeActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivity
                 intent.putExtra("customer_id", "")
                 startActivity(intent)
             }
-            R.id.user_nume_linlyout ->{
-                var intent = Intent(this, WatchCallRecordsActivity::class.java)
-                intent.putExtra("action", "UNREAD")
-                intent.putExtra("customer_id", "")
-                startActivity(intent)
-
+            R.id.user_name_linlyout ->{
+                if (Constants.user_name==null){
+                    var intent = Intent(this, TakeoverActivity().javaClass)
+                    startActivity(intent)
+                } else {
+                    var intent = Intent(this, WatchCallRecordsActivity::class.java)
+                    intent.putExtra("action", "UNREAD")
+                    intent.putExtra("customer_id", "")
+                    startActivity(intent)
+                }
             }
             R.id.state_linlyout ->{
 
@@ -285,9 +286,9 @@ class WatchHomeActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivity
      */
     override fun onLongClick(p0: View): Boolean {
         when (p0.id) {
-            R.id.user_nume_linlyout ->{
-//                val intent = Intent(this, WatchUserSettingActivity::class.java)
-//                startActivity(intent)
+            R.id.user_name_linlyout ->{
+                var intent = Intent(this, TakeoverActivity().javaClass)
+                startActivity(intent)
             }
         }
         return true

+ 17 - 11
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchRegisterActivity.kt

@@ -2,8 +2,11 @@ package com.wdkl.ncs.android.component.home.activity
 
 import android.Manifest
 import android.content.Intent
+import android.content.pm.PackageManager
 import android.os.Handler
 import android.provider.Settings
+import android.support.v4.app.ActivityCompat
+import android.support.v4.content.ContextCompat
 import android.text.TextUtils
 import android.util.Log
 import android.view.KeyEvent
@@ -25,6 +28,7 @@ import com.wdkl.ncs.android.middleware.logic.contract.home.WatchDeviceContract
 import com.wdkl.ncs.android.middleware.logic.presenter.home.WatchDevicePresenter
 import com.wdkl.ncs.android.middleware.model.dos.DeviceDO
 import com.wdkl.ncs.android.middleware.model.dto.TcpSeverDTO
+import com.wdkl.ncs.android.middleware.model.vo.DeviceVO
 import com.wdkl.ncs.android.middleware.tcp.TcpClient
 import com.wdkl.ncs.android.middleware.utils.MessageEvent
 import io.reactivex.Observable
@@ -54,13 +58,13 @@ class WatchRegisterActivity : BaseActivity<WatchDevicePresenter, WatchActivityRe
 
 
 
-//        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 {
-//            //TODO
-//        }
+        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 {
+            //TODO
+        }
 
         Constants.imei = Util().getIMEI(this)
         Log.e(TAG, "IMEI " + Util().getIMEI(this))
@@ -118,7 +122,7 @@ class WatchRegisterActivity : BaseActivity<WatchDevicePresenter, WatchActivityRe
         }).start()
     }
 
-    override fun showData(data: DeviceDO) {
+    override fun showData(data: DeviceVO) {
 
         Log.e(TAG, "收到返回的设备信息 ")
         Constants.part_id = data.partId
@@ -129,10 +133,12 @@ class WatchRegisterActivity : BaseActivity<WatchDevicePresenter, WatchActivityRe
         Constants.sip_id = data.sipId
         Constants.sip_password = data.sipPassword
         Constants.user_name = data.memberName
-        Constants.user_role_name = data.name
+        Constants.user_role_name = data.roleName
 
-        if(TextUtils.isEmpty(Constants.ids)||TextUtils.isEmpty(Constants.sip_id)||TextUtils.isEmpty(Constants.user_name)
-                || TextUtils.isEmpty(Constants.user_role_name)){
+        if(TextUtils.isEmpty(Constants.ids)||TextUtils.isEmpty(Constants.sip_id)
+//                ||TextUtils.isEmpty(Constants.user_name)
+//                || TextUtils.isEmpty(Constants.user_role_name)
+        ){
             showMessage("初始化数据时服务器返回数据不全,请联系管理员")
             tv_feedback_device_info.text = "初始化数据时服务器返回数据不全,请联系管理员"
             return

+ 42 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/adapter/TakeoverItemAdapter.kt

@@ -0,0 +1,42 @@
+package com.wdkl.ncs.android.component.home.adapter
+
+import android.util.Log
+import android.view.ViewGroup
+import com.alibaba.android.vlayout.LayoutHelper
+import com.alibaba.android.vlayout.layout.LinearLayoutHelper
+import com.google.gson.JsonObject
+import com.wdkl.ncs.android.component.home.R
+import com.wdkl.ncs.android.component.home.databinding.TakeoverItemBinding
+import com.wdkl.ncs.android.lib.adapter.BaseDelegateAdapter
+import com.wdkl.ncs.android.lib.utils.BaseRecyclerViewHolder
+
+class TakeoverItemAdapter(val data:ArrayList<JsonObject>) : BaseDelegateAdapter<BaseRecyclerViewHolder<TakeoverItemBinding>, JsonObject>(){
+    override fun dataProvider(): Any {
+        return data
+    }
+
+    override fun itemFilter(position: Int): Boolean {
+        return true
+    }
+
+    override fun getItemCount(): Int {
+        return data.size
+    }
+
+    override fun onCreateLayoutHelper(): LayoutHelper {
+        Log.i("abc",data.toString())
+        return LinearLayoutHelper(0,data.size)
+    }
+
+    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): BaseRecyclerViewHolder<TakeoverItemBinding> {
+        return BaseRecyclerViewHolder.build(parent, R.layout.takeover_item)
+    }
+
+    override fun onBindViewHolder(holder: BaseRecyclerViewHolder<TakeoverItemBinding>?, position: Int) {
+        holder?.bind {
+            binding ->
+            val itemData = getItem(position)
+            binding.clerkName.text = itemData.get("clerk_name").asString
+        }
+    }
+}

+ 2 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/di/HomeComponent.kt

@@ -37,4 +37,6 @@ interface HomeComponent {
     fun inject(activity: EventActivity)
 
     fun inject(activity: WatchEventDetailActivity)
+
+    fun inject(activity: TakeoverActivity)
 }

+ 8 - 3
home/src/main/code/com/wdkl/ncs/android/component/home/service/TcpHandleService.kt

@@ -10,9 +10,11 @@ import com.google.gson.GsonBuilder
 import com.wdkl.ncs.android.component.home.activity.WatchEventDetailActivity
 import com.wdkl.ncs.android.component.home.util.AppUtils
 import com.wdkl.ncs.android.component.home.util.SpeechUtil
+import com.wdkl.ncs.android.component.nursehome.common.Constants
 import com.wdkl.ncs.android.lib.utils.push
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpType
 import com.wdkl.ncs.android.middleware.utils.MessageEvent
 import org.greenrobot.eventbus.EventBus
@@ -44,7 +46,7 @@ class TcpHandleService : Service(){
         Log.i("TcpHandleService", "MessageEvent : " + messageEvent.tag)
         if (messageEvent.tag==2){
             var tcpModel = messageEvent.getMessage() as TcpModel
-           Log.e("tag",tcpModel.toJson())
+           Log.i("tag",tcpModel.toJson())
         }
 
         if (messageEvent.tag==3){
@@ -71,9 +73,12 @@ class TcpHandleService : Service(){
             //todo: 不优雅的传输,应该直接传递对象
             intent.putExtra("tcpModelStr",tcpModel.toJson())
             startActivity(intent)
-        } else if (messageEvent.tag == 4) {
+        } else if (messageEvent.tag == Constants.EVENT_TCP_APP_UPDATE) {
             //重新刷新数据
-            AppUtils.restartApp()
+            var tcpModel = messageEvent.getMessage() as TcpModel
+            if (tcpModel.action==TcpAction.DeviceAction.RESTART) {
+                AppUtils.restartApp()
+            }
         }
     }
 }

+ 24 - 0
home/src/main/res/layout/activity_takeover.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:bind="http://schemas.android.com/apk/res-auto">
+    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="#FFBDC3">
+
+        <com.scwang.smartrefresh.layout.SmartRefreshLayout
+            android:id="@+id/refresh"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="6px"
+            android:layout_marginRight="6px"
+            bind:srlEnableLoadMore="false"
+            bind:srlEnableRefresh="true">
+
+            <android.support.v7.widget.RecyclerView
+                android:id="@+id/takeover_list"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:background="#FFBDC3"></android.support.v7.widget.RecyclerView>
+        </com.scwang.smartrefresh.layout.SmartRefreshLayout>
+    </RelativeLayout>
+</layout>

+ 26 - 0
home/src/main/res/layout/takeover_item.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout>
+    <RelativeLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="50px"
+        android:layout_marginTop="7px"
+        android:background="#FFFFFF">
+
+        <RelativeLayout
+            android:layout_width="match_parent"
+            android:layout_height="50px">
+
+            <TextView
+                android:id="@+id/clerk_name"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_centerVertical="true"
+                android:layout_marginLeft="20px"
+                android:textColor="#F78B8F"
+                android:textSize="32px" />
+
+        </RelativeLayout>
+
+    </RelativeLayout>
+</layout>

+ 3 - 3
home/src/main/res/layout/watch_activity_home.xml

@@ -73,7 +73,7 @@
 
 
                 <RelativeLayout
-                    android:id="@+id/user_nume_linlyout"
+                    android:id="@+id/user_name_linlyout"
                     android:layout_width="0dp"
                     android:layout_height="match_parent"
                     android:layout_weight="1"
@@ -106,7 +106,7 @@
                             android:layout_width="wrap_content"
                             android:layout_height="wrap_content"
                             android:layout_marginTop="10px"
-                            android:text="王护士"
+                            android:text="无人使用"
                             android:textColor="#ffffff"
                             android:textSize="16px" />
 
@@ -115,7 +115,7 @@
                             android:layout_width="wrap_content"
                             android:layout_height="wrap_content"
                             android:layout_marginTop="10px"
-                            android:text="护士"
+                            android:text=""
                             android:textColor="#ffffff"
                             android:textSize="16px" />
                     </LinearLayout>

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

@@ -80,7 +80,7 @@
 
 
                 <RelativeLayout
-                    android:id="@+id/user_nume_linlyout"
+                    android:id="@+id/user_name_linlyout"
                     android:layout_width="0dp"
                     android:layout_height="match_parent"
                     android:layout_weight="1"

+ 3 - 5
middleware/src/main/code/com/wdkl/ncs/android/middleware/api/UrlManager.kt

@@ -54,15 +54,13 @@ interface UrlManager {
 private class DevUrlManager : UrlManager{
 
     override val base: String
-//        get() = "http://192.168.1.162"
-//        get() = "http://192.168.1.139"
-//get() = "http://47.106.200.55"
 //        get() = "http://dev.base.wdklian.com"
-get() = "http://8.129.220.143"
+//        get() = "http://8.129.220.143"
+        get() = "http://192.168.1.188"
 
     override val device_url: String
 //        get() = "${base}:6005/"
-get() = "${base}:8006/"
+        get() = "${base}:8006/"
     override val basic: String
         get() = "${base}:7002/"
 }

+ 3 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/api/WatchNamedUserApi.kt

@@ -17,4 +17,7 @@ interface WatchNamedUserApi {
                          , @Query("device_id") device_id: Int
                          , @Query("customer_id") customer_id: Int
                          ): Observable<ResponseBody>
+
+    @GET("/watch/get_using")
+    fun getPartWatchUsing(@Query("part_id") part_id: Int): Observable<ResponseBody>
 }

+ 2 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/di/PresenterComponent.kt

@@ -60,4 +60,6 @@ interface PresenterComponent {
     fun inject(presenter: WatchCallRecordsFragmentPresenter)
 
     fun inject(presenter: WatchDevicePresenter)
+
+    fun inject(presenter: TakeoverPresenter)
 }

+ 15 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/home/TakeoverContract.kt

@@ -0,0 +1,15 @@
+package com.wdkl.ncs.android.middleware.logic.contract.home
+
+import com.google.gson.JsonArray
+import com.wdkl.ncs.android.lib.base.BaseContract
+
+interface TakeoverContract {
+    interface View : BaseContract.BaseView{
+        fun renderData(data : JsonArray)
+
+    }
+
+    interface Presenter : BaseContract.BasePresenter{
+        fun loadList(partId: Int)
+    }
+}

+ 2 - 1
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/home/WatchDeviceContract.kt

@@ -4,6 +4,7 @@ import com.wdkl.ncs.android.lib.base.BaseContract
 import com.wdkl.ncs.android.middleware.model.dos.BroadcastDO
 import com.wdkl.ncs.android.middleware.model.dos.DeviceDO
 import com.wdkl.ncs.android.middleware.model.dto.TcpSeverDTO
+import com.wdkl.ncs.android.middleware.model.vo.DeviceVO
 
 /**
  * 获取当前设备数据接口
@@ -14,7 +15,7 @@ interface WatchDeviceContract {
      */
     interface View: BaseContract.BaseView{
         //显示设备信息
-        fun showData(data : DeviceDO)
+        fun showData(data : DeviceVO)
         //显示tcp通讯地址
         fun setTcpServerHost(tcpSeverDTO: TcpSeverDTO)
     }

+ 64 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/home/TakeoverPresenter.kt

@@ -0,0 +1,64 @@
+package com.wdkl.ncs.android.middleware.logic.presenter.home
+
+import com.enation.javashop.net.engine.plugin.connection.ConnectionQuality
+import com.enation.javashop.net.engine.plugin.exception.ExceptionHandle
+import com.enation.javashop.net.engine.utils.ThreadFromUtils
+import com.google.gson.FieldNamingPolicy
+import com.google.gson.GsonBuilder
+import com.google.gson.JsonArray
+import com.wdkl.ncs.android.lib.base.RxPresenter
+import com.wdkl.ncs.android.lib.utils.*
+import com.wdkl.ncs.android.middleware.api.WatchNamedUserApi
+import com.wdkl.ncs.android.middleware.di.MiddlewareDaggerComponent
+import com.wdkl.ncs.android.middleware.logic.contract.home.TakeoverContract
+import io.reactivex.disposables.Disposable
+import javax.inject.Inject
+
+class TakeoverPresenter@Inject constructor() : RxPresenter<TakeoverContract.View>(), TakeoverContract.Presenter {
+    /**
+     *依赖注入初始化
+     */
+    override fun bindDagger() {
+        MiddlewareDaggerComponent.component.inject(this)
+    }
+
+    @Inject
+    protected lateinit var watchNamedUserApi: WatchNamedUserApi
+
+    override fun loadList(partId:Int) {
+
+        watchNamedUserApi.getPartWatchUsing(partId).map {
+            var data = JsonArray()
+            var gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
+            data = gson.fromJson<JsonArray>(it.getJsonString(), JsonArray::class.java)
+
+            return@map data
+        }
+                .compose(ThreadFromUtils.defaultSchedulers())
+                .subscribe(observable)
+    }
+
+    private val observable = object: ConnectionObserver<Any>(){
+        override fun onStartWithConnection() {
+            providerView()
+        }
+
+        override fun onNextWithConnection(result: Any, connectionQuality: ConnectionQuality) {
+            when (result) {
+                is JsonArray -> {
+                    providerView().complete()
+                    providerView().renderData(result as JsonArray)
+                }
+            }
+        }
+
+        override fun onErrorWithConnection(error: ExceptionHandle.ResponeThrowable, connectionQuality: ConnectionQuality) {
+            providerView().onError(error.customMessage)
+        }
+
+        override fun attachSubscribe(var1: Disposable) {
+            addDisposable(var1)
+        }
+
+    }
+}

+ 4 - 3
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/home/WatchDevicePresenter.kt

@@ -12,6 +12,7 @@ import com.wdkl.ncs.android.middleware.di.MiddlewareDaggerComponent
 import com.wdkl.ncs.android.middleware.logic.contract.home.WatchDeviceContract
 import com.wdkl.ncs.android.middleware.model.dos.DeviceDO
 import com.wdkl.ncs.android.middleware.model.dto.TcpSeverDTO
+import com.wdkl.ncs.android.middleware.model.vo.DeviceVO
 import io.reactivex.disposables.Disposable
 import javax.inject.Inject
 
@@ -46,7 +47,7 @@ class WatchDevicePresenter@Inject constructor() :RxPresenter<WatchDeviceContract
             when (result) {
                 is DeviceDO -> {
                     providerView().complete()
-                    providerView().showData(result as DeviceDO)
+                    providerView().showData(result as DeviceVO)
                 }
 
                 is TcpSeverDTO -> {
@@ -74,10 +75,10 @@ class WatchDevicePresenter@Inject constructor() :RxPresenter<WatchDeviceContract
     override fun loadData(ethMac:String) {
 
         registerDeviceApi.getDeviceMessage(ethMac).map {
-            var deviceDO = DeviceDO()
+            var deviceDO = DeviceVO()
 
             var gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
-            deviceDO = gson.fromJson(it.getJsonString(), DeviceDO::class.java)
+            deviceDO = gson.fromJson(it.getJsonString(), DeviceVO::class.java)
           return@map deviceDO
         }
                 .compose(ThreadFromUtils.defaultSchedulers())

+ 89 - 39
middleware/src/main/code/com/wdkl/ncs/android/middleware/model/dos/DeviceDO.java

@@ -2,15 +2,15 @@ package com.wdkl.ncs.android.middleware.model.dos;
 
 import com.fasterxml.jackson.databind.PropertyNamingStrategy;
 import com.fasterxml.jackson.databind.annotation.JsonNaming;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import com.wdkl.ncs.android.middleware.model.annotation.Column;
 import com.wdkl.ncs.android.middleware.model.annotation.Id;
 import com.wdkl.ncs.android.middleware.model.annotation.PrimaryKeyField;
 import com.wdkl.ncs.android.middleware.model.annotation.Table;
 
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-
 import java.io.Serializable;
+import java.util.Objects;
 
 @Table(name = "ncs_device")
 @ApiModel
@@ -63,7 +63,7 @@ public class DeviceDO implements Serializable {
      * 注册设备类型:1:护士主机  2:医生主机  3:门口机  4:病床分机 5:LCD走廊屏  6:LED点阵屏  7:护士腕表  8:护工腕表  9:病人腕表  10:手机App
      */
     @Column(name = "device_type")
-    @ApiModelProperty(value = "注册设备类型:1:护士主机  2:医生主机  3:门口机  4:病床分机 5:LCD走廊屏  6:LED点阵屏  7:护士腕表  8:护工腕表  9:病人腕表  10:手机App", required = false)
+    @ApiModelProperty(value = "注册设备类型:1:护士主机  2:医生主机  3:门口机  4:病床分机 5:LCD走廊屏  6:LED点阵屏  7:移动设备  8:护工腕表  9:病人腕表  10:手机App", required = false)
     private Integer deviceType;
     /**
      * 注册设备出厂编号
@@ -108,9 +108,10 @@ public class DeviceDO implements Serializable {
     @ApiModelProperty(value = "该设备的有线以太网卡分配的IP地址", required = false)
     private String ethIp;
     /**
-     *	该设备的有线以太网卡分配的IP地址端口
-     */	@Column(name = "eth_ip_port" )
-    @ApiModelProperty(value="该设备的有线以太网卡分配的IP地址端口",required=false)
+     * 该设备的有线以太网卡分配的IP地址端口
+     */
+    @Column(name = "eth_ip_port")
+    @ApiModelProperty(value = "该设备的有线以太网卡分配的IP地址端口", required = false)
     private String ethIpPort;
     /**
      * 该设备的WIFI网卡MAC地址
@@ -173,27 +174,34 @@ public class DeviceDO implements Serializable {
     @ApiModelProperty(value = "null", required = false)
     private Integer memberId;
     /**
-     *	是否为后备,空或否时为并行
-     */	@Column(name = "bool_backup" )
-    @ApiModelProperty(value="是否为后备,空或否时为并行",required=false)
+     * 是否为后备,空或否时为并行
+     */
+    @Column(name = "bool_backup")
+    @ApiModelProperty(value = "是否为后备,空或否时为并行", required = false)
     private Boolean boolBackup;
     /**
-     *	后备哪个设备,设备id
-     */	@Column(name = "backup_id" )
-    @ApiModelProperty(value="后备哪个设备,设备id",required=false)
+     * 后备哪个设备,设备id
+     */
+    @Column(name = "backup_id")
+    @ApiModelProperty(value = "后备哪个设备,设备id", required = false)
     private Integer backupId;
     /**
-     *	null
-     */	@Column(name = "priority" )
-    @ApiModelProperty(value="null",required=false)
+     * null
+     */
+    @Column(name = "priority")
+    @ApiModelProperty(value = "null", required = false)
     private Integer priority;
 
-    @Column(name = "full_name")
-    @ApiModelProperty(value = "病房病床名称", required = false)
-    private String fullName; // 空间结构全名
-
-    private String memberName; // 使用人(护士腕表)
+    @Column(name = "config")
+    @ApiModelProperty(value = "设备配置信息,看板设备有配置内容,已json格式存储", required = false)
+    private String config; //
 
+    /**
+     * roleId
+     */
+    @Column(name = "role_id")
+    @ApiModelProperty(value = "roleId", required = false)
+    private Integer roleId;
 
     @PrimaryKeyField
     public Integer getId() {
@@ -231,14 +239,6 @@ public class DeviceDO implements Serializable {
         this.updateTime = updateTime;
     }
 
-    public String getMemberName() {
-        return memberName;
-    }
-
-    public void setMemberName(String memberName) {
-        this.memberName = memberName;
-    }
-
     public Integer getPartId() {
         return partId;
     }
@@ -407,7 +407,6 @@ public class DeviceDO implements Serializable {
         this.sipId = sipId;
     }
 
-
     public String getSipPassword() {
         return sipPassword;
     }
@@ -450,14 +449,6 @@ public class DeviceDO implements Serializable {
         this.backupId = backupId;
     }
 
-    public String getFullName() {
-        return fullName;
-    }
-
-    public void setFullName(String fullName) {
-        this.fullName = fullName;
-    }
-
     public Integer getPriority() {
         return priority;
     }
@@ -465,4 +456,63 @@ public class DeviceDO implements Serializable {
     public void setPriority(Integer priority) {
         this.priority = priority;
     }
-}
+
+    public Integer getRoleId() {
+        return roleId;
+    }
+
+    public void setRoleId(Integer roleId) {
+        this.roleId = roleId;
+    }
+
+    public String getConfig() {
+        return config;
+    }
+
+    public void setConfig(String config) {
+        this.config = config;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        DeviceDO deviceDO = (DeviceDO) o;
+        return Objects.equals(id, deviceDO.id) &&
+                Objects.equals(unionId, deviceDO.unionId) &&
+                Objects.equals(createTime, deviceDO.createTime) &&
+                Objects.equals(updateTime, deviceDO.updateTime) &&
+                Objects.equals(partId, deviceDO.partId) &&
+                Objects.equals(syncTime, deviceDO.syncTime) &&
+                Objects.equals(frameId, deviceDO.frameId) &&
+                Objects.equals(deviceType, deviceDO.deviceType) &&
+                Objects.equals(code, deviceDO.code) &&
+                Objects.equals(model, deviceDO.model) &&
+                Objects.equals(softVer, deviceDO.softVer) &&
+                Objects.equals(hardVer, deviceDO.hardVer) &&
+                Objects.equals(name, deviceDO.name) &&
+                Objects.equals(ethMac, deviceDO.ethMac) &&
+                Objects.equals(ethIp, deviceDO.ethIp) &&
+                Objects.equals(ethIpPort, deviceDO.ethIpPort) &&
+                Objects.equals(wifiMac, deviceDO.wifiMac) &&
+                Objects.equals(wifiIp, deviceDO.wifiIp) &&
+                Objects.equals(wifiHostname, deviceDO.wifiHostname) &&
+                Objects.equals(wifiPassword, deviceDO.wifiPassword) &&
+                Objects.equals(status, deviceDO.status) &&
+                Objects.equals(sipIp, deviceDO.sipIp) &&
+                Objects.equals(sipId, deviceDO.sipId) &&
+                Objects.equals(sipPassword, deviceDO.sipPassword) &&
+                Objects.equals(sipStatus, deviceDO.sipStatus) &&
+                Objects.equals(memberId, deviceDO.memberId) &&
+                Objects.equals(boolBackup, deviceDO.boolBackup) &&
+                Objects.equals(backupId, deviceDO.backupId) &&
+                Objects.equals(priority, deviceDO.priority) &&
+                Objects.equals(config, deviceDO.config) &&
+                Objects.equals(roleId, deviceDO.roleId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, unionId, createTime, updateTime, partId, syncTime, frameId, deviceType, code, model, softVer, hardVer, name, ethMac, ethIp, ethIpPort, wifiMac, wifiIp, wifiHostname, wifiPassword, status, sipIp, sipId, sipPassword, sipStatus, memberId, boolBackup, backupId, priority, config, roleId);
+    }
+}

+ 58 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/model/vo/DeviceVO.java

@@ -0,0 +1,58 @@
+package com.wdkl.ncs.android.middleware.model.vo;
+
+import com.wdkl.ncs.android.middleware.model.annotation.Table;
+import com.wdkl.ncs.android.middleware.model.dos.DeviceDO;
+
+@Table(name = "ncs_device")
+public class DeviceVO extends DeviceDO {
+
+    private String memberName; // 使用人(护士腕表)
+
+    private String roleName; // 使用角色
+
+    private String shopName; // 科室名
+
+    private Integer type; // 设备所在空间结构类型
+
+    private String fullName; // 空间结构全名
+
+    public String getMemberName() {
+        return memberName;
+    }
+
+    public void setMemberName(String memberName) {
+        this.memberName = memberName;
+    }
+
+    public String getRoleName() {
+        return roleName;
+    }
+
+    public void setRoleName(String roleName) {
+        this.roleName = roleName;
+    }
+
+    public String getShopName() {
+        return shopName;
+    }
+
+    public void setShopName(String shopName) {
+        this.shopName = shopName;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getFullName() {
+        return fullName;
+    }
+
+    public void setFullName(String fullName) {
+        this.fullName = fullName;
+    }
+}

+ 1 - 1
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClientHandler.java

@@ -88,7 +88,7 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
         if (evt instanceof IdleStateEvent){
             IdleStateEvent event = (IdleStateEvent)evt;
             if (event.state()== IdleState.WRITER_IDLE){
-//                ctx.writeAndFlush("0");
+                ctx.writeAndFlush("0");
               //读心跳包超时执行
             }else if (event.state() == IdleState.READER_IDLE){
                 Log.i(TAG,"TcpClientHandler ===> pong from server failed");

+ 9 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/DeviceUtil.java

@@ -20,4 +20,13 @@ public class DeviceUtil {
         tcpModel.setFromId(fromId);
         return tcpModel;
     }
+
+    public static TcpModel deviceChange(Integer fromId, Integer toId){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.DEVICE);
+        tcpModel.setAction(TcpAction.DeviceAction.DEVICE_CHANGE);
+        tcpModel.setFromId(fromId);
+        tcpModel.setToId(toId);
+        return tcpModel;
+    }
 }

+ 1 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/enums/TcpAction.java

@@ -172,6 +172,7 @@ public interface TcpAction {
         CONNECT("连接"),
         APP_UPDATE("APP更新"),
         DEVICE_REFRESH("设备刷新"),
+        DEVICE_CHANGE("设备更换"),
         USER_CHANGE("用户绑定");
         private String description;
         DeviceAction(String description){