Quellcode durchsuchen

add poc2.0第一天测试需求结果

lihao1 vor 3 Jahren
Ursprung
Commit
5f69b499ba
23 geänderte Dateien mit 725 neuen und 123 gelöschten Zeilen
  1. 28 12
      cadengine/src/main/java/cn/sagacloud/android/cadengine/items/EquipItem.kt
  2. 2 1
      cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Point.kt
  3. BIN
      cadengine/src/main/res/drawable/yellow_equip.png
  4. 1 0
      demo/src/main/AndroidManifest.xml
  5. 3 2
      demo/src/main/java/com/framework/di/Di.kt
  6. 2 0
      demo/src/main/java/com/framework/mvvm/model/db/entity/PipeConfigEntity.kt
  7. 7 5
      demo/src/main/java/com/sybotan/android/demo/activities/EquipDetailActivity.kt
  8. 78 70
      demo/src/main/java/com/sybotan/android/demo/activities/GraphyActivity.kt
  9. 42 2
      demo/src/main/java/com/sybotan/android/demo/activities/PocActivity.kt
  10. 1 1
      demo/src/main/java/com/sybotan/android/demo/adapter/EquipListAdapter.java
  11. 19 6
      demo/src/main/java/com/sybotan/android/demo/adapter/PipeExpandAdapter.kt
  12. 9 6
      demo/src/main/java/com/sybotan/android/demo/adapter/RelationExpandAdapter.kt
  13. 9 9
      demo/src/main/java/com/sybotan/android/demo/adapter/StaticInfoAdapter.java
  14. 12 0
      demo/src/main/java/com/sybotan/android/demo/bean/ApkVersionBean.java
  15. 59 0
      demo/src/main/java/com/sybotan/android/demo/bean/AutoUpDateBean.java
  16. 4 0
      demo/src/main/java/com/sybotan/android/demo/bean/BaseModel.java
  17. 14 0
      demo/src/main/java/com/sybotan/android/demo/bean/PipeConfigEntityPackClass.java
  18. 13 0
      demo/src/main/java/com/sybotan/android/demo/bean/RelConfigEntityPackClass.java
  19. 11 0
      demo/src/main/java/com/sybotan/android/demo/retrofit/API.java
  20. 198 0
      demo/src/main/java/com/sybotan/android/demo/tools/DownLoadApk.java
  21. 136 0
      demo/src/main/java/com/sybotan/android/demo/tools/LogUtil.java
  22. 3 3
      demo/src/main/java/com/sybotan/android/demo/tools/UploadImage.java
  23. 74 6
      demo/src/main/java/com/sybotan/android/demo/viewmodel/GraphyVM.kt

+ 28 - 12
cadengine/src/main/java/cn/sagacloud/android/cadengine/items/EquipItem.kt

