Sfoglia il codice sorgente

feat 切换数据字典

lihao1 3 anni fa
parent
commit
9e889251a5
26 ha cambiato i file con 1203 aggiunte e 219 eliminazioni
  1. 6 2
      demo/src/main/java/com/framework/mvvm/model/db/dao/InfoDao.kt
  2. 1 2
      demo/src/main/java/com/framework/mvvm/model/db/dao/ObjectDao.kt
  3. 5 5
      demo/src/main/java/com/framework/mvvm/model/db/entity/task/ObjectEntity.kt
  4. 9 1
      demo/src/main/java/com/framework/mvvm/model/repository/AdmRepository.kt
  5. 29 29
      demo/src/main/java/com/sybotan/android/demo/activities/EquipDetailActivity.kt
  6. 60 35
      demo/src/main/java/com/sybotan/android/demo/activities/GraphyActivity.kt
  7. 1 1
      demo/src/main/java/com/sybotan/android/demo/adapter/PersonalSelectSingleAdapter.java
  8. 1 1
      demo/src/main/java/com/sybotan/android/demo/adapter/SelectPopListAdapter.java
  9. 26 66
      demo/src/main/java/com/sybotan/android/demo/adapter/StaticInfoAdapter.java
  10. 1 1
      demo/src/main/java/com/sybotan/android/demo/retrofit/BaseViewModelInterface.java
  11. 4 4
      demo/src/main/java/com/sybotan/android/demo/tools/LocalDataOperation.java
  12. 23 19
      demo/src/main/java/com/sybotan/android/demo/tools/LogUtil.java
  13. 6 0
      demo/src/main/java/com/sybotan/android/demo/view/ListItemView.java
  14. 2 2
      demo/src/main/java/com/sybotan/android/demo/viewmodel/BuildVM.kt
  15. 1 1
      demo/src/main/java/com/sybotan/android/demo/viewmodel/ContainerVM.kt
  16. 2 2
      demo/src/main/java/com/sybotan/android/demo/viewmodel/DeviceVM.kt
  17. 764 0
      demo/src/main/java/com/sybotan/android/demo/viewmodel/EquipDetailVM.kt
  18. 74 27
      demo/src/main/java/com/sybotan/android/demo/viewmodel/GraphyVM.kt
  19. 2 2
      demo/src/main/java/com/sybotan/android/demo/viewmodel/RelationVM.kt
  20. 53 4
      demo/src/main/java/com/sybotan/android/demo/viewmodel/SpaceDetailVM.kt
  21. 9 9
      demo/src/main/java/com/sybotan/android/demo/viewmodel/SpaceMapVM.kt
  22. 40 0
      demo/src/main/res/layout/activity_graphy.xml
  23. 5 5
      demo/src/main/res/layout/layout_common_list_item1.xml
  24. 78 0
      demo/src/main/res/layout/layout_common_list_item9.xml
  25. 1 1
      demo/src/main/res/layout/view_double.xml
  26. BIN
      demo/src/main/res/mipmap-xxhdpi/sift.png

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

@@ -21,7 +21,11 @@ interface InfoDao {
     @Update
     suspend fun updateInfo(vararg info: InfoEntity)
 
-    @Query("select * from info where class_code = :classCode and code = :code")
-    suspend fun getInfoByClassCodeAndCode(classCode: String, code: String): InfoEntity
+    @Query("select * from info where (class_code = :classCode or class_code= :parentClassCode) and code = :code")
+    suspend fun getInfoByClassCodeAndCode(
+        classCode: String,
+        parentClassCode: String,
+        code: String
+    ): InfoEntity?
 
 }

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

