Quellcode durchsuchen

add poc2.0修复excel 1、2、3

lihao1 vor 3 Jahren
Ursprung
Commit
d44bd9b22f

+ 3 - 0
demo/build.gradle

@@ -129,6 +129,7 @@ dependencies {
     implementation files('libs/universal-image-loader-1.9.4-with-sources.jar')
     implementation files('libs/httpclient-4.3.5.jar')
     implementation files('libs/httpcore-4.3.2.jar')
+    implementation 'com.google.ar:core:1.23.0'
     testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: JUNIT_VERSION
     androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0', {
         exclude group: 'com.android.support', module: 'support-annotations'
@@ -273,4 +274,6 @@ dependencies {
     implementation 'com.squareup.okhttp3:logging-interceptor:3.14.4'
 
     debugImplementation 'com.amitshekhar.android:debug-db:1.0.4'
+    //屏幕适配
+    implementation 'me.jessyan:autosize:1.2.1'
 }

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

@@ -35,6 +35,13 @@
         android:supportsRtl="true"
         android:theme="@style/AppTheme">
 
+        <meta-data
+            android:name="design_width_in_dp"
+            android:value="960" />
+        <meta-data
+            android:name="design_height_in_dp"
+            android:value="600" />
+
         <provider
             android:name=".tools.MyProvider"
             android:authorities="com.sybotan.android.demo.fileProvider"

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

@@ -11,11 +11,11 @@ interface EquipmentDao {
     @Query("select * from equipment")
     suspend fun getEquipments(): List<EquipmentEntity>
 
-    @Query("select * from equipment where id = :id")
+    @Query("select * from equipment where id = :id and valid = 1")
     suspend fun getEquipmentById(id: String): EquipmentEntity
 
     @Query("select * from equipment where code = :code and valid = 1")
-    suspend fun getEquipmentByCode(code: String): EquipmentEntity
+    suspend fun getEquipmentByCode(code: String): EquipmentEntity?
 
     @Insert(onConflict = OnConflictStrategy.REPLACE)
     suspend fun insEquipment(vararg equipment: EquipmentEntity)

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

@@ -11,22 +11,22 @@ interface ObjectDao {
     @Query("select * from object")
     suspend fun getObjects(): List<ObjectEntity>
 
-    @Query("select * from object where id = :id")
+    @Query("select * from object where id = :id and valid = 1")
     suspend fun getObjectById(id: String): ObjectEntity?
 
-    @Query("select * from object where obj_type = :objType")
+    @Query("select * from object where obj_type = :objType and valid = 1")
     suspend fun getObjectByObjType(objType: String): List<ObjectEntity>
 
-    @Query("select * from object where building_id = :buildingId and obj_type=:type")
+    @Query("select * from object where building_id = :buildingId and obj_type=:type and valid = 1")
     suspend fun getObjectByBuildingId(buildingId: String, type: String): List<ObjectEntity>
 
-    @Query("select * from object where building_id = :buildingId")
+    @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")
+    @Query("select * from object where floor_id = :floorId and obj_type=:type and valid = 1")
     suspend fun getEquipByFloorId(floorId: String, type: String): List<ObjectEntity>
 
-    @Query("select * from object where class_code = :code")
+    @Query("select * from object where class_code = :code and valid = 1")
     suspend fun getObjectByCode(code: String): List<ObjectEntity>
 
     @Insert(onConflict = OnConflictStrategy.REPLACE)

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

@@ -24,5 +24,5 @@ interface SystemDao {
     suspend fun insSystems(systems: List<SystemEntity>)
 
     @Query("select * from system where code = :code")
-    suspend fun getSysByCode(code: String): SystemEntity
+    suspend fun getSysByCode(code: String): SystemEntity?
 }

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

@@ -22,8 +22,8 @@ data class ObjectEntity(
     @ColumnInfo(name = "name") val name: String,
     @ColumnInfo(name = "project_id") val projectId: String,        // 项目id
     @ColumnInfo(name = "obj_type") val objType: String,            // 对象类型
-    @ColumnInfo(name = "class_code") val classCode: String,        // 对象类型编码
-    @ColumnInfo(name = "local_id") val localId: String?,            // 对象位置编码
+    @ColumnInfo(name = "class_code") var classCode: String,        // 对象类型编码
+    @ColumnInfo(name = "local_id") var localId: String?,            // 对象位置编码
     @ColumnInfo(name = "local_name") val localName: String?,        // 对象位置名称
     @ColumnInfo(name = "group_code") val groupCode: String?,        // 集团编码
     @ColumnInfo(name = "grouping") val grouping: Int?,              // 1 表示单个对象,2 表示对象组
@@ -38,7 +38,7 @@ data class ObjectEntity(
     @ColumnInfo(name = "client_id") val clientId: String?,          // 客户端生成id
     @ColumnInfo(name = "update_app") val updateApp: String?,        // 更新对象的应用
     @ColumnInfo(name = "upload_flag") var uploadFlag: String?,      // app端上传数据标记
-    @ColumnInfo(name = "valid") val valid: Int?,                    // 合法标识: 1 合法, 0 非法
+    @ColumnInfo(name = "valid") var valid: Int?,                    // 合法标识: 1 合法, 0 非法
     @ColumnInfo(name = "delivery_state") val deliveryState: Int?,   // BDTP交付状态: 1 已交付, 0 待交付
     @ColumnInfo(name = "d2m_state") val d2mState: Int?,             // 逆向数据的数模同步状态(0:未同步;1:已同步)
     @ColumnInfo(name = "virtual_codes") val virtualCodes: String?,   // 虚点清单: Json 数据格式

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

@@ -117,7 +117,7 @@ class AdmRepository(
         return db.objectDao().getEquipByFloorId(id, "equipment")
     }
 
-    suspend fun getEquipByCode(code: String): EquipmentEntity {
+    suspend fun getEquipByCode(code: String): EquipmentEntity? {
         return db.equipmentDao().getEquipmentByCode(code)
     }
 
@@ -125,7 +125,7 @@ class AdmRepository(
         return db.equipmentDao().getEquipments()
     }
 
-    suspend fun getSysByCode(code: String): SystemEntity {
+    suspend fun getSysByCode(code: String): SystemEntity? {
         return db.systemDao().getSysByCode(code)
     }
 

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

@@ -209,7 +209,8 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
         dialog = EquipListDialog(this)
         dialog.setOnSubmit {
             this.equipEntity = it
-            equipClass.setTvRight(it.systemName + "/" + it.name)
+            equipClass.setTvRight(it.systemName + "/" + it.name + "-" + it.code)
+            localId.setEtRight(it.code + "-")
             graphyVM.getEquipInfosConfig(it)
             graphyVM.getRelConfig(it, deviceId, uuid)
 
@@ -289,7 +290,7 @@ class EquipDetailActivity : BaseActivity(), View.OnTouchListener {
                             if (equip.classCode.equals(eq.code)) {
                                 this.equipEntity = eq
                                 graphyVM.getRelConfig(eq, deviceId, uuid)
-                                equipClass.setTvRight(equipEntity!!.systemName + "/" + equipEntity!!.name)
+                                equipClass.setTvRight(equipEntity!!.systemName + "/" + equipEntity!!.name + "-" + equipEntity!!.code)
                                 graphyVM.getEquipInfosConfig(equipEntity!!)
                                 graphyVM.getEquipment(deviceId)
                                 break

+ 18 - 1
demo/src/main/java/com/sybotan/android/demo/activities/GraphyActivity.kt

@@ -25,6 +25,7 @@ package com.sybotan.android.demo.activities
 
 import android.annotation.SuppressLint
 import android.content.Context
+import android.content.DialogInterface
 import android.content.Intent
 import android.graphics.Color
 import android.graphics.PointF
@@ -40,6 +41,7 @@ import android.webkit.WebViewClient
 import android.widget.TextView
 import android.widget.Toast
 import android.widget.*
+import androidx.appcompat.app.AlertDialog
 import androidx.appcompat.widget.AppCompatEditText
 import androidx.appcompat.widget.LinearLayoutCompat
 import androidx.recyclerview.widget.GridLayoutManager
@@ -605,7 +607,22 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
                                 startActivityForResult(intent, REQUEST_CODE_EQUIP)
                             }
                             equipDelete.setOnClickListener {
-                                graphyVM.insProblemEquip(scene.choseSpace!!, point.data.deviceId!!)
+                                val builder: AlertDialog.Builder =
+                                    AlertDialog.Builder(this@GraphyActivity)
+                                        .setTitle("确认标记/删除设备吗")
+                                        .setPositiveButton("确定",
+                                            DialogInterface.OnClickListener { dialogInterface, i ->
+                                                graphyVM.insProblemEquip(
+                                                    scene.choseSpace!!,
+                                                    point.data.deviceId!!
+                                                )
+                                            }).setNegativeButton("取消",
+                                            DialogInterface.OnClickListener { dialogInterface, i ->
+                                                dialogInterface.dismiss()
+                                            })
+                                builder.create().show()
+
+
                             }
 
                         } else {

+ 1 - 1
demo/src/main/java/com/sybotan/android/demo/bean/result/SpaceEqModel.kt

@@ -11,5 +11,5 @@ class SpaceEqModel {
     var typeName: String? = null
     var children = ArrayList<Children>()
 
-    var isCheck: Boolean = false
+    var isCheck: Boolean = true
 }

+ 1 - 1
demo/src/main/java/com/sybotan/android/demo/bean/result/SpacePipeModel.kt

@@ -12,5 +12,5 @@ class SpacePipeModel {
     var typeName: String? = null
     var children = ArrayList<ChildrenZ>()
 
-    var isCheck: Boolean = false
+    var isCheck: Boolean = true
 }

+ 96 - 0
demo/src/main/java/com/sybotan/android/demo/view/CameraPreview.java

@@ -0,0 +1,96 @@
+package com.sybotan.android.demo.view;
+
+import android.content.Context;
+import android.hardware.Camera;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+
+import java.io.IOException;
+
+/**
+ * Created by lihao.
+ * Date: 2021/10/20
+ */
+//继承SurfaceView并且实现SurfaceHolder.Callback接口
+public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback
+{
+    private static final String TAG = "CameraPreview";
+    private final SurfaceHolder mHolder;
+    private Camera mCamera;
+
+    public CameraPreview(Context context, Camera camera) {
+        super(context);
+        mCamera = camera;
+        mHolder = getHolder();
+        mHolder.addCallback(this);
+        //下面一行适用于Android3.0之前的设备适配,一般可以省略
+        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
+    }
+
+    @Override
+    public void surfaceCreated(SurfaceHolder holder) {
+        //制定相机图像的绘制区域为这个SurfaceView,并且启动相机的预览
+        try {
+            mCamera.setPreviewDisplay(holder);
+            mCamera.startPreview();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public void surfaceDestroyed(SurfaceHolder holder) {
+        //摧毁时释放相机的资源,如果留空的话则需要在activity里释放camera
+        mCamera.release();
+    }
+
+    @Override
+    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
+        //当SurfaceView尺寸变化时(包括设备横屏竖屏改变时时),需要重新设定相关参数
+        if (mHolder.getSurface() == null) {
+            //检查SurfaceView是否存在
+            return;
+        }
+
+        //改变设置前先关闭相机
+        try {
+            mCamera.stopPreview();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        //使用最佳比例配置重启相机
+        try {
+            mCamera.setPreviewDisplay(mHolder);
+            final Camera.Parameters parameters = mCamera.getParameters();
+            final Camera.Size size = getBestPreviewSize(w, h);
+            parameters.setPreviewSize(size.width, size.height);
+            mCamera.setParameters(parameters);
+            mCamera.startPreview();
+        } catch (Exception e) {
+        }
+    }
+
+
+    private Camera.Size getBestPreviewSize(int width, int height) {
+        Camera.Size result = null;
+        final Camera.Parameters p = mCamera.getParameters();
+        //特别注意此处需要规定rate的比是大的比小的,不然有可能出现rate = height/width,但是后面遍历的时候,current_rate = width/height,所以我们限定都为大的比小的。
+        float rate = (float) Math.max(width, height)/ (float)Math.min(width, height);
+        float tmp_diff;
+        float min_diff = 0.1f;
+        for (Camera.Size size : p.getSupportedPreviewSizes()) {
+            float current_rate = (float) Math.max(size.width, size.height)/ (float)Math.min(size.width, size.height);
+            tmp_diff = Math.abs(current_rate-rate);
+//            if( min_diff < 0){
+//                min_diff = tmp_diff ;
+//                result = size;
+//            }
+            if( tmp_diff < min_diff ){
+                min_diff = tmp_diff ;
+                result = size;
+            }
+        }
+        return result;
+    }
+
+}

+ 134 - 108
demo/src/main/java/com/sybotan/android/demo/viewmodel/GraphyVM.kt

@@ -485,7 +485,7 @@ class GraphyVM(
                     val spaceModel = SpaceEqModel()
                     spaceModel.type = equip.classCode
                     var equipEntity = repo.getEquipByCode(equip.classCode)
-                    spaceModel.typeName = equipEntity.name
+                    spaceModel.typeName = equipEntity?.name
                     val child = Children()
                     child.deviceId = equip.id
                     child.name = equip.name
@@ -568,59 +568,47 @@ class GraphyVM(
      * 查询楼层下的管道数据
      */
     fun floorPipe() {
-        viewModelScope.launch {
-            val pipeModels = ArrayList<SpacePipeModel>()
-            val pipes = repo.getPipeByFloorId(floorId)
-            for (pipe in pipes) {
-                var hasParent = false
-                for (model in pipeModels) {
-                    if (model.type!!.equals(pipe.pipeType)) {
-                        val child = ChildrenZ()
-                        val objFrom = repo.getObject(pipe.objFrom!!)
-                        val objTo = repo.getObject(pipe.objTo!!)
-                        val strInfoFrom =
-                            gson.fromJson(objFrom!!.strInfos, StrInfosforEquip::class.java)
-                        child.position.add(PointF(strInfoFrom.location.x, strInfoFrom.location.y))
-
-                        val strInfoTo =
-                            gson.fromJson(objTo!!.strInfos, StrInfosforEquip::class.java)
-                        child.position.add(PointF(strInfoTo.location.x, strInfoTo.location.y))
-                        model.children.add(child)
-                        hasParent = true
-                    }
-                }
-                if (!hasParent) {
-                    val pipeModel = SpacePipeModel()
-                    pipeModel.typeName = pipe.pipeSubType + "--" + pipe.pipeType
-                    pipeModel.type = pipe.pipeType
-                    val child = ChildrenZ()
-                    val objFrom = repo.getObject(pipe.objFrom!!)
-                    val objTo = repo.getObject(pipe.objTo!!)
-                    val strInfoFrom =
-                        gson.fromJson(objFrom!!.strInfos, StrInfosforEquip::class.java)
-                    child.position.add(PointF(strInfoFrom.location.x, strInfoFrom.location.y))
-
-                    val strInfoTo = gson.fromJson(objTo!!.strInfos, StrInfosforEquip::class.java)
-                    child.position.add(PointF(strInfoTo.location.x, strInfoTo.location.y))
-                    pipeModel.children.add(child)
-                    pipeModels.add(pipeModel)
-                }
-
-            }
-            mEmitter.SendDircetive(SPACE_PIPE, pipeModels)
-        }
-//        val bean = ReqFloorPipe()
-//        bean.floorId = floorId
-//        val observable = RetrofitFactory.getInstance().floorPipe(getRequestBody(bean))
-//        sendRequest(
-//            observable,
-//            object : BaseObserver<ArrayList<SpacePipeModel>>(mActivity, this) {
-//                override fun onSuccess(models: java.util.ArrayList<SpacePipeModel>) {
-//                    mEmitter.SendDircetive(SPACE_PIPE, models)
+//        viewModelScope.launch {
+//            val pipeModels = ArrayList<SpacePipeModel>()
+//            val pipes = repo.getPipeByFloorId(floorId)
+//            for (pipe in pipes) {
+//                var hasParent = false
+//                for (model in pipeModels) {
+//                    if (model.type!!.equals(pipe.pipeType)) {
+//                        val child = ChildrenZ()
+//                        val objFrom = repo.getObject(pipe.objFrom!!)
+//                        val objTo = repo.getObject(pipe.objTo!!)
+//                        val strInfoFrom =
+//                            gson.fromJson(objFrom!!.strInfos, StrInfosforEquip::class.java)
+//                        child.position.add(PointF(strInfoFrom.location.x, strInfoFrom.location.y))
+//
+//                        val strInfoTo =
+//                            gson.fromJson(objTo!!.strInfos, StrInfosforEquip::class.java)
+//                        child.position.add(PointF(strInfoTo.location.x, strInfoTo.location.y))
+//                        model.children.add(child)
+//                        hasParent = true
+//                    }
 //                }
-//            },
-//            true
-//        )
+//                if (!hasParent) {
+//                    val pipeModel = SpacePipeModel()
+//                    pipeModel.typeName = pipe.pipeSubType + "--" + pipe.pipeType
+//                    pipeModel.type = pipe.pipeType
+//                    val child = ChildrenZ()
+//                    val objFrom = repo.getObject(pipe.objFrom!!)
+//                    val objTo = repo.getObject(pipe.objTo!!)
+//                    val strInfoFrom =
+//                        gson.fromJson(objFrom!!.strInfos, StrInfosforEquip::class.java)
+//                    child.position.add(PointF(strInfoFrom.location.x, strInfoFrom.location.y))
+//
+//                    val strInfoTo = gson.fromJson(objTo!!.strInfos, StrInfosforEquip::class.java)
+//                    child.position.add(PointF(strInfoTo.location.x, strInfoTo.location.y))
+//                    pipeModel.children.add(child)
+//                    pipeModels.add(pipeModel)
+//                }
+//
+//            }
+//            mEmitter.SendDircetive(SPACE_PIPE, pipeModels)
+//        }
     }
 
     fun getInfosConfig(spaceId: String) {
@@ -680,7 +668,7 @@ class GraphyVM(
             for (equip in equips) {
                 if (!TextUtils.isEmpty(equip.systemCode)) {
                     val systemEntity = repo.getSysByCode(equip.systemCode!!)
-                    equip.systemName = systemEntity.name
+                    equip.systemName = systemEntity?.name
                 }
             }
             mEmitter.SendDircetive(EQUIP_CLASS, equips)
@@ -771,7 +759,9 @@ class GraphyVM(
             } else {
                 val equip = repo.getObject(deviceId!!)
 //                equip!!.infos = JSONObject(hashMap as Map<*, *>)
-                equip!!.strInfos = gson.toJson(hashMap)
+                equip!!.classCode = equipEntity.code!!
+                equip.localId = localId
+                equip.strInfos = gson.toJson(hashMap)
                 repo.insObject(equip)
             }
             //插入文件数据
@@ -848,13 +838,16 @@ class GraphyVM(
                 if (!CommonUtils.IsNull(relsFrom)) {
                     var relRealFrom = ArrayList<RelationEntity>()
                     relRealFrom.addAll(relsFrom)
-                    for (rel in relRealFrom) {
+                    val iterator = relRealFrom.iterator()
+                    while (iterator.hasNext()) {
+                        val rel = iterator.next()
                         val objFrom = repo.getObject(rel.objFrom!!)
                         val objTo = repo.getObject(rel.objTo!!)
                         if (objFrom == null) {
                             rel.objFromLocalId = "该设备"
                             if (!entity.code.equals(config.classCodeFrom)) {
-                                relRealFrom.remove(rel)
+//                                relRealFrom.remove(rel)
+                                iterator.remove()
                                 continue
                             }
                         } else {
@@ -864,14 +857,16 @@ class GraphyVM(
                                 rel.objFromLocalId = objFrom.localId
                             }
                             if (!objFrom.classCode.equals(config.classCodeFrom)) {
-                                relRealFrom.remove(rel)
+//                                relRealFrom.remove(rel)
+                                iterator.remove()
                                 continue
                             }
                         }
                         if (objTo == null) {
                             rel.objToLocalId = "该设备"
                             if (!entity.code.equals(config.classCodeTo)) {
-                                relRealFrom.remove(rel)
+//                                relRealFrom.remove(rel)
+                                iterator.remove()
                                 continue
                             }
                         } else {
@@ -881,11 +876,15 @@ class GraphyVM(
                                 rel.objToLocalId = objTo.localId
                             }
                             if (!objTo.classCode.equals(config.classCodeTo)) {
-                                relRealFrom.remove(rel)
+//                                relRealFrom.remove(rel)
+                                iterator.remove()
                                 continue
                             }
                         }
                     }
+                    for (rel in relRealFrom) {
+
+                    }
                     relList.add(relRealFrom)
                 } else {
                     relList.add(ArrayList<RelationEntity>())
@@ -894,18 +893,18 @@ class GraphyVM(
                 pack.entity = config
                 if (config.objTypeFrom.equals("equipment")) {
                     val equipmentFrom = repo.getEquipByCode(config.classCodeFrom!!)
-                    pack.fromName = equipmentFrom.name
+                    pack.fromName = equipmentFrom?.name
                 } else {
                     val equipmentFrom = repo.getSysByCode(config.classCodeFrom!!)
-                    pack.fromName = equipmentFrom.name
+                    pack.fromName = equipmentFrom?.name
 
                 }
                 if (config.objTypeTo.equals("equipment")) {
                     val equipmentTo = repo.getEquipByCode(config.classCodeTo!!)
-                    pack.toName = equipmentTo.name
+                    pack.toName = equipmentTo?.name
                 } else {
                     val equipmentTo = repo.getSysByCode(config.classCodeTo!!)
-                    pack.toName = equipmentTo.name
+                    pack.toName = equipmentTo?.name
                 }
                 configParent.add(pack)
             }
@@ -916,13 +915,16 @@ class GraphyVM(
                 if (!CommonUtils.IsNull(relsTo)) {
                     var relRealTo = ArrayList<RelationEntity>()
                     relRealTo.addAll(relsTo)
-                    for (rel in relRealTo) {
+                    val iterator = relRealTo.iterator()
+                    while (iterator.hasNext()) {
+                        val rel = iterator.next()
                         val objFrom = repo.getObject(rel.objFrom!!)
                         val objTo = repo.getObject(rel.objTo!!)
                         if (objFrom == null) {
                             rel.objFromLocalId = "该设备"
                             if (!entity.code.equals(config.classCodeFrom)) {
-                                relRealTo.remove(rel)
+//                                relRealTo.remove(rel)
+                                iterator.remove()
                                 continue
                             }
                         } else {
@@ -932,14 +934,16 @@ class GraphyVM(
                                 rel.objFromLocalId = objFrom.localId
                             }
                             if (!objFrom.classCode.equals(config.classCodeFrom)) {
-                                relRealTo.remove(rel)
+//                                relRealTo.remove(rel)
+                                iterator.remove()
                                 continue
                             }
                         }
                         if (objTo == null) {
                             rel.objToLocalId = "该设备"
                             if (!entity.code.equals(config.classCodeTo)) {
-                                relRealTo.remove(rel)
+//                                relRealTo.remove(rel)
+                                iterator.remove()
                                 continue
                             }
                         } else {
@@ -949,11 +953,13 @@ class GraphyVM(
                                 rel.objToLocalId = objTo.localId
                             }
                             if (!objTo.classCode.equals(config.classCodeTo)) {
-                                relRealTo.remove(rel)
+//                                relRealTo.remove(rel)
+                                iterator.remove()
                                 continue
                             }
                         }
                     }
+
                     relList.add(relRealTo)
                 } else {
                     relList.add(ArrayList<RelationEntity>())
@@ -962,18 +968,18 @@ class GraphyVM(
                 pack.entity = config
                 if (config.objTypeFrom.equals("equipment")) {
                     val equipmentFrom = repo.getEquipByCode(config.classCodeFrom!!)
-                    pack.fromName = equipmentFrom.name
+                    pack.fromName = equipmentFrom?.name
                 } else {
                     val equipmentFrom = repo.getSysByCode(config.classCodeFrom!!)
-                    pack.fromName = equipmentFrom.name
+                    pack.fromName = equipmentFrom?.name
 
                 }
                 if (config.objTypeTo.equals("equipment")) {
                     val equipmentTo = repo.getEquipByCode(config.classCodeTo!!)
-                    pack.toName = equipmentTo.name
+                    pack.toName = equipmentTo?.name
                 } else {
                     val equipmentTo = repo.getSysByCode(config.classCodeTo!!)
-                    pack.toName = equipmentTo.name
+                    pack.toName = equipmentTo?.name
                 }
                 configParent.add(pack)
 
@@ -996,13 +1002,16 @@ class GraphyVM(
                 if (!CommonUtils.IsNull(pipeFrom)) {
                     var pipeRealFrom = ArrayList<PipeEntity>()
                     pipeRealFrom.addAll(pipeFrom)
-                    for (rel in pipeRealFrom) {
+                    val iterator = pipeRealFrom.iterator()
+                    while (iterator.hasNext()) {
+                        val rel = iterator.next()
                         val objFrom = repo.getObject(rel.objFrom!!)
                         val objTo = repo.getObject(rel.objTo!!)
                         if (objFrom == null) {
                             rel.objFromLocalId = "该设备"
                             if (!entity.code.equals(config.classCodeFrom)) {
-                                pipeRealFrom.remove(rel)
+//                                pipeRealFrom.remove(rel)
+                                iterator.remove()
                                 continue
                             }
                         } else {
@@ -1012,14 +1021,16 @@ class GraphyVM(
                                 rel.objFromLocalId = objFrom.localId
                             }
                             if (!objFrom.classCode.equals(config.classCodeFrom)) {
-                                pipeRealFrom.remove(rel)
+//                                pipeRealFrom.remove(rel)
+                                iterator.remove()
                                 continue
                             }
                         }
                         if (objTo == null) {
                             rel.objToLocalId = "该设备"
                             if (!entity.code.equals(config.classCodeTo)) {
-                                pipeRealFrom.remove(rel)
+//                                pipeRealFrom.remove(rel)
+                                iterator.remove()
                                 continue
                             }
                         } else {
@@ -1029,7 +1040,8 @@ class GraphyVM(
                                 rel.objToLocalId = objTo.localId
                             }
                             if (!objTo.classCode.equals(config.classCodeTo)) {
-                                pipeRealFrom.remove(rel)
+//                                pipeRealFrom.remove(rel)
+                                iterator.remove()
                                 continue
                             }
                         }
@@ -1041,9 +1053,9 @@ class GraphyVM(
                 val pack = PipeConfigEntityPackClass()
                 pack.entity = config
                 val equipmentFrom = repo.getEquipByCode(config.classCodeFrom!!)
-                pack.fromName = equipmentFrom.name
+                pack.fromName = equipmentFrom?.name
                 val equipmentTo = repo.getEquipByCode(config.classCodeTo!!)
-                pack.toName = equipmentTo.name
+                pack.toName = equipmentTo?.name
                 pipeParent.add(pack)
             }
 
@@ -1053,13 +1065,16 @@ class GraphyVM(
                 if (!CommonUtils.IsNull(pipeFrom)) {
                     var pipeRealFrom = ArrayList<PipeEntity>()
                     pipeRealFrom.addAll(pipeFrom)
-                    for (rel in pipeRealFrom) {
+                    val iterator = pipeRealFrom.iterator()
+                    while (iterator.hasNext()) {
+                        val rel = iterator.next()
                         val objFrom = repo.getObject(rel.objFrom!!)
                         val objTo = repo.getObject(rel.objTo!!)
                         if (objFrom == null) {
                             rel.objFromLocalId = "该设备"
                             if (!entity.code.equals(config.classCodeFrom)) {
-                                pipeRealFrom.remove(rel)
+//                                pipeRealFrom.remove(rel)
+                                iterator.remove()
                                 continue
                             }
                         } else {
@@ -1069,14 +1084,16 @@ class GraphyVM(
                                 rel.objFromLocalId = objFrom.localId
                             }
                             if (!objFrom.classCode.equals(config.classCodeFrom)) {
-                                pipeRealFrom.remove(rel)
+//                                pipeRealFrom.remove(rel)
+                                iterator.remove()
                                 continue
                             }
                         }
                         if (objTo == null) {
                             rel.objToLocalId = "该设备"
                             if (!entity.code.equals(config.classCodeTo)) {
-                                pipeRealFrom.remove(rel)
+//                                pipeRealFrom.remove(rel)
+                                iterator.remove()
                                 continue
                             }
                         } else {
@@ -1086,11 +1103,13 @@ class GraphyVM(
                                 rel.objToLocalId = objTo.localId
                             }
                             if (!objTo.classCode.equals(config.classCodeTo)) {
-                                pipeRealFrom.remove(rel)
+//                                pipeRealFrom.remove(rel)
+                                iterator.remove()
                                 continue
                             }
                         }
                     }
+
                     pipeChildren.add(pipeRealFrom)
                 } else {
                     pipeChildren.add(ArrayList<PipeEntity>())
@@ -1098,9 +1117,9 @@ class GraphyVM(
                 val pack = PipeConfigEntityPackClass()
                 pack.entity = config
                 val equipmentFrom = repo.getEquipByCode(config.classCodeFrom!!)
-                pack.fromName = equipmentFrom.name
+                pack.fromName = equipmentFrom?.name
                 val equipmentTo = repo.getEquipByCode(config.classCodeTo!!)
-                pack.toName = equipmentTo.name
+                pack.toName = equipmentTo?.name
                 pipeParent.add(pack)
             }
             val hashMap1 = HashMap<String, Any>()
@@ -1242,29 +1261,36 @@ class GraphyVM(
 
     fun insProblemEquip(space: TunableSpaceItem, deviceId: String) {
         viewModelScope.launch {
-            val proEntity = repo.getEqProblem(deviceId)
-            if (proEntity == null) {
-                val entity = ProblemEquipEntity(
-                    id = UUID.randomUUID().toString(),
-                    floorId = floorId,
-                    projectId = projectId,
-                    buildingId = buildingId,
-                    equipId = deviceId,
-                    workId = null,
-                    problemType = null,
-                    problemState = 1,
-                    message = null,
-                    creator = null,
-                    creationTime = null,
-                    modifier = null,
-                    modifiedTime = null,
-                    uploadFlag = null,
-                    valid = 1, state = "1"
-                )
-                repo.insProblemEquipEntity(entity)
+            val equip = repo.getObject(deviceId)
+            if (TextUtils.isEmpty(equip?.id)) {
+                val proEntity = repo.getEqProblem(deviceId)
+                if (proEntity == null) {
+                    val entity = ProblemEquipEntity(
+                        id = UUID.randomUUID().toString(),
+                        floorId = floorId,
+                        projectId = projectId,
+                        buildingId = buildingId,
+                        equipId = deviceId,
+                        workId = null,
+                        problemType = null,
+                        problemState = 1,
+                        message = null,
+                        creator = null,
+                        creationTime = null,
+                        modifier = null,
+                        modifiedTime = null,
+                        uploadFlag = null,
+                        valid = 1, state = "1"
+                    )
+                    repo.insProblemEquipEntity(entity)
+                }
+            } else {
+                equip?.valid = 0
+                equip?.state = "1"
+                repo.insObject(equip!!)
             }
+            getSpaceEq(space)
         }
-        getSpaceEq(space)
     }
 
     fun deleteRel(

+ 49 - 0
demo/src/main/java/com/zbar/lib/CaptureActivity.java

@@ -14,8 +14,10 @@ import android.os.Binder;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
+
 import androidx.core.app.ActivityCompat;
 import androidx.core.content.PermissionChecker;
+
 import android.util.Log;
 import android.view.SurfaceHolder;
 import android.view.SurfaceView;
@@ -100,6 +102,51 @@ public class CaptureActivity extends Activity implements SurfaceHolder.Callback
 
     }
 
+    Handler handler = new Handler();
+
+    Runnable runnable = new Runnable() {
+        @Override
+        public void run() {
+            if (mCameraManager != null) {
+                mCameraManager.autoFocus();
+            }
+            handler.postDelayed(runnable, 2000);
+        }
+    };
+
+//    private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) {
+//        final double ASPECT_TOLERANCE = 0.1;
+//        double targetRatio = (double) w / h;
+//        if (sizes == null) return null;
+//
+//        Camera.Size optimalSize = null;
+//        double minDiff = Double.MAX_VALUE;
+//
+//        int targetHeight = h;
+//
+//// Try to find an size match aspect ratio and size
+//        for (Camera.Size size : sizes) {
+//            double ratio = (double) size.width / size.height;
+//            if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
+//            if (Math.abs(size.height - targetHeight) < minDiff) {
+//                optimalSize = size;
+//                minDiff = Math.abs(size.height - targetHeight);
+//            }
+//        }
+//
+//// Cannot find the one match the aspect ratio, ignore the requirement
+//        if (optimalSize == null) {
+//            minDiff = Double.MAX_VALUE;
+//            for (Camera.Size size : sizes) {
+//                if (Math.abs(size.height - targetHeight) < minDiff) {
+//                    optimalSize = size;
+//                    minDiff = Math.abs(size.height - targetHeight);
+//                }
+//            }
+//        }
+//        return optimalSize;
+//    }
+
     @Override
     protected void onResume() {
         super.onResume();
@@ -112,6 +159,7 @@ public class CaptureActivity extends Activity implements SurfaceHolder.Callback
                 mHolder.addCallback(this);
                 mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
             }
+            handler.postDelayed(runnable, 2000);
         }
     }
 
@@ -132,6 +180,7 @@ public class CaptureActivity extends Activity implements SurfaceHolder.Callback
         if (!isHasSurface) {
             scanPreview.getHolder().removeCallback(this);
         }
+        handler.removeCallbacksAndMessages(null);
     }
 
     //region 初始化和回收相关资源

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

@@ -4,7 +4,7 @@
     android:layout_height="match_parent"
     android:orientation="vertical" >
 
-    <SurfaceView
+    <com.sybotan.android.demo.view.CameraPreview
         android:id="@+id/capture_preview"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />

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

@@ -179,6 +179,7 @@
                 android:layout_marginTop="12dp"
                 android:layout_marginRight="65dp"
                 android:hint="输入数字化交付编码"
+                android:textColor="@color/black_272727"
                 android:textColorHint="@color/grey_500"
                 android:textSize="16sp"
                 android:visibility="gone" />
@@ -337,6 +338,7 @@
                 android:layout_marginRight="50dp"
                 android:hint="距离地面高度,米"
                 android:inputType="numberDecimal"
+                android:textColor="@color/black_272727"
                 android:textColorHint="@color/grey_500"
                 android:textSize="16sp" />
 
@@ -726,6 +728,7 @@
                 android:layout_marginRight="65dp"
                 android:hint="距离地面高度,米"
                 android:inputType="numberDecimal"
+                android:textColor="@color/black_272727"
                 android:textColorHint="@color/grey_500"
                 android:textSize="16sp" />
 
@@ -819,6 +822,7 @@
                 android:layout_marginTop="8dp"
                 android:layout_marginRight="65dp"
                 android:hint="请输入辅助信息"
+                android:textColor="@color/black_272727"
                 android:textColorHint="@color/grey_500"
                 android:textSize="16sp" />
 
@@ -901,6 +905,7 @@
                 android:gravity="start"
                 android:hint="请输入问题描述"
                 android:padding="5dp"
+                android:textColor="@color/black_272727"
                 android:textSize="13sp" />
 
             <TextView

+ 4 - 1
demo/src/main/res/layout/layout_common_list_item1.xml

@@ -5,6 +5,7 @@
     <!--android:background="@drawable/createclickbg"-->
 
     <RelativeLayout
+        android:id="@+id/rl"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_centerVertical="true"
@@ -55,11 +56,13 @@
 
     <EditText
         android:id="@+id/et_right"
-        android:layout_width="wrap_content"
+        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:background="@null"
         android:gravity="right"
         android:hint="请输入"

+ 1 - 1
gradle.properties

@@ -24,7 +24,7 @@ SAGA_GROUP=cn.sagacloud
 SYBOTAN_KOTLIN_VERSION=1.2.42
 android.useAndroidX=true
 LICENSE_NAME=The Apache Software License, Version 2.0
-SAGA_CODE=5
+SAGA_CODE=7
 MAVEN_REPO_SNAPSHOT_URL=http\://dev.dp.sagacloud.cn\:8082/repository/maven-snapshots/
 NEXUS_USERNAME=saga
 DEVELOPER_ID=Andy.Sybotan