@@ -30,22 +30,26 @@ class EquipItem(
     val mPaint_inner = Paint()
     val mPaint_center = Paint()
     var mDefaultScale = 0f
-    var mBitmap: Bitmap
+    var mRedBitmap: Bitmap
+    var mBlueBitmap: Bitmap
+    var mGreenBitmap: Bitmap
+    var myellowBitmap: Bitmap
 
     init {
         if (defaultScale != null) {
             mDefaultScale = defaultScale
         }
-        //1-蓝 2-绿 3-红
-        if (data.equipState == 1) {
-            mBitmap = BitmapFactory.decodeResource(context.resources, R.drawable.equip_blue)
-        } else if (data.equipState == 2) {
-            mBitmap = BitmapFactory.decodeResource(context.resources, R.drawable.equip_green)
-        } else if (data.equipState == 3) {
-            mBitmap = BitmapFactory.decodeResource(context.resources, R.drawable.equip_red)
-        } else {
-            mBitmap = BitmapFactory.decodeResource(context.resources, R.drawable.equip_blue)
-        }
+        //1-蓝 2-绿 3-红 4-黄
+
+        mBlueBitmap = BitmapFactory.decodeResource(context.resources, R.drawable.equip_blue)
+
+
+        mGreenBitmap = BitmapFactory.decodeResource(context.resources, R.drawable.equip_green)
+
+        mRedBitmap = BitmapFactory.decodeResource(context.resources, R.drawable.equip_red)
+        myellowBitmap = BitmapFactory.decodeResource(context.resources, R.drawable.yellow_equip)
+
+
         /** 新建 */
         //内圈
         mPaint_inner.color = Color.parseColor("#66272727")
@@ -79,7 +83,19 @@ class EquipItem(
         val matrix = Matrix()
         matrix.postScale(3.0000007f, 3.0000007f)
         matrix.postTranslate(data.mX - 400f, data.mY - 400f)
-        canvas.drawBitmap(mBitmap, matrix, mPaint_center)
+        //1-蓝 2-绿 3-红
+        if (data.equipState == 1) {
+            canvas.drawBitmap(mBlueBitmap, matrix, mPaint_center)
+        } else if (data.equipState == 2) {
+            canvas.drawBitmap(mGreenBitmap, matrix, mPaint_center)
+        } else if (data.equipState == 3) {
+            canvas.drawBitmap(mRedBitmap, matrix, mPaint_center)
+        } else if (data.equipState == 4) {
+            canvas.drawBitmap(myellowBitmap, matrix, mPaint_center)
+        } else {
+            canvas.drawBitmap(mBlueBitmap, matrix, mPaint_center)
+        }
+
 //        canvas.drawCircle(data.mX, data.mY, 500f, mPaint_center)
 //        canvas.drawCircle(data.mX, -data.mY, 1500f, mPaint_inner)
         super.onDraw(canvas)

+ 2 - 1
cadengine/src/main/java/cn/sagacloud/android/cadengine/types/Point.kt

@@ -30,6 +30,7 @@ class Point {
     var deviceId: String? = null
     var photos: ArrayList<Photos> = ArrayList()
 
-    //1-蓝 2-绿 3-红
+    //1-蓝 2-绿 3-红 4-huang
     var equipState: Int? = 0
+    var equipType: Int? = 0
 }

BIN
cadengine/src/main/res/drawable/yellow_equip.png


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

@@ -21,6 +21,7 @@
 
     <uses-feature android:name="android.hardware.camera" />
     <uses-feature android:name="android.hardware.camera.autofocus" />
+    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
 
 
     <application

+ 3 - 2
demo/src/main/java/com/framework/di/Di.kt

@@ -7,6 +7,7 @@ import com.framework.app.IP
 import com.framework.mvvm.model.db.AdmDatabase
 import com.framework.mvvm.model.repository.AdmRepository
 import com.framework.mvvm.mv.AdmViewModel
+import com.sybotan.android.demo.tools.LogUtil
 import okhttp3.OkHttpClient
 import okhttp3.logging.HttpLoggingInterceptor
 import org.kodein.di.*
@@ -47,10 +48,10 @@ val httpModule = DI.Module("netModule") {
             HttpLoggingInterceptor { message ->
                 try {
                     val text: String = URLDecoder.decode(message, "utf-8")
-                    Log.e("OKHttp-----", text)
+                    LogUtil.e("OKHttp-----", text)
                 } catch (e: UnsupportedEncodingException) {
                     e.printStackTrace()
-                    Log.e("OKHttp-----", message)
+                    LogUtil.e("OKHttp-----", message)
                 }
             }.setLevel(HttpLoggingInterceptor.Level.BODY)
         }

+ 2 - 0
demo/src/main/java/com/framework/mvvm/model/db/entity/PipeConfigEntity.kt

@@ -18,4 +18,6 @@ data class PipeConfigEntity(
     @ColumnInfo(name = "pipe_sub_type") val pipeSubType: String?,        // 管道用途(业务定义补充描述类型)
     @ColumnInfo(name = "pipe_direction") val pipeDirection: Int?,        // 管道方向(1:正向from->to;-1:反向to->from;0:无方向)
     @ColumnInfo(name = "pipe_description") val pipeDescription: String?, // 描述信息
+//    val classCodeFromName: String?,
+//    val classCodeToName: String?,
 )

+ 7 - 5
demo/src/main/java/com/sybotan/android/demo/activities/EquipDetailActivity.kt

@@ -25,6 +25,8 @@ import com.google.gson.reflect.TypeToken
 import com.sybotan.android.demo.adapter.PictureAdapter
 import com.sybotan.android.demo.adapter.PipeExpandAdapter
 import com.sybotan.android.demo.adapter.RelationExpandAdapter
+import com.sybotan.android.demo.bean.PipeConfigEntityPackClass
+import com.sybotan.android.demo.bean.RelConfigEntityPackClass
 import com.sybotan.android.demo.bean.result.Position
 import com.sybotan.android.demo.bean.result.Z
 import com.sybotan.android.demo.retrofit.Constant
@@ -297,14 +299,14 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
                 }
                 GraphyVM.EQUIP_REL -> {
                     val hashMap = params as HashMap<String, Any>
-                    val parent = hashMap.get("parent") as ArrayList<RelConfigEntity>
+                    val parent = hashMap.get("parent") as ArrayList<RelConfigEntityPackClass>
                     val children = hashMap.get("child") as MutableList<List<RelationEntity>>
                     val relAdapter =
                         RelationExpandAdapter(this@EquipDetailActivity, parent, children)
                     relAdapter.setOnAdd(object : RelationExpandAdapter.AddRel {
-                        override fun onAdd(group: RelConfigEntity) {
-                            this@EquipDetailActivity.groupRelConfigEntity = group
-                            graphyVM.getRelObj(group, equipEntity!!.code!!)
+                        override fun onAdd(group: RelConfigEntityPackClass) {
+                            this@EquipDetailActivity.groupRelConfigEntity = group.entity
+                            graphyVM.getRelObj(group.entity, equipEntity!!.code!!)
                         }
                     })
                     relAdapter.setOnDelete(object : RelationExpandAdapter.DeleteRel {
@@ -350,7 +352,7 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
                 }
                 GraphyVM.PIPE -> {
                     val hashMap = params as HashMap<String, Any>
-                    val parent = hashMap.get("parent") as ArrayList<PipeConfigEntity>
+                    val parent = hashMap.get("parent") as ArrayList<PipeConfigEntityPackClass>
                     val children = hashMap.get("child") as MutableList<List<PipeEntity>>
                     val pipeAdapter = PipeExpandAdapter(this, parent, children)
                     pipeAdapter.setOnAdd(object : PipeExpandAdapter.AddRel {

+ 78 - 70
demo/src/main/java/com/sybotan/android/demo/activities/GraphyActivity.kt

@@ -545,6 +545,83 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
         scene.setOnSingleTopUp(object : FloorScene.OnSingleTopUp {
             @SuppressLint("SetJavaScriptEnabled")
             override fun onSingUp(x: Float, y: Float) {
+
+                //查看模式下,判断问题点选中逻辑
+                if ("normal".equals(scene.type)) {
+                    realDistance = distance * scene.defaultPointScale / graphyView.scale
+                    var hasChoose = false
+                    for (point in scene.pointItemList) {
+                        val sqrt = Math.sqrt(
+                            Math.pow(
+                                Math.abs(x - point.data.mX).toDouble(),
+                                2.0
+                            ) + Math.pow(Math.abs(y - point.data.mY).toDouble(), 2.0)
+                        ).toInt()
+                        if (sqrt < realDistance) {
+                            hasChoose = true
+                            showDotDetail(point)
+                            break
+                        }
+                    }
+                    if (!hasChoose) {
+                        problemLl.visibility = View.GONE
+                    } else {
+                        return
+                    }
+                    var hasChooseEquip = false
+                    for (point in scene.equipList) {
+                        val sqrt = Math.sqrt(
+                            Math.pow(
+                                Math.abs(x - point.data.mX).toDouble(),
+                                2.0
+                            ) + Math.pow(Math.abs(y - point.data.mY).toDouble(), 2.0)
+                        ).toInt()
+                        if (sqrt < realDistance) {
+                            hasChooseEquip = true
+                            equipDetail.alpha = 1f
+                            equipDelete.alpha = 1f
+                            equipDetail.isEnabled = true
+                            equipDelete.isEnabled = true
+                            point.data.equipState = 4
+                            equipDetail.setOnClickListener {
+                                val intent =
+                                    Intent(this@GraphyActivity, EquipDetailActivity::class.java)
+                                val bundle = Bundle()
+                                val positon = Position()
+                                positon.x = point.data.mX.toString()
+                                positon.y = point.data.mY.toString()
+                                val z = Z()
+                                val position = gson.fromJson(point.data.position, Z::class.java)
+                                z.offset = position.offset
+                                z.region = position.region
+                                positon.z = z
+                                bundle.putString("spaceId", scene.choseSpace!!.data.id)
+                                bundle.putSerializable("position", positon)
+                                bundle.putString("buildingId", buildingId)
+                                bundle.putString("floorId", floorId)
+                                bundle.putString("deviceId", point.data.deviceId)
+                                bundle.putString("projectId", projectId)
+                                intent.putExtra("equip", bundle)
+                                startActivityForResult(intent, REQUEST_CODE_EQUIP)
+                            }
+                            equipDelete.setOnClickListener {
+                                graphyVM.insProblemEquip(scene.choseSpace!!, point.data.deviceId!!)
+                            }
+
+                        } else {
+                            point.data.equipState = point.data.equipType
+                        }
+                    }
+                    if (!hasChooseEquip) {
+                        equipDetail.alpha = 0.5f
+                        equipDelete.alpha = 0.5f
+                        equipDetail.isEnabled = false
+                        equipDelete.isEnabled = false
+                    } else {
+                        return
+                    }
+                }
+
                 //如果只是查看模式,可以选中空间,进行空间内业务操作
                 if ("normal".equals(scene.type)) {
                     var hasChose = false
@@ -875,76 +952,6 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
                     scene.qrcodeItemList.clear()
                 }
 
-                //查看模式下,判断问题点选中逻辑
-                if ("normal".equals(scene.type)) {
-                    realDistance = distance * scene.defaultPointScale / graphyView.scale
-                    var hasChoose = false
-                    for (point in scene.pointItemList) {
-                        val sqrt = Math.sqrt(
-                            Math.pow(
-                                Math.abs(x - point.data.mX).toDouble(),
-                                2.0
-                            ) + Math.pow(Math.abs(y - point.data.mY).toDouble(), 2.0)
-                        ).toInt()
-                        if (sqrt < realDistance) {
-                            hasChoose = true
-                            showDotDetail(point)
-                            break
-                        }
-                    }
-                    if (!hasChoose) {
-                        problemLl.visibility = View.GONE
-                    }
-                    var hasChooseEquip = false
-                    for (point in scene.equipList) {
-                        val sqrt = Math.sqrt(
-                            Math.pow(
-                                Math.abs(x - point.data.mX).toDouble(),
-                                2.0
-                            ) + Math.pow(Math.abs(y - point.data.mY).toDouble(), 2.0)
-                        ).toInt()
-                        if (sqrt < realDistance) {
-                            hasChooseEquip = true
-                            equipDetail.alpha = 1f
-                            equipDelete.alpha = 1f
-                            equipDetail.isEnabled = true
-                            equipDelete.isEnabled = true
-                            equipDetail.setOnClickListener {
-                                val intent =
-                                    Intent(this@GraphyActivity, EquipDetailActivity::class.java)
-                                val bundle = Bundle()
-                                val positon = Position()
-                                positon.x = point.data.mX.toString()
-                                positon.y = point.data.mY.toString()
-                                val z = Z()
-                                val position = gson.fromJson(point.data.position, Z::class.java)
-                                z.offset = position.offset
-                                z.region = position.region
-                                positon.z = z
-                                bundle.putString("spaceId", scene.choseSpace!!.data.id)
-                                bundle.putSerializable("position", positon)
-                                bundle.putString("buildingId", buildingId)
-                                bundle.putString("floorId", floorId)
-                                bundle.putString("deviceId", point.data.deviceId)
-                                bundle.putString("projectId", projectId)
-                                intent.putExtra("equip", bundle)
-                                startActivityForResult(intent, REQUEST_CODE_EQUIP)
-                            }
-                            equipDelete.setOnClickListener {
-                                graphyVM.insProblemEquip(scene.choseSpace!!, point.data.deviceId!!)
-                            }
-                            break
-                        }
-                    }
-                    if (!hasChooseEquip) {
-                        equipDetail.alpha = 0.5f
-                        equipDelete.alpha = 0.5f
-                        equipDetail.isEnabled = false
-                        equipDelete.isEnabled = false
-                    }
-                    return
-                }
-
                 //绑定二位码业务
                 if ("qrcode".equals(scene.type)) {
                     qrcodeLl.visibility = View.VISIBLE
@@ -1599,6 +1606,7 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
                     point.remark = child.remark
                     point.type = model.type
                     point.equipState = child.type
+                    point.equipType = child.type
                     point.position = child.position
                     point.deviceId = child.deviceId
 

+ 42 - 2
demo/src/main/java/com/sybotan/android/demo/activities/PocActivity.kt

@@ -1,6 +1,7 @@
 package com.sybotan.android.demo.activities
 
 import android.Manifest
+import android.app.ProgressDialog
 import android.content.SharedPreferences
 import android.content.pm.PackageManager
 import android.os.Bundle
@@ -9,27 +10,38 @@ import androidx.appcompat.app.AppCompatActivity
 import androidx.constraintlayout.widget.ConstraintLayout
 import androidx.core.app.ActivityCompat
 import androidx.core.content.edit
+import androidx.lifecycle.lifecycleScope
 import com.framework.app.tools.MacUtil
 import com.framework.mvvm.model.vo.AdmRequest
 import com.framework.mvvm.mv.AdmViewModel
 import com.sybotan.android.demo.R
 import com.sybotan.android.demo.activities.poc.SceneActivity
 import com.sybotan.android.demo.activities.poc.SpaceActivity
+import com.sybotan.android.demo.bean.AutoUpDateBean
+import com.sybotan.android.demo.tools.CommonUtils
+import com.sybotan.android.demo.tools.DownLoadApk
 import com.sybotan.android.demo.tools.LocalDataOperation
 import com.sybotan.android.demo.tools.ToastUtils
+import com.sybotan.android.demo.viewmodel.GraphyVM
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
 import org.jetbrains.anko.startActivity
 import org.kodein.di.DI
 import org.kodein.di.DIAware
 import org.kodein.di.android.closestDI
 import org.kodein.di.android.x.viewmodel.viewModel
 import org.kodein.di.instance
+import java.io.IOException
+import java.net.HttpURLConnection
+import java.net.URL
 
-class PocActivity : AppCompatActivity(), DIAware {
+class PocActivity : BaseActivity(), DIAware {
 
     override val di: DI by closestDI()
 
     private val mVm: AdmViewModel by viewModel()
     private val sp: SharedPreferences by instance()
+    private var autoUpDateBean: AutoUpDateBean.Content? = null
 
     private val REQUEST_EXTERNAL_STORAGE = 1 // 不可改
 
@@ -54,7 +66,9 @@ class PocActivity : AppCompatActivity(), DIAware {
         }
 
         uploadBtn.setOnClickListener {
-            LocalDataOperation.getInstance().offlineSendRequest.uploadImageNew(this)
+            lifecycleScope.launch(Dispatchers.IO) {
+                LocalDataOperation.getInstance().offlineSendRequest.uploadImageNew(this@PocActivity)
+            }
             mVm.uploadBuilding {
                 ToastUtils.showMyToast("建筑数据上传成功")
             }
@@ -90,7 +104,33 @@ class PocActivity : AppCompatActivity(), DIAware {
 //                buildingId = "Bd0002220002bcaa181bd406439c9ecaddac13b0d543"
 //            )
 //        )
+        val viewModel = GraphyVM(this.application, { name, params ->
+            when (name) {
+                GraphyVM.UPDATE_APP -> {
+                    autoUpDateBean = params as AutoUpDateBean.Content
+                    if (!CommonUtils.IsNull(autoUpDateBean)
+                        && Integer.valueOf(autoUpDateBean!!.getBuild()) > Integer.valueOf(
+                            CommonUtils.getVersionMsg(this).get(0)
+                        )
+                    ) { //需要更新
+                        downUrl(
+                            "https://edition.persagy.com/api/download/getByParams/app/saas-version-app/Spring/MVC/entrance/unifier/download?resource="
+                                    + autoUpDateBean!!.getDownloadUrl(),
+                            autoUpDateBean!!.getBuild()
+                        )
+                    }
+                }
+            }
+        }, this@PocActivity, "", "", "")
+        viewModel.queryAutoUpdate();
+    }
 
+    fun downUrl(url: String?, build: String?) {
+        val dialog = ProgressDialog(this@PocActivity)
+        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL)
+        dialog.setCancelable(false)
+        dialog.show()
+        Thread(DownLoadApk(dialog, url, this@PocActivity, build)).start()
     }
 
     private fun checkStoragePermission() {

+ 1 - 1
demo/src/main/java/com/sybotan/android/demo/adapter/EquipListAdapter.java

@@ -23,7 +23,7 @@ public class EquipListAdapter extends BaseRecyclerViewAdapter<EquipmentEntity> {
 
     @Override
     protected void onBindDataToView(ViewHolder holder, EquipmentEntity entity) {
-        holder.setText(R.id.labelTv, entity.getSystemName() + "/" + entity.getName());
+        holder.setText(R.id.labelTv, entity.getSystemName() + "/" + entity.getName() + "-" + entity.getCode());
     }
 
     @Override

+ 19 - 6
demo/src/main/java/com/sybotan/android/demo/adapter/PipeExpandAdapter.kt

@@ -12,18 +12,19 @@ import com.framework.mvvm.model.db.entity.PipeEntity
 import com.framework.mvvm.model.db.entity.RelConfigEntity
 import com.framework.mvvm.model.db.entity.RelationEntity
 import com.sybotan.android.demo.R
+import com.sybotan.android.demo.bean.PipeConfigEntityPackClass
 import java.lang.StringBuilder
 
 
 class PipeExpandAdapter(
     context: Context,
-    groups: List<PipeConfigEntity>,
+    groups: List<PipeConfigEntityPackClass>,
     items: List<List<PipeEntity>>
 ) : BaseExpandableListAdapter() {
     private var addRel: AddRel? = null
     private var deleteRel: DeleteRel? = null
     private var mContext: Context = context
-    private var mGroups: List<PipeConfigEntity> = groups
+    private var mGroups: List<PipeConfigEntityPackClass> = groups
     private var mItems: List<List<PipeEntity>> = items
     private var mLayoutInflater: LayoutInflater = LayoutInflater.from(context)
 
@@ -35,7 +36,7 @@ class PipeExpandAdapter(
         return mItems[groupPosition].size
     }
 
-    override fun getGroup(groupPosition: Int): PipeConfigEntity {
+    override fun getGroup(groupPosition: Int): PipeConfigEntityPackClass {
         return mGroups[groupPosition]
     }
 
@@ -69,12 +70,24 @@ class PipeExpandAdapter(
         if (holder == null) {
             holder = mLayoutInflater.inflate(R.layout.group_expand_relation, parent, false)
         }
-        val group: PipeConfigEntity = mGroups[groupPosition]
+        val group: PipeConfigEntityPackClass = mGroups[groupPosition]
         val tvGroup = holder?.findViewById(R.id.title) as TextView
-        tvGroup.text = group.pipeSubType + "--" + group.pipeType
+        //1:正向from->to;-1:反向to->from;0:无方向
+        var sb = StringBuilder()
+        sb.append(group.fromName)
+        if (group.entity.pipeDirection == 1) {
+            sb.append("  —>  ")
+        } else if (group.entity.pipeDirection == -1) {
+            sb.append("  <—  ")
+        } else if (group.entity.pipeDirection == 0) {
+            sb.append("  ——  ")
+        }
+        sb.append(group.toName)
+        tvGroup.text =
+            group.entity.pipeSubType + "--" + group.entity.pipeType + "\n" + sb.toString()
         val add = holder?.findViewById(R.id.add) as ImageView
         add.setOnClickListener {
-            addRel?.onAdd(group)
+            addRel?.onAdd(group.entity)
         }
         return holder
     }

+ 9 - 6
demo/src/main/java/com/sybotan/android/demo/adapter/RelationExpandAdapter.kt

@@ -10,18 +10,20 @@ import android.widget.TextView
 import com.framework.mvvm.model.db.entity.RelConfigEntity
 import com.framework.mvvm.model.db.entity.RelationEntity
 import com.sybotan.android.demo.R
+import com.sybotan.android.demo.bean.RelConfigEntityPackClass
+import com.yuyh.library.imgsel.utils.LogUtils
 import java.lang.StringBuilder
 
 
 class RelationExpandAdapter(
     context: Context,
-    groups: List<RelConfigEntity>,
+    groups: List<RelConfigEntityPackClass>,
     items: MutableList<List<RelationEntity>>
 ) : BaseExpandableListAdapter() {
     private var addRel: AddRel? = null
     private var deleteRel: DeleteRel? = null
     private var mContext: Context = context
-    private var mGroups: List<RelConfigEntity> = groups
+    private var mGroups: List<RelConfigEntityPackClass> = groups
     private var mItems: List<List<RelationEntity>> = items
     private var mLayoutInflater: LayoutInflater = LayoutInflater.from(context)
 
@@ -33,7 +35,7 @@ class RelationExpandAdapter(
         return mItems[groupPosition].size
     }
 
-    override fun getGroup(groupPosition: Int): RelConfigEntity {
+    override fun getGroup(groupPosition: Int): RelConfigEntityPackClass {
         return mGroups[groupPosition]
     }
 
@@ -67,9 +69,10 @@ class RelationExpandAdapter(
         if (holder == null) {
             holder = mLayoutInflater.inflate(R.layout.group_expand_relation, parent, false)
         }
-        val group: RelConfigEntity = mGroups[groupPosition]
+        val group: RelConfigEntityPackClass = mGroups[groupPosition]
         val tvGroup = holder?.findViewById(R.id.title) as TextView
-        tvGroup.text = group.graphName + "/" + group.relName
+        tvGroup.text =
+            group.entity.graphName + "/" + group.entity.relName + "\n" + group.fromName + "  ->  " + group.toName
         val add = holder?.findViewById(R.id.add) as ImageView
         add.setOnClickListener {
             addRel?.onAdd(group)
@@ -102,7 +105,7 @@ class RelationExpandAdapter(
     }
 
     public interface AddRel {
-        fun onAdd(group: RelConfigEntity)
+        fun onAdd(group: RelConfigEntityPackClass)
     }
 
     fun setOnAdd(addRel: AddRel) {

+ 9 - 9
demo/src/main/java/com/sybotan/android/demo/adapter/StaticInfoAdapter.java

@@ -98,7 +98,7 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
                         }.getType());
                         StringBuilder sb = new StringBuilder();
                         for (int i = 0; i < value.size(); i++) {
-                            sb.append(info.getOptions().get(i).getTxt()).append("、");
+                            sb.append(value.get(i).getTxt()).append("、");
                         }
                         enumItemView.setTvRight(sb.toString());
                     }
@@ -114,8 +114,8 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
                             ArrayList<Options> arrayList = new ArrayList<>();
                             StringBuilder sb = new StringBuilder();
                             for (int i = 0; i < list.size(); i++) {
-                                sb.append(info.getOptions().get(i).getTxt()).append("、");
-                                arrayList.add(info.getOptions().get(i));
+                                sb.append(info.getOptions().get(list.get(i)).getTxt()).append("、");
+                                arrayList.add(info.getOptions().get(list.get(i)));
                             }
                             hashMap.put(info.getCode(), new Gson().toJson(arrayList));
                             enumItemView.setTvRight(sb.toString());
@@ -154,7 +154,7 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
                         }.getType());
                         StringBuilder sb = new StringBuilder();
                         for (int i = 0; i < value.size(); i++) {
-                            sb.append(info.getOptions().get(i).getTxt()).append("、");
+                            sb.append(value.get(i).getTxt()).append("、");
                         }
                         enumItemView.setTvRight(sb.toString());
                     }
@@ -170,8 +170,8 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
                             ArrayList<Options> arrayList = new ArrayList<>();
                             StringBuilder sb = new StringBuilder();
                             for (int i = 0; i < list.size(); i++) {
-                                sb.append(info.getOptions().get(i).getTxt()).append("、");
-                                arrayList.add(info.getOptions().get(i));
+                                sb.append(info.getOptions().get(list.get(i)).getTxt()).append("、");
+                                arrayList.add(info.getOptions().get(list.get(i)));
                             }
                             hashMap.put(info.getCode(), new Gson().toJson(arrayList));
                             enumItemView.setTvRight(sb.toString());
@@ -239,7 +239,7 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
                             }.getType());
                             StringBuilder sb = new StringBuilder();
                             for (int i = 0; i < value.size(); i++) {
-                                sb.append(info.getOptions().get(i).getTxt()).append("、");
+                                sb.append(value.get(i).getTxt()).append("、");
                             }
                             enumItemView2.setTvRight(sb.toString());
                         }
@@ -255,8 +255,8 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
                                 ArrayList<Options> arrayList = new ArrayList<>();
                                 StringBuilder sb = new StringBuilder();
                                 for (int i = 0; i < list.size(); i++) {
-                                    sb.append(info.getOptions().get(i).getTxt()).append("、");
-                                    arrayList.add(info.getOptions().get(i));
+                                    sb.append(info.getOptions().get(list.get(i)).getTxt()).append("、");
+                                    arrayList.add(info.getOptions().get(list.get(i)));
                                 }
                                 hashMap.put(info.getCode(), new Gson().toJson(arrayList));
                                 enumItemView2.setTvRight(sb.toString());

+ 12 - 0
demo/src/main/java/com/sybotan/android/demo/bean/ApkVersionBean.java

@@ -0,0 +1,12 @@
+package com.sybotan.android.demo.bean;
+
+/**
+ * 2020/7/17.
+ */
+public class ApkVersionBean {
+    public String appId = "e467fe4f-8ff5-4526-aef1-f852f4aa14fa";
+    public String appTypeId = "android";
+
+    public ApkVersionBean() {
+    }
+}

+ 59 - 0
demo/src/main/java/com/sybotan/android/demo/bean/AutoUpDateBean.java

@@ -0,0 +1,59 @@
+package com.sybotan.android.demo.bean;
+
+import java.util.List;
+
+public class AutoUpDateBean {
+    private String version;
+
+    private String result;
+
+    private String reason;
+
+    private List<Content> content ;
+
+    public void setVersion(String version){
+        this.version = version;
+    }
+    public String getVersion(){
+        return this.version;
+    }
+    public void setResult(String result){
+        this.result = result;
+    }
+    public String getResult(){
+        return this.result;
+    }
+    public void setReason(String reason){
+        this.reason = reason;
+    }
+    public String getReason(){
+        return this.reason;
+    }
+    public void setContent(List<Content> content){
+        this.content = content;
+    }
+    public List<Content> getContent(){
+        return this.content;
+    }
+
+
+    public class Content {
+        private String downloadUrl;
+
+        private String build;
+
+        public void setDownloadUrl(String downloadUrl){
+            this.downloadUrl = downloadUrl;
+        }
+        public String getDownloadUrl(){
+            return this.downloadUrl;
+        }
+        public void setBuild(String build){
+            this.build = build;
+        }
+        public String getBuild(){
+            return this.build;
+        }
+
+    }
+}

+ 4 - 0
demo/src/main/java/com/sybotan/android/demo/bean/BaseModel.java

@@ -12,6 +12,7 @@ public class BaseModel<T> implements Serializable {
     public String code;
     private T rtn;
     private T datas;
+    private T content;
 
     public boolean isSuccess() {
 //        if (!TextUtils.isEmpty(result)) {
@@ -29,6 +30,9 @@ public class BaseModel<T> implements Serializable {
         if (datas != null) {
             return datas;
         }
+        if (content != null) {
+            return content;
+        }
         return null;
     }
 

+ 14 - 0
demo/src/main/java/com/sybotan/android/demo/bean/PipeConfigEntityPackClass.java

@@ -0,0 +1,14 @@
+package com.sybotan.android.demo.bean;
+
+import com.framework.mvvm.model.db.entity.PipeConfigEntity;
+import com.framework.mvvm.model.db.entity.RelConfigEntity;
+
+/**
+ * Created by lihao.
+ * Date: 2021/10/18
+ */
+public class PipeConfigEntityPackClass {
+    public PipeConfigEntity entity;
+    public String fromName;
+    public String toName;
+}

+ 13 - 0
demo/src/main/java/com/sybotan/android/demo/bean/RelConfigEntityPackClass.java

@@ -0,0 +1,13 @@
+package com.sybotan.android.demo.bean;
+
+import com.framework.mvvm.model.db.entity.RelConfigEntity;
+
+/**
+ * Created by lihao.
+ * Date: 2021/10/18
+ */
+public class RelConfigEntityPackClass {
+    public RelConfigEntity entity;
+    public String fromName;
+    public String toName;
+}

+ 11 - 0
demo/src/main/java/com/sybotan/android/demo/retrofit/API.java

@@ -1,6 +1,7 @@
 package com.sybotan.android.demo.retrofit;
 
 
+import com.sybotan.android.demo.bean.AutoUpDateBean;
 import com.sybotan.android.demo.bean.BaseModel;
 import com.sybotan.android.demo.bean.result.*;
 import com.sybotan.android.demo.entitiies.*;
@@ -9,6 +10,10 @@ import java.util.ArrayList;
 import java.util.List;
 
 import com.sybotan.android.demo.bean.result.ProblemsModel;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
 import io.reactivex.Observable;
 import okhttp3.RequestBody;
 import retrofit2.http.Body;
@@ -193,4 +198,10 @@ public interface API {
     Observable<BaseModel<ResEqRel>> addEqToEqRel(@Body RequestBody body);
 
 
+    /**
+     * 自动更新 app
+     */
+    @POST("https://edition.persagy.com/api/app/saas-version-app/Spring/MVC/entrance/unifier/VersionLastService")
+    Observable<BaseModel<ArrayList<AutoUpDateBean.Content>>> autoUpdateApp(@Body RequestBody body);
+
 }

+ 198 - 0
demo/src/main/java/com/sybotan/android/demo/tools/DownLoadApk.java

@@ -0,0 +1,198 @@
+package com.sybotan.android.demo.tools;
+
+import android.app.ProgressDialog;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.Message;
+
+import androidx.core.content.FileProvider;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+public class DownLoadApk implements Runnable {
+    private ProgressDialog dialog;
+    InputStream is;
+    FileOutputStream fos;
+    String url;
+    String build;
+    Context context;
+    //  判断是否停止
+    private boolean mIsCancel = false;
+    //  进度
+    private int mProgress;
+    //  文件保存路径
+    private String mSavePath;
+
+    public DownLoadApk(ProgressDialog dialog, String url, Context context, String build) {
+        this.dialog = dialog;
+        this.url = url;
+        this.context = context;
+        this.build = build;
+    }
+
+    @Override
+    public void run() {
+//        OkHttpClient client = new OkHttpClient();
+//        LogUtils.e("url=====" + url);
+//        Request request = new Request.Builder().get().url(url).build();
+//        try {
+//            Response response = client.newCall(request).execute();
+//            if (response.isSuccessful()) {
+//                //获取内容总长度
+//                long contentLength = response.body().contentLength();
+//                //设置最大值
+//                LogUtils.e("url=====" + contentLength);
+//                dialog.setMax((int) contentLength);
+//                //保存到sd卡
+//                File apkFile = new File(Environment.getExternalStorageDirectory() +"mnt/sdcard", "meos.apk");
+//                fos = new FileOutputStream(apkFile);
+//                //获得输入流
+//                is = response.body().byteStream();
+//                //定义缓冲区大小
+//                byte[] bys = new byte[1024];
+//                int progress = 0;
+//                int len = -1;
+//                while ((len = is.read(bys)) != -1) {
+//                    try {
+//                        Thread.sleep(1);
+//                        fos.write(bys, 0, len);
+//                        fos.flush();
+//                        progress += len;
+//                        //设置进度
+//                        dialog.setProgress(progress);
+//                        LogUtils.e("url=====" + progress);
+//                    } catch (InterruptedException e) {
+//                        LogUtils.e("url=====" + "InterruptedException");
+//                    }
+//                }
+//                //下载完成,提示用户安装
+//                installApk(apkFile);
+//            }
+//        } catch (IOException e) {
+//
+//        } finally {
+//            //关闭io流
+//            if (is != null) {
+//                try {
+//                    is.close();
+//                } catch (IOException e) {
+//                    e.printStackTrace();
+//                }
+//                is = null;
+//            }
+//            if (fos != null) {
+//                try {
+//                    fos.close();
+//                } catch (IOException e) {
+//                    e.printStackTrace();
+//                }
+//                fos = null;
+//            }
+//        }
+//        dialog.dismiss();
+
+
+        try {
+            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
+                String sdPath = Environment.getExternalStorageDirectory() + "/";
+//                      文件保存路径
+                mSavePath = sdPath + "meos";
+
+                File dir = new File(mSavePath);
+                if (!dir.exists()) {
+                    dir.mkdir();
+                }
+                // 下载文件
+                HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
+                conn.connect();
+                InputStream is = conn.getInputStream();
+                int length = conn.getContentLength();
+
+                File apkFile = new File(mSavePath, build);
+                FileOutputStream fos = new FileOutputStream(apkFile);
+
+                int count = 0;
+                byte[] buffer = new byte[1024];
+                while (!mIsCancel) {
+                    int numread = is.read(buffer);
+                    count += numread;
+                    // 计算进度条的当前位置
+                    mProgress = (int) (((float) count / length) * 100);
+                    // 更新进度条
+                    mUpdateProgressHandler.sendEmptyMessage(1);
+
+                    // 下载完成
+                    if (numread < 0) {
+                        mUpdateProgressHandler.sendEmptyMessage(2);
+                        break;
+                    }
+                    fos.write(buffer, 0, numread);
+                }
+                fos.close();
+                is.close();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 接收消息
+     */
+    private Handler mUpdateProgressHandler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case 1:
+                    // 设置进度条
+                    dialog.setProgress(mProgress);
+                    break;
+                case 2:
+                    // 隐藏当前下载对话框
+                    dialog.dismiss();
+                    // 安装 APK 文件
+                    installAPK();
+            }
+        }
+
+        ;
+    };
+
+    protected void installAPK() {
+        File apkFile = new File(mSavePath, build);
+        if (!apkFile.exists()) {
+            return;
+        }
+//        Intent intent = new Intent(Intent.ACTION_VIEW);
+////      安装完成后,启动app(源码中少了这句话)
+//        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+//        Uri uri = Uri.parse("file://" + apkFile.toString());
+//        intent.setDataAndType(uri, "application/vnd.android.package-archive");
+//        intent.setAction("android.intent.action.VIEW");
+//        intent.addCategory("android.intent.category.DEFAULT");
+//        context.startActivity(intent);
+
+
+        Intent intent = new Intent(Intent.ACTION_VIEW);
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            //区别于 FLAG_GRANT_READ_URI_PERMISSION 跟 FLAG_GRANT_WRITE_URI_PERMISSION, URI权限会持久存在即使重启,直到明确的用 revokeUriPermission(Uri, int) 撤销。 这个flag只提供可能持久授权。但是接收的应用必须调用ContentResolver的takePersistableUriPermission(Uri, int)方法实现
+            Uri apkUri = FileProvider.getUriForFile(context, "com.sybotan.android.demo.fileProvider", apkFile); //与manifest中定义的provider中的authorities="com.xxxx.fileprovider"保持一致
+            intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
+        } else {
+            intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
+        }
+        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
+        intent.addCategory("android.intent.category.DEFAULT");
+        intent.setAction("android.intent.action.VIEW");
+        context.startActivity(intent);
+    }
+}

+ 136 - 0
demo/src/main/java/com/sybotan/android/demo/tools/LogUtil.java

@@ -0,0 +1,136 @@
+package com.sybotan.android.demo.tools;
+
+import android.text.TextUtils;
+import android.util.Log;
+
+
+public class LogUtil {
+    public static boolean isPrint = false;
+
+    /**
+     * level 决定日志的显示级别,
+     * VERBOSE显示所有级别日志
+     * 显示中间个个级别的日志
+     * NOTHING不是显示任何日志
+     */
+
+    private static final int VERBOSE = 1;
+
+    private static final int DEBUG = 2;
+
+    private static final int INFO = 3;
+
+    private static final int WARN = 4;
+
+    private static final int ERROR = 5;
+
+    private static final int NOTHING = 6;
+
+    /**
+     * 控制打印级别
+     * 是否打印日志
+     */
+    private static final int LEVEL = VERBOSE;//显示所有级别日志
+//    private static final int LEVEL = NOTHING;//屏蔽所有日志
+
+    //本项目默认tag
+    private static final String defaultTag = "meos";//默认过滤器
+
+
+    public static void v(String msg) {
+        v(null, msg);
+    }
+
+    public static void v(String tag, String meg) {
+        if (TextUtils.isEmpty(tag)) {
+            tag = defaultTag;
+        }
+        if (LEVEL <= VERBOSE) {
+            Log.v(tag, meg);
+        }
+    }
+
+    public static void d(String msg) {
+        d(null, msg);
+    }
+
+    public static void d(String tag, String msg) {
+        if (TextUtils.isEmpty(tag)) {
+            tag = defaultTag;
+        }
+        if (LEVEL <= DEBUG) {
+            Log.d(tag, msg);
+        }
+    }
+
+    public static void i(String msg) {
+        i(defaultTag, msg);
+    }
+
+    public static void i(String tag, String msg) {
+        if (TextUtils.isEmpty(tag)) {
+            tag = defaultTag;
+        }
+        if (LEVEL <= INFO) {
+            Log.i(tag, msg);
+
+        }
+    }
+
+    public static void w(String msg) {
+        w(null, msg);
+    }
+
+    public static void w(String tag, String msg) {
+        if (TextUtils.isEmpty(tag)) {
+            tag = defaultTag;
+        }
+        if (LEVEL <= WARN) {
+            Log.w(tag, msg);
+        }
+    }
+
+    public static void e(String msg) {
+        e(null, msg);
+    }
+
+    /**
+     * 截断输出日志
+     * 解决Log打印不全的问题
+     *
+     * @param msg
+     */
+    public static void e(String tag, String msg) {
+        if (TextUtils.isEmpty(tag)) {
+            tag = defaultTag;
+        }
+        if (LEVEL <= ERROR) {
+            if (tag == null || tag.length() == 0
+                    || msg == null || msg.length() == 0)
+                return;
+
+            int segmentSize = 3 * 1024;
+            long length = msg.length();
+            if (length <= segmentSize) {// 长度小于等于限制直接打印
+                Log.e(tag, msg);
+            } else {
+                while (msg.length() > segmentSize) {// 循环分段打印日志
+                    String logContent = msg.substring(0, segmentSize);
+                    msg = msg.replace(logContent, "");
+                    Log.e(tag, logContent);
+                }
+                Log.e(tag, msg);// 打印剩余日志
+            }
+        }
+    }
+
+
+    public static void ePrint(String msg) {
+        if (isPrint) {
+            int maxLength = 3000;
+            if (msg.length() > maxLength) {
+                SDCardHelper.saveFileToSDCardCustomDir(msg.getBytes(), "aLog", msg.substring(0, 30) + ".txt");
+            }
+        }
+    }
+}

+ 3 - 3
demo/src/main/java/com/sybotan/android/demo/tools/UploadImage.java

@@ -232,11 +232,11 @@ public class UploadImage {
             // 配置信息
             RequestConfig requestConfig = RequestConfig.custom()
                     // 设置连接超时时间(单位毫秒)
-                    .setConnectTimeout(5000)
+                    .setConnectTimeout(50000)
                     // 设置请求超时时间(单位毫秒)
-                    .setConnectionRequestTimeout(5000)
+                    .setConnectionRequestTimeout(50000)
                     // socket读写超时时间(单位毫秒)
-                    .setSocketTimeout(5000)
+                    .setSocketTimeout(50000)
                     // 设置是否允许重定向(默认为true)
                     .setRedirectsEnabled(true).build();
             httpPost.setConfig(requestConfig);

+ 74 - 6
demo/src/main/java/com/sybotan/android/demo/viewmodel/GraphyVM.kt

@@ -36,6 +36,8 @@ import java.util.*
 import kotlin.collections.ArrayList
 import kotlin.collections.HashMap
 import com.alibaba.fastjson.JSON
+import com.sybotan.android.demo.bean.*
+import io.reactivex.Observable
 
 
 /**
@@ -825,11 +827,10 @@ class GraphyVM(
         viewModelScope.launch {
             val equipId = if (TextUtils.isEmpty(deviceId)) uuid else deviceId
             //获取关系二级列表
-            val configParent = ArrayList<RelConfigEntity>()
+            val configParent = ArrayList<RelConfigEntityPackClass>()
             val relList = mutableListOf<List<RelationEntity>>()
             val fromList = repo.getRelConfigByCodeFrom(entity.code!!)
             val toList = repo.getRelConfigByCodeTo(entity.code!!)
-            configParent.addAll(fromList)
             for (config in fromList) {
                 val relsFrom = repo.getRelByCodeFrom(config.graphCode!!, config.relCode!!, equipId)
                 if (!CommonUtils.IsNull(relsFrom)) {
@@ -859,8 +860,27 @@ class GraphyVM(
                 } else {
                     relList.add(ArrayList<RelationEntity>())
                 }
+                val pack = RelConfigEntityPackClass()
+                pack.entity = config
+                if (config.objTypeFrom.equals("equipment")) {
+                    val equipmentFrom = repo.getEquipByCode(config.classCodeFrom!!)
+                    pack.fromName = equipmentFrom.name
+                } else {
+                    val equipmentFrom = repo.getSysByCode(config.classCodeFrom!!)
+                    pack.fromName = equipmentFrom.name
+
+                }
+                if (config.objTypeTo.equals("equipment")) {
+                    val equipmentTo = repo.getEquipByCode(config.classCodeTo!!)
+                    pack.toName = equipmentTo.name
+                } else {
+                    val equipmentTo = repo.getSysByCode(config.classCodeTo!!)
+                    pack.toName = equipmentTo.name
+                }
+                configParent.add(pack)
             }
-            configParent.addAll(toList)
+
+
             for (config in toList) {
                 val relsTo = repo.getRelByCodeTo(config.graphCode!!, config.relCode!!, equipId)
                 if (!CommonUtils.IsNull(relsTo)) {
@@ -890,6 +910,25 @@ class GraphyVM(
                 } else {
                     relList.add(ArrayList<RelationEntity>())
                 }
+                val pack = RelConfigEntityPackClass()
+                pack.entity = config
+                if (config.objTypeFrom.equals("equipment")) {
+                    val equipmentFrom = repo.getEquipByCode(config.classCodeFrom!!)
+                    pack.fromName = equipmentFrom.name
+                } else {
+                    val equipmentFrom = repo.getSysByCode(config.classCodeFrom!!)
+                    pack.fromName = equipmentFrom.name
+
+                }
+                if (config.objTypeTo.equals("equipment")) {
+                    val equipmentTo = repo.getEquipByCode(config.classCodeTo!!)
+                    pack.toName = equipmentTo.name
+                } else {
+                    val equipmentTo = repo.getSysByCode(config.classCodeTo!!)
+                    pack.toName = equipmentTo.name
+                }
+                configParent.add(pack)
+
             }
             val hashMap = HashMap<String, Any>()
             hashMap.put("parent", configParent)
@@ -897,12 +936,12 @@ class GraphyVM(
             mEmitter.SendDircetive(EQUIP_REL, hashMap)
 
             //获取管道二级列表
-            val pipeParent = ArrayList<PipeConfigEntity>()
+            val pipeParent = ArrayList<PipeConfigEntityPackClass>()
             val pipeChildren = mutableListOf<List<PipeEntity>>()
             val pipeFromList = repo.getPipeConfigByCodeFrom(entity.code!!)
             val pipeToList = repo.getPipeConfigByCodeTo(entity.code!!)
 
-            pipeParent.addAll(pipeFromList)
+
             for (config in pipeFromList) {
                 val pipeFrom =
                     repo.getPipeByIdFrom(equipId, config.pipeType!!, config.pipeSubType!!)
@@ -933,9 +972,16 @@ class GraphyVM(
                 } else {
                     pipeChildren.add(ArrayList<PipeEntity>())
                 }
+                val pack = PipeConfigEntityPackClass()
+                pack.entity = config
+                val equipmentFrom = repo.getEquipByCode(config.classCodeFrom!!)
+                pack.fromName = equipmentFrom.name
+                val equipmentTo = repo.getEquipByCode(config.classCodeTo!!)
+                pack.toName = equipmentTo.name
+                pipeParent.add(pack)
             }
 
-            pipeParent.addAll(pipeToList)
+
             for (config in pipeToList) {
                 val pipeFrom = repo.getPipeByIdTo(equipId, config.pipeType!!, config.pipeSubType!!)
                 if (!CommonUtils.IsNull(pipeFrom)) {
@@ -965,6 +1011,13 @@ class GraphyVM(
                 } else {
                     pipeChildren.add(ArrayList<PipeEntity>())
                 }
+                val pack = PipeConfigEntityPackClass()
+                pack.entity = config
+                val equipmentFrom = repo.getEquipByCode(config.classCodeFrom!!)
+                pack.fromName = equipmentFrom.name
+                val equipmentTo = repo.getEquipByCode(config.classCodeTo!!)
+                pack.toName = equipmentTo.name
+                pipeParent.add(pack)
             }
             val hashMap1 = HashMap<String, Any>()
             hashMap1.put("parent", pipeParent)
@@ -1158,7 +1211,22 @@ class GraphyVM(
         }
     }
 
+    fun queryAutoUpdate() {
+        val bean = ApkVersionBean()
+        val observable = RetrofitFactory.getInstance().autoUpdateApp(getRequestBody(bean))
+        sendRequest(
+            observable,
+            object : BaseObserver<java.util.ArrayList<AutoUpDateBean.Content>>(mActivity, this) {
+                override fun onSuccess(models: ArrayList<AutoUpDateBean.Content>) {
+                    mEmitter.SendDircetive(UPDATE_APP, models.get(0))
+                }
+            },
+            true
+        )
+    }
+
     companion object {
+        const val UPDATE_APP = "UPDATE_APP"
         const val MAP_LOAD = "MAP_LOAD"
         const val EQUIP_CLASS = "EQUIP_CLASS"