@@ -23,11 +23,10 @@ interface ObjectDao {
     @Query("select * from object where building_id = :buildingId and valid = 1")
     suspend fun getObjectByBuildingId(buildingId: String): List<ObjectEntity>
 
-    @Query("select * from object where floor_id = :floorId and obj_type=:type and container_id=:containerId and valid = 1")
+    @Query("select * from object where floor_id = :floorId and obj_type=:type and valid = 1")
     suspend fun getEquipByFloorId(
         floorId: String,
         type: String,
-        containerId: String
     ): List<ObjectEntity>
 
     @Query("select * from object where class_code = :code and valid = 1")

+ 5 - 5
demo/src/main/java/com/framework/mvvm/model/db/entity/task/ObjectEntity.kt

@@ -57,17 +57,17 @@ data class Infos(
     val schemeId: String,
     val state: String,
     val RoomLocalName: String,
-    val unit: String,
+    var unit: String,
     val group: String,
     val label: String,
-    val options: ArrayList<Options>,
-    val dataType: String,
-    val inputType: String,
+    var options: ArrayList<Options>,
+    var dataType: String,
+    var inputType: String,
     val code: String,
     val floorMap: String
 )
 
-data class Options(val txt: String, val `val`: String)
+data class Options(val name: String, val code: String)
 
 data class InfosForObj(
     val floorMap: String,

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

@@ -127,7 +127,7 @@ class AdmRepository(
     }
 
     suspend fun getEquipByFloorId(id: String): List<ObjectEntity> {
-        return db.objectDao().getEquipByFloorId(id, "equipment", "")
+        return db.objectDao().getEquipByFloorId(id, "equipment")
     }
 
     suspend fun getEquipByCode(code: String): EquipmentEntity? {
@@ -250,6 +250,14 @@ class AdmRepository(
         return db.objectDao().getContainerObjs(deviceId)
     }
 
+    suspend fun getInfoByClassCodeAndCode(
+        classCode: String,
+        parentClassCode: String,
+        code: String
+    ): InfoEntity? {
+        return db.infoDao().getInfoByClassCodeAndCode(classCode, parentClassCode, code)
+    }
+
 
     /**
      * 请求框架数据

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

@@ -40,7 +40,7 @@ import com.sybotan.android.demo.retrofit.Constant
 import com.sybotan.android.demo.tools.*
 import com.sybotan.android.demo.tools.LocalDataOperation.*
 import com.sybotan.android.demo.view.*
-import com.sybotan.android.demo.viewmodel.GraphyVM
+import com.sybotan.android.demo.viewmodel.EquipDetailVM
 import com.sybotan.base.extensions.toInt
 import com.yuyh.library.imgsel.ImageLoader
 import com.yuyh.library.imgsel.ImgSelConfig
@@ -105,7 +105,7 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
     private lateinit var uuid: String
 
     /** viewModel */
-    lateinit var graphyVM: GraphyVM
+    lateinit var equipVM: EquipDetailVM
     private lateinit var dialog: EquipListDialog
     var equips: List<EquipmentEntity> = ArrayList()
 
@@ -207,7 +207,7 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
                 ToastUtils.showMyToast("请输入设备编码")
                 return@setOnClickListener
             }
-            graphyVM.insEquip(
+            equipVM.insEquip(
                 uuid,
                 deviceId,
                 staticInfoAdapter.hashMap,
@@ -274,8 +274,8 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
             this.equipEntity = it
             equipClass.setTvRight(it.systemName + "/" + it.name + "-" + it.code)
             localId.setEtRight(it.code + "-")
-            graphyVM.getEquipInfosConfig(it)
-            graphyVM.getRelConfig(it, deviceId, uuid)
+            equipVM.getEquipInfosConfig(it)
+            equipVM.getRelConfig(it, deviceId, uuid)
 
         }
         staticInfoAdapter = StaticInfoAdapter(this, list)
@@ -284,18 +284,18 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
             this.info = it
         }
         recycler.adapter = staticInfoAdapter
-        graphyVM = GraphyVM(this.application, { name, params ->
+        equipVM = EquipDetailVM(this.application, { name, params ->
             when (name) {
-                GraphyVM.EQUIP_CLASS -> {
+                EquipDetailVM.EQUIP_CLASS -> {
                     equips = params as List<EquipmentEntity>
                     if (this.equipEntity == null) {
                         for (eq in equips) {
                             if (widgetCode.equals(eq.code)) {
                                 this.equipEntity = eq
-                                graphyVM.getRelConfig(eq, deviceId, uuid)
+                                equipVM.getRelConfig(eq, deviceId, uuid)
                                 equipClass.setTvRight(equipEntity!!.systemName + "/" + equipEntity!!.name + "-" + equipEntity!!.code)
-                                graphyVM.getEquipInfosConfig(equipEntity!!)
-                                graphyVM.getEquipment(deviceId)
+                                equipVM.getEquipInfosConfig(equipEntity!!)
+                                equipVM.getEquipment(deviceId)
                                 localId.setEtRight(eq.code + "-")
                                 break
                             }
@@ -303,7 +303,7 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
                     }
                     dialog.setList(equips);
                 }
-                GraphyVM.EQUIP_INFO -> {
+                EquipDetailVM.EQUIP_INFO -> {
                     list.clear()
                     if (params != null) {
                         list.addAll(params as ArrayList<Infos>)
@@ -311,7 +311,7 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
                     staticInfoAdapter.notifyDataSetChanged()
                 }
 
-                GraphyVM.SPACE_INFOS -> {
+                EquipDetailVM.SPACE_INFOS -> {
                     if (params != null) {
                         staticInfoAdapter.hashMap = params as HashMap<String, Any>?
                         if (staticInfoAdapter.hashMap != null && staticInfoAdapter.hashMap.get("equipContent") != null) {
@@ -351,7 +351,7 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
                         }
                     }
                 }
-                GraphyVM.Equip_INFOS -> {
+                EquipDetailVM.Equip_INFOS -> {
                     var equip = params as ObjectEntity
                     this.equip = equip
                     localId.setEtRight(equip.localId)
@@ -369,16 +369,16 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
                         for (eq in equips) {
                             if (equip.classCode.equals(eq.code)) {
                                 this.equipEntity = eq
-                                graphyVM.getRelConfig(eq, deviceId, uuid)
+                                equipVM.getRelConfig(eq, deviceId, uuid)
                                 equipClass.setTvRight(equipEntity!!.systemName + "/" + equipEntity!!.name + "-" + equipEntity!!.code)
-                                graphyVM.getEquipInfosConfig(equipEntity!!)
-                                graphyVM.getEquipment(deviceId)
+                                equipVM.getEquipInfosConfig(equipEntity!!)
+                                equipVM.getEquipment(deviceId)
                                 break
                             }
                         }
                     }
                 }
-                GraphyVM.EQUIP_REL -> {
+                EquipDetailVM.EQUIP_REL -> {
                     val hashMap = params as HashMap<String, Any>
                     val parent = hashMap.get("parent") as ArrayList<RelConfigEntityPackClass>
                     val children = hashMap.get("child") as MutableList<List<RelationPackClass>>
@@ -387,12 +387,12 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
                     relAdapter.setOnAdd(object : RelationExpandAdapter.AddRel {
                         override fun onAdd(group: RelConfigEntityPackClass) {
                             this@EquipDetailActivity.groupRelConfigEntity = group
-                            graphyVM.getRelObj(group, equipEntity!!.code!!)
+                            equipVM.getRelObj(group, equipEntity!!.code!!)
                         }
                     })
                     relAdapter.setOnDelete(object : RelationExpandAdapter.DeleteRel {
                         override fun ondelete(item: RelationEntity) {
-                            graphyVM.deleteRel(item, equipEntity, deviceId, uuid)
+                            equipVM.deleteRel(item, equipEntity, deviceId, uuid)
                         }
                     })
                     expandLvRelation.setAdapter(relAdapter)
@@ -400,7 +400,7 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
                         expandLvRelation.expandGroup(index)
                     }
                 }
-                GraphyVM.REL_OBJECT -> {
+                EquipDetailVM.REL_OBJECT -> {
                     val equipObjects = params as List<ObjectEntity>
                     val pop = SelectListSinglePopupWindow(this@EquipDetailActivity)
                     pop.setList(equipObjects, Constant.TYPE2)
@@ -418,7 +418,7 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
                             )
                             dialog.show()
                             dialog.setOnSubmit {
-                                graphyVM.addRel(
+                                equipVM.addRel(
                                     deviceId,
                                     uuid,
                                     equipEntity!!,
@@ -431,7 +431,7 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
                     }
 
                 }
-                GraphyVM.PIPE -> {
+                EquipDetailVM.PIPE -> {
                     val hashMap = params as HashMap<String, Any>
                     val parent = hashMap.get("parent") as ArrayList<PipeConfigEntityPackClass>
                     val children = hashMap.get("child") as MutableList<List<PipeEntity>>
@@ -439,20 +439,20 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
                     pipeAdapter.setOnAdd(object : PipeExpandAdapter.AddRel {
                         override fun onAdd(group: PipeConfigEntityPackClass) {
                             this@EquipDetailActivity.groupPipeConfigEntity = group
-                            graphyVM.getPipeObj(group, equipEntity!!.code!!)
+                            equipVM.getPipeObj(group, equipEntity!!.code!!)
                         }
                     })
                     expandLvPipe.setAdapter(pipeAdapter)
                     pipeAdapter.setOnDelete(object : PipeExpandAdapter.DeleteRel {
                         override fun ondelete(item: PipeEntity) {
-                            graphyVM.deletePipe(item, equipEntity, deviceId, uuid)
+                            equipVM.deletePipe(item, equipEntity, deviceId, uuid)
                         }
                     })
                     for (index in 0 until expandLvPipe.count) {
                         expandLvPipe.expandGroup(index)
                     }
                 }
-                GraphyVM.PIPE_OBJECT -> {
+                EquipDetailVM.PIPE_OBJECT -> {
                     val equipObjects = params as List<ObjectEntity>
                     val pop = SelectListSinglePopupWindow(this)
                     pop.setList(equipObjects, Constant.TYPE2)
@@ -470,7 +470,7 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
                             )
                             dialog.show()
                             dialog.setOnSubmit {
-                                graphyVM.addPipe(
+                                equipVM.addPipe(
                                     deviceId,
                                     uuid,
                                     equipEntity!!,
@@ -482,17 +482,17 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
                         }
                     }
                 }
-                GraphyVM.SERVE_AREA -> {
+                EquipDetailVM.SERVE_AREA -> {
                     serveArea.setTvRight(params.toString())
                 }
             }
         }, this, buildingId, floorId, projectId)
-        graphyVM.getEquipment(deviceId)
+        equipVM.getEquipment(deviceId)
     }
 
     override fun onResume() {
         super.onResume()
-        graphyVM.getServeArea(if (TextUtils.isEmpty(deviceId)) uuid else deviceId)
+        equipVM.getServeArea(if (TextUtils.isEmpty(deviceId)) uuid else deviceId)
     }
 
     private fun addPic() {

+ 60 - 35
demo/src/main/java/com/sybotan/android/demo/activities/GraphyActivity.kt

@@ -220,6 +220,9 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
     private lateinit var equipDetail: TextView
     private lateinit var equipContainer: TextView
     private lateinit var equipDelete: TextView
+    private lateinit var sift: TextView
+    private lateinit var checkAll: CheckBox
+    private lateinit var onlySpace: CheckBox
 
     /**
      * 创建Activity时的回调函数
@@ -368,6 +371,9 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
         equipDetail = findViewById(R.id.equipDetail)
         equipContainer = findViewById(R.id.equipContainer)
         equipDelete = findViewById(R.id.equipDelete)
+        checkAll = findViewById(R.id.checkAll)
+        onlySpace = findViewById(R.id.onlySpace)
+        sift = findViewById(R.id.sift)
 
     }
 
@@ -1263,46 +1269,23 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
                         scene.removeItem(item)
                     }
                     scene.equipList.clear()
-                    //流式布局
-                    equipWwv.removeAllViews()
-                    for (model in list) {
-                        val textview = TextView(this)
-                        textview.apply {
-                            setText(model.typeName + "-" + model.type + "(${model.children.size})")
-                            setSingleLine()
-                            gravity = Gravity.CENTER
-                            textSize = 12f
-                            height = DensityUtils.dp2px(this@GraphyActivity, 30f)
-                            if (equipClassList.contains(model.type)) {
+                    initEquipChoose(list)
+                    refreshEquip(list)
+                    checkAll.setOnCheckedChangeListener { buttonView, isChecked ->
+                        if (isChecked) {
+                            for (model in list) {
                                 model.isCheck = false
+                                equipClassList.add(model.type!!)
                             }
-                            if (model.isCheck) {
-                                background = resources.getDrawable(R.drawable.shape_filter_normal)
-                                textColor = resources.getColor(R.color.grey_900)
-                            } else {
-                                background = resources.getDrawable(R.drawable.shape_filter_selected)
-                                textColor = resources.getColor(R.color.white)
-                            }
-                            setOnClickListener {
-                                model.isCheck = !model.isCheck
-                                if (model.isCheck) {
-                                    equipClassList.remove(model.type!!)
-                                    textview.background =
-                                        resources.getDrawable(R.drawable.shape_filter_normal)
-                                    textview.textColor = resources.getColor(R.color.grey_900)
-                                } else {
-                                    equipClassList.add(model.type!!)
-                                    textview.background =
-                                        resources.getDrawable(R.drawable.shape_filter_selected)
-                                    textview.textColor = resources.getColor(R.color.white)
-                                }
-                                refreshEquip(list)
+                        } else {
+                            for (model in list) {
+                                model.isCheck = true
+                                equipClassList.remove(model.type!!)
                             }
-                            equipWwv.addView(this)
                         }
-
+                        initEquipChoose(list)
+                        refreshEquip(list)
                     }
-                    refreshEquip(list)
                 }
 
                 /** 查询管道类型树 */
@@ -1407,6 +1390,48 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
         graphyVM.getSpaceJob(from, scene.spaceList)
     }
 
+    private fun initEquipChoose(list: List<SpaceEqModel>) {
+        //流式布局
+        equipWwv.removeAllViews()
+        for (model in list) {
+            val textview = TextView(this)
+            textview.apply {
+                setText(model.typeName + "-" + model.type + "(${model.children.size})")
+                setSingleLine()
+                gravity = Gravity.CENTER
+                textSize = 12f
+                height = DensityUtils.dp2px(this@GraphyActivity, 30f)
+                if (equipClassList.contains(model.type)) {
+                    model.isCheck = false
+                }
+                if (model.isCheck) {
+                    background = resources.getDrawable(R.drawable.shape_filter_normal)
+                    textColor = resources.getColor(R.color.grey_900)
+                } else {
+                    background = resources.getDrawable(R.drawable.shape_filter_selected)
+                    textColor = resources.getColor(R.color.white)
+                }
+                setOnClickListener {
+                    model.isCheck = !model.isCheck
+                    if (model.isCheck) {
+                        equipClassList.remove(model.type!!)
+                        textview.background =
+                            resources.getDrawable(R.drawable.shape_filter_normal)
+                        textview.textColor = resources.getColor(R.color.grey_900)
+                    } else {
+                        equipClassList.add(model.type!!)
+                        textview.background =
+                            resources.getDrawable(R.drawable.shape_filter_selected)
+                        textview.textColor = resources.getColor(R.color.white)
+                    }
+                    refreshEquip(list)
+                }
+                equipWwv.addView(this)
+            }
+
+        }
+    }
+
     val graphyHelper: GraphyHelper = GraphyHelper(scene, this)
 
     /**

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

@@ -52,7 +52,7 @@ public class PersonalSelectSingleAdapter extends RecyclerView.Adapter<PersonalSe
         final Object item = items.get(position);
         if (type.equals(Constant.TYPE1)) {
             Options options = (Options) item;
-            holder.choice_name.setText(options.getTxt());
+            holder.choice_name.setText(options.getName());
         }
         if (type.equals(Constant.TYPE2)) {
             ObjectEntity options = (ObjectEntity) item;

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

@@ -56,7 +56,7 @@ public class SelectPopListAdapter extends RecyclerView.Adapter<SelectPopListAdap
         final Object item = items.get(position);
         if (type.equals(Constant.TYPE1)) {
             Options options = (Options) item;
-            holder.choice_name.setText(options.getTxt());
+            holder.choice_name.setText(options.getName());
         }
         if (type.equals(Constant.TYPE2)) {
             ObjectEntity options = (ObjectEntity) item;

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

@@ -86,62 +86,18 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
 
     @Override
     protected void onBindDataToView(ViewHolder holder, Infos info) {
-        if (TextUtils.isEmpty(info.getInputType())) {
-            if (!CommonUtils.IsNull(info.getOptions())) {
-                ListItemView enumItemView = holder.getView(R.id.view_enum);
-                String unit = "";
-                if (!TextUtils.isEmpty(info.getUnit())) {
-                    unit = "(" + info.getUnit() + ")";
-                }
-                enumItemView.setTvLeft(info.getLabel() + unit);
-                enumItemView.setTvRight("请选择");
-
-                if (!valueList.contains(info.getCode())) {
-                    if (hashMap != null && hashMap.get(info.getCode()) != null) {
-                        ArrayList<Options> value = new Gson().fromJson((String) hashMap.get(info.getCode()), new TypeToken<List<Options>>() {
-                        }.getType());
-                        StringBuilder sb = new StringBuilder();
-                        for (int i = 0; i < value.size(); i++) {
-                            sb.append(value.get(i).getTxt()).append("、");
-                        }
-                        enumItemView.setTvRight(sb.toString());
-                    }
-                }
-                valueList.add(info.getCode());
-
-                enumItemView.getView(R.id.tv_right).setOnClickListener(v -> {
-                    SelectListPopupWindow popupWindow = new SelectListPopupWindow(mContext);
-                    popupWindow.setList(info.getOptions(), Constant.TYPE1);
-                    popupWindow.setOnCommit(new SelectListPopupWindow.Commit() {
-                        @Override
-                        public void onCommit(ArrayList<Integer> list) {
-                            ArrayList<Options> arrayList = new ArrayList<>();
-                            StringBuilder sb = new StringBuilder();
-                            for (int i = 0; i < list.size(); 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());
-                        }
-                    });
-                    popupWindow.showAtLocation(enumItemView, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0);
-                });
-            } else {
-                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() + ")";
         }
+        if (TextUtils.isEmpty(info.getInputType())) {
+            ListItemView textItemView = holder.getView(R.id.view_text);
+            String label = TextUtils.isEmpty(info.getLabel()) ? "" : info.getLabel();
+            textItemView.setTvLeft(label + unit);
+            EditText etRight = textItemView.findViewById(R.id.et_right);
+            initEditTextTouch(etRight, info);
+            return;
+        }
         switch (info.getInputType()) {
             case "text":
                 ListItemView textItemView = holder.getView(R.id.view_text);
@@ -149,6 +105,12 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
                 EditText etRight = textItemView.findViewById(R.id.et_right);
                 initEditTextTouch(etRight, info);
                 break;
+            case "double":
+                ListItemView doubleItemView = holder.getView(R.id.view_double);
+                doubleItemView.setTvLeft(info.getLabel() + unit);
+                EditText etRight1 = doubleItemView.findViewById(R.id.et_right);
+                initEditTextTouch(etRight1, info);
+                break;
             case "textarea":
                 holder.setText(R.id.mtextTitle, info.getLabel() + unit);
                 EditText mtextContent = holder.getView(R.id.mtextContent);
@@ -166,7 +128,7 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
                         }.getType());
                         StringBuilder sb = new StringBuilder();
                         for (int i = 0; i < value.size(); i++) {
-                            sb.append(value.get(i).getTxt()).append("、");
+                            sb.append(value.get(i).getName()).append("、");
                         }
                         enumItemView.setTvRight(sb.toString());
                     }
@@ -182,7 +144,7 @@ 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(list.get(i)).getTxt()).append("、");
+                                sb.append(info.getOptions().get(list.get(i)).getName()).append("、");
                                 arrayList.add(info.getOptions().get(list.get(i)));
                             }
                             hashMap.put(info.getCode(), new Gson().toJson(arrayList));
@@ -251,7 +213,7 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
                             }.getType());
                             StringBuilder sb = new StringBuilder();
                             for (int i = 0; i < value.size(); i++) {
-                                sb.append(value.get(i).getTxt()).append("、");
+                                sb.append(value.get(i).getName()).append("、");
                             }
                             enumItemView2.setTvRight(sb.toString());
                         }
@@ -267,7 +229,7 @@ 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(list.get(i)).getTxt()).append("、");
+                                    sb.append(info.getOptions().get(list.get(i)).getName()).append("、");
                                     arrayList.add(info.getOptions().get(list.get(i)));
                                 }
                                 hashMap.put(info.getCode(), new Gson().toJson(arrayList));
@@ -278,9 +240,9 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
                         popupWindow.showAtLocation(enumItemView2, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0);
                     });
                 } else {
-//                    return MTEXT;
-                    holder.setText(R.id.mtextTitle, info.getLabel() + unit);
-                    EditText mtextContent2 = holder.getView(R.id.mtextContent);
+                    ListItemView textItemView1 = holder.getView(R.id.view_text);
+                    textItemView1.setTvLeft(info.getLabel() + unit);
+                    EditText mtextContent2 = textItemView1.findViewById(R.id.et_right);
                     initEditTextTouch(mtextContent2, info);
                 }
                 break;
@@ -343,7 +305,7 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
         }
         if (!valueList.contains(info.getCode())) {
             if (hashMap != null && hashMap.get(info.getCode()) != null) {
-                editText.setText((String) hashMap.get(info.getCode()));
+                editText.setText(hashMap.get(info.getCode()).toString());
             }
         }
         valueList.add(info.getCode());
@@ -379,11 +341,7 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
     @Override
     public int getItemViewType(int position) {
         if (TextUtils.isEmpty(mBeans.get(position).getInputType())) {
-            if (!CommonUtils.IsNull(mBeans.get(position).getOptions())) {
-                return ENUM;
-            } else {
-                return MTEXT;
-            }
+            return TEXT;
         }
         switch (mBeans.get(position).getInputType()) {
             case "text":
@@ -399,11 +357,13 @@ public class StaticInfoAdapter extends BaseRecyclerViewAdapter<Infos> {
                 return PICTURE;
             case "date":
                 return DATE;
+            case "double":
+                return DOUBLE;
             default:
                 if (!CommonUtils.IsNull(mBeans.get(position).getOptions())) {
                     return ENUM;
                 }
-                return MTEXT;
+                return TEXT;
         }
     }
 

+ 1 - 1
demo/src/main/java/com/sybotan/android/demo/retrofit/BaseViewModelInterface.java

@@ -13,5 +13,5 @@ public interface BaseViewModelInterface {
      * @param name 命令
      * @param params 附带的参数,一般情况下为Null
      */
-    public void SendDircetive(String name, Object params);
+    public void SendDirective(String name, Object params);
 }

+ 4 - 4
demo/src/main/java/com/sybotan/android/demo/tools/LocalDataOperation.java

@@ -59,22 +59,22 @@ public class LocalDataOperation {
      */
     public <T> void dealLocalData(BaseActivity mActivity, BaseViewModelInterface object) {
         Observable<T> observable = Observable.create((ObservableOnSubscribe<T>) e -> {
-            object.SendDircetive(DEAL_IO_DATA, e);
+            object.SendDirective(DEAL_IO_DATA, e);
         }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
         observable.compose(mActivity.bindToLifecycle()).subscribe(new Observer<T>() {
             @Override
             public void onSubscribe(Disposable d) {
-                object.SendDircetive(SHOW_DIALOG_IN_MAIN, d);
+                object.SendDirective(SHOW_DIALOG_IN_MAIN, d);
             }
 
             @Override
             public void onNext(T s) {
-                object.SendDircetive(DEAL_DATA_NEXT, s);
+                object.SendDirective(DEAL_DATA_NEXT, s);
             }
 
             @Override
             public void onError(Throwable e) {
-                object.SendDircetive(DEAL_DATA_ERROR, e);
+                object.SendDirective(DEAL_DATA_ERROR, e);
             }
 
             @Override

+ 23 - 19
demo/src/main/java/com/sybotan/android/demo/tools/LogUtil.java

@@ -91,7 +91,9 @@ public class LogUtil {
     }
 
     public static void e(String msg) {
-        e(null, msg);
+        if (isPrint) {
+            e(null, msg);
+        }
     }
 
     /**
@@ -101,25 +103,27 @@ public class LogUtil {
      * @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);
+        if (isPrint) {
+            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);// 打印剩余日志
                 }
-                Log.e(tag, msg);// 打印剩余日志
             }
         }
     }

+ 6 - 0
demo/src/main/java/com/sybotan/android/demo/view/ListItemView.java

@@ -101,6 +101,12 @@ public class ListItemView extends RelativeLayout {
                 mIvMust = mContentView.findViewById(R.id.iv_must);
                 setEditTextListener(et, et_max);
                 break;
+            case 9:
+                mContentView = LayoutInflater.from(context).inflate(R.layout.layout_common_list_item9, this, true);
+                final EditText et9 = (EditText) getView(R.id.et_right);
+                mIvMust = mContentView.findViewById(R.id.iv_must);
+                setEditTextListener(et9, et_max);
+                break;
             case 3:
                 mContentView = LayoutInflater.from(context).inflate(R.layout.layout_common_list_item2, this, true);
                 EditText et_left = (EditText) getView(R.id.et_right1);

+ 2 - 2
demo/src/main/java/com/sybotan/android/demo/viewmodel/BuildVM.kt

@@ -80,13 +80,13 @@ class BuildVM(app: Application, b: BaseViewModelInterface, a: BaseActivity) :
                     )
                 )
             }
-            mEmitter.SendDircetive(BUILD_TYPE, t)
+            mEmitter.SendDirective(BUILD_TYPE, t)
         }
 
 //        val observable = RetrofitFactory.getInstance().requestBuildJob()
 //        this.sendRequest(observable, object : BaseObserver<List<Build>>(mActivity, this) {
 //            override fun onSuccess(t: List<Build>?) {
-//                mEmitter.SendDircetive(BUILD_TYPE, t)
+//                mEmitter.SendDirective(BUILD_TYPE, t)
 //            }
 //
 //        }, true)

+ 1 - 1
demo/src/main/java/com/sybotan/android/demo/viewmodel/ContainerVM.kt

@@ -56,7 +56,7 @@ class ContainerVM(
             hashMap.put("title", equip.localId!!)
             hashMap.put("parent", parent)
             hashMap.put("child", children)
-            mEmitter.SendDircetive(CONTAINER, hashMap)
+            mEmitter.SendDirective(CONTAINER, hashMap)
         }
     }
 

+ 2 - 2
demo/src/main/java/com/sybotan/android/demo/viewmodel/DeviceVM.kt

@@ -22,7 +22,7 @@ class DeviceVM(app: Application, b: BaseViewModelInterface, a: BaseActivity) : B
             observable,
             object : BaseObserver<List<DeviceType>>(mActivity, this) {
                 override fun onSuccess(t: List<DeviceType>?) {
-                    mEmitter.SendDircetive(DEVICE_TYPE, t)
+                    mEmitter.SendDirective(DEVICE_TYPE, t)
                 }
             }, true
         )
@@ -35,7 +35,7 @@ class DeviceVM(app: Application, b: BaseViewModelInterface, a: BaseActivity) : B
             observable,
             object : BaseObserver<ResDeviceModel>(mActivity, this) {
                 override fun onSuccess(t: ResDeviceModel?) {
-                    mEmitter.SendDircetive(DEVICE_ADD, t)
+                    mEmitter.SendDirective(DEVICE_ADD, t)
                 }
 
             },

+ 764 - 0
demo/src/main/java/com/sybotan/android/demo/viewmodel/EquipDetailVM.kt

@@ -0,0 +1,764 @@
+package com.sybotan.android.demo.viewmodel
+
+/**
+ * Created by lihao.
+ * Date: 2021/11/9
+ */
+
+import android.app.Activity.RESULT_OK
+import android.app.Application
+import android.text.TextUtils
+import androidx.lifecycle.viewModelScope
+import cn.sagacloud.android.cadengine.types.*
+import com.framework.mvvm.model.db.entity.*
+import com.framework.mvvm.model.db.entity.task.*
+import com.framework.mvvm.model.db.entity.dict.EquipmentEntity
+import com.framework.mvvm.model.db.entity.dict.PipeConfigEntity
+import com.framework.mvvm.model.db.entity.dict.RelConfigEntity
+import com.framework.mvvm.model.repository.AdmRepository
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+import com.sybotan.android.demo.activities.BaseActivity
+import com.sybotan.android.demo.bean.request.*
+import com.sybotan.android.demo.bean.result.*
+import com.sybotan.android.demo.bean.result.Position
+import com.sybotan.android.demo.retrofit.BaseViewModelInterface
+import com.sybotan.android.demo.tools.CommonUtils
+import com.sybotan.android.demo.tools.ToastUtils
+import kotlinx.coroutines.launch
+import org.kodein.di.DI
+import org.kodein.di.DIAware
+import org.kodein.di.android.x.closestDI
+import org.kodein.di.instance
+import java.util.*
+import kotlin.collections.ArrayList
+import kotlin.collections.HashMap
+import com.sybotan.android.demo.bean.*
+
+
+/**
+ * Created by lihao.
+ * Date: 2021/6/9
+ */
+class EquipDetailVM(
+    app: Application,
+    b: BaseViewModelInterface?, activity: BaseActivity?, //建筑id
+    private val buildingId: String, //楼层id
+    private val floorId: String,
+    private val projectId: String
+) : BaseViewModel(app, b, activity), DIAware {
+    private val gson = Gson()
+
+    override val di: DI by closestDI()
+    val repo: AdmRepository by instance()
+
+    fun getEquipment(deviceId: String) {
+        viewModelScope.launch {
+            val equips = repo.getEquipment()
+            for (equip in equips) {
+                if (!TextUtils.isEmpty(equip.systemCode)) {
+                    val systemEntity = repo.getSysByCode(equip.systemCode!!)
+                    equip.systemName = systemEntity?.name
+                }
+            }
+            mEmitter.SendDirective(EQUIP_CLASS, equips)
+
+            if (!TextUtils.isEmpty(deviceId)) {
+                var equip = repo.getObject(deviceId)
+                val infos = gson.fromJson(equip!!.infos, HashMap::class.java)
+                mEmitter.SendDirective(SPACE_INFOS, infos)
+                mEmitter.SendDirective(Equip_INFOS, equip)
+            }
+        }
+    }
+
+    fun getEquipInfosConfig(equipmentEntity: EquipmentEntity) {
+        viewModelScope.launch {
+            val infosConfig = repo.getInfosConfigByEquipCode(equipmentEntity.code!!)
+            if (CommonUtils.IsNull(infosConfig)) {
+                mEmitter.SendDirective(EQUIP_INFO, null)
+                return@launch
+            }
+            val infos = infosConfig.get(0).infos
+            val infoList = gson.fromJson<List<Infos>>(
+                infos,
+                object : TypeToken<List<Infos?>?>() {}.type
+            )
+            mergeInfo(equipmentEntity, infoList)
+            mEmitter.SendDirective(EQUIP_INFO, infoList)
+
+        }
+    }
+
+    private suspend fun mergeInfo(equipmentEntity: EquipmentEntity, infoList: List<Infos>) {
+        for (info in infoList) {
+            val infoEntity =
+                repo.getInfoByClassCodeAndCode(equipmentEntity.code!!, "equipment", info.code)
+            if (infoEntity != null) {
+                info.dataType =
+                    if (TextUtils.isEmpty(infoEntity?.dataType)) "" else infoEntity?.dataType!!
+                info.unit = if (TextUtils.isEmpty(infoEntity?.unit)) "" else infoEntity?.unit!!
+                if (infoEntity!!.dataSource != null) {
+                    info.options = gson.fromJson(
+                        infoEntity.dataSource,
+                        object : TypeToken<List<Options?>?>() {}.type
+                    )
+                }
+                if (TextUtils.isEmpty(info.inputType)) {
+                    when {
+                        info.dataType.equals("BOOLEAN") -> {
+                            if (CommonUtils.IsNull(info.options)) {
+                                info.options.add(Options("off", "否"))
+                                info.options.add(Options("on", "是"))
+                            }
+                        }
+                        info.dataType.equals("ATTACHMENT") -> {
+                            info.inputType = "photo"
+                        }
+                        info.dataType.equals("DATETIME") -> {
+                            info.inputType = "date"
+                        }
+                        info.dataType.equals("DOUBLE") -> {
+                            info.inputType = "double"
+                        }
+                        info.dataType.equals("INTEGER") -> {
+                            info.inputType = "setpper"
+                        }
+                        else -> {
+                            info.inputType = "text"
+                        }
+                    }
+                    if (!CommonUtils.IsNull(info.options)) {
+                        info.inputType = "picker"
+                    }
+
+                }
+            }
+        }
+    }
+
+    fun insEquip(
+        uuid: String,
+        deviceId: String?,
+        hashMap: HashMap<String, Any>?,
+        equipContent: String,
+        beans: ArrayList<Photos>,
+        equipEntity: EquipmentEntity,
+        localName: String,
+        localId: String,
+        checked: Int,
+        position: Position,
+        containerId: String,
+    ) {
+        viewModelScope.launch {
+            val objects = repo.getObjects()
+            if (!CommonUtils.IsNull(objects)) {
+                for (obj in objects) {
+                    if (deviceId != obj.id && !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)
+            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)
+            if (TextUtils.isEmpty(deviceId)) {
+                val objectEntity = ObjectEntity(
+                    id = uuid,
+                    name = localName,
+                    projectId = projectId,
+                    objType = "equipment",
+                    classCode = equipEntity.code!!,
+                    localId = localId,
+                    localName = localName,
+                    groupCode = "",
+                    grouping = 1,
+                    buildingId = buildingId,
+                    floorId = floorId,
+                    creator = "Android",
+                    createApp = "",
+                    creationTime = "",
+                    modifier = "Android",
+                    modifiedTime = "",
+                    clientDevice = "",
+                    clientId = uuid,
+                    updateApp = "",
+                    uploadFlag = "",
+                    valid = 1,
+                    deliveryState = null,
+                    d2mState = null,
+                    virtualCodes = null,
+                    infos = gson.toJsonTree(hashMap),
+                    floorMap = null,
+                    state = "1",
+                    containerId = if (TextUtils.isEmpty(containerId)) "" else containerId
+                )
+                repo.insObject(objectEntity)
+            } else {
+                val equip = repo.getObject(deviceId!!)
+//                equip!!.infos = JSONObject(hashMap as Map<*, *>)
+                equip!!.classCode = equipEntity.code!!
+                equip.localId = localId
+                equip.infos = gson.toJsonTree(hashMap)
+                equip.state = "1"
+                repo.insObject(equip)
+            }
+            //插入文件数据
+            var order = 0
+            for (photo in beans) {
+                if (photo.itemType != 1) {
+                    if (order != 0) {
+                        var phUuid = ""
+                        if (TextUtils.isEmpty(photo.id)) {
+                            phUuid = UUID.randomUUID().toString().replace("-", "")
+                        } else {
+                            phUuid = photo.id
+                        }
+
+                        val file = FileEntity(
+                            id = phUuid,
+                            bizType = "problem_arch",
+                            filePath = photo.key,
+                            fileType = "photo",
+                            clientPath = photo.path,
+                            refObjId = if (TextUtils.isEmpty(deviceId)) uuid else deviceId,
+                            refInfoCode = "",
+                            remark = "",
+                            orderNum = order,
+                            projectId = projectId,
+                            buildingId = buildingId,
+                            floorId = floorId,
+                            creator = "android",
+                            creationTime = "",
+                            modifier = "",
+                            modifiedTime = null,
+                            valid = 1,
+                            uploadFlag = "", state = "1"
+                        )
+                        repo.insFile(file)
+                    }
+                    order++
+                }
+            }
+            mActivity.setResult(RESULT_OK)
+            mActivity.finish()
+        }
+    }
+
+
+    fun getRelConfig(entity: EquipmentEntity, deviceId: String, uuid: String) {
+        viewModelScope.launch {
+            val equipId = if (TextUtils.isEmpty(deviceId)) uuid else deviceId
+            //获取关系二级列表
+            val configParent = ArrayList<RelConfigEntityPackClass>()
+            val relList = mutableListOf<List<RelationPackClass>>()
+            val fromList = repo.getRelConfigByCodeFrom(entity.code!!)
+            val toList = repo.getRelConfigByCodeTo(entity.code!!)
+            loadCfgs(entity.code, fromList, true, configParent)
+            loadCfgs(entity.code, toList, true, configParent)
+            for (parent in configParent) {
+                var rel = ArrayList<RelationPackClass>()
+                for (child in parent.targetTypes) {
+                    if (child.canFrom) {
+                        val to = repo.getRelByCodeTo(
+                            parent.entity.graphCode!!,
+                            parent.entity.relCode!!,
+                            equipId
+                        )
+                        loadRelation(to, child, parent, rel)
+                    }
+
+                    if (child.canTo) {
+                        val from = repo.getRelByCodeFrom(
+                            parent.entity.graphCode!!,
+                            parent.entity.relCode!!,
+                            equipId
+                        )
+                        loadRelation(from, child, parent, rel)
+                    }
+                }
+                relList.add(rel)
+            }
+            val hashMap = HashMap<String, Any>()
+            hashMap.put("parent", configParent)
+            hashMap.put("child", relList)
+            mEmitter.SendDirective(EQUIP_REL, hashMap)
+
+            //获取管道二级列表
+            val pipeParent = ArrayList<PipeConfigEntityPackClass>()
+            val pipeChildren = mutableListOf<List<PipeEntity>>()
+            val pipeFromList = repo.getPipeConfigByCodeFrom(entity.code)
+            val pipeToList = repo.getPipeConfigByCodeTo(entity.code)
+            loadPipeCfgs(entity.code, pipeFromList, true, pipeParent)
+            loadPipeCfgs(entity.code, pipeToList, true, pipeParent)
+            val floorPipes = repo.getPipeByFloorId(floorId)
+            for (parent in pipeParent) {
+                var pipes = ArrayList<PipeEntity>()
+                for (floorPipe in floorPipes) {
+                    if ((floorPipe.objFrom.equals(equipId) || floorPipe.objTo.equals(equipId)) && floorPipe.pipeType.equals(
+                            parent.entity.pipeType
+                        ) && floorPipe.pipeSubType.equals(parent.entity.pipeSubType)
+                    ) {
+                        bindPipeName(floorPipe)
+                        pipes.add(floorPipe)
+                    }
+                }
+                pipeChildren.add(pipes)
+            }
+            val hashMap1 = HashMap<String, Any>()
+            hashMap1.put("parent", pipeParent)
+            hashMap1.put("child", pipeChildren)
+            mEmitter.SendDirective(PIPE, hashMap1)
+
+        }
+    }
+
+    private suspend fun bindPipeName(floorPipe: PipeEntity) {
+        val from = repo.getObject(floorPipe.objFrom!!)
+        if (from == null) {
+            floorPipe.objFromLocalId = "该设备"
+        } else {
+            floorPipe.objFromLocalId =
+                if (from!!.id.startsWith("Eq")) from!!.localId else from!!.localName
+        }
+        val to = repo.getObject(floorPipe.objTo!!)
+        if (to == null) {
+            floorPipe.objToLocalId = "该设备"
+        } else {
+            floorPipe.objToLocalId = if (to!!.id.startsWith("Eq")) to!!.localId else to!!.localName
+        }
+    }
+
+    private fun loadPipeCfgs(
+        srcCode: String,
+        cfgs: List<PipeConfigEntity>,
+        targetAsTo: Boolean,
+        groups: ArrayList<PipeConfigEntityPackClass>
+    ) {
+        for (cfg in cfgs) {
+            var group: PipeConfigEntityPackClass? = null
+            for (g in groups) {
+                if (g.samePipeConfig(cfg)) {
+                    group = g
+                    break
+                }
+            }
+            if (group == null) {
+                group = PipeConfigEntityPackClass()
+                group.entity = cfg
+                groups.add(group)
+            }
+            val cfgTarget = if (targetAsTo) cfg.classCodeTo else cfg.classCodeFrom
+
+            var targetType: PipeConfigEntityPackClass.TargetPipeType? = null
+            for (t in group.targetTypes) {
+                if (t.targetCode.equals(cfgTarget)) {
+                    targetType = t
+                    break
+                }
+            }
+            if (targetType == null) {
+                targetType = PipeConfigEntityPackClass.TargetPipeType()
+                targetType.srcCode = srcCode
+                targetType.pipeType = group.entity.pipeType
+                targetType.pipeSubType = group.entity.pipeSubType
+                targetType.targetCode = cfgTarget
+                group.targetTypes.add(targetType)
+            }
+            if (cfg.pipeDirection == 1) {
+                if (targetAsTo) {
+                    targetType.canTo = true
+                } else {
+                    targetType.canFrom = true
+                }
+            } else if (cfg.pipeDirection == -1) {
+                if (targetAsTo) {
+                    targetType.canFrom = true
+                } else {
+                    targetType.canTo = true
+                }
+            } else if (cfg.pipeDirection == 0) {
+                targetType.canConnect = true
+            }
+        }
+    }
+
+    private suspend fun loadRelation(
+        to: List<RelationEntity>,
+        child: RelConfigEntityPackClass.TargetRelType,
+        parent: RelConfigEntityPackClass,
+        rel: ArrayList<RelationPackClass>
+    ) {
+        bindRelationEntityName(to)
+        if (!CommonUtils.IsNull(to)) {
+            for (t in to) {
+                if (child.targetCode.equals(parent.entity.classCodeTo)) {
+                    val pack = RelationPackClass()
+                    pack.entity = t
+                    pack.targetPipeType = child
+                    rel.add(pack)
+                }
+            }
+        }
+    }
+
+    private suspend fun bindRelationEntityName(
+        entitys: List<RelationEntity>
+    ) {
+        for (rel in entitys) {
+            val from = repo.getObject(rel.objFrom!!)
+            if (from == null) {
+                rel.objFromLocalId = "该设备"
+            } else {
+                rel.objFromLocalId =
+                    if (from!!.id.startsWith("Eq")) from!!.localId else from!!.localName
+            }
+            val to = repo.getObject(rel.objTo!!)
+            if (to == null) {
+                rel.objToLocalId = "该设备"
+            } else {
+                rel.objToLocalId = if (to!!.id.startsWith("Eq")) to!!.localId else to!!.localName
+            }
+        }
+    }
+
+    private fun loadCfgs(
+        srcCode: String,
+        cfgs: List<RelConfigEntity>,
+        targetAsTo: Boolean,
+        groups: ArrayList<RelConfigEntityPackClass>
+    ) {
+        for (cfg in cfgs) {
+            var group: RelConfigEntityPackClass? = null
+            for (g in groups) {
+                if (g.sameRelConfig(cfg)) {
+                    group = g
+                    break
+                }
+            }
+            if (group == null) {
+                group = RelConfigEntityPackClass()
+                group.entity = cfg
+                groups.add(group)
+            }
+            val cfgTarget = if (targetAsTo) cfg.classCodeTo else cfg.classCodeFrom
+            var tartgetType: RelConfigEntityPackClass.TargetRelType? = null
+            for (t in group.targetTypes) {
+                if (t.targetCode.equals(cfgTarget)) {
+                    tartgetType = t
+                    break
+                }
+            }
+            if (tartgetType == null) {
+                tartgetType = RelConfigEntityPackClass.TargetRelType()
+                tartgetType.srcCode = srcCode
+                tartgetType.graphCode = group.entity.graphCode
+                tartgetType.relCode = group.entity.relCode
+                tartgetType.targetCode = cfgTarget
+                tartgetType.direction = cfg.direction
+                group.targetTypes.add(tartgetType)
+            }
+            if (targetAsTo) {
+                tartgetType.canTo = true
+            } else {
+                tartgetType.canFrom = true
+            }
+
+            if ("fixed".equals(cfg.direction)) {
+                if (targetAsTo)
+                    tartgetType.canTo = true
+                else
+                    tartgetType.canFrom = true
+            } else if ("optional".equals(cfg.direction)) {
+                tartgetType.canTo = true
+                tartgetType.canFrom = true
+            } else {
+                tartgetType.connect = true
+                // !targetCanBeTo && !targetCanBeFrom 表示无方向选择
+            }
+
+        }
+    }
+
+    fun getRelObj(group: RelConfigEntityPackClass, code: String) {
+        viewModelScope.launch {
+            val objects: ArrayList<ObjectEntity> = ArrayList()
+            for (type in group.targetTypes) {
+                val objs = repo.getObjectByCode(type.targetCode!!)
+                if (!CommonUtils.IsNull(objs)) {
+                    objects.addAll(objs)
+                }
+            }
+            mEmitter.SendDirective(REL_OBJECT, objects)
+        }
+    }
+
+    /**
+     * 获取可建立管道对象列表
+     */
+    fun getPipeObj(group: PipeConfigEntityPackClass, code: String) {
+        viewModelScope.launch {
+            val objects: ArrayList<ObjectEntity> = ArrayList()
+            for (type in group.targetTypes) {
+                val objs = repo.getObjectByCode(type.targetCode!!)
+                if (!CommonUtils.IsNull(objs)) {
+                    objects.addAll(objs)
+                }
+            }
+            mEmitter.SendDirective(PIPE_OBJECT, objects)
+        }
+    }
+
+    /**
+     * 增加关系
+     */
+    fun addRel(
+        deviceId: String, uuid: String, equipEntity: EquipmentEntity,
+        equip: ObjectEntity,
+        groupRelConfigEntity: RelConfigEntity,
+        eq: Boolean
+    ) {
+        viewModelScope.launch {
+            var equipId: String
+            if (TextUtils.isEmpty(deviceId)) {
+                equipId = uuid
+            } else {
+                equipId = deviceId
+            }
+            val objFrom: String
+            val objto: String
+            if (eq) {
+                objFrom = equipId
+                objto = equip.id
+            } else {
+                objto = equipId
+                objFrom = equip.id
+            }
+
+            val relEntity = RelationEntity(
+                id = UUID.randomUUID().toString(),
+                projectId = projectId,
+                buildingId = buildingId,
+                floorId = floorId,
+                graphCode = groupRelConfigEntity.graphCode,
+                graphId = null,
+                groupCode = null,
+                relCode = groupRelConfigEntity.relCode,
+                relValue = null,
+                objFrom = objFrom,
+                objTo = objto,
+                createApp = null,
+                updateApp = null,
+                creator = null,
+                creationTime = "",
+                modifiedTime = "",
+                modifier = null,
+                clientId = null,
+                clientDevice = null,
+                uploadFlag = null,
+                deliveryState = null,
+                valid = 1, d2mState = null, objFromLocalId = null, objToLocalId = null, state = "1"
+            )
+            repo.insRelation(relEntity)
+            getRelConfig(equipEntity, deviceId, uuid)
+        }
+    }
+
+    /**
+     * 增加管道
+     */
+    fun addPipe(
+        deviceId: String, uuid: String, equipEntity: EquipmentEntity,
+        equip: ObjectEntity,
+        groupPipeConfigEntity: PipeConfigEntity,
+        direction: String
+    ) {
+        viewModelScope.launch {
+            var equipId: String
+            if (TextUtils.isEmpty(deviceId)) {
+                equipId = uuid
+            } else {
+                equipId = deviceId
+            }
+            val objFrom: String
+            val objto: String
+            if (groupPipeConfigEntity.classCodeFrom.equals(equipEntity!!.code)) {
+                objFrom = equipId
+                objto = equip.id
+            } else {
+                objto = equipId
+                objFrom = equip.id
+            }
+            var pipeDirection: Int
+            if (direction.equals("->")) {
+                pipeDirection = 1
+            } else if (direction.equals("<-")) {
+                pipeDirection = -1
+            } else {
+                pipeDirection = 0
+            }
+
+            val relEntity = PipeEntity(
+                id = UUID.randomUUID().toString(),
+                projectId = projectId,
+                buildingId = buildingId,
+                floorId = floorId,
+                objFrom = objFrom,
+                objTo = objto,
+                creator = null,
+                creationTime = "",
+                modifiedTime = "",
+                modifier = null,
+                uploadFlag = null,
+                deliveryState = null,
+                valid = 1,
+                d2mState = null,
+                objFromLocalId = null,
+                objToLocalId = null,
+                direction = pipeDirection,
+                typeFrom = "equipment",
+                typeTo = "equipment",
+                pipeType = groupPipeConfigEntity.pipeType,
+                pipeSubType = groupPipeConfigEntity.pipeSubType,
+                route = null,
+                infos = null, state = "1"
+            )
+            repo.insPipe(relEntity)
+            getRelConfig(equipEntity, deviceId, uuid)
+        }
+    }
+
+    /**
+     * 删除关系
+     */
+    fun deleteRel(
+        item: RelationEntity,
+        equipEntity: EquipmentEntity?,
+        deviceId: String,
+        uuid: String
+    ) {
+        viewModelScope.launch {
+            var rel = repo.getRelById(item.id)
+            rel.valid = 0
+            repo.insRelation(rel)
+            getRelConfig(equipEntity!!, deviceId, uuid)
+        }
+    }
+
+    /**
+     * 删除管道
+     */
+    fun deletePipe(
+        item: PipeEntity,
+        equipEntity: EquipmentEntity?,
+        deviceId: String,
+        uuid: String
+    ) {
+        viewModelScope.launch {
+            var rel = repo.getPipeById(item.id)
+            rel.valid = 0
+            repo.insPipe(rel)
+            getRelConfig(equipEntity!!, deviceId, uuid)
+        }
+    }
+
+    /**
+     * 修改设备位置
+     */
+    fun insEquip(ob: ObjectEntity, position: Position) {
+        viewModelScope.launch {
+            var obj = repo.getObject(ob.id)
+            val hashMap = gson.fromJson(obj!!.infos, 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.infos = gson.toJsonTree(hashMap)
+            obj.state = "1"
+            repo.insObject(obj)
+            mEmitter.SendDirective(UPDATE_LOCATION, null)
+        }
+
+    }
+
+    /**
+     * 获取设备服务区域
+     */
+    fun getServeArea(deviceId: String) {
+        viewModelScope.launch {
+            val entity = repo.getServeAreaByObjId(deviceId)
+            if (entity == null) {
+                mEmitter.SendDirective(SERVE_AREA, "无")
+            } else {
+                mEmitter.SendDirective(SERVE_AREA, "有")
+            }
+        }
+
+    }
+
+    /**
+     * 获取无模型设备
+     */
+    fun getContainer(deviceId: String) {
+        viewModelScope.launch {
+            val objs = repo.getContainerObjs(deviceId)
+            val equip = repo.getObject(deviceId)
+            val configs = repo.getContainerConfig(equip!!.classCode!!)
+            val hashMap = HashMap<String, Any>()
+            hashMap.put("configs", configs)
+            hashMap.put("objs", objs)
+            mEmitter.SendDirective(CONTAINER_EQUIP, hashMap)
+        }
+    }
+
+    companion object {
+
+        //查询设备类
+        const val EQUIP_CLASS = "EQUIP_CLASS"
+
+        //设置空间的任务状态(新建和修改)
+        const val SPACE_EQ = "SPACE_EQ"
+
+        //查询空间详情查看info值
+        const val SPACE_INFOS = "SPACE_INFOS"
+
+        //查询设备详情
+        const val EQUIP_INFO = "EQUIP_INFO"
+
+        //设备对象实例
+        const val Equip_INFOS = "Equip_INFOS"
+
+        //关系二级列表
+        const val EQUIP_REL = "EQUIP_REL"
+
+        //可建立关系对象实例列表
+        const val REL_OBJECT = "REL_OBJECT"
+
+        //可建立管道对象实例列表
+        const val PIPE_OBJECT = "PIPE_OBJECT"
+
+        //管道二级列表
+        const val PIPE = "PIPE"
+
+        //编辑设备位置
+        const val UPDATE_LOCATION = "UPDATE_LOCATION"
+
+        //设备服务区域
+        const val SERVE_AREA = "SERVE_AREA"
+
+        //无模型设备
+        const val CONTAINER_EQUIP = "CONTAINER_EQUIP"
+    }
+
+}

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

@@ -141,7 +141,7 @@ class GraphyVM(
                 }
                 spaceJobList.add(spaceJobModel)
             }
-            mEmitter.SendDircetive(SPACE_JOB, spaceJobList)
+            mEmitter.SendDirective(SPACE_JOB, spaceJobList)
 
         }
     }
@@ -176,7 +176,7 @@ class GraphyVM(
             }
             space.state = "1"
             repo.insSpace(space)
-            mEmitter.SendDircetive(SET_JOB, null)
+            mEmitter.SendDirective(SET_JOB, null)
         }
     }
 
@@ -188,7 +188,7 @@ class GraphyVM(
     fun getSpaceEq(choseSpace: TunableSpaceItem?) {
         viewModelScope.launch {
             val equips = repo.getEquipByFloorId(floorId)
-
+            equips.filter { !TextUtils.isEmpty(it.containerId) }
             var models: ArrayList<SpaceEqModel> = ArrayList()
             for (equip in equips) {
                 var hasParent = false
@@ -273,7 +273,7 @@ class GraphyVM(
                     models.add(spaceModel)
                 }
             }
-            mEmitter.SendDircetive(SPACE_EQ, models)
+            mEmitter.SendDirective(SPACE_EQ, models)
         }
     }
 
@@ -285,7 +285,7 @@ class GraphyVM(
         val observable = RetrofitFactory.getInstance().pipeList(getRequestBody(bean))
         sendRequest(observable, object : BaseObserver<ArrayList<PipeListModel>>(mActivity, this) {
             override fun onSuccess(models: ArrayList<PipeListModel>) {
-                mEmitter.SendDircetive(PIPE_LIST, models)
+                mEmitter.SendDirective(PIPE_LIST, models)
             }
         }, true)
     }
@@ -313,7 +313,7 @@ class GraphyVM(
 //        val observable = RetrofitFactory.getInstance().addPipe(getRequestBody(bean))
 //        sendRequest(observable, object : BaseObserver<AddPipeModel>(mActivity, this) {
 //            override fun onSuccess(models: AddPipeModel) {
-//                mEmitter.SendDircetive(ADD_PIPE, null)
+//                mEmitter.SendDirective(ADD_PIPE, null)
 //            }
 //        }, true)
     }
@@ -361,7 +361,7 @@ class GraphyVM(
 //                }
 //
 //            }
-//            mEmitter.SendDircetive(SPACE_PIPE, pipeModels)
+//            mEmitter.SendDirective(SPACE_PIPE, pipeModels)
 //        }
     }
 
@@ -387,13 +387,13 @@ class GraphyVM(
                     equip.systemName = systemEntity?.name
                 }
             }
-            mEmitter.SendDircetive(EQUIP_CLASS, equips)
+            mEmitter.SendDirective(EQUIP_CLASS, equips)
 
             if (!TextUtils.isEmpty(deviceId)) {
                 var equip = repo.getObject(deviceId)
                 val infos = gson.fromJson(equip!!.infos, HashMap::class.java)
-                mEmitter.SendDircetive(SPACE_INFOS, infos)
-                mEmitter.SendDircetive(Equip_INFOS, equip)
+                mEmitter.SendDirective(SPACE_INFOS, infos)
+                mEmitter.SendDirective(Equip_INFOS, equip)
             }
         }
     }
@@ -402,7 +402,7 @@ class GraphyVM(
         viewModelScope.launch {
             val infosConfig = repo.getInfosConfigByEquipCode(equipmentEntity.code!!)
             if (CommonUtils.IsNull(infosConfig)) {
-                mEmitter.SendDircetive(EQUIP_INFO, null)
+                mEmitter.SendDirective(EQUIP_INFO, null)
                 return@launch
             }
             val infos = infosConfig.get(0).infos
@@ -410,7 +410,7 @@ class GraphyVM(
                 infos,
                 object : TypeToken<List<Infos?>?>() {}.type
             )
-            mEmitter.SendDircetive(EQUIP_INFO, infoList)
+            mEmitter.SendDirective(EQUIP_INFO, infoList)
 
         }
     }
@@ -543,7 +543,7 @@ class GraphyVM(
                     }
                     val floorOfflineData =
                         SJsonUtil.fromJson(floor.floorMap!!, FloorData::class.java)
-                    mEmitter.SendDircetive(MAP_LOAD, gson.toJson(floorOfflineData))
+                    mEmitter.SendDirective(MAP_LOAD, gson.toJson(floorOfflineData))
                     break
                 }
             }
@@ -587,7 +587,7 @@ class GraphyVM(
             val hashMap = HashMap<String, Any>()
             hashMap.put("parent", configParent)
             hashMap.put("child", relList)
-            mEmitter.SendDircetive(EQUIP_REL, hashMap)
+            mEmitter.SendDirective(EQUIP_REL, hashMap)
 
             //获取管道二级列表
             val pipeParent = ArrayList<PipeConfigEntityPackClass>()
@@ -613,7 +613,7 @@ class GraphyVM(
             val hashMap1 = HashMap<String, Any>()
             hashMap1.put("parent", pipeParent)
             hashMap1.put("child", pipeChildren)
-            mEmitter.SendDircetive(PIPE, hashMap1)
+            mEmitter.SendDirective(PIPE, hashMap1)
 
         }
     }
@@ -794,10 +794,13 @@ class GraphyVM(
                     objects.addAll(objs)
                 }
             }
-            mEmitter.SendDircetive(REL_OBJECT, objects)
+            mEmitter.SendDirective(REL_OBJECT, objects)
         }
     }
 
+    /**
+     * 获取可建立管道对象列表
+     */
     fun getPipeObj(group: PipeConfigEntityPackClass, code: String) {
         viewModelScope.launch {
             val objects: ArrayList<ObjectEntity> = ArrayList()
@@ -807,10 +810,13 @@ class GraphyVM(
                     objects.addAll(objs)
                 }
             }
-            mEmitter.SendDircetive(PIPE_OBJECT, objects)
+            mEmitter.SendDirective(PIPE_OBJECT, objects)
         }
     }
 
+    /**
+     * 增加关系
+     */
     fun addRel(
         deviceId: String, uuid: String, equipEntity: EquipmentEntity,
         equip: ObjectEntity,
@@ -863,6 +869,9 @@ class GraphyVM(
         }
     }
 
+    /**
+     * 增加管道
+     */
     fun addPipe(
         deviceId: String, uuid: String, equipEntity: EquipmentEntity,
         equip: ObjectEntity,
@@ -924,6 +933,9 @@ class GraphyVM(
         }
     }
 
+    /**
+     * 增加设备问题
+     */
     fun insProblemEquip(space: TunableSpaceItem, deviceId: String) {
         viewModelScope.launch {
             val equip = repo.getObject(deviceId)
@@ -958,6 +970,9 @@ class GraphyVM(
         }
     }
 
+    /**
+     * 删除关系
+     */
     fun deleteRel(
         item: RelationEntity,
         equipEntity: EquipmentEntity?,
@@ -972,6 +987,9 @@ class GraphyVM(
         }
     }
 
+    /**
+     * 删除管道
+     */
     fun deletePipe(
         item: PipeEntity,
         equipEntity: EquipmentEntity?,
@@ -986,6 +1004,9 @@ class GraphyVM(
         }
     }
 
+    /**
+     * APP自动更新
+     */
     fun queryAutoUpdate() {
         val bean = ApkVersionBean()
         val observable = RetrofitFactory.getInstance().autoUpdateApp(getRequestBody(bean))
@@ -994,7 +1015,7 @@ class GraphyVM(
             object : BaseObserver<java.util.ArrayList<AutoUpDateBean.Content>>(mActivity, this) {
                 override fun onSuccess(models: ArrayList<AutoUpDateBean.Content>) {
                     if (!CommonUtils.IsNull(models)) {
-                        mEmitter.SendDircetive(UPDATE_APP, models.get(0))
+                        mEmitter.SendDirective(UPDATE_APP, models.get(0))
                     }
                 }
             },
@@ -1002,6 +1023,9 @@ class GraphyVM(
         )
     }
 
+    /**
+     * 修改设备位置
+     */
     fun insEquip(ob: ObjectEntity, position: Position) {
         viewModelScope.launch {
             var obj = repo.getObject(ob.id)
@@ -1015,23 +1039,29 @@ class GraphyVM(
             obj.infos = gson.toJsonTree(hashMap)
             obj.state = "1"
             repo.insObject(obj)
-            mEmitter.SendDircetive(UPDATE_LOCATION, null)
+            mEmitter.SendDirective(UPDATE_LOCATION, null)
         }
 
     }
 
+    /**
+     * 获取设备服务区域
+     */
     fun getServeArea(deviceId: String) {
         viewModelScope.launch {
             val entity = repo.getServeAreaByObjId(deviceId)
             if (entity == null) {
-                mEmitter.SendDircetive(SERVE_AREA, "无")
+                mEmitter.SendDirective(SERVE_AREA, "无")
             } else {
-                mEmitter.SendDircetive(SERVE_AREA, "有")
+                mEmitter.SendDirective(SERVE_AREA, "有")
             }
         }
 
     }
 
+    /**
+     * 获取无模型设备
+     */
     fun getContainer(deviceId: String) {
         viewModelScope.launch {
             val objs = repo.getContainerObjs(deviceId)
@@ -1040,21 +1070,23 @@ class GraphyVM(
             val hashMap = HashMap<String, Any>()
             hashMap.put("configs", configs)
             hashMap.put("objs", objs)
-            mEmitter.SendDircetive(CONTAINER_EQUIP, hashMap)
+            mEmitter.SendDirective(CONTAINER_EQUIP, hashMap)
         }
     }
 
     companion object {
+        //app版本更新
         const val UPDATE_APP = "UPDATE_APP"
+
+        //地图加载
         const val MAP_LOAD = "MAP_LOAD"
+
+        //查询设备类
         const val EQUIP_CLASS = "EQUIP_CLASS"
 
         //查询空间和任务
         const val SPACE_JOB = "SPACE_JOB"
 
-        //查询空间核查问题
-        const val GET_PROBLEM = "GET_PROBLEM"
-
         //设置空间核查问题的信息和状态
         const val SET_PROBLEM = "SET_PROBLEM"
 
@@ -1073,19 +1105,34 @@ class GraphyVM(
         //查询空间下的管道Equip_INFOS
         const val SPACE_PIPE = "SPACE_PIPE"
 
-        //查询空间详情
-        const val SPACE_INFO = "SPACE_INFO"
+        //查询空间详情查看info值
         const val SPACE_INFOS = "SPACE_INFOS"
 
         //查询设备详情
         const val EQUIP_INFO = "EQUIP_INFO"
+
+        //设备对象实例
         const val Equip_INFOS = "Equip_INFOS"
+
+        //关系二级列表
         const val EQUIP_REL = "EQUIP_REL"
+
+        //可建立关系对象实例列表
         const val REL_OBJECT = "REL_OBJECT"
+
+        //可建立管道对象实例列表
         const val PIPE_OBJECT = "PIPE_OBJECT"
+
+        //管道二级列表
         const val PIPE = "PIPE"
+
+        //编辑设备位置
         const val UPDATE_LOCATION = "UPDATE_LOCATION"
+
+        //设备服务区域
         const val SERVE_AREA = "SERVE_AREA"
+
+        //无模型设备
         const val CONTAINER_EQUIP = "CONTAINER_EQUIP"
     }
 

+ 2 - 2
demo/src/main/java/com/sybotan/android/demo/viewmodel/RelationVM.kt

@@ -39,7 +39,7 @@ class RelationVM(app: Application, b: BaseViewModelInterface, a: BaseActivity) :
         val observable = RetrofitFactory.getInstance().getRelationEqs(getRequestBody(req))
         sendRequest(observable, object : BaseObserver<List<RelationEq>>(mActivity, this) {
             override fun onSuccess(models: List<RelationEq>) {
-                mEmitter.SendDircetive(code, models)
+                mEmitter.SendDirective(code, models)
             }
         }, true)
 
@@ -50,7 +50,7 @@ class RelationVM(app: Application, b: BaseViewModelInterface, a: BaseActivity) :
         val observable = RetrofitFactory.getInstance().getSpacePipe(getRequestBody(req))
         sendRequest(observable, object : BaseObserver<List<SpacePipe>>(mActivity, this) {
             override fun onSuccess(pipes: List<SpacePipe>) {
-                mEmitter.SendDircetive(code, pipes)
+                mEmitter.SendDirective(code, pipes)
             }
         }, true)
 

+ 53 - 4
demo/src/main/java/com/sybotan/android/demo/viewmodel/SpaceDetailVM.kt

@@ -2,15 +2,18 @@ package com.sybotan.android.demo.viewmodel
 
 import android.app.Activity.RESULT_OK
 import android.app.Application
+import android.text.TextUtils
 import androidx.lifecycle.viewModelScope
 import cn.sagacloud.android.cadengine.types.*
 import com.framework.mvvm.model.db.entity.*
 import com.framework.mvvm.model.db.entity.task.Infos
+import com.framework.mvvm.model.db.entity.task.Options
 import com.framework.mvvm.model.repository.AdmRepository
 import com.google.gson.Gson
 import com.google.gson.reflect.TypeToken
 import com.sybotan.android.demo.activities.BaseActivity
 import com.sybotan.android.demo.retrofit.BaseViewModelInterface
+import com.sybotan.android.demo.tools.CommonUtils
 import kotlinx.coroutines.launch
 import org.kodein.di.DI
 import org.kodein.di.DIAware
@@ -43,15 +46,61 @@ class SpaceDetailVM(
     fun getInfosConfig(spaceId: String) {
         viewModelScope.launch {
             val infosConfig = repo.getInfosConfigByObjType("space")
-            val info = infosConfig[0].infos
             val infoList = gson.fromJson<List<Infos>>(
-                info,
+                infosConfig[0].infos,
                 object : TypeToken<List<Infos?>?>() {}.type
             )
+            mergeInfo(infoList)
             val spaceObject = repo.getObject(spaceId)
             val infos = gson.fromJson(spaceObject!!.infos, HashMap::class.java)
-            mEmitter.SendDircetive(SPACE_INFOS, infos)
-            mEmitter.SendDircetive(SPACE_INFO, infoList)
+            mEmitter.SendDirective(SPACE_INFOS, infos)
+            mEmitter.SendDirective(SPACE_INFO, infoList)
+        }
+    }
+
+    private suspend fun mergeInfo(infoList: List<Infos>) {
+        for (info in infoList) {
+            val infoEntity = repo.getInfoByClassCodeAndCode("GeneralZone", "space", info.code)
+            if (infoEntity != null) {
+                info.dataType =
+                    if (TextUtils.isEmpty(infoEntity?.dataType)) "" else infoEntity?.dataType!!
+                info.unit = if (TextUtils.isEmpty(infoEntity?.unit)) "" else infoEntity?.unit!!
+                if (infoEntity!!.dataSource != null) {
+                    info.options = gson.fromJson(
+                        infoEntity.dataSource,
+                        object : TypeToken<List<Options?>?>() {}.type
+                    )
+                }
+                if (TextUtils.isEmpty(info.inputType)) {
+                    when {
+                        info.dataType.equals("BOOLEAN") -> {
+                            if (CommonUtils.IsNull(info.options)) {
+                                info.options.add(Options("off", "否"))
+                                info.options.add(Options("on", "是"))
+                            }
+                        }
+                        info.dataType.equals("ATTACHMENT") -> {
+                            info.inputType = "photo"
+                        }
+                        info.dataType.equals("DATETIME") -> {
+                            info.inputType = "date"
+                        }
+                        info.dataType.equals("DOUBLE") -> {
+                            info.inputType = "double"
+                        }
+                        info.dataType.equals("INTEGER") -> {
+                            info.inputType = "setpper"
+                        }
+                        else -> {
+                            info.inputType = "text"
+                        }
+                    }
+                    if (!CommonUtils.IsNull(info.options)) {
+                        info.inputType = "picker"
+                    }
+
+                }
+            }
         }
     }
 

+ 9 - 9
demo/src/main/java/com/sybotan/android/demo/viewmodel/SpaceMapVM.kt

@@ -119,7 +119,7 @@ class SpaceMapVM(
                 }
                 spaceJobList.add(spaceJobModel)
             }
-            mEmitter.SendDircetive(SPACE_JOB, spaceJobList)
+            mEmitter.SendDirective(SPACE_JOB, spaceJobList)
 
         }
     }
@@ -221,7 +221,7 @@ class SpaceMapVM(
                     repo.insFile(file)
                 }
             }
-            mEmitter.SendDircetive(ADD_PROBLEM, null)
+            mEmitter.SendDirective(ADD_PROBLEM, null)
         }
     }
 
@@ -264,7 +264,7 @@ class SpaceMapVM(
                     models.add(promodel)
                 }
             }
-            mEmitter.SendDircetive(GET_PROBLEM, models)
+            mEmitter.SendDirective(GET_PROBLEM, models)
         }
     }
 
@@ -278,7 +278,7 @@ class SpaceMapVM(
             val problem = repo.getProblemById(point.data.id!!)
             problem.problemState = 2
             repo.insProblem(problem)
-            mEmitter.SendDircetive(CLOSE_PROBLEM, null)
+            mEmitter.SendDirective(CLOSE_PROBLEM, null)
         }
     }
 
@@ -313,7 +313,7 @@ class SpaceMapVM(
                 uploadFlag = "", state = "1", location = toJson
             )
             repo.insQrcode(qrcode)
-            mEmitter.SendDircetive(BIND_QECODE, null)
+            mEmitter.SendDirective(BIND_QECODE, null)
         }
     }
 
