Jelajahi Sumber

add poc2.0修复bug

lihao1 3 tahun lalu
induk
melakukan
8b7be8d765
25 mengubah file dengan 561 tambahan dan 98 penghapusan
  1. 2 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/FloorScene.kt
  2. 3 0
      demo/src/main/java/com/framework/mvvm/model/db/dao/ObjectDao.kt
  3. 6 0
      demo/src/main/java/com/framework/mvvm/model/db/dao/ProblemArchDao.kt
  4. 1 1
      demo/src/main/java/com/framework/mvvm/model/db/dao/QrCodeDao.kt
  5. 17 1
      demo/src/main/java/com/framework/mvvm/model/repository/AdmRepository.kt
  6. 15 0
      demo/src/main/java/com/sybotan/android/demo/activities/BaseActivity.java
  7. 19 6
      demo/src/main/java/com/sybotan/android/demo/activities/EquipDetailActivity.kt
  8. 202 44
      demo/src/main/java/com/sybotan/android/demo/activities/GraphyActivity.kt
  9. 3 0
      demo/src/main/java/com/sybotan/android/demo/activities/SpaceDetailActivity.kt
  10. 2 2
      demo/src/main/java/com/sybotan/android/demo/adapter/PersonalSelectSingleAdapter.java
  11. 10 0
      demo/src/main/java/com/sybotan/android/demo/adapter/PictureAdapter.java
  12. 5 1
      demo/src/main/java/com/sybotan/android/demo/adapter/RelationExpandAdapter.kt
  13. 49 9
      demo/src/main/java/com/sybotan/android/demo/adapter/StaticInfoAdapter.java
  14. 15 0
      demo/src/main/java/com/sybotan/android/demo/bean/ReLoactionEventBus.java
  15. 4 1
      demo/src/main/java/com/sybotan/android/demo/bean/RelConfigEntityPackClass.java
  16. 1 1
      demo/src/main/java/com/sybotan/android/demo/tools/WordWrapView.java
  17. 5 0
      demo/src/main/java/com/sybotan/android/demo/view/ObjectRelationDialog.java
  18. 2 1
      demo/src/main/java/com/sybotan/android/demo/view/SelectListPopupWindow.java
  19. 47 7
      demo/src/main/java/com/sybotan/android/demo/view/SelectListSinglePopupWindow.java
  20. 101 17
      demo/src/main/java/com/sybotan/android/demo/viewmodel/GraphyVM.kt
  21. 2 6
      demo/src/main/res/layout/activity_graphy.xml
  22. 2 0
      demo/src/main/res/layout/common_number_control.xml
  23. 44 1
      demo/src/main/res/layout/dialog_list_choice.xml
  24. 2 0
      demo/src/main/res/layout/layout_common_list_item1.xml
  25. 2 0
      demo/src/main/res/layout/view_mtext.xml

+ 2 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/FloorScene.kt