@@ -340,7 +340,7 @@ class SpaceMapVM(
                 qrcodeModel.position = gson.toJson(position)
                 qrcodeModels.add(qrcodeModel)
             }
-            mEmitter.SendDircetive(GET_QECODE, qrcodeModels)
+            mEmitter.SendDirective(GET_QECODE, qrcodeModels)
         }
     }
 
@@ -377,7 +377,7 @@ class SpaceMapVM(
             }
             space.state = "1"
             repo.insSpace(space)
-            mEmitter.SendDircetive(SET_JOB, null)
+            mEmitter.SendDirective(SET_JOB, null)
         }
     }
 
@@ -393,7 +393,7 @@ class SpaceMapVM(
                     }
                     val floorOfflineData =
                         SJsonUtil.fromJson(floor.floorMap!!, FloorData::class.java)
-                    mEmitter.SendDircetive(MAP_LOAD, gson.toJson(floorOfflineData))
+                    mEmitter.SendDirective(MAP_LOAD, gson.toJson(floorOfflineData))
                     break
                 }
             }
@@ -444,7 +444,7 @@ class SpaceMapVM(
                     gson.toJson(entity.geom),
                     object : TypeToken<List<PointF?>?>() {}.type
                 )
-                mEmitter.SendDircetive(SERVE_AREA, ar)
+                mEmitter.SendDirective(SERVE_AREA, ar)
             }
         }
     }

+ 40 - 0
demo/src/main/res/layout/activity_graphy.xml

@@ -139,6 +139,46 @@
                 android:textColor="@color/grey_900"
                 android:textSize="12sp" />
 
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:orientation="horizontal"
+                android:visibility="gone">
+
+                <CheckBox
+                    android:id="@+id/checkAll"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="全选"
+                    android:textColor="@color/black_272727"
+                    android:textSize="14sp" />
+
+                <CheckBox
+                    android:id="@+id/onlySpace"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="40dp"
+                    android:text="选中空间"
+                    android:textColor="@color/black_272727"
+                    android:textSize="14sp" />
+
+                <TextView
+                    android:id="@+id/sift"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="40dp"
+                    android:background="@color/grey_300"
+                    android:drawableLeft="@mipmap/sift"
+                    android:drawablePadding="5dp"
+                    android:padding="5dp"
+                    android:paddingLeft="5dp"
+                    android:paddingRight="5dp"
+                    android:text="专业:全部"
+                    android:textColor="@color/black_272727"
+                    android:textSize="14sp" />
+            </LinearLayout>
+
             <ScrollView
                 android:layout_width="match_parent"
                 android:layout_height="80dp"

+ 5 - 5
demo/src/main/res/layout/layout_common_list_item1.xml