@@ -294,6 +294,7 @@ open class FloorScene : SGraphyScene() {
     open fun addColumn(column: Column) {
         val item = ColumnItem(column)
         item.isVisible = isShowColumn
+        item.zOrder = 100000f
         columnList.add(item)
         addItem(item)
     } // Function addColumn()
@@ -376,6 +377,7 @@ open class FloorScene : SGraphyScene() {
     open fun addWindow(window: Window) {
         val item = WindowItem(window)
         item.isVisible = isShowSpace
+        item.zOrder = 100001f
         windowList.add(item)
         addItem(item)
     } // Function addWindow()

+ 3 - 0
demo/src/main/java/com/framework/mvvm/model/db/dao/ObjectDao.kt

@@ -29,6 +29,9 @@ interface ObjectDao {
     @Query("select * from object where class_code = :code and valid = 1")
     suspend fun getObjectByCode(code: String): List<ObjectEntity>
 
+    @Query("select * from object where local_id = UPPEr(:localId) and valid = 1")
+    suspend fun getObjectByLocalId(localId: String): ObjectEntity?
+
     @Insert(onConflict = OnConflictStrategy.REPLACE)
     suspend fun insObject(vararg obj: ObjectEntity)
 

+ 6 - 0
demo/src/main/java/com/framework/mvvm/model/db/dao/ProblemArchDao.kt

@@ -14,6 +14,12 @@ interface ProblemArchDao {
     @Query("select * from problem_arch where id = :id")
     suspend fun getProblemById(id: String): ProblemArchEntity
 
+    @Query("select * from problem_arch where floor_id = :floorId")
+    suspend fun getProblemByFloor(floorId: String): List<ProblemArchEntity>
+
+    @Query("select * from problem_arch where floor_id = :floorId and valid = 1 and problem_state = 1")
+    suspend fun getProblemByAvalible(floorId: String): List<ProblemArchEntity>
+
     @Query("select * from problem_arch where building_id = :id")
     suspend fun getProblemByBuildingId(id: String): List<ProblemArchEntity>
 

+ 1 - 1
demo/src/main/java/com/framework/mvvm/model/db/dao/QrCodeDao.kt

@@ -15,7 +15,7 @@ interface QrCodeDao {
     suspend fun getQrCodeById(id: String): QrCodeEntity
 
     @Query("select * from qr_code where obj_id = :id")
-    suspend fun getQrCodeByObjId(id: String): List<QrCodeEntity>
+    suspend fun getQrCodeByObjId(id: String): List<QrCodeEntity>?
 
     @Query("select * from qr_code where building_id = :id")
     suspend fun getQrCodeByBuildingId(id: String): List<QrCodeEntity>

+ 17 - 1
demo/src/main/java/com/framework/mvvm/model/repository/AdmRepository.kt

@@ -56,6 +56,14 @@ class AdmRepository(
         return db.problemArchDao().getProblems()
     }
 
+    suspend fun getProblemByAvalible(floorId: String): List<ProblemArchEntity> {
+        return db.problemArchDao().getProblemByAvalible(floorId)
+    }
+
+    suspend fun getProblemByFloor(floorId: String): List<ProblemArchEntity> {
+        return db.problemArchDao().getProblemByAvalible(floorId)
+    }
+
     suspend fun getProblemById(id: String): ProblemArchEntity {
         return db.problemArchDao().getProblemById(id)
     }
@@ -72,7 +80,7 @@ class AdmRepository(
         return db.qrCodeDao().insQrCode(qrcode)
     }
 
-    suspend fun getQrcode(objId: String): List<QrCodeEntity> {
+    suspend fun getQrcode(objId: String): List<QrCodeEntity>? {
         return db.qrCodeDao().getQrCodeByObjId(objId)
     }
 
@@ -100,6 +108,10 @@ class AdmRepository(
         return db.objectDao().getObjectByObjType(objType)
     }
 
+    suspend fun getObjects(): List<ObjectEntity> {
+        return db.objectDao().getObjects()
+    }
+
     suspend fun getFloorByBuildingId(buildingId: String, type: String): List<ObjectEntity> {
         return db.objectDao().getObjectByBuildingId(buildingId, type)
     }
@@ -200,6 +212,10 @@ class AdmRepository(
         return db.objectDao().getObjectByCode(code)
     }
 
+    suspend fun getObjectByLocalId(localId: String): ObjectEntity? {
+        return db.objectDao().getObjectByLocalId(localId)
+    }
+
     suspend fun getInfosConfigByEquipCode(code: String): List<InfosConfigEntity> {
         return db.infosConfigDao().getConfigByEquipCode("equipment", code)
     }

+ 15 - 0
demo/src/main/java/com/sybotan/android/demo/activities/BaseActivity.java

@@ -2,6 +2,7 @@ package com.sybotan.android.demo.activities;
 
 import android.os.Bundle;
 import android.util.Log;
+import android.view.inputmethod.InputMethodManager;
 
 import com.sybotan.android.demo.DemoApp;
 import com.sybotan.android.demo.tools.LocalDataOperation;
@@ -44,4 +45,18 @@ public class BaseActivity extends RxAppCompatActivity {
         return netMobile == 1 || netMobile == 0;
     }
 
+    public boolean dismissSoftKeyboard() {
+        try {
+            InputMethodManager inputMethodManage = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
+            if (this.getCurrentFocus() == null) {
+                return inputMethodManage.hideSoftInputFromWindow(this.getWindow().getDecorView().getWindowToken(), 0);
+            } else {
+                return inputMethodManage.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+
 }

+ 19 - 6
demo/src/main/java/com/sybotan/android/demo/activities/EquipDetailActivity.kt

@@ -9,6 +9,7 @@ import android.util.Log
 import android.view.Gravity
 import android.view.MotionEvent
 import android.view.View
+import android.view.ViewGroup
 import android.widget.*
 import androidx.appcompat.widget.SwitchCompat
 import androidx.core.widget.NestedScrollView
@@ -26,6 +27,7 @@ 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.ReLoactionEventBus
 import com.sybotan.android.demo.bean.RelConfigEntityPackClass
 import com.sybotan.android.demo.bean.RelationPackClass
 import com.sybotan.android.demo.bean.result.Position
@@ -39,6 +41,8 @@ import com.yuyh.library.imgsel.ImageLoader
 import com.yuyh.library.imgsel.ImgSelConfig
 import com.yuyh.library.imgsel.utils.LogUtils
 import io.reactivex.ObservableEmitter
+import org.greenrobot.eventbus.EventBus
+import org.jetbrains.anko.scrollView
 import org.json.JSONException
 import org.json.JSONObject
 import java.io.File
@@ -50,6 +54,7 @@ import kotlin.collections.ArrayList
  * Date: 2021/9/27
  */
 class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
+    private lateinit var equip: ObjectEntity
     private var equipEntity: EquipmentEntity? = null
 
     //选择图片
@@ -179,6 +184,13 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
             )
         }
         findViewById<ImageView>(R.id.back).setOnClickListener { finish() }
+        root.setOnScrollChangeListener { v, scrollX, scrollY, oldScrollX, oldScrollY -> dismissSoftKeyboard() }
+        if (!TextUtils.isEmpty(deviceId)) {
+            location.setOnClickListener {
+                EventBus.getDefault().postSticky(ReLoactionEventBus(equip))
+                finish()
+            }
+        }
     }
 
     //重写onTouch方法
@@ -228,11 +240,11 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
                     dialog.setList(equips);
                 }
                 GraphyVM.EQUIP_INFO -> {
+                    list.clear()
                     if (params != null) {
-                        list.clear()
                         list.addAll(params as ArrayList<Infos>)
-                        staticInfoAdapter.notifyDataSetChanged()
                     }
+                    staticInfoAdapter.notifyDataSetChanged()
                 }
 
                 GraphyVM.SPACE_INFOS -> {
@@ -274,6 +286,7 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
                 }
                 GraphyVM.Equip_INFOS -> {
                     var equip = params as ObjectEntity
+                    this.equip = equip
                     localId.setEtRight(equip.localId)
                     deviceId = equip.id
                     val strInfo = Gson().fromJson(equip.strInfos, StrInfosforEquip::class.java)
@@ -328,11 +341,11 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
                     pop.showAtLocation(root, Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL, 0, 0)
                     pop.setOnItemClickListener {
                         if (!CommonUtils.IsNull(list)) {
-                            val equip = equipObjects.get(it)
+                            val equip = it
                             val localIdString = (localId.getView(R.id.et_right)) as EditText
                             val dialog = ObjectRelationDialog(
                                 this@EquipDetailActivity,
-                                localIdString.text.toString(),
+                                "该设备",
                                 equip,
                                 groupRelConfigEntity
                             )
@@ -380,11 +393,11 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
                     pop.showAtLocation(root, Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL, 0, 0)
                     pop.setOnItemClickListener {
                         if (!CommonUtils.IsNull(list)) {
-                            val equip = equipObjects.get(it)
+                            val equip = it
                             val localIdString = (localId.getView(R.id.et_right)) as EditText
                             val dialog = PipeDialog(
                                 this@EquipDetailActivity,
-                                localIdString.text.toString(),
+                                "该设备",
                                 equip,
                                 groupPipeConfigEntity
                             )

+ 202 - 44
demo/src/main/java/com/sybotan/android/demo/activities/GraphyActivity.kt

@@ -58,6 +58,7 @@ import com.arashivision.sdkcamera.camera.InstaCameraManager
 import com.arashivision.sdkcamera.camera.callback.ICameraChangedCallback
 import com.arashivision.sdkcamera.camera.callback.ICaptureStatusListener
 import com.bumptech.glide.Glide
+import com.framework.mvvm.model.db.entity.StrInfosforEquip
 import com.framework.mvvm.mv.AdmViewModel
 import com.google.gson.Gson
 import com.lzy.okgo.OkGo
@@ -67,6 +68,7 @@ import com.sybotan.android.demo.R
 import com.sybotan.android.demo.activities.poc.RelationActivity
 import com.sybotan.android.demo.adapter.PictureAdapter
 import com.sybotan.android.demo.adapter.PipeAdapter
+import com.sybotan.android.demo.bean.ReLoactionEventBus
 import com.sybotan.android.demo.bean.result.*
 import com.sybotan.android.demo.graphy.GraphyHelper
 import com.sybotan.android.demo.retrofit.BaseViewModelInterface
@@ -506,6 +508,7 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
                 }
                 LocalDataOperation.DEAL_DATA_ERROR -> {
                     ToastUtils.showMyToast("图片上传失败")
+                    pictureAdapter.notifyDataSetChanged()
                 }
                 else -> {
                 }
@@ -1035,6 +1038,10 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
 
         /** 设置空间的任务状态完成 */
         modelSubmit.setOnClickListener {
+            if (scene.choseSpace!!.data.jobStatus.equals("02")) {
+                ToastUtils.showMyToast("空间内还有未解决的问题")
+                return@setOnClickListener
+            }
             graphyVM.setJob(scene.choseSpace, "03")
         }
 
@@ -1116,6 +1123,65 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
             equipLl.visibility = View.VISIBLE
             equipEdit.setText("")
             equipRg.clearCheck()
+            equipNext.setText("下一步")
+            /** 取消添加设备 */
+            equipCancel.setOnClickListener {
+                drawLl.visibility = View.VISIBLE
+                equipLl.visibility = View.GONE
+                scene.eqItem?.let { it1 -> scene.removeItem(it1) }
+                scene.type = "normal"
+            }
+
+            /** 添加设备下一步 */
+            equipNext.setOnClickListener {
+                if (TextUtils.isEmpty(equipLocation.text.toString())) {
+                    ToastUtils.showMyToast("请扎点")
+                    return@setOnClickListener
+                }
+                if (floor.isChecked) {
+                    equipEdit.setText("0")
+                }
+                if (!air.isChecked && !roof.isChecked && !floor.isChecked && !wall.isChecked) {
+                    ToastUtils.showMyToast("请选择设备位置")
+                    return@setOnClickListener
+                }
+                if ((air.isChecked || wall.isChecked) && TextUtils.isEmpty(equipEdit.text.toString())) {
+                    ToastUtils.showMyToast("请输入高度")
+                    return@setOnClickListener
+                }
+                val intent = Intent(this, EquipDetailActivity::class.java)
+                val bundle = Bundle()
+                val positon = Position()
+                positon.x = scene.point.mX.toString()
+                positon.y = scene.point.mY.toString()
+                val z = Z()
+                z.offset = equipEdit.text.toString()
+                if (roof.isChecked) {
+                    z.offset = "0"
+                }
+                when (equipRg.checkedRadioButtonId) {
+                    R.id.roof -> {
+                        z.region = "roof"
+                    }
+                    R.id.floor -> {
+                        z.region = "floor"
+                    }
+                    R.id.wall -> {
+                        z.region = "wall"
+                    }
+                    R.id.air -> {
+                        z.region = "air"
+                    }
+                }
+                positon.z = z
+                bundle.putString("spaceId", scene.choseSpace!!.data.id)
+                bundle.putSerializable("position", positon)
+                bundle.putString("buildingId", buildingId)
+                bundle.putString("floorId", floorId)
+                bundle.putString("projectId", projectId)
+                intent.putExtra("equip", bundle)
+                startActivityForResult(intent, REQUEST_CODE_EQUIP)
+            }
 
         }
 
@@ -1128,54 +1194,33 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
             piprRv.layoutManager = GridLayoutManager(this, 3, LinearLayoutManager.HORIZONTAL, false)
             graphyVM.pipeList()
         }
-
-        /** 取消添加设备 */
-        equipCancel.setOnClickListener {
-            drawLl.visibility = View.VISIBLE
-            equipLl.visibility = View.GONE
-            scene.eqItem?.let { it1 -> scene.removeItem(it1) }
-            scene.type = "normal"
+        roof.setOnCheckedChangeListener { buttonView, isChecked ->
+            if (isChecked) {
+                equipEdit.setText("")
+                equipEdit.isEnabled = false
+                equipEdit.alpha = 0.5f
+            }
         }
-
-        /** 添加设备下一步 */
-        equipNext.setOnClickListener {
-            if (TextUtils.isEmpty(equipLocation.text.toString())) {
-                ToastUtils.showMyToast("请扎点")
-                return@setOnClickListener
+        wall.setOnCheckedChangeListener { buttonView, isChecked ->
+            if (isChecked) {
+                equipEdit.setText("")
+                equipEdit.isEnabled = true
+                equipEdit.alpha = 1f
             }
-            if (TextUtils.isEmpty(equipEdit.text.toString())) {
-                ToastUtils.showMyToast("请输入高度")
-                return@setOnClickListener
+        }
+        air.setOnCheckedChangeListener { buttonView, isChecked ->
+            if (isChecked) {
+                equipEdit.setText("")
+                equipEdit.isEnabled = true
+                equipEdit.alpha = 1f
             }
-            val intent = Intent(this, EquipDetailActivity::class.java)
-            val bundle = Bundle()
-            val positon = Position()
-            positon.x = scene.point.mX.toString()
-            positon.y = scene.point.mY.toString()
-            val z = Z()
-            z.offset = equipEdit.text.toString()
-            when (equipRg.checkedRadioButtonId) {
-                R.id.roof -> {
-                    z.region = "roof"
-                }
-                R.id.floor -> {
-                    z.region = "floor"
-                }
-                R.id.wall -> {
-                    z.region = "wall"
-                }
-                R.id.air -> {
-                    z.region = "air"
-                }
+        }
+        floor.setOnCheckedChangeListener { buttonView, isChecked ->
+            if (isChecked) {
+                equipEdit.setText("0")
+                equipEdit.isEnabled = true
+                equipEdit.alpha = 1f
             }
-            positon.z = z
-            bundle.putString("spaceId", scene.choseSpace!!.data.id)
-            bundle.putSerializable("position", positon)
-            bundle.putString("buildingId", buildingId)
-            bundle.putString("floorId", floorId)
-            bundle.putString("projectId", projectId)
-            intent.putExtra("equip", bundle)
-            startActivityForResult(intent, REQUEST_CODE_EQUIP)
         }
 
         /** 服务 */
@@ -1501,6 +1546,22 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
                     }
                     refreshPipe(spacePipeModel)
                 }
+                /** 添加设备成功 */
+                GraphyVM.UPDATE_LOCATION -> {
+                    equipLocation.setText("")
+                    equipEdit.setText("")
+                    scene.eqItem?.let { it1 -> scene.removeItem(it1) }
+//                    roof.isChecked = false
+//                    floor.isChecked = false
+//                    wall.isChecked = false
+//                    air.isChecked = false
+                    scene.point = Point()
+                    scene.type = "normal"
+                    equipLl.visibility = View.GONE
+                    drawLl.visibility = View.VISIBLE
+                    graphyVM.getSpaceEq(scene.choseSpace)
+                    graphyVM.floorPipe()
+                }
             }
         }, this, buildingId, floorId, projectId)
         graphyVM.getMap()
@@ -1689,6 +1750,8 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
         problemLl.visibility = View.VISIBLE
         if (point != null) {
             problemDesc.setText(point.data.content)
+        } else {
+            problemDesc.setText("")
         }
         initProblemPicture(point)
 
@@ -1918,6 +1981,101 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
     override fun onDestroy() {
         super.onDestroy()
         InstaCameraManager.getInstance().unregisterCameraChangedCallback(this)
+        EventBus.getDefault().unregister(this)
+    }
+
+    @Subscribe
+    fun onEvent(bus: ReLoactionEventBus) {
+        for (eq in scene.equipList) {
+            if (eq.data.deviceId!!.equals(bus.equip.id)) {
+                scene.removeItem(eq)
+                break
+            }
+        }
+        val strInfo = gson.fromJson(bus.equip.strInfos, StrInfosforEquip::class.java)
+        scene.type = "equip"
+        equipLocation.setText("(${strInfo.location.x},${-strInfo.location.y})")
+        drawLl.visibility = View.GONE
+        equipLl.visibility = View.VISIBLE
+        equipRg.clearCheck()
+        if (strInfo.zRegion.equals("roof")) {
+            roof.isChecked = true
+        } else if (strInfo.zRegion.equals("floor")) {
+            floor.isChecked = true
+        } else if (strInfo.zRegion.equals("wall")) {
+            wall.isChecked = true
+        } else if (strInfo.zRegion.equals("air")) {
+            air.isChecked = true
+        }
+        equipEdit.setText(strInfo.location.z.toString())
+
+        scene.point.mX = strInfo.location.x
+        scene.point.mY = -strInfo.location.y
+        scene.point.equipState = 4
+        scene.eqItem = EquipItem(this@GraphyActivity, scene.point)
+        scene.eqItem!!.isVisible = true
+        scene.eqItem!!.zOrder = 10000012f
+        scene.addItem(scene.eqItem!!)
+        equipNext.setText("保存确定")
+        /** 添加设备下一步 */
+        equipNext.setOnClickListener {
+            if (TextUtils.isEmpty(equipLocation.text.toString())) {
+                ToastUtils.showMyToast("请扎点")
+                return@setOnClickListener
+            }
+            if (floor.isChecked) {
+                equipEdit.setText("0")
+            }
+            if (!air.isChecked && !roof.isChecked && !floor.isChecked && !wall.isChecked) {
+                ToastUtils.showMyToast("请选择设备位置")
+                return@setOnClickListener
+            }
+            if ((air.isChecked || wall.isChecked) && TextUtils.isEmpty(equipEdit.text.toString())) {
+                ToastUtils.showMyToast("请输入高度")
+                return@setOnClickListener
+            }
+            val position = Position()
+            position.x = scene.point.mX.toString()
+            position.y = scene.point.mY.toString()
+            val z = Z()
+            z.offset = equipEdit.text.toString()
+            if (roof.isChecked) {
+                z.offset = "0"
+            }
+            when (equipRg.checkedRadioButtonId) {
+                R.id.roof -> {
+                    z.region = "roof"
+                }
+                R.id.floor -> {
+                    z.region = "floor"
+                }
+                R.id.wall -> {
+                    z.region = "wall"
+                }
+                R.id.air -> {
+                    z.region = "air"
+                }
+            }
+            position.z = z
+            equipDetail.alpha = 0.5f
+            equipDelete.alpha = 0.5f
+            equipDetail.isEnabled = false
+            equipDelete.isEnabled = false
+            graphyVM.insEquip(bus.equip, position)
+        }
+        /** 取消添加设备 */
+        equipCancel.setOnClickListener {
+            drawLl.visibility = View.VISIBLE
+            equipLl.visibility = View.GONE
+            scene.eqItem?.let { it1 -> scene.removeItem(it1) }
+            scene.type = "normal"
+            equipDetail.alpha = 0.5f
+            equipDelete.alpha = 0.5f
+            equipDetail.isEnabled = false
+            equipDelete.isEnabled = false
+            graphyVM.getSpaceEq(scene.choseSpace)
+        }
+
     }
 
 

+ 3 - 0
demo/src/main/java/com/sybotan/android/demo/activities/SpaceDetailActivity.kt

@@ -209,6 +209,9 @@ class SpaceDetailActivity : BaseActivity() {
                 }
                 LocalDataOperation.DEAL_DATA_ERROR -> {
                     ToastUtils.showMyToast("图片上传失败")
+                    staticInfoAdapter.hashMap.put("Photos", Gson().toJson(beans))
+                    staticInfoAdapter.valueList.clear()
+                    staticInfoAdapter.notifyDataSetChanged()
                 }
                 else -> {
                 }

+ 2 - 2
demo/src/main/java/com/sybotan/android/demo/adapter/PersonalSelectSingleAdapter.java

@@ -25,7 +25,7 @@ import java.util.List;
  * Created by cunwen on 16/6/21.
  */
 public class PersonalSelectSingleAdapter extends RecyclerView.Adapter<PersonalSelectSingleAdapter.BuildViewHolder> {
-    private List<?> items = new ArrayList<>();
+    private List<ObjectEntity> items = new ArrayList<>();
     private Context context;
     private int selectPosition;
     private String type;
@@ -33,7 +33,7 @@ public class PersonalSelectSingleAdapter extends RecyclerView.Adapter<PersonalSe
     private int redPosition;
     private Boolean flag;
 
-    public void setItems(List<?> items, Context context, int position, String type) {
+    public void setItems(List<ObjectEntity> items, Context context, int position, String type) {
         this.items = items;
         this.context = context;
         this.selectPosition = position;

+ 10 - 0
demo/src/main/java/com/sybotan/android/demo/adapter/PictureAdapter.java

@@ -10,6 +10,8 @@ import android.view.ViewGroup;
 import android.widget.ImageView;
 
 
+import com.bumptech.glide.load.engine.DiskCacheStrategy;
+import com.bumptech.glide.request.RequestOptions;
 import com.sybotan.android.demo.R;
 import com.sybotan.android.demo.activities.LookBigPicActivity;
 
@@ -19,6 +21,7 @@ import com.sybotan.android.demo.retrofit.Constant;
 import com.sybotan.android.demo.tools.CommonUtils;
 import com.sybotan.android.demo.tools.DensityUtils;
 import com.sybotan.android.demo.tools.GlideApp;
+import com.sybotan.android.demo.tools.LogUtil;
 import com.tencent.smtt.sdk.ui.dialog.widget.RoundImageView;
 
 import java.io.ByteArrayOutputStream;
@@ -136,9 +139,16 @@ public class PictureAdapter extends BaseRecyclerViewAdapter<Photos> {
             mImageView.setImageResource(R.mipmap.image_error_icon);
             return;
         }
+        RequestOptions myoptions = new RequestOptions()
+                .placeholder(R.mipmap.image_loading_icon)
+                .error(R.mipmap.image_error_icon);
+
         GlideApp.with(mContext)
                 .load(path)
+//                .diskCacheStrategy(DiskCacheStrategy.ALL)
+                .apply(myoptions)
                 .into(mImageView);
+        LogUtil.e("path:" + path);
     }
 
     @Override

+ 5 - 1
demo/src/main/java/com/sybotan/android/demo/adapter/RelationExpandAdapter.kt

@@ -96,7 +96,11 @@ class RelationExpandAdapter(
         val item = mItems[groupPosition][childPosition]
         var sb = StringBuilder()
         sb.append(item.entity.objFromLocalId)
-        sb.append("  —>  ")
+        if (item.targetPipeType.direction.equals("none")) {
+            sb.append("  —-  ")
+        } else {
+            sb.append("  —>  ")
+        }
         sb.append(item.entity.objToLocalId)
         itemTv.text = sb.toString()
         holder.findViewById<ImageView>(R.id.delete).setOnClickListener {

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

@@ -3,12 +3,15 @@ package com.sybotan.android.demo.adapter;
 import android.annotation.SuppressLint;
 import android.content.Context;
 import android.graphics.Color;
+import android.graphics.Rect;
 import android.text.Editable;
 import android.text.TextUtils;
 import android.text.TextWatcher;
 import android.view.Gravity;
 import android.view.MotionEvent;
 import android.view.View;
+import android.view.ViewTreeObserver;
+import android.view.inputmethod.InputMethodManager;
 import android.widget.Button;
 import android.widget.EditText;
 
@@ -89,7 +92,11 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
         if (TextUtils.isEmpty(info.getInputType())) {
             if (!CommonUtils.IsNull(info.getOptions())) {
                 ListItemView enumItemView = holder.getView(R.id.view_enum);
-                enumItemView.setTvLeft(info.getLabel());
+                String unit = "";
+                if (!TextUtils.isEmpty(info.getUnit())) {
+                    unit = "(" + info.getUnit() + ")";
+                }
+                enumItemView.setTvLeft(info.getLabel() + unit);
                 enumItemView.setTvRight("请选择");
 
                 if (!valueList.contains(info.getCode())) {
@@ -124,28 +131,36 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
                     popupWindow.showAtLocation(enumItemView, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0);
                 });
             } else {
-                holder.setText(R.id.mtextTitle, info.getLabel());
+                String unit = "";
+                if (!TextUtils.isEmpty(info.getUnit())) {
+                    unit = "(" + info.getUnit() + ")";
+                }
+                holder.setText(R.id.mtextTitle, info.getLabel() + unit);
                 EditText mtextContent2 = holder.getView(R.id.mtextContent);
                 initEditTextTouch(mtextContent2, info);
             }
             return;
         }
+        String unit = "";
+        if (!TextUtils.isEmpty(info.getUnit())) {
+            unit = "(" + info.getUnit() + ")";
+        }
         switch (info.getInputType()) {
             case "text":
                 ListItemView textItemView = holder.getView(R.id.view_text);
-                textItemView.setTvLeft(info.getLabel());
+                textItemView.setTvLeft(info.getLabel() + unit);
                 EditText etRight = textItemView.findViewById(R.id.et_right);
                 initEditTextTouch(etRight, info);
                 break;
             case "textarea":
-                holder.setText(R.id.mtextTitle, info.getLabel());
+                holder.setText(R.id.mtextTitle, info.getLabel() + unit);
                 EditText mtextContent = holder.getView(R.id.mtextContent);
                 initEditTextTouch(mtextContent, info);
                 break;
             case "radio":
             case "picker":
                 ListItemView enumItemView = holder.getView(R.id.view_enum);
-                enumItemView.setTvLeft(info.getLabel());
+                enumItemView.setTvLeft(info.getLabel() + unit);
                 enumItemView.setTvRight("请选择");
 
                 if (!valueList.contains(info.getCode())) {
@@ -183,7 +198,7 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
             case "setpper":
 //                return INT;
                 ListItemView intItemView = holder.getView(R.id.view_int);
-                intItemView.setTvLeft(info.getLabel());
+                intItemView.setTvLeft(info.getLabel() + unit);
                 CommonNumberControl numberControl = (CommonNumberControl) intItemView.getView(R.id.et_right);
                 initEditTextTouch(numberControl.getEditText(), info);
                 break;
@@ -220,7 +235,7 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
             case "date":
 //                return DATE;
                 ListItemView listItemView = holder.getView(R.id.view_date);
-                listItemView.setTvLeft(info.getLabel());
+                listItemView.setTvLeft(info.getLabel() + unit);
                 listItemView.getView(R.id.tv_right).setOnClickListener(v -> {
                     pvTime.show(true);
                 });
@@ -230,7 +245,7 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
                 if (!CommonUtils.IsNull(info.getOptions())) {
 //                    return ENUM;
                     ListItemView enumItemView2 = holder.getView(R.id.view_enum);
-                    enumItemView2.setTvLeft(info.getLabel());
+                    enumItemView2.setTvLeft(info.getLabel() + unit);
                     enumItemView2.setTvRight("请选择");
 
                     if (!valueList.contains(info.getCode())) {
@@ -267,7 +282,7 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
                     });
                 } else {
 //                    return MTEXT;
-                    holder.setText(R.id.mtextTitle, info.getLabel());
+                    holder.setText(R.id.mtextTitle, info.getLabel() + unit);
                     EditText mtextContent2 = holder.getView(R.id.mtextContent);
                     initEditTextTouch(mtextContent2, info);
                 }
@@ -337,6 +352,31 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
         valueList.add(info.getCode());
         editText.addTextChangedListener(textWatcher);
         editText.setTag(textWatcher);
+
+        editText.getViewTreeObserver().addOnGlobalLayoutListener(
+                () -> {
+                    Rect r = new Rect();
+                    editText.getWindowVisibleDisplayFrame(r);
+                    int screenHeight = editText.getRootView()
+                            .getHeight();
+                    int heightDifference = screenHeight - (r.bottom);
+                    if (heightDifference > 200) {
+                        //软键盘显示
+                        editText.setFocusable(true);
+                    } else {
+                        //软键盘隐藏
+                        editText.clearFocus();
+
+                    }
+                });
+        editText.setOnClickListener(v -> {
+            editText.setFocusable(true);
+            editText.setFocusableInTouchMode(true);
+            editText.requestFocus();
+            editText.findFocus();
+            InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
+            imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);// 显示输入法
+        });
     }
 
     @Override

+ 15 - 0
demo/src/main/java/com/sybotan/android/demo/bean/ReLoactionEventBus.java

@@ -0,0 +1,15 @@
+package com.sybotan.android.demo.bean;
+
+import com.framework.mvvm.model.db.entity.ObjectEntity;
+
+/**
+ * Created by lihao.
+ * Date: 2021/10/26
+ */
+public class ReLoactionEventBus {
+    public ObjectEntity equip;
+
+    public ReLoactionEventBus(ObjectEntity equip) {
+        this.equip = equip;
+    }
+}

+ 4 - 1
demo/src/main/java/com/sybotan/android/demo/bean/RelConfigEntityPackClass.java

@@ -2,6 +2,8 @@ package com.sybotan.android.demo.bean;
 
 import com.framework.mvvm.model.db.entity.RelConfigEntity;
 
+import org.jetbrains.annotations.Nullable;
+
 import java.util.ArrayList;
 import java.util.Objects;
 
@@ -20,12 +22,13 @@ public class RelConfigEntityPackClass {
     }
 
     public static class TargetRelType {
-        public boolean canFrom;
+        public boolean canFrom ;
         public boolean canTo;
         public boolean connect;
         public String srcCode;
         public String graphCode;
         public String relCode;
         public String targetCode;
+        public String direction;
     }
 }

+ 1 - 1
demo/src/main/java/com/sybotan/android/demo/tools/WordWrapView.java

@@ -104,7 +104,7 @@ public class WordWrapView extends ViewGroup {
             int height = child.getMeasuredHeight();
             x += width + TEXT_MARGIN;
             if (!mIsAudit) {
-                if (index != childCount - 1 && x > actualWidth) {//换行
+                if (x > actualWidth) {//换行
                     x = width;
                     rows++;
                 }

+ 5 - 0
demo/src/main/java/com/sybotan/android/demo/view/ObjectRelationDialog.java

@@ -31,6 +31,7 @@ public class ObjectRelationDialog extends Dialog implements View.OnClickListener
     private TextView relationTv;
     private TextView toleft;
     private TextView toright;
+    private TextView connect;
     private Submit submit;
 
     public ObjectRelationDialog(@NonNull Context context, String localId, ObjectEntity equip, RelConfigEntityPackClass configEntity) {
@@ -48,6 +49,7 @@ public class ObjectRelationDialog extends Dialog implements View.OnClickListener
         findViewById(R.id.toright).setOnClickListener(this);
         toleft = findViewById(R.id.toleft);
         toright = findViewById(R.id.toright);
+        connect = findViewById(R.id.connect);
         findViewById(R.id.connect).setOnClickListener(this);
         findViewById(R.id.btnSubmit).setOnClickListener(this);
 
@@ -66,6 +68,9 @@ public class ObjectRelationDialog extends Dialog implements View.OnClickListener
                 if (type.canTo) {
                     toright.setVisibility(View.VISIBLE);
                 }
+                if (type.connect) {
+                    connect.setVisibility(View.VISIBLE);
+                }
                 break;
             }
         }

+ 2 - 1
demo/src/main/java/com/sybotan/android/demo/view/SelectListPopupWindow.java

@@ -23,6 +23,7 @@ import android.widget.TextView;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
+import com.framework.mvvm.model.db.entity.ObjectEntity;
 import com.sybotan.android.demo.R;
 import com.sybotan.android.demo.activities.BaseActivity;
 import com.sybotan.android.demo.adapter.SelectPopListAdapter;
@@ -258,7 +259,7 @@ public class SelectListPopupWindow extends PopupWindow {
     }
 
     public interface OnRecyclerViewItemClickListener {
-        void onItemClick(int position);
+        void onItemClick(ObjectEntity objectEntity);
     }
 
     public interface Commit {

+ 47 - 7
demo/src/main/java/com/sybotan/android/demo/view/SelectListSinglePopupWindow.java

@@ -7,6 +7,7 @@ package com.sybotan.android.demo.view;
 import android.app.Activity;
 import android.content.Context;
 import android.graphics.drawable.ColorDrawable;
+import android.text.TextUtils;
 import android.util.DisplayMetrics;
 import android.view.Gravity;
 import android.view.LayoutInflater;
@@ -17,7 +18,11 @@ import android.view.View.OnTouchListener;
 import android.view.ViewGroup.LayoutParams;
 import android.view.animation.Animation;
 import android.view.animation.AnimationUtils;
+import android.view.inputmethod.EditorInfo;
 import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
 import android.widget.PopupWindow;
 import android.widget.TextView;
 
@@ -25,12 +30,16 @@ import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
 
+import com.framework.mvvm.model.db.entity.EquipmentEntity;
+import com.framework.mvvm.model.db.entity.ObjectEntity;
 import com.sybotan.android.demo.R;
 import com.sybotan.android.demo.activities.BaseActivity;
 import com.sybotan.android.demo.adapter.PersonalSelectSingleAdapter;
+import com.sybotan.android.demo.retrofit.Constant;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 
 public class SelectListSinglePopupWindow extends PopupWindow {
@@ -39,8 +48,11 @@ public class SelectListSinglePopupWindow extends PopupWindow {
     private TextView title;
     private Button btn1, btn_cancel;
     private RecyclerView recyclerview;
+    private LinearLayout searchLinear;
+    private EditText searchEdt;
+    private ImageView searchDelete;
     private View mMenuView;
-
+    private List<ObjectEntity> itemList = new ArrayList<>();
 
     private Context context;
     private static final long DISMISSDELAYED = 2000;
@@ -51,13 +63,14 @@ public class SelectListSinglePopupWindow extends PopupWindow {
     PersonalSelectSingleAdapter adapter;
     public ArrayList<String> list = new ArrayList<String>();
     public int position = -1;
+    private List<ObjectEntity> dataList = new ArrayList<>();
 
     public SelectListSinglePopupWindow(Context context) {
         super(context);
         this.context = context;
 
         dm = new DisplayMetrics();
-        ((BaseActivity)context).getWindowManager().getDefaultDisplay().getMetrics(dm);
+        ((BaseActivity) context).getWindowManager().getDefaultDisplay().getMetrics(dm);
 
         LayoutInflater inflater = (LayoutInflater) context
                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
@@ -66,6 +79,10 @@ public class SelectListSinglePopupWindow extends PopupWindow {
         btn1 = (Button) mMenuView.findViewById(R.id.btn1);
         btn1.setVisibility(View.GONE);
         btn_cancel = (Button) mMenuView.findViewById(R.id.btn_cancel);
+        searchLinear = (LinearLayout) mMenuView.findViewById(R.id.search_linear);
+        searchEdt = (EditText) mMenuView.findViewById(R.id.search_edt);
+        searchDelete = (ImageView) mMenuView.findViewById(R.id.search_delete);
+        searchLinear.setVisibility(View.VISIBLE);
         //取消按钮
         btn_cancel.setOnClickListener(new OnClickListener() {
 
@@ -90,13 +107,34 @@ public class SelectListSinglePopupWindow extends PopupWindow {
             @Override
             public void onItemClick(View view, int position) {
                 if (mOnItemClickListener != null) {
-                    mOnItemClickListener.onItemClick(position);
+                    mOnItemClickListener.onItemClick(itemList.get(position));
                 }
                 dismiss();
             }
         });
         recyclerview.setAdapter(adapter);
-
+        searchDelete.setOnClickListener(v -> {
+            searchEdt.setText("");
+            itemList.clear();
+            itemList.addAll(dataList);
+            adapter.notifyDataSetChanged();
+        });
+        searchEdt.setOnEditorActionListener((textView, actionId, keyEvent) -> {
+            if (actionId == EditorInfo.IME_ACTION_SEARCH) {//修改回车键功能
+                if (!TextUtils.isEmpty(searchEdt.getText().toString().trim())) {
+                    String s = searchEdt.getText().toString().trim();
+                    itemList.clear();
+                    for (int i = 0; i < dataList.size(); i++) {
+                        if ((!TextUtils.isEmpty(dataList.get(i).getLocalId()) && Objects.requireNonNull(dataList.get(i).getLocalId()).contains(s)) || (!TextUtils.isEmpty(dataList.get(i).getLocalName()) && Objects.requireNonNull(dataList.get(i).getLocalName()).contains(s)) || dataList.get(i).getClassCode().contains(s)) {
+                            itemList.add(dataList.get(i));
+                        }
+                    }
+                    adapter.setItems(itemList, context, position, Constant.TYPE2);
+                    adapter.notifyDataSetChanged();
+                }
+            }
+            return false;
+        });
 
         //设置SelectPicPopupWindow的View
         this.setContentView(mMenuView);
@@ -129,7 +167,6 @@ public class SelectListSinglePopupWindow extends PopupWindow {
         });
 
 
-
     }
 
     public void setBtn(Boolean flag, String textBtn1) {
@@ -162,8 +199,11 @@ public class SelectListSinglePopupWindow extends PopupWindow {
         }
     }
 
-    public void setList(List<?> list, String type) {
-        adapter.setItems(list, context, position, type);
+    public void setList(List<ObjectEntity> list, String type) {
+        this.dataList = list;
+        itemList.clear();
+        itemList.addAll(dataList);
+        adapter.setItems(itemList, context, position, type);
         LayoutParams mParams1 = recyclerview.getLayoutParams();
         mParams1.height = (int) (55 * (list.size() >= 6 ? 6 : list.size()) * dm.density);
         recyclerview.setLayoutParams(mParams1);

+ 101 - 17
demo/src/main/java/com/sybotan/android/demo/viewmodel/GraphyVM.kt

@@ -2,9 +2,11 @@ package com.sybotan.android.demo.viewmodel
 
 import android.app.Activity.RESULT_OK
 import android.app.Application
+import android.graphics.Path
 import android.graphics.PointF
 import android.text.TextUtils
 import androidx.lifecycle.viewModelScope
+import cn.sagacloud.android.cadengine.Lasso
 import cn.sagacloud.android.cadengine.items.PointItem
 import cn.sagacloud.android.cadengine.items.SpaceItem
 import cn.sagacloud.android.cadengine.items.TunableSpaceItem
@@ -15,6 +17,7 @@ import com.sybotan.android.demo.bean.result.ProblemsModel
 import com.google.gson.Gson
 import com.google.gson.reflect.TypeToken
 import com.sybotan.android.demo.activities.BaseActivity
+import com.sybotan.android.demo.activities.GraphyActivity
 import com.sybotan.android.demo.bean.request.*
 import com.sybotan.android.demo.bean.result.*
 import com.sybotan.android.demo.bean.result.Position
@@ -80,9 +83,42 @@ class GraphyVM(
                 spaceJobModel.localName = objectEntity!!.localName
                 spaceJobModel.name = objectEntity.name
                 spaceJobModel.projectId = projectId
+                val strInfo = gson.fromJson(objectEntity.strInfos, StrInfos::class.java)
+                spaceJobModel.outline = strInfo.outline
+                spaceJobModel.objectEntity = objectEntity
                 if (from.equals("space")) {
+                    val problems = repo.getProblemByAvalible(floorId)
+                    var hasProblem = false
+                    var list: ArrayList<PointF> = ArrayList()
+                    for (line in spaceJobModel.outline[0]!!) {
+                        if (line.size < 1) {
+                            list.add(PointF(line[0].x, line[0].y))
+                            continue
+                        }
+                        for (p in line) {
+                            list.add(PointF(p.x, p.y))
+                        }
+                    }
+                    for (problem in problems) {
+                        val geomList = gson.fromJson<List<PointF>>(
+                            problem.strGeom,
+                            object : TypeToken<List<PointF?>?>() {}.type
+                        )
+                        val pointF = android.graphics.Point(
+                            geomList.get(0).x.toInt(),
+                            -geomList.get(0).y.toInt()
+                        )
+                        if (Lasso.isPolygonContainsPoint(list, pointF)) {
+                            hasProblem = true
+                            break
+                        }
+                    }
                     if (spaceEntity.archState == 1) {
-                        spaceJobModel.job = "01"
+                        if (hasProblem) {
+                            spaceJobModel.job = "02"
+                        } else {
+                            spaceJobModel.job = "01"
+                        }
                     } else {
                         spaceJobModel.job = "03"
                     }
@@ -104,10 +140,6 @@ class GraphyVM(
 //                } else if (spaceEntity.archState == 2 && spaceEntity.equipState == 2) {
 //                    spaceJobModel.job = "05"
 //                }
-                val strInfo = gson.fromJson(objectEntity.strInfos, StrInfos::class.java)
-
-                spaceJobModel.outline = strInfo.outline
-                spaceJobModel.objectEntity = objectEntity
                 spaceJobList.add(spaceJobModel)
             }
             mEmitter.SendDircetive(SPACE_JOB, spaceJobList)
@@ -248,7 +280,7 @@ class GraphyVM(
      */
     fun getProblem(choseSpace: TunableSpaceItem?) {
         viewModelScope.launch {
-            val problems = repo.getProblem()
+            val problems = repo.getProblemByFloor(floorId)
             var models: ArrayList<ProblemsModel> = ArrayList()
             for (problem in problems) {
                 if (problem.problemState == 1) {
@@ -377,7 +409,7 @@ class GraphyVM(
         viewModelScope.launch {
             val qrcodes = repo.getQrcode(choseSpace!!.data.id!!)
             val qrcodeModels = ArrayList<QrcodeModel>()
-            for (qrcode in qrcodes) {
+            for (qrcode in qrcodes!!) {
                 var qrcodeModel = QrcodeModel()
                 qrcodeModel.obj_id = qrcode.objId
                 qrcodeModel.qr_code = qrcode.qrCode
@@ -411,6 +443,13 @@ class GraphyVM(
      */
     fun setJob(choseSpace: TunableSpaceItem?, jobStatus: String) {
         viewModelScope.launch {
+            if (jobStatus.equals("03")) {
+                val qrcodes = repo.getQrcode(choseSpace!!.data.id!!)
+                if (CommonUtils.IsNull(qrcodes)) {
+                    ToastUtils.showMyToast("未安装空间二维码,不能完成空间核查")
+                    return@launch
+                }
+            }
             var space = repo.getSpaceBySpaceId(choseSpace!!.data.id!!)
             if (jobStatus.equals("01")) {
                 space.archState = 1
@@ -714,6 +753,17 @@ class GraphyVM(
         position: Position
     ) {
         viewModelScope.launch {
+            val objects = repo.getObjects()
+            if (!CommonUtils.IsNull(objects)) {
+                for (obj in objects) {
+                    if (!TextUtils.isEmpty(obj.localId) && obj.localId!!.toUpperCase()
+                            .equals(localId.toUpperCase())
+                    ) {
+                        ToastUtils.showMyToast("已有此编码的设备")
+                        return@launch
+                    }
+                }
+            }
             hashMap!!.put("equipContent", equipContent)
             hashMap!!.put("equipPhoto", gson.toJson(beans))
             hashMap!!.put("equipCheck", checked)
@@ -873,7 +923,7 @@ class GraphyVM(
             for (parent in pipeParent) {
                 var pipes = ArrayList<PipeEntity>()
                 for (floorPipe in floorPipes) {
-                    if ((floorPipe.objFrom.equals(deviceId) || floorPipe.objTo.equals(deviceId)) && floorPipe.pipeType.equals(
+                    if ((floorPipe.objFrom.equals(equipId) || floorPipe.objTo.equals(equipId)) && floorPipe.pipeType.equals(
                             parent.entity.pipeType
                         ) && floorPipe.pipeSubType.equals(parent.entity.pipeSubType)
                     ) {
@@ -893,11 +943,18 @@ class GraphyVM(
 
     private suspend fun bindPipeName(floorPipe: PipeEntity) {
         val from = repo.getObject(floorPipe.objFrom!!)
-        floorPipe.objFromLocalId =
-            if (from!!.id.startsWith("Eq")) from!!.localId else from!!.localName
+        if (from == null) {
+            floorPipe.objFromLocalId = "该设备"
+        } else {
+            floorPipe.objFromLocalId =
+                if (from!!.id.startsWith("Eq")) from!!.localId else from!!.localName
+        }
         val to = repo.getObject(floorPipe.objTo!!)
-        floorPipe.objToLocalId =
-            if (to!!.id.startsWith("Eq")) to!!.localId else to!!.localName
+        if (to == null) {
+            floorPipe.objToLocalId = "该设备"
+        } else {
+            floorPipe.objToLocalId = if (to!!.id.startsWith("Eq")) to!!.localId else to!!.localName
+        }
     }
 
     private fun loadPipeCfgs(
@@ -978,11 +1035,18 @@ class GraphyVM(
     ) {
         for (rel in entitys) {
             val from = repo.getObject(rel.objFrom!!)
-            rel.objFromLocalId =
-                if (from!!.id.startsWith("Eq")) from!!.localId else from!!.localName
+            if (from == null) {
+                rel.objFromLocalId = "该设备"
+            } else {
+                rel.objFromLocalId =
+                    if (from!!.id.startsWith("Eq")) from!!.localId else from!!.localName
+            }
             val to = repo.getObject(rel.objTo!!)
-            rel.objToLocalId =
-                if (to!!.id.startsWith("Eq")) to!!.localId else to!!.localName
+            if (to == null) {
+                rel.objToLocalId = "该设备"
+            } else {
+                rel.objToLocalId = if (to!!.id.startsWith("Eq")) to!!.localId else to!!.localName
+            }
         }
     }
 
@@ -1019,6 +1083,7 @@ class GraphyVM(
                 tartgetType.graphCode = group.entity.graphCode
                 tartgetType.relCode = group.entity.relCode
                 tartgetType.targetCode = cfgTarget
+                tartgetType.direction = cfg.direction
                 group.targetTypes.add(tartgetType)
             }
             if (targetAsTo) {
@@ -1036,7 +1101,7 @@ class GraphyVM(
                 tartgetType.canTo = true
                 tartgetType.canFrom = true
             } else {
-                tartgetType.canFrom = true
+                tartgetType.connect = true
                 // !targetCanBeTo && !targetCanBeFrom 表示无方向选择
             }
 
@@ -1260,6 +1325,24 @@ class GraphyVM(
         )
     }
 
+    fun insEquip(ob: ObjectEntity, position: Position) {
+        viewModelScope.launch {
+            var obj = repo.getObject(ob.id)
+            val hashMap = gson.fromJson(obj!!.strInfos, HashMap::class.java) as HashMap<String, Any>
+            val z = PointZ()
+            z.x = position.x.toFloat()
+            z.y = -position.y.toFloat()
+            z.z = position.z.offset.toFloat()
+            hashMap.put("location", z)
+            hashMap.put("zRegion", position.z.region)
+            obj.strInfos = gson.toJson(hashMap)
+            obj.state = "1"
+            repo.insObject(obj)
+            mEmitter.SendDircetive(UPDATE_LOCATION, null)
+        }
+
+    }
+
     companion object {
         const val UPDATE_APP = "UPDATE_APP"
         const val MAP_LOAD = "MAP_LOAD"
@@ -1317,6 +1400,7 @@ class GraphyVM(
         const val REL_OBJECT = "REL_OBJECT"
         const val PIPE_OBJECT = "PIPE_OBJECT"
         const val PIPE = "PIPE"
+        const val UPDATE_LOCATION = "UPDATE_LOCATION"
     }
 
 }

+ 2 - 6
demo/src/main/res/layout/activity_graphy.xml

@@ -40,9 +40,7 @@
             android:id="@+id/pipeWwv"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_marginLeft="20dp"
-            android:layout_marginTop="5dp"
-            android:layout_marginRight="20dp" />
+            android:layout_marginTop="5dp" />
     </ScrollView>
 
     <RelativeLayout
@@ -409,9 +407,7 @@
                 <com.sybotan.android.demo.tools.WordWrapView
                     android:id="@+id/equipWwv"
                     android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginLeft="20dp"
-                    android:layout_marginRight="20dp" />
+                    android:layout_height="wrap_content" />
             </ScrollView>
 
             <LinearLayout

+ 2 - 0
demo/src/main/res/layout/common_number_control.xml

@@ -13,6 +13,8 @@
         android:src="@mipmap/minus" />
 
     <EditText
+        android:focusable="true"
+        android:focusableInTouchMode="true"
         android:id="@+id/number_control_num"
         android:layout_width="wrap_content"
         android:layout_height="30dp"

+ 44 - 1
demo/src/main/res/layout/dialog_list_choice.xml

@@ -23,10 +23,53 @@
             android:background="@drawable/common_line_ffffff_single_all"
             android:gravity="center"
             android:paddingLeft="10dp"
-            android:text="请选择项目"
+            android:text="请选择"
             android:textColor="@color/gray_a6a6a6"
             android:textSize="15sp" />
 
+        <LinearLayout
+            android:id="@+id/search_linear"
+            android:layout_width="match_parent"
+            android:layout_height="32dp"
+            android:layout_marginLeft="16dp"
+            android:layout_marginRight="16dp"
+            android:layout_toLeftOf="@+id/common_search_cancel"
+            android:background="@drawable/bg_round_search"
+            android:orientation="horizontal"
+            android:visibility="gone">
+
+            <ImageView
+                android:id="@+id/search_iv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:layout_marginLeft="11dp"
+                android:src="@mipmap/icon_search" />
+
+            <EditText
+                android:id="@+id/search_edt"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_marginLeft="10dp"
+                android:layout_weight="1"
+                android:background="@null"
+                android:hint="搜索设备"
+                android:imeOptions="actionSearch"
+                android:singleLine="true"
+                android:textColor="@color/gray_272727"
+                android:textColorHint="@color/gray_a6a6a6"
+                android:textCursorDrawable="@null"
+                android:textSize="15sp" />
+
+            <ImageView
+                android:id="@+id/search_delete"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:layout_gravity="center_vertical"
+                android:paddingLeft="9dp"
+                android:paddingRight="9dp"
+                android:src="@mipmap/delete_default" />
+        </LinearLayout>
 
         <Button
             android:id="@+id/btn1"

+ 2 - 0
demo/src/main/res/layout/layout_common_list_item1.xml

@@ -55,6 +55,8 @@
         android:textSize="15sp" />
 
     <EditText
+        android:focusable="true"
+        android:focusableInTouchMode="true"
         android:id="@+id/et_right"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"

+ 2 - 0
demo/src/main/res/layout/view_mtext.xml

@@ -23,6 +23,8 @@
     </LinearLayout>
 
     <EditText
+        android:focusable="true"
+        android:focusableInTouchMode="true"
         android:id="@+id/mtextContent"
         android:layout_width="match_parent"
         android:layout_height="60dp"