@@ -33,6 +33,7 @@
     </RelativeLayout>
 
     <ImageView
+        android:visibility="gone"
         android:id="@+id/iv_right"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
@@ -55,17 +56,16 @@
         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"
         android:layout_centerVertical="true"
         android:layout_marginLeft="50dp"
-        android:layout_marginRight="8dp"
-        android:layout_toLeftOf="@id/tv_right"
-        android:layout_toRightOf="@+id/rl"
+        android:layout_marginRight="16dp"
         android:background="@null"
+        android:focusable="true"
+        android:text=""
+        android:focusableInTouchMode="true"
         android:gravity="right"
         android:hint="请输入"
         android:singleLine="true"

+ 78 - 0
demo/src/main/res/layout/layout_common_list_item9.xml

@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:background="@drawable/common_line_ffffff_single_16"
+    android:layout_height="60dp">
+    <!--android:background="@drawable/createclickbg"-->
+
+    <RelativeLayout
+        android:id="@+id/rl"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerVertical="true"
+        android:layout_marginLeft="16dp">
+
+        <ImageView
+            android:id="@+id/iv_must"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerVertical="true"
+            android:layout_marginRight="4dp"
+            android:src="@mipmap/icon_must"
+            android:visibility="gone" />
+
+        <TextView
+            android:id="@+id/tv_left"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerVertical="true"
+            android:layout_marginRight="10dp"
+            android:layout_toRightOf="@+id/iv_must"
+            android:singleLine="true"
+            android:textColor="@color/black_272727"
+            android:textSize="16sp" />
+    </RelativeLayout>
+
+    <ImageView
+        android:id="@+id/iv_right"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentRight="true"
+        android:layout_centerVertical="true"
+        android:layout_marginRight="15dp"
+        android:src="@mipmap/cell_jiantouicon"
+        android:visibility="gone" />
+
+    <TextView
+        android:id="@+id/tv_right"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerVertical="true"
+        android:layout_marginRight="20dp"
+        android:layout_toLeftOf="@id/iv_right"
+        android:gravity="right"
+        android:singleLine="true"
+        android:text="人"
+        android:textColor="@color/black_272727"
+        android:textSize="15sp" />
+
+    <EditText
+        android:id="@+id/et_right"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_centerVertical="true"
+        android:layout_marginLeft="50dp"
+        android:layout_marginRight="16dp"
+        android:background="@null"
+        android:focusable="true"
+        android:focusableInTouchMode="true"
+        android:gravity="right"
+        android:hint="请输入"
+        android:inputType="numberDecimal"
+        android:singleLine="true"
+        android:text=""
+        android:textColor="@color/black_272727"
+        android:textColorHint="@color/gray_a6a6a6"
+        android:textSize="15sp" />
+
+</RelativeLayout>

+ 1 - 1
demo/src/main/res/layout/view_double.xml

@@ -10,6 +10,6 @@
         android:layout_width="match_parent"
         android:layout_height="44dp"
         android:layout_marginTop="10dp"
-        app:Type="1" />
+        app:Type="9" />
 
 </LinearLayout>

BIN
demo/src/main/res/mipmap-xxhdpi/sift.png