diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index b007d28..7cb37f7 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -31,5 +31,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index b007d28..7cb37f7 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -31,5 +31,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 04f725b..9a00059 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -64,7 +64,7 @@
}
dependencies {
-//基础依赖库
+ //基础依赖库
implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.10'
implementation 'androidx.core:core-ktx:1.9.0'
def androidx_version = '1.6.1'
@@ -120,4 +120,5 @@
//生成二维码
implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
implementation project(':sdk')
+ implementation 'com.rokid.ai.glass:instructsdk:1.7.8'
}
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index b007d28..7cb37f7 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -31,5 +31,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 04f725b..9a00059 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -64,7 +64,7 @@
}
dependencies {
-//基础依赖库
+ //基础依赖库
implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.10'
implementation 'androidx.core:core-ktx:1.9.0'
def androidx_version = '1.6.1'
@@ -120,4 +120,5 @@
//生成二维码
implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
implementation project(':sdk')
+ implementation 'com.rokid.ai.glass:instructsdk:1.7.8'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index de85667..50019c7 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -70,6 +70,14 @@
android:name=".view.CheckModeActivity"
android:screenOrientation="landscape" />
+
+
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index b007d28..7cb37f7 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -31,5 +31,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 04f725b..9a00059 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -64,7 +64,7 @@
}
dependencies {
-//基础依赖库
+ //基础依赖库
implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.10'
implementation 'androidx.core:core-ktx:1.9.0'
def androidx_version = '1.6.1'
@@ -120,4 +120,5 @@
//生成二维码
implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
implementation project(':sdk')
+ implementation 'com.rokid.ai.glass:instructsdk:1.7.8'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index de85667..50019c7 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -70,6 +70,14 @@
android:name=".view.CheckModeActivity"
android:screenOrientation="landscape" />
+
+
diff --git a/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
new file mode 100644
index 0000000..1deea58
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
@@ -0,0 +1,18 @@
+package com.casic.br.ar.app.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class TopViewPagerAdapter(
+ fragmentManager: FragmentManager,
+ private val pageTitles: Array,
+ private val pages: List
+) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
+
+ override fun getItem(position: Int) = pages[position]
+
+ override fun getCount() = pages.size
+
+ override fun getPageTitle(position: Int) = pageTitles[position]
+}
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index b007d28..7cb37f7 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -31,5 +31,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 04f725b..9a00059 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -64,7 +64,7 @@
}
dependencies {
-//基础依赖库
+ //基础依赖库
implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.10'
implementation 'androidx.core:core-ktx:1.9.0'
def androidx_version = '1.6.1'
@@ -120,4 +120,5 @@
//生成二维码
implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
implementation project(':sdk')
+ implementation 'com.rokid.ai.glass:instructsdk:1.7.8'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index de85667..50019c7 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -70,6 +70,14 @@
android:name=".view.CheckModeActivity"
android:screenOrientation="landscape" />
+
+
diff --git a/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
new file mode 100644
index 0000000..1deea58
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
@@ -0,0 +1,18 @@
+package com.casic.br.ar.app.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class TopViewPagerAdapter(
+ fragmentManager: FragmentManager,
+ private val pageTitles: Array,
+ private val pages: List
+) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
+
+ override fun getItem(position: Int) = pages[position]
+
+ override fun getCount() = pages.size
+
+ override fun getPageTitle(position: Int) = pageTitles[position]
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
index 66f49cf..cf7240b 100644
--- a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
@@ -2,6 +2,8 @@
import android.app.Application
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.rokid.glass.instruct.VoiceInstruction
+import org.opencv.android.OpenCVLoader
class BaseApplication : Application() {
@@ -10,5 +12,8 @@
override fun onCreate() {
super.onCreate()
SaveKeyValues.initSharedPreferences(this)
+ VoiceInstruction.init(this, false)
+ //初始化OpenCV
+ OpenCVLoader.initLocal()
}
}
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index b007d28..7cb37f7 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -31,5 +31,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 04f725b..9a00059 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -64,7 +64,7 @@
}
dependencies {
-//基础依赖库
+ //基础依赖库
implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.10'
implementation 'androidx.core:core-ktx:1.9.0'
def androidx_version = '1.6.1'
@@ -120,4 +120,5 @@
//生成二维码
implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
implementation project(':sdk')
+ implementation 'com.rokid.ai.glass:instructsdk:1.7.8'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index de85667..50019c7 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -70,6 +70,14 @@
android:name=".view.CheckModeActivity"
android:screenOrientation="landscape" />
+
+
diff --git a/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
new file mode 100644
index 0000000..1deea58
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
@@ -0,0 +1,18 @@
+package com.casic.br.ar.app.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class TopViewPagerAdapter(
+ fragmentManager: FragmentManager,
+ private val pageTitles: Array,
+ private val pages: List
+) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
+
+ override fun getItem(position: Int) = pages[position]
+
+ override fun getCount() = pages.size
+
+ override fun getPageTitle(position: Int) = pageTitles[position]
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
index 66f49cf..cf7240b 100644
--- a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
@@ -2,6 +2,8 @@
import android.app.Application
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.rokid.glass.instruct.VoiceInstruction
+import org.opencv.android.OpenCVLoader
class BaseApplication : Application() {
@@ -10,5 +12,8 @@
override fun onCreate() {
super.onCreate()
SaveKeyValues.initSharedPreferences(this)
+ VoiceInstruction.init(this, false)
+ //初始化OpenCV
+ OpenCVLoader.initLocal()
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt b/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt
new file mode 100644
index 0000000..86be402
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt
@@ -0,0 +1,120 @@
+package com.casic.br.ar.app.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.R
+import com.casic.br.ar.app.databinding.FragmentCheckManifestBinding
+import com.casic.br.ar.app.model.SceneCheckManifestModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.vm.CheckManifestViewModel
+import com.casic.br.ar.app.vm.ConfigViewModel
+import com.casic.br.ar.app.widgets.CheckStandardSheet
+import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
+import com.pengxh.kt.lite.adapter.ViewHolder
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class CheckManifestFragment : KotlinBaseFragment() {
+
+ private val kTag = "CheckManifestFragment"
+ private lateinit var configViewModel: ConfigViewModel
+ private lateinit var checkManifestViewModel: CheckManifestViewModel
+
+ override fun initEvent() {
+
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ //detectedScene转为字典值
+ configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java]
+ configViewModel.getDictionaryByCode(requireContext(), "securityScene")
+ configViewModel.dictionary.observe(this) {
+ if (it.code == 200) {
+ for (dic in it.data) {
+ if (dic.name == RuntimeCache.sceneName) {
+ checkManifestViewModel.getCheckManifestByScene(requireContext(), dic.value)
+ return@observe
+ }
+ }
+ }
+ }
+
+ checkManifestViewModel = ViewModelProvider(this)[CheckManifestViewModel::class.java]
+ checkManifestViewModel.sceneManifestResult.observe(this) {
+ if (it.code == 200) {
+ //去重
+ val mainClassSet = HashSet()
+ it.data.forEach { row ->
+ mainClassSet.add(row.typeName)
+ }
+ val typeNameAdapter = object : NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_l_2, mainClassSet.toMutableList()
+ ) {
+ override fun convertView(viewHolder: ViewHolder, position: Int, item: String) {
+ viewHolder.setText(R.id.troubleMainClassView, item)
+ }
+ }
+ binding.leftRecyclerView.adapter = typeNameAdapter
+
+ if (mainClassSet.isEmpty()) {
+ return@observe
+ }
+ //默认加载第一项的数据
+ initSubRecyclerView(it, mainClassSet.first())
+ typeNameAdapter.setOnItemClickedListener(object :
+ NormalRecyclerAdapter.OnItemClickedListener {
+ override fun onItemClicked(position: Int, t: String) {
+ initSubRecyclerView(it, t)
+ }
+ })
+ }
+ }
+ }
+
+ private fun initSubRecyclerView(parent: SceneCheckManifestModel, selectedType: String) {
+ //根据大类查询隐患内容
+ val contentSet = HashSet()
+ for (row in parent.data) {
+ if (row.typeName == selectedType) {
+ contentSet.add(row.checkItem)
+ }
+ }
+ val contentAdapter = object : NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_l_3, contentSet.toMutableList()
+ ) {
+ override fun convertView(viewHolder: ViewHolder, position: Int, item: String) {
+ viewHolder.setText(R.id.troubleIndexView, "${position + 1}、")
+ .setText(R.id.troubleNameView, item)
+ .setOnClickListener(R.id.showImageView) {
+ //显示行业标准
+ for (row in parent.data) {
+ if (row.checkItem == item) {
+ CheckStandardSheet.Builder()
+ .setContext(requireContext())
+ .setSheetValue(row.checkStandard)
+ .build().show()
+ return@setOnClickListener
+ }
+ }
+ }
+ }
+ }
+ binding.rightRecyclerView.adapter = contentAdapter
+ }
+
+ override fun initViewBinding(
+ inflater: LayoutInflater,
+ container: ViewGroup?
+ ): FragmentCheckManifestBinding {
+ return FragmentCheckManifestBinding.inflate(inflater, container, false)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index b007d28..7cb37f7 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -31,5 +31,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 04f725b..9a00059 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -64,7 +64,7 @@
}
dependencies {
-//基础依赖库
+ //基础依赖库
implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.10'
implementation 'androidx.core:core-ktx:1.9.0'
def androidx_version = '1.6.1'
@@ -120,4 +120,5 @@
//生成二维码
implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
implementation project(':sdk')
+ implementation 'com.rokid.ai.glass:instructsdk:1.7.8'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index de85667..50019c7 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -70,6 +70,14 @@
android:name=".view.CheckModeActivity"
android:screenOrientation="landscape" />
+
+
diff --git a/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
new file mode 100644
index 0000000..1deea58
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
@@ -0,0 +1,18 @@
+package com.casic.br.ar.app.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class TopViewPagerAdapter(
+ fragmentManager: FragmentManager,
+ private val pageTitles: Array,
+ private val pages: List
+) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
+
+ override fun getItem(position: Int) = pages[position]
+
+ override fun getCount() = pages.size
+
+ override fun getPageTitle(position: Int) = pageTitles[position]
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
index 66f49cf..cf7240b 100644
--- a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
@@ -2,6 +2,8 @@
import android.app.Application
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.rokid.glass.instruct.VoiceInstruction
+import org.opencv.android.OpenCVLoader
class BaseApplication : Application() {
@@ -10,5 +12,8 @@
override fun onCreate() {
super.onCreate()
SaveKeyValues.initSharedPreferences(this)
+ VoiceInstruction.init(this, false)
+ //初始化OpenCV
+ OpenCVLoader.initLocal()
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt b/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt
new file mode 100644
index 0000000..86be402
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt
@@ -0,0 +1,120 @@
+package com.casic.br.ar.app.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.R
+import com.casic.br.ar.app.databinding.FragmentCheckManifestBinding
+import com.casic.br.ar.app.model.SceneCheckManifestModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.vm.CheckManifestViewModel
+import com.casic.br.ar.app.vm.ConfigViewModel
+import com.casic.br.ar.app.widgets.CheckStandardSheet
+import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
+import com.pengxh.kt.lite.adapter.ViewHolder
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class CheckManifestFragment : KotlinBaseFragment() {
+
+ private val kTag = "CheckManifestFragment"
+ private lateinit var configViewModel: ConfigViewModel
+ private lateinit var checkManifestViewModel: CheckManifestViewModel
+
+ override fun initEvent() {
+
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ //detectedScene转为字典值
+ configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java]
+ configViewModel.getDictionaryByCode(requireContext(), "securityScene")
+ configViewModel.dictionary.observe(this) {
+ if (it.code == 200) {
+ for (dic in it.data) {
+ if (dic.name == RuntimeCache.sceneName) {
+ checkManifestViewModel.getCheckManifestByScene(requireContext(), dic.value)
+ return@observe
+ }
+ }
+ }
+ }
+
+ checkManifestViewModel = ViewModelProvider(this)[CheckManifestViewModel::class.java]
+ checkManifestViewModel.sceneManifestResult.observe(this) {
+ if (it.code == 200) {
+ //去重
+ val mainClassSet = HashSet()
+ it.data.forEach { row ->
+ mainClassSet.add(row.typeName)
+ }
+ val typeNameAdapter = object : NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_l_2, mainClassSet.toMutableList()
+ ) {
+ override fun convertView(viewHolder: ViewHolder, position: Int, item: String) {
+ viewHolder.setText(R.id.troubleMainClassView, item)
+ }
+ }
+ binding.leftRecyclerView.adapter = typeNameAdapter
+
+ if (mainClassSet.isEmpty()) {
+ return@observe
+ }
+ //默认加载第一项的数据
+ initSubRecyclerView(it, mainClassSet.first())
+ typeNameAdapter.setOnItemClickedListener(object :
+ NormalRecyclerAdapter.OnItemClickedListener {
+ override fun onItemClicked(position: Int, t: String) {
+ initSubRecyclerView(it, t)
+ }
+ })
+ }
+ }
+ }
+
+ private fun initSubRecyclerView(parent: SceneCheckManifestModel, selectedType: String) {
+ //根据大类查询隐患内容
+ val contentSet = HashSet()
+ for (row in parent.data) {
+ if (row.typeName == selectedType) {
+ contentSet.add(row.checkItem)
+ }
+ }
+ val contentAdapter = object : NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_l_3, contentSet.toMutableList()
+ ) {
+ override fun convertView(viewHolder: ViewHolder, position: Int, item: String) {
+ viewHolder.setText(R.id.troubleIndexView, "${position + 1}、")
+ .setText(R.id.troubleNameView, item)
+ .setOnClickListener(R.id.showImageView) {
+ //显示行业标准
+ for (row in parent.data) {
+ if (row.checkItem == item) {
+ CheckStandardSheet.Builder()
+ .setContext(requireContext())
+ .setSheetValue(row.checkStandard)
+ .build().show()
+ return@setOnClickListener
+ }
+ }
+ }
+ }
+ }
+ binding.rightRecyclerView.adapter = contentAdapter
+ }
+
+ override fun initViewBinding(
+ inflater: LayoutInflater,
+ container: ViewGroup?
+ ): FragmentCheckManifestBinding {
+ return FragmentCheckManifestBinding.inflate(inflater, container, false)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt b/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt
new file mode 100644
index 0000000..2ddb65c
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt
@@ -0,0 +1,91 @@
+package com.casic.br.ar.app.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.R
+import com.casic.br.ar.app.databinding.FragmentHiddenTroubleBinding
+import com.casic.br.ar.app.extensions.combineFilePath
+import com.casic.br.ar.app.model.HiddenTroubleListResultModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.view.BigImageActivity
+import com.casic.br.ar.app.vm.InspectionViewModel
+import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
+import com.pengxh.kt.lite.adapter.ViewHolder
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.extensions.show
+
+
+class HiddenTroubleFragment : KotlinBaseFragment() {
+
+ private lateinit var inspectionViewModel: InspectionViewModel
+
+ override fun initEvent() {
+
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java]
+ inspectionViewModel.getHiddenTroublesByInspectionId(
+ requireContext(), RuntimeCache.inspectionId
+ )
+ inspectionViewModel.troublesResultModel.observe(this) {
+ if (it.code == 200) {
+ if (it.data.isEmpty()) {
+ binding.tipsView.visibility = View.VISIBLE
+ binding.recyclerView.visibility = View.GONE
+ } else {
+ binding.recyclerView.visibility = View.VISIBLE
+ binding.tipsView.visibility = View.GONE
+
+ val troublesAdapter = object :
+ NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_by_id_l_2, it.data
+ ) {
+ override fun convertView(
+ viewHolder: ViewHolder, position: Int,
+ item: HiddenTroubleListResultModel.DataModel
+ ) {
+ viewHolder.setText(R.id.troubleIndexView, "${position + 1}、")
+ .setText(R.id.troubleNameView, item.name)
+ .setOnClickListener(R.id.deleteTroubleView) {
+ //TODO 删除隐患
+ }
+ .setOnClickListener(R.id.showImageView) {
+ if (item.imageList.isEmpty()) {
+ "此隐患暂无图片".show(requireContext())
+ return@setOnClickListener
+ }
+
+ val images = ArrayList()
+ item.imageList.forEach { imageModel ->
+ images.add(imageModel.alarmImage.combineFilePath())
+ }
+ requireContext().navigatePageTo(0, images)
+ }
+ }
+ }
+ binding.recyclerView.adapter = troublesAdapter
+ }
+ }
+ }
+ }
+
+ override fun initViewBinding(
+ inflater: LayoutInflater,
+ container: ViewGroup?
+ ): FragmentHiddenTroubleBinding {
+ return FragmentHiddenTroubleBinding.inflate(inflater, container, false)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index b007d28..7cb37f7 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -31,5 +31,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 04f725b..9a00059 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -64,7 +64,7 @@
}
dependencies {
-//基础依赖库
+ //基础依赖库
implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.10'
implementation 'androidx.core:core-ktx:1.9.0'
def androidx_version = '1.6.1'
@@ -120,4 +120,5 @@
//生成二维码
implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
implementation project(':sdk')
+ implementation 'com.rokid.ai.glass:instructsdk:1.7.8'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index de85667..50019c7 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -70,6 +70,14 @@
android:name=".view.CheckModeActivity"
android:screenOrientation="landscape" />
+
+
diff --git a/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
new file mode 100644
index 0000000..1deea58
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
@@ -0,0 +1,18 @@
+package com.casic.br.ar.app.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class TopViewPagerAdapter(
+ fragmentManager: FragmentManager,
+ private val pageTitles: Array,
+ private val pages: List
+) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
+
+ override fun getItem(position: Int) = pages[position]
+
+ override fun getCount() = pages.size
+
+ override fun getPageTitle(position: Int) = pageTitles[position]
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
index 66f49cf..cf7240b 100644
--- a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
@@ -2,6 +2,8 @@
import android.app.Application
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.rokid.glass.instruct.VoiceInstruction
+import org.opencv.android.OpenCVLoader
class BaseApplication : Application() {
@@ -10,5 +12,8 @@
override fun onCreate() {
super.onCreate()
SaveKeyValues.initSharedPreferences(this)
+ VoiceInstruction.init(this, false)
+ //初始化OpenCV
+ OpenCVLoader.initLocal()
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt b/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt
new file mode 100644
index 0000000..86be402
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt
@@ -0,0 +1,120 @@
+package com.casic.br.ar.app.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.R
+import com.casic.br.ar.app.databinding.FragmentCheckManifestBinding
+import com.casic.br.ar.app.model.SceneCheckManifestModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.vm.CheckManifestViewModel
+import com.casic.br.ar.app.vm.ConfigViewModel
+import com.casic.br.ar.app.widgets.CheckStandardSheet
+import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
+import com.pengxh.kt.lite.adapter.ViewHolder
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class CheckManifestFragment : KotlinBaseFragment() {
+
+ private val kTag = "CheckManifestFragment"
+ private lateinit var configViewModel: ConfigViewModel
+ private lateinit var checkManifestViewModel: CheckManifestViewModel
+
+ override fun initEvent() {
+
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ //detectedScene转为字典值
+ configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java]
+ configViewModel.getDictionaryByCode(requireContext(), "securityScene")
+ configViewModel.dictionary.observe(this) {
+ if (it.code == 200) {
+ for (dic in it.data) {
+ if (dic.name == RuntimeCache.sceneName) {
+ checkManifestViewModel.getCheckManifestByScene(requireContext(), dic.value)
+ return@observe
+ }
+ }
+ }
+ }
+
+ checkManifestViewModel = ViewModelProvider(this)[CheckManifestViewModel::class.java]
+ checkManifestViewModel.sceneManifestResult.observe(this) {
+ if (it.code == 200) {
+ //去重
+ val mainClassSet = HashSet()
+ it.data.forEach { row ->
+ mainClassSet.add(row.typeName)
+ }
+ val typeNameAdapter = object : NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_l_2, mainClassSet.toMutableList()
+ ) {
+ override fun convertView(viewHolder: ViewHolder, position: Int, item: String) {
+ viewHolder.setText(R.id.troubleMainClassView, item)
+ }
+ }
+ binding.leftRecyclerView.adapter = typeNameAdapter
+
+ if (mainClassSet.isEmpty()) {
+ return@observe
+ }
+ //默认加载第一项的数据
+ initSubRecyclerView(it, mainClassSet.first())
+ typeNameAdapter.setOnItemClickedListener(object :
+ NormalRecyclerAdapter.OnItemClickedListener {
+ override fun onItemClicked(position: Int, t: String) {
+ initSubRecyclerView(it, t)
+ }
+ })
+ }
+ }
+ }
+
+ private fun initSubRecyclerView(parent: SceneCheckManifestModel, selectedType: String) {
+ //根据大类查询隐患内容
+ val contentSet = HashSet()
+ for (row in parent.data) {
+ if (row.typeName == selectedType) {
+ contentSet.add(row.checkItem)
+ }
+ }
+ val contentAdapter = object : NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_l_3, contentSet.toMutableList()
+ ) {
+ override fun convertView(viewHolder: ViewHolder, position: Int, item: String) {
+ viewHolder.setText(R.id.troubleIndexView, "${position + 1}、")
+ .setText(R.id.troubleNameView, item)
+ .setOnClickListener(R.id.showImageView) {
+ //显示行业标准
+ for (row in parent.data) {
+ if (row.checkItem == item) {
+ CheckStandardSheet.Builder()
+ .setContext(requireContext())
+ .setSheetValue(row.checkStandard)
+ .build().show()
+ return@setOnClickListener
+ }
+ }
+ }
+ }
+ }
+ binding.rightRecyclerView.adapter = contentAdapter
+ }
+
+ override fun initViewBinding(
+ inflater: LayoutInflater,
+ container: ViewGroup?
+ ): FragmentCheckManifestBinding {
+ return FragmentCheckManifestBinding.inflate(inflater, container, false)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt b/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt
new file mode 100644
index 0000000..2ddb65c
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt
@@ -0,0 +1,91 @@
+package com.casic.br.ar.app.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.R
+import com.casic.br.ar.app.databinding.FragmentHiddenTroubleBinding
+import com.casic.br.ar.app.extensions.combineFilePath
+import com.casic.br.ar.app.model.HiddenTroubleListResultModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.view.BigImageActivity
+import com.casic.br.ar.app.vm.InspectionViewModel
+import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
+import com.pengxh.kt.lite.adapter.ViewHolder
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.extensions.show
+
+
+class HiddenTroubleFragment : KotlinBaseFragment() {
+
+ private lateinit var inspectionViewModel: InspectionViewModel
+
+ override fun initEvent() {
+
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java]
+ inspectionViewModel.getHiddenTroublesByInspectionId(
+ requireContext(), RuntimeCache.inspectionId
+ )
+ inspectionViewModel.troublesResultModel.observe(this) {
+ if (it.code == 200) {
+ if (it.data.isEmpty()) {
+ binding.tipsView.visibility = View.VISIBLE
+ binding.recyclerView.visibility = View.GONE
+ } else {
+ binding.recyclerView.visibility = View.VISIBLE
+ binding.tipsView.visibility = View.GONE
+
+ val troublesAdapter = object :
+ NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_by_id_l_2, it.data
+ ) {
+ override fun convertView(
+ viewHolder: ViewHolder, position: Int,
+ item: HiddenTroubleListResultModel.DataModel
+ ) {
+ viewHolder.setText(R.id.troubleIndexView, "${position + 1}、")
+ .setText(R.id.troubleNameView, item.name)
+ .setOnClickListener(R.id.deleteTroubleView) {
+ //TODO 删除隐患
+ }
+ .setOnClickListener(R.id.showImageView) {
+ if (item.imageList.isEmpty()) {
+ "此隐患暂无图片".show(requireContext())
+ return@setOnClickListener
+ }
+
+ val images = ArrayList()
+ item.imageList.forEach { imageModel ->
+ images.add(imageModel.alarmImage.combineFilePath())
+ }
+ requireContext().navigatePageTo(0, images)
+ }
+ }
+ }
+ binding.recyclerView.adapter = troublesAdapter
+ }
+ }
+ }
+ }
+
+ override fun initViewBinding(
+ inflater: LayoutInflater,
+ container: ViewGroup?
+ ): FragmentHiddenTroubleBinding {
+ return FragmentHiddenTroubleBinding.inflate(inflater, container, false)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java
new file mode 100644
index 0000000..ba1d738
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java
@@ -0,0 +1,41 @@
+package com.casic.br.ar.app.model;
+
+public class AddHiddenTroubleResultModel {
+
+ private int code;
+ private String data;
+ private String message;
+ private boolean success;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+}
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index b007d28..7cb37f7 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -31,5 +31,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 04f725b..9a00059 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -64,7 +64,7 @@
}
dependencies {
-//基础依赖库
+ //基础依赖库
implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.10'
implementation 'androidx.core:core-ktx:1.9.0'
def androidx_version = '1.6.1'
@@ -120,4 +120,5 @@
//生成二维码
implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
implementation project(':sdk')
+ implementation 'com.rokid.ai.glass:instructsdk:1.7.8'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index de85667..50019c7 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -70,6 +70,14 @@
android:name=".view.CheckModeActivity"
android:screenOrientation="landscape" />
+
+
diff --git a/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
new file mode 100644
index 0000000..1deea58
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
@@ -0,0 +1,18 @@
+package com.casic.br.ar.app.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class TopViewPagerAdapter(
+ fragmentManager: FragmentManager,
+ private val pageTitles: Array,
+ private val pages: List
+) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
+
+ override fun getItem(position: Int) = pages[position]
+
+ override fun getCount() = pages.size
+
+ override fun getPageTitle(position: Int) = pageTitles[position]
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
index 66f49cf..cf7240b 100644
--- a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
@@ -2,6 +2,8 @@
import android.app.Application
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.rokid.glass.instruct.VoiceInstruction
+import org.opencv.android.OpenCVLoader
class BaseApplication : Application() {
@@ -10,5 +12,8 @@
override fun onCreate() {
super.onCreate()
SaveKeyValues.initSharedPreferences(this)
+ VoiceInstruction.init(this, false)
+ //初始化OpenCV
+ OpenCVLoader.initLocal()
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt b/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt
new file mode 100644
index 0000000..86be402
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt
@@ -0,0 +1,120 @@
+package com.casic.br.ar.app.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.R
+import com.casic.br.ar.app.databinding.FragmentCheckManifestBinding
+import com.casic.br.ar.app.model.SceneCheckManifestModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.vm.CheckManifestViewModel
+import com.casic.br.ar.app.vm.ConfigViewModel
+import com.casic.br.ar.app.widgets.CheckStandardSheet
+import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
+import com.pengxh.kt.lite.adapter.ViewHolder
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class CheckManifestFragment : KotlinBaseFragment() {
+
+ private val kTag = "CheckManifestFragment"
+ private lateinit var configViewModel: ConfigViewModel
+ private lateinit var checkManifestViewModel: CheckManifestViewModel
+
+ override fun initEvent() {
+
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ //detectedScene转为字典值
+ configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java]
+ configViewModel.getDictionaryByCode(requireContext(), "securityScene")
+ configViewModel.dictionary.observe(this) {
+ if (it.code == 200) {
+ for (dic in it.data) {
+ if (dic.name == RuntimeCache.sceneName) {
+ checkManifestViewModel.getCheckManifestByScene(requireContext(), dic.value)
+ return@observe
+ }
+ }
+ }
+ }
+
+ checkManifestViewModel = ViewModelProvider(this)[CheckManifestViewModel::class.java]
+ checkManifestViewModel.sceneManifestResult.observe(this) {
+ if (it.code == 200) {
+ //去重
+ val mainClassSet = HashSet()
+ it.data.forEach { row ->
+ mainClassSet.add(row.typeName)
+ }
+ val typeNameAdapter = object : NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_l_2, mainClassSet.toMutableList()
+ ) {
+ override fun convertView(viewHolder: ViewHolder, position: Int, item: String) {
+ viewHolder.setText(R.id.troubleMainClassView, item)
+ }
+ }
+ binding.leftRecyclerView.adapter = typeNameAdapter
+
+ if (mainClassSet.isEmpty()) {
+ return@observe
+ }
+ //默认加载第一项的数据
+ initSubRecyclerView(it, mainClassSet.first())
+ typeNameAdapter.setOnItemClickedListener(object :
+ NormalRecyclerAdapter.OnItemClickedListener {
+ override fun onItemClicked(position: Int, t: String) {
+ initSubRecyclerView(it, t)
+ }
+ })
+ }
+ }
+ }
+
+ private fun initSubRecyclerView(parent: SceneCheckManifestModel, selectedType: String) {
+ //根据大类查询隐患内容
+ val contentSet = HashSet()
+ for (row in parent.data) {
+ if (row.typeName == selectedType) {
+ contentSet.add(row.checkItem)
+ }
+ }
+ val contentAdapter = object : NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_l_3, contentSet.toMutableList()
+ ) {
+ override fun convertView(viewHolder: ViewHolder, position: Int, item: String) {
+ viewHolder.setText(R.id.troubleIndexView, "${position + 1}、")
+ .setText(R.id.troubleNameView, item)
+ .setOnClickListener(R.id.showImageView) {
+ //显示行业标准
+ for (row in parent.data) {
+ if (row.checkItem == item) {
+ CheckStandardSheet.Builder()
+ .setContext(requireContext())
+ .setSheetValue(row.checkStandard)
+ .build().show()
+ return@setOnClickListener
+ }
+ }
+ }
+ }
+ }
+ binding.rightRecyclerView.adapter = contentAdapter
+ }
+
+ override fun initViewBinding(
+ inflater: LayoutInflater,
+ container: ViewGroup?
+ ): FragmentCheckManifestBinding {
+ return FragmentCheckManifestBinding.inflate(inflater, container, false)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt b/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt
new file mode 100644
index 0000000..2ddb65c
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt
@@ -0,0 +1,91 @@
+package com.casic.br.ar.app.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.R
+import com.casic.br.ar.app.databinding.FragmentHiddenTroubleBinding
+import com.casic.br.ar.app.extensions.combineFilePath
+import com.casic.br.ar.app.model.HiddenTroubleListResultModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.view.BigImageActivity
+import com.casic.br.ar.app.vm.InspectionViewModel
+import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
+import com.pengxh.kt.lite.adapter.ViewHolder
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.extensions.show
+
+
+class HiddenTroubleFragment : KotlinBaseFragment() {
+
+ private lateinit var inspectionViewModel: InspectionViewModel
+
+ override fun initEvent() {
+
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java]
+ inspectionViewModel.getHiddenTroublesByInspectionId(
+ requireContext(), RuntimeCache.inspectionId
+ )
+ inspectionViewModel.troublesResultModel.observe(this) {
+ if (it.code == 200) {
+ if (it.data.isEmpty()) {
+ binding.tipsView.visibility = View.VISIBLE
+ binding.recyclerView.visibility = View.GONE
+ } else {
+ binding.recyclerView.visibility = View.VISIBLE
+ binding.tipsView.visibility = View.GONE
+
+ val troublesAdapter = object :
+ NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_by_id_l_2, it.data
+ ) {
+ override fun convertView(
+ viewHolder: ViewHolder, position: Int,
+ item: HiddenTroubleListResultModel.DataModel
+ ) {
+ viewHolder.setText(R.id.troubleIndexView, "${position + 1}、")
+ .setText(R.id.troubleNameView, item.name)
+ .setOnClickListener(R.id.deleteTroubleView) {
+ //TODO 删除隐患
+ }
+ .setOnClickListener(R.id.showImageView) {
+ if (item.imageList.isEmpty()) {
+ "此隐患暂无图片".show(requireContext())
+ return@setOnClickListener
+ }
+
+ val images = ArrayList()
+ item.imageList.forEach { imageModel ->
+ images.add(imageModel.alarmImage.combineFilePath())
+ }
+ requireContext().navigatePageTo(0, images)
+ }
+ }
+ }
+ binding.recyclerView.adapter = troublesAdapter
+ }
+ }
+ }
+ }
+
+ override fun initViewBinding(
+ inflater: LayoutInflater,
+ container: ViewGroup?
+ ): FragmentHiddenTroubleBinding {
+ return FragmentHiddenTroubleBinding.inflate(inflater, container, false)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java
new file mode 100644
index 0000000..ba1d738
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java
@@ -0,0 +1,41 @@
+package com.casic.br.ar.app.model;
+
+public class AddHiddenTroubleResultModel {
+
+ private int code;
+ private String data;
+ private String message;
+ private boolean success;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+}
diff --git a/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java b/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java
new file mode 100644
index 0000000..993ef8d
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java
@@ -0,0 +1,208 @@
+package com.casic.br.ar.app.model;
+
+import java.util.List;
+
+public class SceneCheckManifestModel {
+
+ private int code;
+ private List data;
+ private String message;
+ private boolean success;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public List getData() {
+ return data;
+ }
+
+ public void setData(List data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+
+ public static class DataModel {
+ private List> basisList;
+ private String checkItem;
+ private String checkMethod;
+ private String checkObject;
+ private String checkObjectName;
+ private String checkStandard;
+ private String createTime;
+ private String createUserId;
+ private String createUserName;
+ private String id;
+ private String remark;
+ private String scene;
+ private String sceneName;
+ private String type;
+ private String typeName;
+ private String updateTime;
+ private String updateUserId;
+ private String updateUserName;
+
+ public List> getBasisList() {
+ return basisList;
+ }
+
+ public void setBasisList(List> basisList) {
+ this.basisList = basisList;
+ }
+
+ public String getCheckItem() {
+ return checkItem;
+ }
+
+ public void setCheckItem(String checkItem) {
+ this.checkItem = checkItem;
+ }
+
+ public String getCheckMethod() {
+ return checkMethod;
+ }
+
+ public void setCheckMethod(String checkMethod) {
+ this.checkMethod = checkMethod;
+ }
+
+ public String getCheckObject() {
+ return checkObject;
+ }
+
+ public void setCheckObject(String checkObject) {
+ this.checkObject = checkObject;
+ }
+
+ public String getCheckObjectName() {
+ return checkObjectName;
+ }
+
+ public void setCheckObjectName(String checkObjectName) {
+ this.checkObjectName = checkObjectName;
+ }
+
+ public String getCheckStandard() {
+ return checkStandard;
+ }
+
+ public void setCheckStandard(String checkStandard) {
+ this.checkStandard = checkStandard;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getCreateUserId() {
+ return createUserId;
+ }
+
+ public void setCreateUserId(String createUserId) {
+ this.createUserId = createUserId;
+ }
+
+ public String getCreateUserName() {
+ return createUserName;
+ }
+
+ public void setCreateUserName(String createUserName) {
+ this.createUserName = createUserName;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getScene() {
+ return scene;
+ }
+
+ public void setScene(String scene) {
+ this.scene = scene;
+ }
+
+ public String getSceneName() {
+ return sceneName;
+ }
+
+ public void setSceneName(String sceneName) {
+ this.sceneName = sceneName;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getTypeName() {
+ return typeName;
+ }
+
+ public void setTypeName(String typeName) {
+ this.typeName = typeName;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ public String getUpdateUserId() {
+ return updateUserId;
+ }
+
+ public void setUpdateUserId(String updateUserId) {
+ this.updateUserId = updateUserId;
+ }
+
+ public String getUpdateUserName() {
+ return updateUserName;
+ }
+
+ public void setUpdateUserName(String updateUserName) {
+ this.updateUserName = updateUserName;
+ }
+ }
+}
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index b007d28..7cb37f7 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -31,5 +31,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 04f725b..9a00059 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -64,7 +64,7 @@
}
dependencies {
-//基础依赖库
+ //基础依赖库
implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.10'
implementation 'androidx.core:core-ktx:1.9.0'
def androidx_version = '1.6.1'
@@ -120,4 +120,5 @@
//生成二维码
implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
implementation project(':sdk')
+ implementation 'com.rokid.ai.glass:instructsdk:1.7.8'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index de85667..50019c7 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -70,6 +70,14 @@
android:name=".view.CheckModeActivity"
android:screenOrientation="landscape" />
+
+
diff --git a/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
new file mode 100644
index 0000000..1deea58
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
@@ -0,0 +1,18 @@
+package com.casic.br.ar.app.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class TopViewPagerAdapter(
+ fragmentManager: FragmentManager,
+ private val pageTitles: Array,
+ private val pages: List
+) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
+
+ override fun getItem(position: Int) = pages[position]
+
+ override fun getCount() = pages.size
+
+ override fun getPageTitle(position: Int) = pageTitles[position]
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
index 66f49cf..cf7240b 100644
--- a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
@@ -2,6 +2,8 @@
import android.app.Application
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.rokid.glass.instruct.VoiceInstruction
+import org.opencv.android.OpenCVLoader
class BaseApplication : Application() {
@@ -10,5 +12,8 @@
override fun onCreate() {
super.onCreate()
SaveKeyValues.initSharedPreferences(this)
+ VoiceInstruction.init(this, false)
+ //初始化OpenCV
+ OpenCVLoader.initLocal()
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt b/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt
new file mode 100644
index 0000000..86be402
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt
@@ -0,0 +1,120 @@
+package com.casic.br.ar.app.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.R
+import com.casic.br.ar.app.databinding.FragmentCheckManifestBinding
+import com.casic.br.ar.app.model.SceneCheckManifestModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.vm.CheckManifestViewModel
+import com.casic.br.ar.app.vm.ConfigViewModel
+import com.casic.br.ar.app.widgets.CheckStandardSheet
+import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
+import com.pengxh.kt.lite.adapter.ViewHolder
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class CheckManifestFragment : KotlinBaseFragment() {
+
+ private val kTag = "CheckManifestFragment"
+ private lateinit var configViewModel: ConfigViewModel
+ private lateinit var checkManifestViewModel: CheckManifestViewModel
+
+ override fun initEvent() {
+
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ //detectedScene转为字典值
+ configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java]
+ configViewModel.getDictionaryByCode(requireContext(), "securityScene")
+ configViewModel.dictionary.observe(this) {
+ if (it.code == 200) {
+ for (dic in it.data) {
+ if (dic.name == RuntimeCache.sceneName) {
+ checkManifestViewModel.getCheckManifestByScene(requireContext(), dic.value)
+ return@observe
+ }
+ }
+ }
+ }
+
+ checkManifestViewModel = ViewModelProvider(this)[CheckManifestViewModel::class.java]
+ checkManifestViewModel.sceneManifestResult.observe(this) {
+ if (it.code == 200) {
+ //去重
+ val mainClassSet = HashSet()
+ it.data.forEach { row ->
+ mainClassSet.add(row.typeName)
+ }
+ val typeNameAdapter = object : NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_l_2, mainClassSet.toMutableList()
+ ) {
+ override fun convertView(viewHolder: ViewHolder, position: Int, item: String) {
+ viewHolder.setText(R.id.troubleMainClassView, item)
+ }
+ }
+ binding.leftRecyclerView.adapter = typeNameAdapter
+
+ if (mainClassSet.isEmpty()) {
+ return@observe
+ }
+ //默认加载第一项的数据
+ initSubRecyclerView(it, mainClassSet.first())
+ typeNameAdapter.setOnItemClickedListener(object :
+ NormalRecyclerAdapter.OnItemClickedListener {
+ override fun onItemClicked(position: Int, t: String) {
+ initSubRecyclerView(it, t)
+ }
+ })
+ }
+ }
+ }
+
+ private fun initSubRecyclerView(parent: SceneCheckManifestModel, selectedType: String) {
+ //根据大类查询隐患内容
+ val contentSet = HashSet()
+ for (row in parent.data) {
+ if (row.typeName == selectedType) {
+ contentSet.add(row.checkItem)
+ }
+ }
+ val contentAdapter = object : NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_l_3, contentSet.toMutableList()
+ ) {
+ override fun convertView(viewHolder: ViewHolder, position: Int, item: String) {
+ viewHolder.setText(R.id.troubleIndexView, "${position + 1}、")
+ .setText(R.id.troubleNameView, item)
+ .setOnClickListener(R.id.showImageView) {
+ //显示行业标准
+ for (row in parent.data) {
+ if (row.checkItem == item) {
+ CheckStandardSheet.Builder()
+ .setContext(requireContext())
+ .setSheetValue(row.checkStandard)
+ .build().show()
+ return@setOnClickListener
+ }
+ }
+ }
+ }
+ }
+ binding.rightRecyclerView.adapter = contentAdapter
+ }
+
+ override fun initViewBinding(
+ inflater: LayoutInflater,
+ container: ViewGroup?
+ ): FragmentCheckManifestBinding {
+ return FragmentCheckManifestBinding.inflate(inflater, container, false)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt b/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt
new file mode 100644
index 0000000..2ddb65c
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt
@@ -0,0 +1,91 @@
+package com.casic.br.ar.app.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.R
+import com.casic.br.ar.app.databinding.FragmentHiddenTroubleBinding
+import com.casic.br.ar.app.extensions.combineFilePath
+import com.casic.br.ar.app.model.HiddenTroubleListResultModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.view.BigImageActivity
+import com.casic.br.ar.app.vm.InspectionViewModel
+import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
+import com.pengxh.kt.lite.adapter.ViewHolder
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.extensions.show
+
+
+class HiddenTroubleFragment : KotlinBaseFragment() {
+
+ private lateinit var inspectionViewModel: InspectionViewModel
+
+ override fun initEvent() {
+
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java]
+ inspectionViewModel.getHiddenTroublesByInspectionId(
+ requireContext(), RuntimeCache.inspectionId
+ )
+ inspectionViewModel.troublesResultModel.observe(this) {
+ if (it.code == 200) {
+ if (it.data.isEmpty()) {
+ binding.tipsView.visibility = View.VISIBLE
+ binding.recyclerView.visibility = View.GONE
+ } else {
+ binding.recyclerView.visibility = View.VISIBLE
+ binding.tipsView.visibility = View.GONE
+
+ val troublesAdapter = object :
+ NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_by_id_l_2, it.data
+ ) {
+ override fun convertView(
+ viewHolder: ViewHolder, position: Int,
+ item: HiddenTroubleListResultModel.DataModel
+ ) {
+ viewHolder.setText(R.id.troubleIndexView, "${position + 1}、")
+ .setText(R.id.troubleNameView, item.name)
+ .setOnClickListener(R.id.deleteTroubleView) {
+ //TODO 删除隐患
+ }
+ .setOnClickListener(R.id.showImageView) {
+ if (item.imageList.isEmpty()) {
+ "此隐患暂无图片".show(requireContext())
+ return@setOnClickListener
+ }
+
+ val images = ArrayList()
+ item.imageList.forEach { imageModel ->
+ images.add(imageModel.alarmImage.combineFilePath())
+ }
+ requireContext().navigatePageTo(0, images)
+ }
+ }
+ }
+ binding.recyclerView.adapter = troublesAdapter
+ }
+ }
+ }
+ }
+
+ override fun initViewBinding(
+ inflater: LayoutInflater,
+ container: ViewGroup?
+ ): FragmentHiddenTroubleBinding {
+ return FragmentHiddenTroubleBinding.inflate(inflater, container, false)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java
new file mode 100644
index 0000000..ba1d738
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java
@@ -0,0 +1,41 @@
+package com.casic.br.ar.app.model;
+
+public class AddHiddenTroubleResultModel {
+
+ private int code;
+ private String data;
+ private String message;
+ private boolean success;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+}
diff --git a/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java b/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java
new file mode 100644
index 0000000..993ef8d
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java
@@ -0,0 +1,208 @@
+package com.casic.br.ar.app.model;
+
+import java.util.List;
+
+public class SceneCheckManifestModel {
+
+ private int code;
+ private List data;
+ private String message;
+ private boolean success;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public List getData() {
+ return data;
+ }
+
+ public void setData(List data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+
+ public static class DataModel {
+ private List> basisList;
+ private String checkItem;
+ private String checkMethod;
+ private String checkObject;
+ private String checkObjectName;
+ private String checkStandard;
+ private String createTime;
+ private String createUserId;
+ private String createUserName;
+ private String id;
+ private String remark;
+ private String scene;
+ private String sceneName;
+ private String type;
+ private String typeName;
+ private String updateTime;
+ private String updateUserId;
+ private String updateUserName;
+
+ public List> getBasisList() {
+ return basisList;
+ }
+
+ public void setBasisList(List> basisList) {
+ this.basisList = basisList;
+ }
+
+ public String getCheckItem() {
+ return checkItem;
+ }
+
+ public void setCheckItem(String checkItem) {
+ this.checkItem = checkItem;
+ }
+
+ public String getCheckMethod() {
+ return checkMethod;
+ }
+
+ public void setCheckMethod(String checkMethod) {
+ this.checkMethod = checkMethod;
+ }
+
+ public String getCheckObject() {
+ return checkObject;
+ }
+
+ public void setCheckObject(String checkObject) {
+ this.checkObject = checkObject;
+ }
+
+ public String getCheckObjectName() {
+ return checkObjectName;
+ }
+
+ public void setCheckObjectName(String checkObjectName) {
+ this.checkObjectName = checkObjectName;
+ }
+
+ public String getCheckStandard() {
+ return checkStandard;
+ }
+
+ public void setCheckStandard(String checkStandard) {
+ this.checkStandard = checkStandard;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getCreateUserId() {
+ return createUserId;
+ }
+
+ public void setCreateUserId(String createUserId) {
+ this.createUserId = createUserId;
+ }
+
+ public String getCreateUserName() {
+ return createUserName;
+ }
+
+ public void setCreateUserName(String createUserName) {
+ this.createUserName = createUserName;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getScene() {
+ return scene;
+ }
+
+ public void setScene(String scene) {
+ this.scene = scene;
+ }
+
+ public String getSceneName() {
+ return sceneName;
+ }
+
+ public void setSceneName(String sceneName) {
+ this.sceneName = sceneName;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getTypeName() {
+ return typeName;
+ }
+
+ public void setTypeName(String typeName) {
+ this.typeName = typeName;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ public String getUpdateUserId() {
+ return updateUserId;
+ }
+
+ public void setUpdateUserId(String updateUserId) {
+ this.updateUserId = updateUserId;
+ }
+
+ public String getUpdateUserName() {
+ return updateUserName;
+ }
+
+ public void setUpdateUserName(String updateUserName) {
+ this.updateUserName = updateUserName;
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt
index 4d617a4..43db667 100644
--- a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt
@@ -96,6 +96,15 @@
): String
/**
+ * 添加隐患
+ */
+ @POST("/inspection-record/addAlarm")
+ suspend fun addHiddenTrouble(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
+
+ /**
* 根据场景获取获取隐患目录
*/
@GET("/alarm-menu/listPage")
@@ -119,7 +128,7 @@
* 根据场景获取获取检查清单
*/
@GET("/check-menu/listPage")
- suspend fun getCheckManifestByScene(
+ suspend fun getCheckManifestByPage(
@Header("token") token: String,
@Query("scene") scene: String,
@Query("offset") offset: Int,
@@ -127,6 +136,18 @@
): String
/**
+ * 获取检查清单-不分页
+ */
+ @GET("/check-menu/list")
+ suspend fun getCheckManifest(
+ @Header("token") token: String,
+ @Query("keyword") keyword: String,
+ @Query("type") type: String,
+ @Query("scene") scene: String,
+ @Query("checkObject") checkObject: String
+ ): String
+
+ /**
* 获取指导视频
*/
@GET("/knowledge-base/listPage")
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index b007d28..7cb37f7 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -31,5 +31,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 04f725b..9a00059 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -64,7 +64,7 @@
}
dependencies {
-//基础依赖库
+ //基础依赖库
implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.10'
implementation 'androidx.core:core-ktx:1.9.0'
def androidx_version = '1.6.1'
@@ -120,4 +120,5 @@
//生成二维码
implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
implementation project(':sdk')
+ implementation 'com.rokid.ai.glass:instructsdk:1.7.8'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index de85667..50019c7 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -70,6 +70,14 @@
android:name=".view.CheckModeActivity"
android:screenOrientation="landscape" />
+
+
diff --git a/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
new file mode 100644
index 0000000..1deea58
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
@@ -0,0 +1,18 @@
+package com.casic.br.ar.app.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class TopViewPagerAdapter(
+ fragmentManager: FragmentManager,
+ private val pageTitles: Array,
+ private val pages: List
+) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
+
+ override fun getItem(position: Int) = pages[position]
+
+ override fun getCount() = pages.size
+
+ override fun getPageTitle(position: Int) = pageTitles[position]
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
index 66f49cf..cf7240b 100644
--- a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
@@ -2,6 +2,8 @@
import android.app.Application
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.rokid.glass.instruct.VoiceInstruction
+import org.opencv.android.OpenCVLoader
class BaseApplication : Application() {
@@ -10,5 +12,8 @@
override fun onCreate() {
super.onCreate()
SaveKeyValues.initSharedPreferences(this)
+ VoiceInstruction.init(this, false)
+ //初始化OpenCV
+ OpenCVLoader.initLocal()
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt b/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt
new file mode 100644
index 0000000..86be402
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt
@@ -0,0 +1,120 @@
+package com.casic.br.ar.app.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.R
+import com.casic.br.ar.app.databinding.FragmentCheckManifestBinding
+import com.casic.br.ar.app.model.SceneCheckManifestModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.vm.CheckManifestViewModel
+import com.casic.br.ar.app.vm.ConfigViewModel
+import com.casic.br.ar.app.widgets.CheckStandardSheet
+import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
+import com.pengxh.kt.lite.adapter.ViewHolder
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class CheckManifestFragment : KotlinBaseFragment() {
+
+ private val kTag = "CheckManifestFragment"
+ private lateinit var configViewModel: ConfigViewModel
+ private lateinit var checkManifestViewModel: CheckManifestViewModel
+
+ override fun initEvent() {
+
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ //detectedScene转为字典值
+ configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java]
+ configViewModel.getDictionaryByCode(requireContext(), "securityScene")
+ configViewModel.dictionary.observe(this) {
+ if (it.code == 200) {
+ for (dic in it.data) {
+ if (dic.name == RuntimeCache.sceneName) {
+ checkManifestViewModel.getCheckManifestByScene(requireContext(), dic.value)
+ return@observe
+ }
+ }
+ }
+ }
+
+ checkManifestViewModel = ViewModelProvider(this)[CheckManifestViewModel::class.java]
+ checkManifestViewModel.sceneManifestResult.observe(this) {
+ if (it.code == 200) {
+ //去重
+ val mainClassSet = HashSet()
+ it.data.forEach { row ->
+ mainClassSet.add(row.typeName)
+ }
+ val typeNameAdapter = object : NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_l_2, mainClassSet.toMutableList()
+ ) {
+ override fun convertView(viewHolder: ViewHolder, position: Int, item: String) {
+ viewHolder.setText(R.id.troubleMainClassView, item)
+ }
+ }
+ binding.leftRecyclerView.adapter = typeNameAdapter
+
+ if (mainClassSet.isEmpty()) {
+ return@observe
+ }
+ //默认加载第一项的数据
+ initSubRecyclerView(it, mainClassSet.first())
+ typeNameAdapter.setOnItemClickedListener(object :
+ NormalRecyclerAdapter.OnItemClickedListener {
+ override fun onItemClicked(position: Int, t: String) {
+ initSubRecyclerView(it, t)
+ }
+ })
+ }
+ }
+ }
+
+ private fun initSubRecyclerView(parent: SceneCheckManifestModel, selectedType: String) {
+ //根据大类查询隐患内容
+ val contentSet = HashSet()
+ for (row in parent.data) {
+ if (row.typeName == selectedType) {
+ contentSet.add(row.checkItem)
+ }
+ }
+ val contentAdapter = object : NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_l_3, contentSet.toMutableList()
+ ) {
+ override fun convertView(viewHolder: ViewHolder, position: Int, item: String) {
+ viewHolder.setText(R.id.troubleIndexView, "${position + 1}、")
+ .setText(R.id.troubleNameView, item)
+ .setOnClickListener(R.id.showImageView) {
+ //显示行业标准
+ for (row in parent.data) {
+ if (row.checkItem == item) {
+ CheckStandardSheet.Builder()
+ .setContext(requireContext())
+ .setSheetValue(row.checkStandard)
+ .build().show()
+ return@setOnClickListener
+ }
+ }
+ }
+ }
+ }
+ binding.rightRecyclerView.adapter = contentAdapter
+ }
+
+ override fun initViewBinding(
+ inflater: LayoutInflater,
+ container: ViewGroup?
+ ): FragmentCheckManifestBinding {
+ return FragmentCheckManifestBinding.inflate(inflater, container, false)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt b/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt
new file mode 100644
index 0000000..2ddb65c
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt
@@ -0,0 +1,91 @@
+package com.casic.br.ar.app.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.R
+import com.casic.br.ar.app.databinding.FragmentHiddenTroubleBinding
+import com.casic.br.ar.app.extensions.combineFilePath
+import com.casic.br.ar.app.model.HiddenTroubleListResultModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.view.BigImageActivity
+import com.casic.br.ar.app.vm.InspectionViewModel
+import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
+import com.pengxh.kt.lite.adapter.ViewHolder
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.extensions.show
+
+
+class HiddenTroubleFragment : KotlinBaseFragment() {
+
+ private lateinit var inspectionViewModel: InspectionViewModel
+
+ override fun initEvent() {
+
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java]
+ inspectionViewModel.getHiddenTroublesByInspectionId(
+ requireContext(), RuntimeCache.inspectionId
+ )
+ inspectionViewModel.troublesResultModel.observe(this) {
+ if (it.code == 200) {
+ if (it.data.isEmpty()) {
+ binding.tipsView.visibility = View.VISIBLE
+ binding.recyclerView.visibility = View.GONE
+ } else {
+ binding.recyclerView.visibility = View.VISIBLE
+ binding.tipsView.visibility = View.GONE
+
+ val troublesAdapter = object :
+ NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_by_id_l_2, it.data
+ ) {
+ override fun convertView(
+ viewHolder: ViewHolder, position: Int,
+ item: HiddenTroubleListResultModel.DataModel
+ ) {
+ viewHolder.setText(R.id.troubleIndexView, "${position + 1}、")
+ .setText(R.id.troubleNameView, item.name)
+ .setOnClickListener(R.id.deleteTroubleView) {
+ //TODO 删除隐患
+ }
+ .setOnClickListener(R.id.showImageView) {
+ if (item.imageList.isEmpty()) {
+ "此隐患暂无图片".show(requireContext())
+ return@setOnClickListener
+ }
+
+ val images = ArrayList()
+ item.imageList.forEach { imageModel ->
+ images.add(imageModel.alarmImage.combineFilePath())
+ }
+ requireContext().navigatePageTo(0, images)
+ }
+ }
+ }
+ binding.recyclerView.adapter = troublesAdapter
+ }
+ }
+ }
+ }
+
+ override fun initViewBinding(
+ inflater: LayoutInflater,
+ container: ViewGroup?
+ ): FragmentHiddenTroubleBinding {
+ return FragmentHiddenTroubleBinding.inflate(inflater, container, false)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java
new file mode 100644
index 0000000..ba1d738
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java
@@ -0,0 +1,41 @@
+package com.casic.br.ar.app.model;
+
+public class AddHiddenTroubleResultModel {
+
+ private int code;
+ private String data;
+ private String message;
+ private boolean success;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+}
diff --git a/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java b/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java
new file mode 100644
index 0000000..993ef8d
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java
@@ -0,0 +1,208 @@
+package com.casic.br.ar.app.model;
+
+import java.util.List;
+
+public class SceneCheckManifestModel {
+
+ private int code;
+ private List data;
+ private String message;
+ private boolean success;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public List getData() {
+ return data;
+ }
+
+ public void setData(List data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+
+ public static class DataModel {
+ private List> basisList;
+ private String checkItem;
+ private String checkMethod;
+ private String checkObject;
+ private String checkObjectName;
+ private String checkStandard;
+ private String createTime;
+ private String createUserId;
+ private String createUserName;
+ private String id;
+ private String remark;
+ private String scene;
+ private String sceneName;
+ private String type;
+ private String typeName;
+ private String updateTime;
+ private String updateUserId;
+ private String updateUserName;
+
+ public List> getBasisList() {
+ return basisList;
+ }
+
+ public void setBasisList(List> basisList) {
+ this.basisList = basisList;
+ }
+
+ public String getCheckItem() {
+ return checkItem;
+ }
+
+ public void setCheckItem(String checkItem) {
+ this.checkItem = checkItem;
+ }
+
+ public String getCheckMethod() {
+ return checkMethod;
+ }
+
+ public void setCheckMethod(String checkMethod) {
+ this.checkMethod = checkMethod;
+ }
+
+ public String getCheckObject() {
+ return checkObject;
+ }
+
+ public void setCheckObject(String checkObject) {
+ this.checkObject = checkObject;
+ }
+
+ public String getCheckObjectName() {
+ return checkObjectName;
+ }
+
+ public void setCheckObjectName(String checkObjectName) {
+ this.checkObjectName = checkObjectName;
+ }
+
+ public String getCheckStandard() {
+ return checkStandard;
+ }
+
+ public void setCheckStandard(String checkStandard) {
+ this.checkStandard = checkStandard;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getCreateUserId() {
+ return createUserId;
+ }
+
+ public void setCreateUserId(String createUserId) {
+ this.createUserId = createUserId;
+ }
+
+ public String getCreateUserName() {
+ return createUserName;
+ }
+
+ public void setCreateUserName(String createUserName) {
+ this.createUserName = createUserName;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getScene() {
+ return scene;
+ }
+
+ public void setScene(String scene) {
+ this.scene = scene;
+ }
+
+ public String getSceneName() {
+ return sceneName;
+ }
+
+ public void setSceneName(String sceneName) {
+ this.sceneName = sceneName;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getTypeName() {
+ return typeName;
+ }
+
+ public void setTypeName(String typeName) {
+ this.typeName = typeName;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ public String getUpdateUserId() {
+ return updateUserId;
+ }
+
+ public void setUpdateUserId(String updateUserId) {
+ this.updateUserId = updateUserId;
+ }
+
+ public String getUpdateUserName() {
+ return updateUserName;
+ }
+
+ public void setUpdateUserName(String updateUserName) {
+ this.updateUserName = updateUserName;
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt
index 4d617a4..43db667 100644
--- a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt
@@ -96,6 +96,15 @@
): String
/**
+ * 添加隐患
+ */
+ @POST("/inspection-record/addAlarm")
+ suspend fun addHiddenTrouble(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
+
+ /**
* 根据场景获取获取隐患目录
*/
@GET("/alarm-menu/listPage")
@@ -119,7 +128,7 @@
* 根据场景获取获取检查清单
*/
@GET("/check-menu/listPage")
- suspend fun getCheckManifestByScene(
+ suspend fun getCheckManifestByPage(
@Header("token") token: String,
@Query("scene") scene: String,
@Query("offset") offset: Int,
@@ -127,6 +136,18 @@
): String
/**
+ * 获取检查清单-不分页
+ */
+ @GET("/check-menu/list")
+ suspend fun getCheckManifest(
+ @Header("token") token: String,
+ @Query("keyword") keyword: String,
+ @Query("type") type: String,
+ @Query("scene") scene: String,
+ @Query("checkObject") checkObject: String
+ ): String
+
+ /**
* 获取指导视频
*/
@GET("/knowledge-base/listPage")
diff --git a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt
index 8c35212..beedfe1 100644
--- a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt
@@ -2,7 +2,10 @@
import com.casic.br.ar.app.utils.AuthenticationHelper
import com.casic.br.ar.app.utils.LocaleConstant
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.google.gson.Gson
import com.google.gson.JsonObject
+import com.google.gson.reflect.TypeToken
import com.pengxh.kt.lite.utils.RetrofitFactory
import com.pengxh.kt.lite.utils.SaveKeyValues
import okhttp3.MediaType.Companion.toMediaType
@@ -30,6 +33,9 @@
RetrofitFactory.createRetrofit(httpConfig, timeout = 20)
}
+ private val gson by lazy { Gson() }
+ private val typeToken = object : TypeToken>>() {}.type
+
/**
* 验证PublicKey
*/
@@ -133,6 +139,45 @@
}
/**
+ * 添加隐患
+ */
+ suspend fun addHiddenTrouble(
+ mainClass: String,
+ subClass: String,
+ sceneName: String,
+ subClassName: String,
+ basis: String,
+ alarmMenuId: String,
+ content: String,
+ scene: String,
+ inspectionId: String,
+ name: String,
+ mainClassName: String,
+ id: String,
+ imageList: Array>
+ ): String {
+ val param = JsonObject()
+ param.addProperty("mainClass", mainClass)
+ param.addProperty("subClass", subClass)
+ param.addProperty("sceneName", sceneName)
+ param.addProperty("subClassName", subClassName)
+ param.addProperty("basis", basis)
+ param.addProperty("alarmMenuId", alarmMenuId)
+ param.addProperty("content", content)
+ param.addProperty("scene", scene)
+ param.addProperty("inspectionId", inspectionId)
+ param.addProperty("name", name)
+ param.addProperty("mainClassName", mainClassName)
+ param.addProperty("id", id)
+ param.add("imageList", gson.toJsonTree(imageList, typeToken).asJsonArray)
+ val requestBody = param.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+
+ return api.addHiddenTrouble(AuthenticationHelper.token, requestBody)
+ }
+
+ /**
* 根据场景获取获取隐患目录
*/
suspend fun getHiddenTroubleByScene(scene: String, offset: Int): String {
@@ -151,13 +196,22 @@
/**
* 根据场景获取获取隐患目录
*/
- suspend fun getCheckManifestByScene(scene: String, offset: Int): String {
- return api.getCheckManifestByScene(
+ suspend fun getCheckManifestByPage(scene: String, offset: Int): String {
+ return api.getCheckManifestByPage(
AuthenticationHelper.token, scene, offset, LocaleConstant.PAGE_LIMIT
)
}
/**
+ * 获取检查清单-不分页
+ */
+ suspend fun getCheckManifest(
+ keyword: String, type: String, scene: String, checkObject: String
+ ): String {
+ return api.getCheckManifest(AuthenticationHelper.token, keyword, type, scene, checkObject)
+ }
+
+ /**
* 获取指导视频
*/
suspend fun getGuideVideoByPage(keywords: String, classId: String, offset: Int): String {
@@ -212,17 +266,12 @@
/**
* 推送报警信息
* */
- suspend fun uploadDetectTargetAlarm(
- alamCode: String,
- alarmlmgPath: String,
- inspectionld: String,
- scene: String
- ): String {
+ suspend fun uploadDetectTargetAlarm(alarmCode: String, alarmImgPath: String): String {
val param = JsonObject()
- param.addProperty("alamCode", alamCode)
- param.addProperty("alarmlmgPath", alarmlmgPath)
- param.addProperty("inspectionld", inspectionld)
- param.addProperty("scene", scene)
+ param.addProperty("alarmCode", alarmCode)
+ param.addProperty("alarmImgPath", alarmImgPath)
+ param.addProperty("inspectionId", RuntimeCache.inspectionId)
+ param.addProperty("scene", RuntimeCache.sceneName)
val requestBody = param.toString().toRequestBody(
"application/json;charset=UTF-8".toMediaType()
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index b007d28..7cb37f7 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -31,5 +31,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 04f725b..9a00059 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -64,7 +64,7 @@
}
dependencies {
-//基础依赖库
+ //基础依赖库
implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.10'
implementation 'androidx.core:core-ktx:1.9.0'
def androidx_version = '1.6.1'
@@ -120,4 +120,5 @@
//生成二维码
implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
implementation project(':sdk')
+ implementation 'com.rokid.ai.glass:instructsdk:1.7.8'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index de85667..50019c7 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -70,6 +70,14 @@
android:name=".view.CheckModeActivity"
android:screenOrientation="landscape" />
+
+
diff --git a/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
new file mode 100644
index 0000000..1deea58
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
@@ -0,0 +1,18 @@
+package com.casic.br.ar.app.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class TopViewPagerAdapter(
+ fragmentManager: FragmentManager,
+ private val pageTitles: Array,
+ private val pages: List
+) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
+
+ override fun getItem(position: Int) = pages[position]
+
+ override fun getCount() = pages.size
+
+ override fun getPageTitle(position: Int) = pageTitles[position]
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
index 66f49cf..cf7240b 100644
--- a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
@@ -2,6 +2,8 @@
import android.app.Application
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.rokid.glass.instruct.VoiceInstruction
+import org.opencv.android.OpenCVLoader
class BaseApplication : Application() {
@@ -10,5 +12,8 @@
override fun onCreate() {
super.onCreate()
SaveKeyValues.initSharedPreferences(this)
+ VoiceInstruction.init(this, false)
+ //初始化OpenCV
+ OpenCVLoader.initLocal()
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt b/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt
new file mode 100644
index 0000000..86be402
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt
@@ -0,0 +1,120 @@
+package com.casic.br.ar.app.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.R
+import com.casic.br.ar.app.databinding.FragmentCheckManifestBinding
+import com.casic.br.ar.app.model.SceneCheckManifestModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.vm.CheckManifestViewModel
+import com.casic.br.ar.app.vm.ConfigViewModel
+import com.casic.br.ar.app.widgets.CheckStandardSheet
+import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
+import com.pengxh.kt.lite.adapter.ViewHolder
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class CheckManifestFragment : KotlinBaseFragment() {
+
+ private val kTag = "CheckManifestFragment"
+ private lateinit var configViewModel: ConfigViewModel
+ private lateinit var checkManifestViewModel: CheckManifestViewModel
+
+ override fun initEvent() {
+
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ //detectedScene转为字典值
+ configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java]
+ configViewModel.getDictionaryByCode(requireContext(), "securityScene")
+ configViewModel.dictionary.observe(this) {
+ if (it.code == 200) {
+ for (dic in it.data) {
+ if (dic.name == RuntimeCache.sceneName) {
+ checkManifestViewModel.getCheckManifestByScene(requireContext(), dic.value)
+ return@observe
+ }
+ }
+ }
+ }
+
+ checkManifestViewModel = ViewModelProvider(this)[CheckManifestViewModel::class.java]
+ checkManifestViewModel.sceneManifestResult.observe(this) {
+ if (it.code == 200) {
+ //去重
+ val mainClassSet = HashSet()
+ it.data.forEach { row ->
+ mainClassSet.add(row.typeName)
+ }
+ val typeNameAdapter = object : NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_l_2, mainClassSet.toMutableList()
+ ) {
+ override fun convertView(viewHolder: ViewHolder, position: Int, item: String) {
+ viewHolder.setText(R.id.troubleMainClassView, item)
+ }
+ }
+ binding.leftRecyclerView.adapter = typeNameAdapter
+
+ if (mainClassSet.isEmpty()) {
+ return@observe
+ }
+ //默认加载第一项的数据
+ initSubRecyclerView(it, mainClassSet.first())
+ typeNameAdapter.setOnItemClickedListener(object :
+ NormalRecyclerAdapter.OnItemClickedListener {
+ override fun onItemClicked(position: Int, t: String) {
+ initSubRecyclerView(it, t)
+ }
+ })
+ }
+ }
+ }
+
+ private fun initSubRecyclerView(parent: SceneCheckManifestModel, selectedType: String) {
+ //根据大类查询隐患内容
+ val contentSet = HashSet()
+ for (row in parent.data) {
+ if (row.typeName == selectedType) {
+ contentSet.add(row.checkItem)
+ }
+ }
+ val contentAdapter = object : NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_l_3, contentSet.toMutableList()
+ ) {
+ override fun convertView(viewHolder: ViewHolder, position: Int, item: String) {
+ viewHolder.setText(R.id.troubleIndexView, "${position + 1}、")
+ .setText(R.id.troubleNameView, item)
+ .setOnClickListener(R.id.showImageView) {
+ //显示行业标准
+ for (row in parent.data) {
+ if (row.checkItem == item) {
+ CheckStandardSheet.Builder()
+ .setContext(requireContext())
+ .setSheetValue(row.checkStandard)
+ .build().show()
+ return@setOnClickListener
+ }
+ }
+ }
+ }
+ }
+ binding.rightRecyclerView.adapter = contentAdapter
+ }
+
+ override fun initViewBinding(
+ inflater: LayoutInflater,
+ container: ViewGroup?
+ ): FragmentCheckManifestBinding {
+ return FragmentCheckManifestBinding.inflate(inflater, container, false)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt b/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt
new file mode 100644
index 0000000..2ddb65c
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt
@@ -0,0 +1,91 @@
+package com.casic.br.ar.app.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.R
+import com.casic.br.ar.app.databinding.FragmentHiddenTroubleBinding
+import com.casic.br.ar.app.extensions.combineFilePath
+import com.casic.br.ar.app.model.HiddenTroubleListResultModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.view.BigImageActivity
+import com.casic.br.ar.app.vm.InspectionViewModel
+import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
+import com.pengxh.kt.lite.adapter.ViewHolder
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.extensions.show
+
+
+class HiddenTroubleFragment : KotlinBaseFragment() {
+
+ private lateinit var inspectionViewModel: InspectionViewModel
+
+ override fun initEvent() {
+
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java]
+ inspectionViewModel.getHiddenTroublesByInspectionId(
+ requireContext(), RuntimeCache.inspectionId
+ )
+ inspectionViewModel.troublesResultModel.observe(this) {
+ if (it.code == 200) {
+ if (it.data.isEmpty()) {
+ binding.tipsView.visibility = View.VISIBLE
+ binding.recyclerView.visibility = View.GONE
+ } else {
+ binding.recyclerView.visibility = View.VISIBLE
+ binding.tipsView.visibility = View.GONE
+
+ val troublesAdapter = object :
+ NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_by_id_l_2, it.data
+ ) {
+ override fun convertView(
+ viewHolder: ViewHolder, position: Int,
+ item: HiddenTroubleListResultModel.DataModel
+ ) {
+ viewHolder.setText(R.id.troubleIndexView, "${position + 1}、")
+ .setText(R.id.troubleNameView, item.name)
+ .setOnClickListener(R.id.deleteTroubleView) {
+ //TODO 删除隐患
+ }
+ .setOnClickListener(R.id.showImageView) {
+ if (item.imageList.isEmpty()) {
+ "此隐患暂无图片".show(requireContext())
+ return@setOnClickListener
+ }
+
+ val images = ArrayList()
+ item.imageList.forEach { imageModel ->
+ images.add(imageModel.alarmImage.combineFilePath())
+ }
+ requireContext().navigatePageTo(0, images)
+ }
+ }
+ }
+ binding.recyclerView.adapter = troublesAdapter
+ }
+ }
+ }
+ }
+
+ override fun initViewBinding(
+ inflater: LayoutInflater,
+ container: ViewGroup?
+ ): FragmentHiddenTroubleBinding {
+ return FragmentHiddenTroubleBinding.inflate(inflater, container, false)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java
new file mode 100644
index 0000000..ba1d738
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java
@@ -0,0 +1,41 @@
+package com.casic.br.ar.app.model;
+
+public class AddHiddenTroubleResultModel {
+
+ private int code;
+ private String data;
+ private String message;
+ private boolean success;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+}
diff --git a/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java b/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java
new file mode 100644
index 0000000..993ef8d
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java
@@ -0,0 +1,208 @@
+package com.casic.br.ar.app.model;
+
+import java.util.List;
+
+public class SceneCheckManifestModel {
+
+ private int code;
+ private List data;
+ private String message;
+ private boolean success;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public List getData() {
+ return data;
+ }
+
+ public void setData(List data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+
+ public static class DataModel {
+ private List> basisList;
+ private String checkItem;
+ private String checkMethod;
+ private String checkObject;
+ private String checkObjectName;
+ private String checkStandard;
+ private String createTime;
+ private String createUserId;
+ private String createUserName;
+ private String id;
+ private String remark;
+ private String scene;
+ private String sceneName;
+ private String type;
+ private String typeName;
+ private String updateTime;
+ private String updateUserId;
+ private String updateUserName;
+
+ public List> getBasisList() {
+ return basisList;
+ }
+
+ public void setBasisList(List> basisList) {
+ this.basisList = basisList;
+ }
+
+ public String getCheckItem() {
+ return checkItem;
+ }
+
+ public void setCheckItem(String checkItem) {
+ this.checkItem = checkItem;
+ }
+
+ public String getCheckMethod() {
+ return checkMethod;
+ }
+
+ public void setCheckMethod(String checkMethod) {
+ this.checkMethod = checkMethod;
+ }
+
+ public String getCheckObject() {
+ return checkObject;
+ }
+
+ public void setCheckObject(String checkObject) {
+ this.checkObject = checkObject;
+ }
+
+ public String getCheckObjectName() {
+ return checkObjectName;
+ }
+
+ public void setCheckObjectName(String checkObjectName) {
+ this.checkObjectName = checkObjectName;
+ }
+
+ public String getCheckStandard() {
+ return checkStandard;
+ }
+
+ public void setCheckStandard(String checkStandard) {
+ this.checkStandard = checkStandard;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getCreateUserId() {
+ return createUserId;
+ }
+
+ public void setCreateUserId(String createUserId) {
+ this.createUserId = createUserId;
+ }
+
+ public String getCreateUserName() {
+ return createUserName;
+ }
+
+ public void setCreateUserName(String createUserName) {
+ this.createUserName = createUserName;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getScene() {
+ return scene;
+ }
+
+ public void setScene(String scene) {
+ this.scene = scene;
+ }
+
+ public String getSceneName() {
+ return sceneName;
+ }
+
+ public void setSceneName(String sceneName) {
+ this.sceneName = sceneName;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getTypeName() {
+ return typeName;
+ }
+
+ public void setTypeName(String typeName) {
+ this.typeName = typeName;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ public String getUpdateUserId() {
+ return updateUserId;
+ }
+
+ public void setUpdateUserId(String updateUserId) {
+ this.updateUserId = updateUserId;
+ }
+
+ public String getUpdateUserName() {
+ return updateUserName;
+ }
+
+ public void setUpdateUserName(String updateUserName) {
+ this.updateUserName = updateUserName;
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt
index 4d617a4..43db667 100644
--- a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt
@@ -96,6 +96,15 @@
): String
/**
+ * 添加隐患
+ */
+ @POST("/inspection-record/addAlarm")
+ suspend fun addHiddenTrouble(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
+
+ /**
* 根据场景获取获取隐患目录
*/
@GET("/alarm-menu/listPage")
@@ -119,7 +128,7 @@
* 根据场景获取获取检查清单
*/
@GET("/check-menu/listPage")
- suspend fun getCheckManifestByScene(
+ suspend fun getCheckManifestByPage(
@Header("token") token: String,
@Query("scene") scene: String,
@Query("offset") offset: Int,
@@ -127,6 +136,18 @@
): String
/**
+ * 获取检查清单-不分页
+ */
+ @GET("/check-menu/list")
+ suspend fun getCheckManifest(
+ @Header("token") token: String,
+ @Query("keyword") keyword: String,
+ @Query("type") type: String,
+ @Query("scene") scene: String,
+ @Query("checkObject") checkObject: String
+ ): String
+
+ /**
* 获取指导视频
*/
@GET("/knowledge-base/listPage")
diff --git a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt
index 8c35212..beedfe1 100644
--- a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt
@@ -2,7 +2,10 @@
import com.casic.br.ar.app.utils.AuthenticationHelper
import com.casic.br.ar.app.utils.LocaleConstant
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.google.gson.Gson
import com.google.gson.JsonObject
+import com.google.gson.reflect.TypeToken
import com.pengxh.kt.lite.utils.RetrofitFactory
import com.pengxh.kt.lite.utils.SaveKeyValues
import okhttp3.MediaType.Companion.toMediaType
@@ -30,6 +33,9 @@
RetrofitFactory.createRetrofit(httpConfig, timeout = 20)
}
+ private val gson by lazy { Gson() }
+ private val typeToken = object : TypeToken>>() {}.type
+
/**
* 验证PublicKey
*/
@@ -133,6 +139,45 @@
}
/**
+ * 添加隐患
+ */
+ suspend fun addHiddenTrouble(
+ mainClass: String,
+ subClass: String,
+ sceneName: String,
+ subClassName: String,
+ basis: String,
+ alarmMenuId: String,
+ content: String,
+ scene: String,
+ inspectionId: String,
+ name: String,
+ mainClassName: String,
+ id: String,
+ imageList: Array>
+ ): String {
+ val param = JsonObject()
+ param.addProperty("mainClass", mainClass)
+ param.addProperty("subClass", subClass)
+ param.addProperty("sceneName", sceneName)
+ param.addProperty("subClassName", subClassName)
+ param.addProperty("basis", basis)
+ param.addProperty("alarmMenuId", alarmMenuId)
+ param.addProperty("content", content)
+ param.addProperty("scene", scene)
+ param.addProperty("inspectionId", inspectionId)
+ param.addProperty("name", name)
+ param.addProperty("mainClassName", mainClassName)
+ param.addProperty("id", id)
+ param.add("imageList", gson.toJsonTree(imageList, typeToken).asJsonArray)
+ val requestBody = param.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+
+ return api.addHiddenTrouble(AuthenticationHelper.token, requestBody)
+ }
+
+ /**
* 根据场景获取获取隐患目录
*/
suspend fun getHiddenTroubleByScene(scene: String, offset: Int): String {
@@ -151,13 +196,22 @@
/**
* 根据场景获取获取隐患目录
*/
- suspend fun getCheckManifestByScene(scene: String, offset: Int): String {
- return api.getCheckManifestByScene(
+ suspend fun getCheckManifestByPage(scene: String, offset: Int): String {
+ return api.getCheckManifestByPage(
AuthenticationHelper.token, scene, offset, LocaleConstant.PAGE_LIMIT
)
}
/**
+ * 获取检查清单-不分页
+ */
+ suspend fun getCheckManifest(
+ keyword: String, type: String, scene: String, checkObject: String
+ ): String {
+ return api.getCheckManifest(AuthenticationHelper.token, keyword, type, scene, checkObject)
+ }
+
+ /**
* 获取指导视频
*/
suspend fun getGuideVideoByPage(keywords: String, classId: String, offset: Int): String {
@@ -212,17 +266,12 @@
/**
* 推送报警信息
* */
- suspend fun uploadDetectTargetAlarm(
- alamCode: String,
- alarmlmgPath: String,
- inspectionld: String,
- scene: String
- ): String {
+ suspend fun uploadDetectTargetAlarm(alarmCode: String, alarmImgPath: String): String {
val param = JsonObject()
- param.addProperty("alamCode", alamCode)
- param.addProperty("alarmlmgPath", alarmlmgPath)
- param.addProperty("inspectionld", inspectionld)
- param.addProperty("scene", scene)
+ param.addProperty("alarmCode", alarmCode)
+ param.addProperty("alarmImgPath", alarmImgPath)
+ param.addProperty("inspectionId", RuntimeCache.inspectionId)
+ param.addProperty("scene", RuntimeCache.sceneName)
val requestBody = param.toString().toRequestBody(
"application/json;charset=UTF-8".toMediaType()
diff --git a/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt
new file mode 100644
index 0000000..143e287
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt
@@ -0,0 +1,14 @@
+package com.casic.br.ar.app.utils
+
+import com.casic.br.ar.app.model.DictionaryModel
+import org.opencv.core.Mat
+
+object RuntimeCache {
+ //TODO 未引用未赋值
+ var scene = ""
+
+ var sceneName = ""
+ var inspectionId = ""
+ var mainDicModels: MutableList = ArrayList()
+ lateinit var mat: Mat
+}
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index b007d28..7cb37f7 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -31,5 +31,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 04f725b..9a00059 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -64,7 +64,7 @@
}
dependencies {
-//基础依赖库
+ //基础依赖库
implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.10'
implementation 'androidx.core:core-ktx:1.9.0'
def androidx_version = '1.6.1'
@@ -120,4 +120,5 @@
//生成二维码
implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
implementation project(':sdk')
+ implementation 'com.rokid.ai.glass:instructsdk:1.7.8'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index de85667..50019c7 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -70,6 +70,14 @@
android:name=".view.CheckModeActivity"
android:screenOrientation="landscape" />
+
+
diff --git a/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
new file mode 100644
index 0000000..1deea58
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
@@ -0,0 +1,18 @@
+package com.casic.br.ar.app.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class TopViewPagerAdapter(
+ fragmentManager: FragmentManager,
+ private val pageTitles: Array,
+ private val pages: List
+) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
+
+ override fun getItem(position: Int) = pages[position]
+
+ override fun getCount() = pages.size
+
+ override fun getPageTitle(position: Int) = pageTitles[position]
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
index 66f49cf..cf7240b 100644
--- a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
@@ -2,6 +2,8 @@
import android.app.Application
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.rokid.glass.instruct.VoiceInstruction
+import org.opencv.android.OpenCVLoader
class BaseApplication : Application() {
@@ -10,5 +12,8 @@
override fun onCreate() {
super.onCreate()
SaveKeyValues.initSharedPreferences(this)
+ VoiceInstruction.init(this, false)
+ //初始化OpenCV
+ OpenCVLoader.initLocal()
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt b/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt
new file mode 100644
index 0000000..86be402
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt
@@ -0,0 +1,120 @@
+package com.casic.br.ar.app.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.R
+import com.casic.br.ar.app.databinding.FragmentCheckManifestBinding
+import com.casic.br.ar.app.model.SceneCheckManifestModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.vm.CheckManifestViewModel
+import com.casic.br.ar.app.vm.ConfigViewModel
+import com.casic.br.ar.app.widgets.CheckStandardSheet
+import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
+import com.pengxh.kt.lite.adapter.ViewHolder
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class CheckManifestFragment : KotlinBaseFragment() {
+
+ private val kTag = "CheckManifestFragment"
+ private lateinit var configViewModel: ConfigViewModel
+ private lateinit var checkManifestViewModel: CheckManifestViewModel
+
+ override fun initEvent() {
+
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ //detectedScene转为字典值
+ configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java]
+ configViewModel.getDictionaryByCode(requireContext(), "securityScene")
+ configViewModel.dictionary.observe(this) {
+ if (it.code == 200) {
+ for (dic in it.data) {
+ if (dic.name == RuntimeCache.sceneName) {
+ checkManifestViewModel.getCheckManifestByScene(requireContext(), dic.value)
+ return@observe
+ }
+ }
+ }
+ }
+
+ checkManifestViewModel = ViewModelProvider(this)[CheckManifestViewModel::class.java]
+ checkManifestViewModel.sceneManifestResult.observe(this) {
+ if (it.code == 200) {
+ //去重
+ val mainClassSet = HashSet()
+ it.data.forEach { row ->
+ mainClassSet.add(row.typeName)
+ }
+ val typeNameAdapter = object : NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_l_2, mainClassSet.toMutableList()
+ ) {
+ override fun convertView(viewHolder: ViewHolder, position: Int, item: String) {
+ viewHolder.setText(R.id.troubleMainClassView, item)
+ }
+ }
+ binding.leftRecyclerView.adapter = typeNameAdapter
+
+ if (mainClassSet.isEmpty()) {
+ return@observe
+ }
+ //默认加载第一项的数据
+ initSubRecyclerView(it, mainClassSet.first())
+ typeNameAdapter.setOnItemClickedListener(object :
+ NormalRecyclerAdapter.OnItemClickedListener {
+ override fun onItemClicked(position: Int, t: String) {
+ initSubRecyclerView(it, t)
+ }
+ })
+ }
+ }
+ }
+
+ private fun initSubRecyclerView(parent: SceneCheckManifestModel, selectedType: String) {
+ //根据大类查询隐患内容
+ val contentSet = HashSet()
+ for (row in parent.data) {
+ if (row.typeName == selectedType) {
+ contentSet.add(row.checkItem)
+ }
+ }
+ val contentAdapter = object : NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_l_3, contentSet.toMutableList()
+ ) {
+ override fun convertView(viewHolder: ViewHolder, position: Int, item: String) {
+ viewHolder.setText(R.id.troubleIndexView, "${position + 1}、")
+ .setText(R.id.troubleNameView, item)
+ .setOnClickListener(R.id.showImageView) {
+ //显示行业标准
+ for (row in parent.data) {
+ if (row.checkItem == item) {
+ CheckStandardSheet.Builder()
+ .setContext(requireContext())
+ .setSheetValue(row.checkStandard)
+ .build().show()
+ return@setOnClickListener
+ }
+ }
+ }
+ }
+ }
+ binding.rightRecyclerView.adapter = contentAdapter
+ }
+
+ override fun initViewBinding(
+ inflater: LayoutInflater,
+ container: ViewGroup?
+ ): FragmentCheckManifestBinding {
+ return FragmentCheckManifestBinding.inflate(inflater, container, false)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt b/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt
new file mode 100644
index 0000000..2ddb65c
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt
@@ -0,0 +1,91 @@
+package com.casic.br.ar.app.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.R
+import com.casic.br.ar.app.databinding.FragmentHiddenTroubleBinding
+import com.casic.br.ar.app.extensions.combineFilePath
+import com.casic.br.ar.app.model.HiddenTroubleListResultModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.view.BigImageActivity
+import com.casic.br.ar.app.vm.InspectionViewModel
+import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
+import com.pengxh.kt.lite.adapter.ViewHolder
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.extensions.show
+
+
+class HiddenTroubleFragment : KotlinBaseFragment() {
+
+ private lateinit var inspectionViewModel: InspectionViewModel
+
+ override fun initEvent() {
+
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java]
+ inspectionViewModel.getHiddenTroublesByInspectionId(
+ requireContext(), RuntimeCache.inspectionId
+ )
+ inspectionViewModel.troublesResultModel.observe(this) {
+ if (it.code == 200) {
+ if (it.data.isEmpty()) {
+ binding.tipsView.visibility = View.VISIBLE
+ binding.recyclerView.visibility = View.GONE
+ } else {
+ binding.recyclerView.visibility = View.VISIBLE
+ binding.tipsView.visibility = View.GONE
+
+ val troublesAdapter = object :
+ NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_by_id_l_2, it.data
+ ) {
+ override fun convertView(
+ viewHolder: ViewHolder, position: Int,
+ item: HiddenTroubleListResultModel.DataModel
+ ) {
+ viewHolder.setText(R.id.troubleIndexView, "${position + 1}、")
+ .setText(R.id.troubleNameView, item.name)
+ .setOnClickListener(R.id.deleteTroubleView) {
+ //TODO 删除隐患
+ }
+ .setOnClickListener(R.id.showImageView) {
+ if (item.imageList.isEmpty()) {
+ "此隐患暂无图片".show(requireContext())
+ return@setOnClickListener
+ }
+
+ val images = ArrayList()
+ item.imageList.forEach { imageModel ->
+ images.add(imageModel.alarmImage.combineFilePath())
+ }
+ requireContext().navigatePageTo(0, images)
+ }
+ }
+ }
+ binding.recyclerView.adapter = troublesAdapter
+ }
+ }
+ }
+ }
+
+ override fun initViewBinding(
+ inflater: LayoutInflater,
+ container: ViewGroup?
+ ): FragmentHiddenTroubleBinding {
+ return FragmentHiddenTroubleBinding.inflate(inflater, container, false)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java
new file mode 100644
index 0000000..ba1d738
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java
@@ -0,0 +1,41 @@
+package com.casic.br.ar.app.model;
+
+public class AddHiddenTroubleResultModel {
+
+ private int code;
+ private String data;
+ private String message;
+ private boolean success;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+}
diff --git a/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java b/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java
new file mode 100644
index 0000000..993ef8d
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java
@@ -0,0 +1,208 @@
+package com.casic.br.ar.app.model;
+
+import java.util.List;
+
+public class SceneCheckManifestModel {
+
+ private int code;
+ private List data;
+ private String message;
+ private boolean success;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public List getData() {
+ return data;
+ }
+
+ public void setData(List data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+
+ public static class DataModel {
+ private List> basisList;
+ private String checkItem;
+ private String checkMethod;
+ private String checkObject;
+ private String checkObjectName;
+ private String checkStandard;
+ private String createTime;
+ private String createUserId;
+ private String createUserName;
+ private String id;
+ private String remark;
+ private String scene;
+ private String sceneName;
+ private String type;
+ private String typeName;
+ private String updateTime;
+ private String updateUserId;
+ private String updateUserName;
+
+ public List> getBasisList() {
+ return basisList;
+ }
+
+ public void setBasisList(List> basisList) {
+ this.basisList = basisList;
+ }
+
+ public String getCheckItem() {
+ return checkItem;
+ }
+
+ public void setCheckItem(String checkItem) {
+ this.checkItem = checkItem;
+ }
+
+ public String getCheckMethod() {
+ return checkMethod;
+ }
+
+ public void setCheckMethod(String checkMethod) {
+ this.checkMethod = checkMethod;
+ }
+
+ public String getCheckObject() {
+ return checkObject;
+ }
+
+ public void setCheckObject(String checkObject) {
+ this.checkObject = checkObject;
+ }
+
+ public String getCheckObjectName() {
+ return checkObjectName;
+ }
+
+ public void setCheckObjectName(String checkObjectName) {
+ this.checkObjectName = checkObjectName;
+ }
+
+ public String getCheckStandard() {
+ return checkStandard;
+ }
+
+ public void setCheckStandard(String checkStandard) {
+ this.checkStandard = checkStandard;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getCreateUserId() {
+ return createUserId;
+ }
+
+ public void setCreateUserId(String createUserId) {
+ this.createUserId = createUserId;
+ }
+
+ public String getCreateUserName() {
+ return createUserName;
+ }
+
+ public void setCreateUserName(String createUserName) {
+ this.createUserName = createUserName;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getScene() {
+ return scene;
+ }
+
+ public void setScene(String scene) {
+ this.scene = scene;
+ }
+
+ public String getSceneName() {
+ return sceneName;
+ }
+
+ public void setSceneName(String sceneName) {
+ this.sceneName = sceneName;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getTypeName() {
+ return typeName;
+ }
+
+ public void setTypeName(String typeName) {
+ this.typeName = typeName;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ public String getUpdateUserId() {
+ return updateUserId;
+ }
+
+ public void setUpdateUserId(String updateUserId) {
+ this.updateUserId = updateUserId;
+ }
+
+ public String getUpdateUserName() {
+ return updateUserName;
+ }
+
+ public void setUpdateUserName(String updateUserName) {
+ this.updateUserName = updateUserName;
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt
index 4d617a4..43db667 100644
--- a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt
@@ -96,6 +96,15 @@
): String
/**
+ * 添加隐患
+ */
+ @POST("/inspection-record/addAlarm")
+ suspend fun addHiddenTrouble(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
+
+ /**
* 根据场景获取获取隐患目录
*/
@GET("/alarm-menu/listPage")
@@ -119,7 +128,7 @@
* 根据场景获取获取检查清单
*/
@GET("/check-menu/listPage")
- suspend fun getCheckManifestByScene(
+ suspend fun getCheckManifestByPage(
@Header("token") token: String,
@Query("scene") scene: String,
@Query("offset") offset: Int,
@@ -127,6 +136,18 @@
): String
/**
+ * 获取检查清单-不分页
+ */
+ @GET("/check-menu/list")
+ suspend fun getCheckManifest(
+ @Header("token") token: String,
+ @Query("keyword") keyword: String,
+ @Query("type") type: String,
+ @Query("scene") scene: String,
+ @Query("checkObject") checkObject: String
+ ): String
+
+ /**
* 获取指导视频
*/
@GET("/knowledge-base/listPage")
diff --git a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt
index 8c35212..beedfe1 100644
--- a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt
@@ -2,7 +2,10 @@
import com.casic.br.ar.app.utils.AuthenticationHelper
import com.casic.br.ar.app.utils.LocaleConstant
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.google.gson.Gson
import com.google.gson.JsonObject
+import com.google.gson.reflect.TypeToken
import com.pengxh.kt.lite.utils.RetrofitFactory
import com.pengxh.kt.lite.utils.SaveKeyValues
import okhttp3.MediaType.Companion.toMediaType
@@ -30,6 +33,9 @@
RetrofitFactory.createRetrofit(httpConfig, timeout = 20)
}
+ private val gson by lazy { Gson() }
+ private val typeToken = object : TypeToken>>() {}.type
+
/**
* 验证PublicKey
*/
@@ -133,6 +139,45 @@
}
/**
+ * 添加隐患
+ */
+ suspend fun addHiddenTrouble(
+ mainClass: String,
+ subClass: String,
+ sceneName: String,
+ subClassName: String,
+ basis: String,
+ alarmMenuId: String,
+ content: String,
+ scene: String,
+ inspectionId: String,
+ name: String,
+ mainClassName: String,
+ id: String,
+ imageList: Array>
+ ): String {
+ val param = JsonObject()
+ param.addProperty("mainClass", mainClass)
+ param.addProperty("subClass", subClass)
+ param.addProperty("sceneName", sceneName)
+ param.addProperty("subClassName", subClassName)
+ param.addProperty("basis", basis)
+ param.addProperty("alarmMenuId", alarmMenuId)
+ param.addProperty("content", content)
+ param.addProperty("scene", scene)
+ param.addProperty("inspectionId", inspectionId)
+ param.addProperty("name", name)
+ param.addProperty("mainClassName", mainClassName)
+ param.addProperty("id", id)
+ param.add("imageList", gson.toJsonTree(imageList, typeToken).asJsonArray)
+ val requestBody = param.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+
+ return api.addHiddenTrouble(AuthenticationHelper.token, requestBody)
+ }
+
+ /**
* 根据场景获取获取隐患目录
*/
suspend fun getHiddenTroubleByScene(scene: String, offset: Int): String {
@@ -151,13 +196,22 @@
/**
* 根据场景获取获取隐患目录
*/
- suspend fun getCheckManifestByScene(scene: String, offset: Int): String {
- return api.getCheckManifestByScene(
+ suspend fun getCheckManifestByPage(scene: String, offset: Int): String {
+ return api.getCheckManifestByPage(
AuthenticationHelper.token, scene, offset, LocaleConstant.PAGE_LIMIT
)
}
/**
+ * 获取检查清单-不分页
+ */
+ suspend fun getCheckManifest(
+ keyword: String, type: String, scene: String, checkObject: String
+ ): String {
+ return api.getCheckManifest(AuthenticationHelper.token, keyword, type, scene, checkObject)
+ }
+
+ /**
* 获取指导视频
*/
suspend fun getGuideVideoByPage(keywords: String, classId: String, offset: Int): String {
@@ -212,17 +266,12 @@
/**
* 推送报警信息
* */
- suspend fun uploadDetectTargetAlarm(
- alamCode: String,
- alarmlmgPath: String,
- inspectionld: String,
- scene: String
- ): String {
+ suspend fun uploadDetectTargetAlarm(alarmCode: String, alarmImgPath: String): String {
val param = JsonObject()
- param.addProperty("alamCode", alamCode)
- param.addProperty("alarmlmgPath", alarmlmgPath)
- param.addProperty("inspectionld", inspectionld)
- param.addProperty("scene", scene)
+ param.addProperty("alarmCode", alarmCode)
+ param.addProperty("alarmImgPath", alarmImgPath)
+ param.addProperty("inspectionId", RuntimeCache.inspectionId)
+ param.addProperty("scene", RuntimeCache.sceneName)
val requestBody = param.toString().toRequestBody(
"application/json;charset=UTF-8".toMediaType()
diff --git a/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt
new file mode 100644
index 0000000..143e287
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt
@@ -0,0 +1,14 @@
+package com.casic.br.ar.app.utils
+
+import com.casic.br.ar.app.model.DictionaryModel
+import org.opencv.core.Mat
+
+object RuntimeCache {
+ //TODO 未引用未赋值
+ var scene = ""
+
+ var sceneName = ""
+ var inspectionId = ""
+ var mainDicModels: MutableList = ArrayList()
+ lateinit var mat: Mat
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt
new file mode 100644
index 0000000..989b751
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt
@@ -0,0 +1,217 @@
+package com.casic.br.ar.app.view
+
+import android.graphics.Bitmap
+import android.os.Bundle
+import android.util.Log
+import android.view.View
+import android.widget.AdapterView
+import android.widget.ArrayAdapter
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.databinding.ActivityAddHiddenTroubleBinding
+import com.casic.br.ar.app.extensions.combineFilePath
+import com.casic.br.ar.app.extensions.compressImage
+import com.casic.br.ar.app.model.DictionaryModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.vm.ConfigViewModel
+import com.casic.br.ar.app.vm.HiddenTroubleViewModel
+import com.casic.br.ar.app.vm.ImageFileViewModel
+import com.casic.br.operationsite.test.callback.OnImageCompressListener
+import com.pengxh.kt.lite.adapter.EditableImageAdapter
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets
+import com.pengxh.kt.lite.extensions.createImageFileDir
+import com.pengxh.kt.lite.extensions.dp2px
+import com.pengxh.kt.lite.extensions.getScreenWidth
+import com.pengxh.kt.lite.extensions.saveImage
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.LoadState
+import com.pengxh.kt.lite.utils.LoadingDialogHub
+import org.opencv.android.Utils
+import java.io.File
+
+class AddHiddenTroubleActivity : KotlinBaseActivity() {
+
+ private val kTag = "AddHiddenTroubleActivity"
+ private val context = this
+ private val imagePaths = ArrayList>()
+ private val recyclerViewImages = ArrayList()
+ private val marginOffset by lazy { 1.dp2px(this) }
+ private lateinit var imageAdapter: EditableImageAdapter
+ private lateinit var imageFileViewModel: ImageFileViewModel
+ private lateinit var configViewModel: ConfigViewModel
+ private lateinit var hiddenTroubleViewModel: HiddenTroubleViewModel
+ private var mainDicModels: MutableList = ArrayList()
+ private var subDicModels: MutableList = ArrayList()
+ private var selectedMainTypePosition = 0
+ private var selectedSubTypePosition = 0
+
+ override fun initViewBinding(): ActivityAddHiddenTroubleBinding {
+ return ActivityAddHiddenTroubleBinding.inflate(layoutInflater)
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun observeRequestState() {
+ hiddenTroubleViewModel.loadState.observe(this) {
+ if (it == LoadState.Loading) {
+ LoadingDialogHub.show(this, "隐患添加中,请稍后...")
+ } else {
+ LoadingDialogHub.dismiss()
+ finish()
+ "隐患添加成功".show(this)
+ }
+ }
+
+ imageFileViewModel.loadState.observe(this) {
+ if (it == LoadState.Loading) {
+ "图片上传中,请稍后...".show(this)
+ }
+ }
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ //转为实体类
+ mainDicModels = RuntimeCache.mainDicModels
+ val mainTypeArray = ArrayList()
+ mainDicModels.forEach {
+ mainTypeArray.add(it.name)
+ }
+ val mainTypeAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, mainTypeArray)
+ binding.mainTypeSpinner.adapter = mainTypeAdapter
+
+ configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java]
+ configViewModel.getDictionaryByCode(this, "pitfallSmallType")
+ configViewModel.dictionary.observe(this) {
+ if (it.code == 200) {
+ subDicModels = it.data
+ val subTypeArray = ArrayList()
+ subDicModels.forEach { dic ->
+ subTypeArray.add(dic.name)
+ }
+ val subTypeAdapter = ArrayAdapter(
+ this, android.R.layout.simple_list_item_1, subTypeArray
+ )
+ binding.subTypeSpinner.adapter = subTypeAdapter
+ }
+ }
+
+ //左外边距,左内边距,TextView宽度,内间距,右内边距,右外边距
+ val viewWidth = getScreenWidth() - (15 + 15 + 65 + 10 + 15 + 15).dp2px(this)
+ imageAdapter = EditableImageAdapter(this, recyclerViewImages, viewWidth, 3, 3)
+ binding.recyclerView.addItemDecoration(
+ RecyclerViewItemOffsets(marginOffset, marginOffset, marginOffset, marginOffset)
+ )
+ binding.recyclerView.adapter = imageAdapter
+
+ imageFileViewModel = ViewModelProvider(this)[ImageFileViewModel::class.java]
+ imageFileViewModel.resultModel.observe(this) {
+ if (it.code == 200) {
+ val url = it.data.toString()
+ val map = HashMap()
+ map["alarmImage"] = url
+ map["id"] = ""
+ map["inspectionAlarmId"] = ""
+ imagePaths.add(map)
+ recyclerViewImages.add(url.combineFilePath())
+ imageAdapter.notifyDataSetChanged()
+ }
+ }
+
+ hiddenTroubleViewModel = ViewModelProvider(this)[HiddenTroubleViewModel::class.java]
+ hiddenTroubleViewModel.addTroubleResult.observe(this) {
+ if (it.code == 200) {
+ Log.d(kTag, "troubleId: ${it.data}")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ binding.mainTypeSpinner.setSelection(0)
+ binding.mainTypeSpinner.onItemSelectedListener =
+ object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(
+ parent: AdapterView<*>?, view: View?, position: Int, id: Long
+ ) {
+ selectedMainTypePosition = position
+ }
+
+ override fun onNothingSelected(parent: AdapterView<*>?) {
+
+ }
+ }
+
+ binding.subTypeSpinner.setSelection(0)
+ binding.subTypeSpinner.onItemSelectedListener =
+ object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(
+ parent: AdapterView<*>?, view: View?, position: Int, id: Long
+ ) {
+ selectedSubTypePosition = position
+ }
+
+ override fun onNothingSelected(parent: AdapterView<*>?) {
+
+ }
+ }
+
+ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener {
+ override fun onAddImageClick() {
+ addImage()
+ }
+
+ override fun onItemClick(position: Int) {
+
+ }
+
+ override fun onItemLongClick(view: View?, position: Int) {
+ imagePaths.removeAt(position)
+ recyclerViewImages.removeAt(position)
+ imageAdapter.notifyDataSetChanged()
+ }
+ })
+
+ binding.confirmButton.setOnClickListener {
+ hiddenTroubleViewModel.addHiddenTrouble(
+ this,
+ selectedMainTypePosition.toString(),
+ selectedSubTypePosition.toString(),
+ RuntimeCache.sceneName,
+ subDicModels[selectedMainTypePosition].name,
+ "",
+ "",
+ binding.hiddenTroubleContentView.text.toString(),
+ RuntimeCache.scene,
+ RuntimeCache.inspectionId,
+ binding.hiddenTroubleNameView.text.toString(),
+ mainDicModels[selectedMainTypePosition].name,
+ "",
+ imagePaths.toTypedArray()
+ )
+ }
+
+ binding.cancelButton.setOnClickListener { finish() }
+ }
+
+ private fun addImage() {
+ //mat转图片
+ val bitmap = Bitmap.createBitmap(
+ RuntimeCache.mat.width(),
+ RuntimeCache.mat.height(),
+ Bitmap.Config.ARGB_8888
+ )
+ Utils.matToBitmap(RuntimeCache.mat, bitmap, true)
+ val imagePath = "${createImageFileDir()}/${System.currentTimeMillis()}.png"
+ bitmap.saveImage(imagePath)
+ imagePath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ imageFileViewModel.uploadImage(file)
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index b007d28..7cb37f7 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -31,5 +31,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 04f725b..9a00059 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -64,7 +64,7 @@
}
dependencies {
-//基础依赖库
+ //基础依赖库
implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.10'
implementation 'androidx.core:core-ktx:1.9.0'
def androidx_version = '1.6.1'
@@ -120,4 +120,5 @@
//生成二维码
implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
implementation project(':sdk')
+ implementation 'com.rokid.ai.glass:instructsdk:1.7.8'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index de85667..50019c7 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -70,6 +70,14 @@
android:name=".view.CheckModeActivity"
android:screenOrientation="landscape" />
+
+
diff --git a/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
new file mode 100644
index 0000000..1deea58
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
@@ -0,0 +1,18 @@
+package com.casic.br.ar.app.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class TopViewPagerAdapter(
+ fragmentManager: FragmentManager,
+ private val pageTitles: Array,
+ private val pages: List
+) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
+
+ override fun getItem(position: Int) = pages[position]
+
+ override fun getCount() = pages.size
+
+ override fun getPageTitle(position: Int) = pageTitles[position]
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
index 66f49cf..cf7240b 100644
--- a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
@@ -2,6 +2,8 @@
import android.app.Application
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.rokid.glass.instruct.VoiceInstruction
+import org.opencv.android.OpenCVLoader
class BaseApplication : Application() {
@@ -10,5 +12,8 @@
override fun onCreate() {
super.onCreate()
SaveKeyValues.initSharedPreferences(this)
+ VoiceInstruction.init(this, false)
+ //初始化OpenCV
+ OpenCVLoader.initLocal()
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt b/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt
new file mode 100644
index 0000000..86be402
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt
@@ -0,0 +1,120 @@
+package com.casic.br.ar.app.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.R
+import com.casic.br.ar.app.databinding.FragmentCheckManifestBinding
+import com.casic.br.ar.app.model.SceneCheckManifestModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.vm.CheckManifestViewModel
+import com.casic.br.ar.app.vm.ConfigViewModel
+import com.casic.br.ar.app.widgets.CheckStandardSheet
+import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
+import com.pengxh.kt.lite.adapter.ViewHolder
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class CheckManifestFragment : KotlinBaseFragment() {
+
+ private val kTag = "CheckManifestFragment"
+ private lateinit var configViewModel: ConfigViewModel
+ private lateinit var checkManifestViewModel: CheckManifestViewModel
+
+ override fun initEvent() {
+
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ //detectedScene转为字典值
+ configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java]
+ configViewModel.getDictionaryByCode(requireContext(), "securityScene")
+ configViewModel.dictionary.observe(this) {
+ if (it.code == 200) {
+ for (dic in it.data) {
+ if (dic.name == RuntimeCache.sceneName) {
+ checkManifestViewModel.getCheckManifestByScene(requireContext(), dic.value)
+ return@observe
+ }
+ }
+ }
+ }
+
+ checkManifestViewModel = ViewModelProvider(this)[CheckManifestViewModel::class.java]
+ checkManifestViewModel.sceneManifestResult.observe(this) {
+ if (it.code == 200) {
+ //去重
+ val mainClassSet = HashSet()
+ it.data.forEach { row ->
+ mainClassSet.add(row.typeName)
+ }
+ val typeNameAdapter = object : NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_l_2, mainClassSet.toMutableList()
+ ) {
+ override fun convertView(viewHolder: ViewHolder, position: Int, item: String) {
+ viewHolder.setText(R.id.troubleMainClassView, item)
+ }
+ }
+ binding.leftRecyclerView.adapter = typeNameAdapter
+
+ if (mainClassSet.isEmpty()) {
+ return@observe
+ }
+ //默认加载第一项的数据
+ initSubRecyclerView(it, mainClassSet.first())
+ typeNameAdapter.setOnItemClickedListener(object :
+ NormalRecyclerAdapter.OnItemClickedListener {
+ override fun onItemClicked(position: Int, t: String) {
+ initSubRecyclerView(it, t)
+ }
+ })
+ }
+ }
+ }
+
+ private fun initSubRecyclerView(parent: SceneCheckManifestModel, selectedType: String) {
+ //根据大类查询隐患内容
+ val contentSet = HashSet()
+ for (row in parent.data) {
+ if (row.typeName == selectedType) {
+ contentSet.add(row.checkItem)
+ }
+ }
+ val contentAdapter = object : NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_l_3, contentSet.toMutableList()
+ ) {
+ override fun convertView(viewHolder: ViewHolder, position: Int, item: String) {
+ viewHolder.setText(R.id.troubleIndexView, "${position + 1}、")
+ .setText(R.id.troubleNameView, item)
+ .setOnClickListener(R.id.showImageView) {
+ //显示行业标准
+ for (row in parent.data) {
+ if (row.checkItem == item) {
+ CheckStandardSheet.Builder()
+ .setContext(requireContext())
+ .setSheetValue(row.checkStandard)
+ .build().show()
+ return@setOnClickListener
+ }
+ }
+ }
+ }
+ }
+ binding.rightRecyclerView.adapter = contentAdapter
+ }
+
+ override fun initViewBinding(
+ inflater: LayoutInflater,
+ container: ViewGroup?
+ ): FragmentCheckManifestBinding {
+ return FragmentCheckManifestBinding.inflate(inflater, container, false)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt b/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt
new file mode 100644
index 0000000..2ddb65c
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt
@@ -0,0 +1,91 @@
+package com.casic.br.ar.app.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.R
+import com.casic.br.ar.app.databinding.FragmentHiddenTroubleBinding
+import com.casic.br.ar.app.extensions.combineFilePath
+import com.casic.br.ar.app.model.HiddenTroubleListResultModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.view.BigImageActivity
+import com.casic.br.ar.app.vm.InspectionViewModel
+import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
+import com.pengxh.kt.lite.adapter.ViewHolder
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.extensions.show
+
+
+class HiddenTroubleFragment : KotlinBaseFragment() {
+
+ private lateinit var inspectionViewModel: InspectionViewModel
+
+ override fun initEvent() {
+
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java]
+ inspectionViewModel.getHiddenTroublesByInspectionId(
+ requireContext(), RuntimeCache.inspectionId
+ )
+ inspectionViewModel.troublesResultModel.observe(this) {
+ if (it.code == 200) {
+ if (it.data.isEmpty()) {
+ binding.tipsView.visibility = View.VISIBLE
+ binding.recyclerView.visibility = View.GONE
+ } else {
+ binding.recyclerView.visibility = View.VISIBLE
+ binding.tipsView.visibility = View.GONE
+
+ val troublesAdapter = object :
+ NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_by_id_l_2, it.data
+ ) {
+ override fun convertView(
+ viewHolder: ViewHolder, position: Int,
+ item: HiddenTroubleListResultModel.DataModel
+ ) {
+ viewHolder.setText(R.id.troubleIndexView, "${position + 1}、")
+ .setText(R.id.troubleNameView, item.name)
+ .setOnClickListener(R.id.deleteTroubleView) {
+ //TODO 删除隐患
+ }
+ .setOnClickListener(R.id.showImageView) {
+ if (item.imageList.isEmpty()) {
+ "此隐患暂无图片".show(requireContext())
+ return@setOnClickListener
+ }
+
+ val images = ArrayList()
+ item.imageList.forEach { imageModel ->
+ images.add(imageModel.alarmImage.combineFilePath())
+ }
+ requireContext().navigatePageTo(0, images)
+ }
+ }
+ }
+ binding.recyclerView.adapter = troublesAdapter
+ }
+ }
+ }
+ }
+
+ override fun initViewBinding(
+ inflater: LayoutInflater,
+ container: ViewGroup?
+ ): FragmentHiddenTroubleBinding {
+ return FragmentHiddenTroubleBinding.inflate(inflater, container, false)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java
new file mode 100644
index 0000000..ba1d738
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java
@@ -0,0 +1,41 @@
+package com.casic.br.ar.app.model;
+
+public class AddHiddenTroubleResultModel {
+
+ private int code;
+ private String data;
+ private String message;
+ private boolean success;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+}
diff --git a/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java b/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java
new file mode 100644
index 0000000..993ef8d
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java
@@ -0,0 +1,208 @@
+package com.casic.br.ar.app.model;
+
+import java.util.List;
+
+public class SceneCheckManifestModel {
+
+ private int code;
+ private List data;
+ private String message;
+ private boolean success;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public List getData() {
+ return data;
+ }
+
+ public void setData(List data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+
+ public static class DataModel {
+ private List> basisList;
+ private String checkItem;
+ private String checkMethod;
+ private String checkObject;
+ private String checkObjectName;
+ private String checkStandard;
+ private String createTime;
+ private String createUserId;
+ private String createUserName;
+ private String id;
+ private String remark;
+ private String scene;
+ private String sceneName;
+ private String type;
+ private String typeName;
+ private String updateTime;
+ private String updateUserId;
+ private String updateUserName;
+
+ public List> getBasisList() {
+ return basisList;
+ }
+
+ public void setBasisList(List> basisList) {
+ this.basisList = basisList;
+ }
+
+ public String getCheckItem() {
+ return checkItem;
+ }
+
+ public void setCheckItem(String checkItem) {
+ this.checkItem = checkItem;
+ }
+
+ public String getCheckMethod() {
+ return checkMethod;
+ }
+
+ public void setCheckMethod(String checkMethod) {
+ this.checkMethod = checkMethod;
+ }
+
+ public String getCheckObject() {
+ return checkObject;
+ }
+
+ public void setCheckObject(String checkObject) {
+ this.checkObject = checkObject;
+ }
+
+ public String getCheckObjectName() {
+ return checkObjectName;
+ }
+
+ public void setCheckObjectName(String checkObjectName) {
+ this.checkObjectName = checkObjectName;
+ }
+
+ public String getCheckStandard() {
+ return checkStandard;
+ }
+
+ public void setCheckStandard(String checkStandard) {
+ this.checkStandard = checkStandard;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getCreateUserId() {
+ return createUserId;
+ }
+
+ public void setCreateUserId(String createUserId) {
+ this.createUserId = createUserId;
+ }
+
+ public String getCreateUserName() {
+ return createUserName;
+ }
+
+ public void setCreateUserName(String createUserName) {
+ this.createUserName = createUserName;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getScene() {
+ return scene;
+ }
+
+ public void setScene(String scene) {
+ this.scene = scene;
+ }
+
+ public String getSceneName() {
+ return sceneName;
+ }
+
+ public void setSceneName(String sceneName) {
+ this.sceneName = sceneName;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getTypeName() {
+ return typeName;
+ }
+
+ public void setTypeName(String typeName) {
+ this.typeName = typeName;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ public String getUpdateUserId() {
+ return updateUserId;
+ }
+
+ public void setUpdateUserId(String updateUserId) {
+ this.updateUserId = updateUserId;
+ }
+
+ public String getUpdateUserName() {
+ return updateUserName;
+ }
+
+ public void setUpdateUserName(String updateUserName) {
+ this.updateUserName = updateUserName;
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt
index 4d617a4..43db667 100644
--- a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt
@@ -96,6 +96,15 @@
): String
/**
+ * 添加隐患
+ */
+ @POST("/inspection-record/addAlarm")
+ suspend fun addHiddenTrouble(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
+
+ /**
* 根据场景获取获取隐患目录
*/
@GET("/alarm-menu/listPage")
@@ -119,7 +128,7 @@
* 根据场景获取获取检查清单
*/
@GET("/check-menu/listPage")
- suspend fun getCheckManifestByScene(
+ suspend fun getCheckManifestByPage(
@Header("token") token: String,
@Query("scene") scene: String,
@Query("offset") offset: Int,
@@ -127,6 +136,18 @@
): String
/**
+ * 获取检查清单-不分页
+ */
+ @GET("/check-menu/list")
+ suspend fun getCheckManifest(
+ @Header("token") token: String,
+ @Query("keyword") keyword: String,
+ @Query("type") type: String,
+ @Query("scene") scene: String,
+ @Query("checkObject") checkObject: String
+ ): String
+
+ /**
* 获取指导视频
*/
@GET("/knowledge-base/listPage")
diff --git a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt
index 8c35212..beedfe1 100644
--- a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt
@@ -2,7 +2,10 @@
import com.casic.br.ar.app.utils.AuthenticationHelper
import com.casic.br.ar.app.utils.LocaleConstant
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.google.gson.Gson
import com.google.gson.JsonObject
+import com.google.gson.reflect.TypeToken
import com.pengxh.kt.lite.utils.RetrofitFactory
import com.pengxh.kt.lite.utils.SaveKeyValues
import okhttp3.MediaType.Companion.toMediaType
@@ -30,6 +33,9 @@
RetrofitFactory.createRetrofit(httpConfig, timeout = 20)
}
+ private val gson by lazy { Gson() }
+ private val typeToken = object : TypeToken>>() {}.type
+
/**
* 验证PublicKey
*/
@@ -133,6 +139,45 @@
}
/**
+ * 添加隐患
+ */
+ suspend fun addHiddenTrouble(
+ mainClass: String,
+ subClass: String,
+ sceneName: String,
+ subClassName: String,
+ basis: String,
+ alarmMenuId: String,
+ content: String,
+ scene: String,
+ inspectionId: String,
+ name: String,
+ mainClassName: String,
+ id: String,
+ imageList: Array>
+ ): String {
+ val param = JsonObject()
+ param.addProperty("mainClass", mainClass)
+ param.addProperty("subClass", subClass)
+ param.addProperty("sceneName", sceneName)
+ param.addProperty("subClassName", subClassName)
+ param.addProperty("basis", basis)
+ param.addProperty("alarmMenuId", alarmMenuId)
+ param.addProperty("content", content)
+ param.addProperty("scene", scene)
+ param.addProperty("inspectionId", inspectionId)
+ param.addProperty("name", name)
+ param.addProperty("mainClassName", mainClassName)
+ param.addProperty("id", id)
+ param.add("imageList", gson.toJsonTree(imageList, typeToken).asJsonArray)
+ val requestBody = param.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+
+ return api.addHiddenTrouble(AuthenticationHelper.token, requestBody)
+ }
+
+ /**
* 根据场景获取获取隐患目录
*/
suspend fun getHiddenTroubleByScene(scene: String, offset: Int): String {
@@ -151,13 +196,22 @@
/**
* 根据场景获取获取隐患目录
*/
- suspend fun getCheckManifestByScene(scene: String, offset: Int): String {
- return api.getCheckManifestByScene(
+ suspend fun getCheckManifestByPage(scene: String, offset: Int): String {
+ return api.getCheckManifestByPage(
AuthenticationHelper.token, scene, offset, LocaleConstant.PAGE_LIMIT
)
}
/**
+ * 获取检查清单-不分页
+ */
+ suspend fun getCheckManifest(
+ keyword: String, type: String, scene: String, checkObject: String
+ ): String {
+ return api.getCheckManifest(AuthenticationHelper.token, keyword, type, scene, checkObject)
+ }
+
+ /**
* 获取指导视频
*/
suspend fun getGuideVideoByPage(keywords: String, classId: String, offset: Int): String {
@@ -212,17 +266,12 @@
/**
* 推送报警信息
* */
- suspend fun uploadDetectTargetAlarm(
- alamCode: String,
- alarmlmgPath: String,
- inspectionld: String,
- scene: String
- ): String {
+ suspend fun uploadDetectTargetAlarm(alarmCode: String, alarmImgPath: String): String {
val param = JsonObject()
- param.addProperty("alamCode", alamCode)
- param.addProperty("alarmlmgPath", alarmlmgPath)
- param.addProperty("inspectionld", inspectionld)
- param.addProperty("scene", scene)
+ param.addProperty("alarmCode", alarmCode)
+ param.addProperty("alarmImgPath", alarmImgPath)
+ param.addProperty("inspectionId", RuntimeCache.inspectionId)
+ param.addProperty("scene", RuntimeCache.sceneName)
val requestBody = param.toString().toRequestBody(
"application/json;charset=UTF-8".toMediaType()
diff --git a/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt
new file mode 100644
index 0000000..143e287
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt
@@ -0,0 +1,14 @@
+package com.casic.br.ar.app.utils
+
+import com.casic.br.ar.app.model.DictionaryModel
+import org.opencv.core.Mat
+
+object RuntimeCache {
+ //TODO 未引用未赋值
+ var scene = ""
+
+ var sceneName = ""
+ var inspectionId = ""
+ var mainDicModels: MutableList = ArrayList()
+ lateinit var mat: Mat
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt
new file mode 100644
index 0000000..989b751
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt
@@ -0,0 +1,217 @@
+package com.casic.br.ar.app.view
+
+import android.graphics.Bitmap
+import android.os.Bundle
+import android.util.Log
+import android.view.View
+import android.widget.AdapterView
+import android.widget.ArrayAdapter
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.databinding.ActivityAddHiddenTroubleBinding
+import com.casic.br.ar.app.extensions.combineFilePath
+import com.casic.br.ar.app.extensions.compressImage
+import com.casic.br.ar.app.model.DictionaryModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.vm.ConfigViewModel
+import com.casic.br.ar.app.vm.HiddenTroubleViewModel
+import com.casic.br.ar.app.vm.ImageFileViewModel
+import com.casic.br.operationsite.test.callback.OnImageCompressListener
+import com.pengxh.kt.lite.adapter.EditableImageAdapter
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets
+import com.pengxh.kt.lite.extensions.createImageFileDir
+import com.pengxh.kt.lite.extensions.dp2px
+import com.pengxh.kt.lite.extensions.getScreenWidth
+import com.pengxh.kt.lite.extensions.saveImage
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.LoadState
+import com.pengxh.kt.lite.utils.LoadingDialogHub
+import org.opencv.android.Utils
+import java.io.File
+
+class AddHiddenTroubleActivity : KotlinBaseActivity() {
+
+ private val kTag = "AddHiddenTroubleActivity"
+ private val context = this
+ private val imagePaths = ArrayList>()
+ private val recyclerViewImages = ArrayList()
+ private val marginOffset by lazy { 1.dp2px(this) }
+ private lateinit var imageAdapter: EditableImageAdapter
+ private lateinit var imageFileViewModel: ImageFileViewModel
+ private lateinit var configViewModel: ConfigViewModel
+ private lateinit var hiddenTroubleViewModel: HiddenTroubleViewModel
+ private var mainDicModels: MutableList = ArrayList()
+ private var subDicModels: MutableList = ArrayList()
+ private var selectedMainTypePosition = 0
+ private var selectedSubTypePosition = 0
+
+ override fun initViewBinding(): ActivityAddHiddenTroubleBinding {
+ return ActivityAddHiddenTroubleBinding.inflate(layoutInflater)
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun observeRequestState() {
+ hiddenTroubleViewModel.loadState.observe(this) {
+ if (it == LoadState.Loading) {
+ LoadingDialogHub.show(this, "隐患添加中,请稍后...")
+ } else {
+ LoadingDialogHub.dismiss()
+ finish()
+ "隐患添加成功".show(this)
+ }
+ }
+
+ imageFileViewModel.loadState.observe(this) {
+ if (it == LoadState.Loading) {
+ "图片上传中,请稍后...".show(this)
+ }
+ }
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ //转为实体类
+ mainDicModels = RuntimeCache.mainDicModels
+ val mainTypeArray = ArrayList()
+ mainDicModels.forEach {
+ mainTypeArray.add(it.name)
+ }
+ val mainTypeAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, mainTypeArray)
+ binding.mainTypeSpinner.adapter = mainTypeAdapter
+
+ configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java]
+ configViewModel.getDictionaryByCode(this, "pitfallSmallType")
+ configViewModel.dictionary.observe(this) {
+ if (it.code == 200) {
+ subDicModels = it.data
+ val subTypeArray = ArrayList()
+ subDicModels.forEach { dic ->
+ subTypeArray.add(dic.name)
+ }
+ val subTypeAdapter = ArrayAdapter(
+ this, android.R.layout.simple_list_item_1, subTypeArray
+ )
+ binding.subTypeSpinner.adapter = subTypeAdapter
+ }
+ }
+
+ //左外边距,左内边距,TextView宽度,内间距,右内边距,右外边距
+ val viewWidth = getScreenWidth() - (15 + 15 + 65 + 10 + 15 + 15).dp2px(this)
+ imageAdapter = EditableImageAdapter(this, recyclerViewImages, viewWidth, 3, 3)
+ binding.recyclerView.addItemDecoration(
+ RecyclerViewItemOffsets(marginOffset, marginOffset, marginOffset, marginOffset)
+ )
+ binding.recyclerView.adapter = imageAdapter
+
+ imageFileViewModel = ViewModelProvider(this)[ImageFileViewModel::class.java]
+ imageFileViewModel.resultModel.observe(this) {
+ if (it.code == 200) {
+ val url = it.data.toString()
+ val map = HashMap()
+ map["alarmImage"] = url
+ map["id"] = ""
+ map["inspectionAlarmId"] = ""
+ imagePaths.add(map)
+ recyclerViewImages.add(url.combineFilePath())
+ imageAdapter.notifyDataSetChanged()
+ }
+ }
+
+ hiddenTroubleViewModel = ViewModelProvider(this)[HiddenTroubleViewModel::class.java]
+ hiddenTroubleViewModel.addTroubleResult.observe(this) {
+ if (it.code == 200) {
+ Log.d(kTag, "troubleId: ${it.data}")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ binding.mainTypeSpinner.setSelection(0)
+ binding.mainTypeSpinner.onItemSelectedListener =
+ object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(
+ parent: AdapterView<*>?, view: View?, position: Int, id: Long
+ ) {
+ selectedMainTypePosition = position
+ }
+
+ override fun onNothingSelected(parent: AdapterView<*>?) {
+
+ }
+ }
+
+ binding.subTypeSpinner.setSelection(0)
+ binding.subTypeSpinner.onItemSelectedListener =
+ object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(
+ parent: AdapterView<*>?, view: View?, position: Int, id: Long
+ ) {
+ selectedSubTypePosition = position
+ }
+
+ override fun onNothingSelected(parent: AdapterView<*>?) {
+
+ }
+ }
+
+ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener {
+ override fun onAddImageClick() {
+ addImage()
+ }
+
+ override fun onItemClick(position: Int) {
+
+ }
+
+ override fun onItemLongClick(view: View?, position: Int) {
+ imagePaths.removeAt(position)
+ recyclerViewImages.removeAt(position)
+ imageAdapter.notifyDataSetChanged()
+ }
+ })
+
+ binding.confirmButton.setOnClickListener {
+ hiddenTroubleViewModel.addHiddenTrouble(
+ this,
+ selectedMainTypePosition.toString(),
+ selectedSubTypePosition.toString(),
+ RuntimeCache.sceneName,
+ subDicModels[selectedMainTypePosition].name,
+ "",
+ "",
+ binding.hiddenTroubleContentView.text.toString(),
+ RuntimeCache.scene,
+ RuntimeCache.inspectionId,
+ binding.hiddenTroubleNameView.text.toString(),
+ mainDicModels[selectedMainTypePosition].name,
+ "",
+ imagePaths.toTypedArray()
+ )
+ }
+
+ binding.cancelButton.setOnClickListener { finish() }
+ }
+
+ private fun addImage() {
+ //mat转图片
+ val bitmap = Bitmap.createBitmap(
+ RuntimeCache.mat.width(),
+ RuntimeCache.mat.height(),
+ Bitmap.Config.ARGB_8888
+ )
+ Utils.matToBitmap(RuntimeCache.mat, bitmap, true)
+ val imagePath = "${createImageFileDir()}/${System.currentTimeMillis()}.png"
+ bitmap.saveImage(imagePath)
+ imagePath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ imageFileViewModel.uploadImage(file)
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/view/CheckManifestBySceneActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/CheckManifestBySceneActivity.kt
new file mode 100644
index 0000000..1e7bae2
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/view/CheckManifestBySceneActivity.kt
@@ -0,0 +1,45 @@
+package com.casic.br.ar.app.view
+
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import com.casic.br.ar.app.adapter.TopViewPagerAdapter
+import com.casic.br.ar.app.databinding.ActivityCheckManifestBySceneBinding
+import com.casic.br.ar.app.fragment.CheckManifestFragment
+import com.casic.br.ar.app.fragment.HiddenTroubleFragment
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+
+class CheckManifestBySceneActivity : KotlinBaseActivity() {
+
+ private var fragmentPages = ArrayList()
+
+ override fun initEvent() {
+ binding.confirmButton.setOnClickListener { finish() }
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ val subPageTitles = arrayOf("${RuntimeCache.sceneName}检查清单", "隐患列表")
+ fragmentPages.add(CheckManifestFragment())
+ fragmentPages.add(HiddenTroubleFragment())
+
+ val topViewPagerAdapter = TopViewPagerAdapter(
+ supportFragmentManager, subPageTitles, fragmentPages
+ )
+ //页面永不销毁
+ binding.viewPager.offscreenPageLimit = fragmentPages.size
+ binding.viewPager.adapter = topViewPagerAdapter
+ binding.tabLayout.setupWithViewPager(binding.viewPager)
+ }
+
+ override fun initViewBinding(): ActivityCheckManifestBySceneBinding {
+ return ActivityCheckManifestBySceneBinding.inflate(layoutInflater)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index b007d28..7cb37f7 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -31,5 +31,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 04f725b..9a00059 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -64,7 +64,7 @@
}
dependencies {
-//基础依赖库
+ //基础依赖库
implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.10'
implementation 'androidx.core:core-ktx:1.9.0'
def androidx_version = '1.6.1'
@@ -120,4 +120,5 @@
//生成二维码
implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
implementation project(':sdk')
+ implementation 'com.rokid.ai.glass:instructsdk:1.7.8'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index de85667..50019c7 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -70,6 +70,14 @@
android:name=".view.CheckModeActivity"
android:screenOrientation="landscape" />
+
+
diff --git a/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
new file mode 100644
index 0000000..1deea58
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
@@ -0,0 +1,18 @@
+package com.casic.br.ar.app.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class TopViewPagerAdapter(
+ fragmentManager: FragmentManager,
+ private val pageTitles: Array,
+ private val pages: List
+) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
+
+ override fun getItem(position: Int) = pages[position]
+
+ override fun getCount() = pages.size
+
+ override fun getPageTitle(position: Int) = pageTitles[position]
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
index 66f49cf..cf7240b 100644
--- a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
@@ -2,6 +2,8 @@
import android.app.Application
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.rokid.glass.instruct.VoiceInstruction
+import org.opencv.android.OpenCVLoader
class BaseApplication : Application() {
@@ -10,5 +12,8 @@
override fun onCreate() {
super.onCreate()
SaveKeyValues.initSharedPreferences(this)
+ VoiceInstruction.init(this, false)
+ //初始化OpenCV
+ OpenCVLoader.initLocal()
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt b/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt
new file mode 100644
index 0000000..86be402
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt
@@ -0,0 +1,120 @@
+package com.casic.br.ar.app.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.R
+import com.casic.br.ar.app.databinding.FragmentCheckManifestBinding
+import com.casic.br.ar.app.model.SceneCheckManifestModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.vm.CheckManifestViewModel
+import com.casic.br.ar.app.vm.ConfigViewModel
+import com.casic.br.ar.app.widgets.CheckStandardSheet
+import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
+import com.pengxh.kt.lite.adapter.ViewHolder
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class CheckManifestFragment : KotlinBaseFragment() {
+
+ private val kTag = "CheckManifestFragment"
+ private lateinit var configViewModel: ConfigViewModel
+ private lateinit var checkManifestViewModel: CheckManifestViewModel
+
+ override fun initEvent() {
+
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ //detectedScene转为字典值
+ configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java]
+ configViewModel.getDictionaryByCode(requireContext(), "securityScene")
+ configViewModel.dictionary.observe(this) {
+ if (it.code == 200) {
+ for (dic in it.data) {
+ if (dic.name == RuntimeCache.sceneName) {
+ checkManifestViewModel.getCheckManifestByScene(requireContext(), dic.value)
+ return@observe
+ }
+ }
+ }
+ }
+
+ checkManifestViewModel = ViewModelProvider(this)[CheckManifestViewModel::class.java]
+ checkManifestViewModel.sceneManifestResult.observe(this) {
+ if (it.code == 200) {
+ //去重
+ val mainClassSet = HashSet()
+ it.data.forEach { row ->
+ mainClassSet.add(row.typeName)
+ }
+ val typeNameAdapter = object : NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_l_2, mainClassSet.toMutableList()
+ ) {
+ override fun convertView(viewHolder: ViewHolder, position: Int, item: String) {
+ viewHolder.setText(R.id.troubleMainClassView, item)
+ }
+ }
+ binding.leftRecyclerView.adapter = typeNameAdapter
+
+ if (mainClassSet.isEmpty()) {
+ return@observe
+ }
+ //默认加载第一项的数据
+ initSubRecyclerView(it, mainClassSet.first())
+ typeNameAdapter.setOnItemClickedListener(object :
+ NormalRecyclerAdapter.OnItemClickedListener {
+ override fun onItemClicked(position: Int, t: String) {
+ initSubRecyclerView(it, t)
+ }
+ })
+ }
+ }
+ }
+
+ private fun initSubRecyclerView(parent: SceneCheckManifestModel, selectedType: String) {
+ //根据大类查询隐患内容
+ val contentSet = HashSet()
+ for (row in parent.data) {
+ if (row.typeName == selectedType) {
+ contentSet.add(row.checkItem)
+ }
+ }
+ val contentAdapter = object : NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_l_3, contentSet.toMutableList()
+ ) {
+ override fun convertView(viewHolder: ViewHolder, position: Int, item: String) {
+ viewHolder.setText(R.id.troubleIndexView, "${position + 1}、")
+ .setText(R.id.troubleNameView, item)
+ .setOnClickListener(R.id.showImageView) {
+ //显示行业标准
+ for (row in parent.data) {
+ if (row.checkItem == item) {
+ CheckStandardSheet.Builder()
+ .setContext(requireContext())
+ .setSheetValue(row.checkStandard)
+ .build().show()
+ return@setOnClickListener
+ }
+ }
+ }
+ }
+ }
+ binding.rightRecyclerView.adapter = contentAdapter
+ }
+
+ override fun initViewBinding(
+ inflater: LayoutInflater,
+ container: ViewGroup?
+ ): FragmentCheckManifestBinding {
+ return FragmentCheckManifestBinding.inflate(inflater, container, false)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt b/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt
new file mode 100644
index 0000000..2ddb65c
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt
@@ -0,0 +1,91 @@
+package com.casic.br.ar.app.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.R
+import com.casic.br.ar.app.databinding.FragmentHiddenTroubleBinding
+import com.casic.br.ar.app.extensions.combineFilePath
+import com.casic.br.ar.app.model.HiddenTroubleListResultModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.view.BigImageActivity
+import com.casic.br.ar.app.vm.InspectionViewModel
+import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
+import com.pengxh.kt.lite.adapter.ViewHolder
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.extensions.show
+
+
+class HiddenTroubleFragment : KotlinBaseFragment() {
+
+ private lateinit var inspectionViewModel: InspectionViewModel
+
+ override fun initEvent() {
+
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java]
+ inspectionViewModel.getHiddenTroublesByInspectionId(
+ requireContext(), RuntimeCache.inspectionId
+ )
+ inspectionViewModel.troublesResultModel.observe(this) {
+ if (it.code == 200) {
+ if (it.data.isEmpty()) {
+ binding.tipsView.visibility = View.VISIBLE
+ binding.recyclerView.visibility = View.GONE
+ } else {
+ binding.recyclerView.visibility = View.VISIBLE
+ binding.tipsView.visibility = View.GONE
+
+ val troublesAdapter = object :
+ NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_by_id_l_2, it.data
+ ) {
+ override fun convertView(
+ viewHolder: ViewHolder, position: Int,
+ item: HiddenTroubleListResultModel.DataModel
+ ) {
+ viewHolder.setText(R.id.troubleIndexView, "${position + 1}、")
+ .setText(R.id.troubleNameView, item.name)
+ .setOnClickListener(R.id.deleteTroubleView) {
+ //TODO 删除隐患
+ }
+ .setOnClickListener(R.id.showImageView) {
+ if (item.imageList.isEmpty()) {
+ "此隐患暂无图片".show(requireContext())
+ return@setOnClickListener
+ }
+
+ val images = ArrayList()
+ item.imageList.forEach { imageModel ->
+ images.add(imageModel.alarmImage.combineFilePath())
+ }
+ requireContext().navigatePageTo(0, images)
+ }
+ }
+ }
+ binding.recyclerView.adapter = troublesAdapter
+ }
+ }
+ }
+ }
+
+ override fun initViewBinding(
+ inflater: LayoutInflater,
+ container: ViewGroup?
+ ): FragmentHiddenTroubleBinding {
+ return FragmentHiddenTroubleBinding.inflate(inflater, container, false)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java
new file mode 100644
index 0000000..ba1d738
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java
@@ -0,0 +1,41 @@
+package com.casic.br.ar.app.model;
+
+public class AddHiddenTroubleResultModel {
+
+ private int code;
+ private String data;
+ private String message;
+ private boolean success;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+}
diff --git a/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java b/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java
new file mode 100644
index 0000000..993ef8d
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java
@@ -0,0 +1,208 @@
+package com.casic.br.ar.app.model;
+
+import java.util.List;
+
+public class SceneCheckManifestModel {
+
+ private int code;
+ private List data;
+ private String message;
+ private boolean success;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public List getData() {
+ return data;
+ }
+
+ public void setData(List data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+
+ public static class DataModel {
+ private List> basisList;
+ private String checkItem;
+ private String checkMethod;
+ private String checkObject;
+ private String checkObjectName;
+ private String checkStandard;
+ private String createTime;
+ private String createUserId;
+ private String createUserName;
+ private String id;
+ private String remark;
+ private String scene;
+ private String sceneName;
+ private String type;
+ private String typeName;
+ private String updateTime;
+ private String updateUserId;
+ private String updateUserName;
+
+ public List> getBasisList() {
+ return basisList;
+ }
+
+ public void setBasisList(List> basisList) {
+ this.basisList = basisList;
+ }
+
+ public String getCheckItem() {
+ return checkItem;
+ }
+
+ public void setCheckItem(String checkItem) {
+ this.checkItem = checkItem;
+ }
+
+ public String getCheckMethod() {
+ return checkMethod;
+ }
+
+ public void setCheckMethod(String checkMethod) {
+ this.checkMethod = checkMethod;
+ }
+
+ public String getCheckObject() {
+ return checkObject;
+ }
+
+ public void setCheckObject(String checkObject) {
+ this.checkObject = checkObject;
+ }
+
+ public String getCheckObjectName() {
+ return checkObjectName;
+ }
+
+ public void setCheckObjectName(String checkObjectName) {
+ this.checkObjectName = checkObjectName;
+ }
+
+ public String getCheckStandard() {
+ return checkStandard;
+ }
+
+ public void setCheckStandard(String checkStandard) {
+ this.checkStandard = checkStandard;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getCreateUserId() {
+ return createUserId;
+ }
+
+ public void setCreateUserId(String createUserId) {
+ this.createUserId = createUserId;
+ }
+
+ public String getCreateUserName() {
+ return createUserName;
+ }
+
+ public void setCreateUserName(String createUserName) {
+ this.createUserName = createUserName;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getScene() {
+ return scene;
+ }
+
+ public void setScene(String scene) {
+ this.scene = scene;
+ }
+
+ public String getSceneName() {
+ return sceneName;
+ }
+
+ public void setSceneName(String sceneName) {
+ this.sceneName = sceneName;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getTypeName() {
+ return typeName;
+ }
+
+ public void setTypeName(String typeName) {
+ this.typeName = typeName;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ public String getUpdateUserId() {
+ return updateUserId;
+ }
+
+ public void setUpdateUserId(String updateUserId) {
+ this.updateUserId = updateUserId;
+ }
+
+ public String getUpdateUserName() {
+ return updateUserName;
+ }
+
+ public void setUpdateUserName(String updateUserName) {
+ this.updateUserName = updateUserName;
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt
index 4d617a4..43db667 100644
--- a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt
@@ -96,6 +96,15 @@
): String
/**
+ * 添加隐患
+ */
+ @POST("/inspection-record/addAlarm")
+ suspend fun addHiddenTrouble(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
+
+ /**
* 根据场景获取获取隐患目录
*/
@GET("/alarm-menu/listPage")
@@ -119,7 +128,7 @@
* 根据场景获取获取检查清单
*/
@GET("/check-menu/listPage")
- suspend fun getCheckManifestByScene(
+ suspend fun getCheckManifestByPage(
@Header("token") token: String,
@Query("scene") scene: String,
@Query("offset") offset: Int,
@@ -127,6 +136,18 @@
): String
/**
+ * 获取检查清单-不分页
+ */
+ @GET("/check-menu/list")
+ suspend fun getCheckManifest(
+ @Header("token") token: String,
+ @Query("keyword") keyword: String,
+ @Query("type") type: String,
+ @Query("scene") scene: String,
+ @Query("checkObject") checkObject: String
+ ): String
+
+ /**
* 获取指导视频
*/
@GET("/knowledge-base/listPage")
diff --git a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt
index 8c35212..beedfe1 100644
--- a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt
@@ -2,7 +2,10 @@
import com.casic.br.ar.app.utils.AuthenticationHelper
import com.casic.br.ar.app.utils.LocaleConstant
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.google.gson.Gson
import com.google.gson.JsonObject
+import com.google.gson.reflect.TypeToken
import com.pengxh.kt.lite.utils.RetrofitFactory
import com.pengxh.kt.lite.utils.SaveKeyValues
import okhttp3.MediaType.Companion.toMediaType
@@ -30,6 +33,9 @@
RetrofitFactory.createRetrofit(httpConfig, timeout = 20)
}
+ private val gson by lazy { Gson() }
+ private val typeToken = object : TypeToken>>() {}.type
+
/**
* 验证PublicKey
*/
@@ -133,6 +139,45 @@
}
/**
+ * 添加隐患
+ */
+ suspend fun addHiddenTrouble(
+ mainClass: String,
+ subClass: String,
+ sceneName: String,
+ subClassName: String,
+ basis: String,
+ alarmMenuId: String,
+ content: String,
+ scene: String,
+ inspectionId: String,
+ name: String,
+ mainClassName: String,
+ id: String,
+ imageList: Array>
+ ): String {
+ val param = JsonObject()
+ param.addProperty("mainClass", mainClass)
+ param.addProperty("subClass", subClass)
+ param.addProperty("sceneName", sceneName)
+ param.addProperty("subClassName", subClassName)
+ param.addProperty("basis", basis)
+ param.addProperty("alarmMenuId", alarmMenuId)
+ param.addProperty("content", content)
+ param.addProperty("scene", scene)
+ param.addProperty("inspectionId", inspectionId)
+ param.addProperty("name", name)
+ param.addProperty("mainClassName", mainClassName)
+ param.addProperty("id", id)
+ param.add("imageList", gson.toJsonTree(imageList, typeToken).asJsonArray)
+ val requestBody = param.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+
+ return api.addHiddenTrouble(AuthenticationHelper.token, requestBody)
+ }
+
+ /**
* 根据场景获取获取隐患目录
*/
suspend fun getHiddenTroubleByScene(scene: String, offset: Int): String {
@@ -151,13 +196,22 @@
/**
* 根据场景获取获取隐患目录
*/
- suspend fun getCheckManifestByScene(scene: String, offset: Int): String {
- return api.getCheckManifestByScene(
+ suspend fun getCheckManifestByPage(scene: String, offset: Int): String {
+ return api.getCheckManifestByPage(
AuthenticationHelper.token, scene, offset, LocaleConstant.PAGE_LIMIT
)
}
/**
+ * 获取检查清单-不分页
+ */
+ suspend fun getCheckManifest(
+ keyword: String, type: String, scene: String, checkObject: String
+ ): String {
+ return api.getCheckManifest(AuthenticationHelper.token, keyword, type, scene, checkObject)
+ }
+
+ /**
* 获取指导视频
*/
suspend fun getGuideVideoByPage(keywords: String, classId: String, offset: Int): String {
@@ -212,17 +266,12 @@
/**
* 推送报警信息
* */
- suspend fun uploadDetectTargetAlarm(
- alamCode: String,
- alarmlmgPath: String,
- inspectionld: String,
- scene: String
- ): String {
+ suspend fun uploadDetectTargetAlarm(alarmCode: String, alarmImgPath: String): String {
val param = JsonObject()
- param.addProperty("alamCode", alamCode)
- param.addProperty("alarmlmgPath", alarmlmgPath)
- param.addProperty("inspectionld", inspectionld)
- param.addProperty("scene", scene)
+ param.addProperty("alarmCode", alarmCode)
+ param.addProperty("alarmImgPath", alarmImgPath)
+ param.addProperty("inspectionId", RuntimeCache.inspectionId)
+ param.addProperty("scene", RuntimeCache.sceneName)
val requestBody = param.toString().toRequestBody(
"application/json;charset=UTF-8".toMediaType()
diff --git a/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt
new file mode 100644
index 0000000..143e287
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt
@@ -0,0 +1,14 @@
+package com.casic.br.ar.app.utils
+
+import com.casic.br.ar.app.model.DictionaryModel
+import org.opencv.core.Mat
+
+object RuntimeCache {
+ //TODO 未引用未赋值
+ var scene = ""
+
+ var sceneName = ""
+ var inspectionId = ""
+ var mainDicModels: MutableList = ArrayList()
+ lateinit var mat: Mat
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt
new file mode 100644
index 0000000..989b751
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt
@@ -0,0 +1,217 @@
+package com.casic.br.ar.app.view
+
+import android.graphics.Bitmap
+import android.os.Bundle
+import android.util.Log
+import android.view.View
+import android.widget.AdapterView
+import android.widget.ArrayAdapter
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.databinding.ActivityAddHiddenTroubleBinding
+import com.casic.br.ar.app.extensions.combineFilePath
+import com.casic.br.ar.app.extensions.compressImage
+import com.casic.br.ar.app.model.DictionaryModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.vm.ConfigViewModel
+import com.casic.br.ar.app.vm.HiddenTroubleViewModel
+import com.casic.br.ar.app.vm.ImageFileViewModel
+import com.casic.br.operationsite.test.callback.OnImageCompressListener
+import com.pengxh.kt.lite.adapter.EditableImageAdapter
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets
+import com.pengxh.kt.lite.extensions.createImageFileDir
+import com.pengxh.kt.lite.extensions.dp2px
+import com.pengxh.kt.lite.extensions.getScreenWidth
+import com.pengxh.kt.lite.extensions.saveImage
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.LoadState
+import com.pengxh.kt.lite.utils.LoadingDialogHub
+import org.opencv.android.Utils
+import java.io.File
+
+class AddHiddenTroubleActivity : KotlinBaseActivity() {
+
+ private val kTag = "AddHiddenTroubleActivity"
+ private val context = this
+ private val imagePaths = ArrayList>()
+ private val recyclerViewImages = ArrayList()
+ private val marginOffset by lazy { 1.dp2px(this) }
+ private lateinit var imageAdapter: EditableImageAdapter
+ private lateinit var imageFileViewModel: ImageFileViewModel
+ private lateinit var configViewModel: ConfigViewModel
+ private lateinit var hiddenTroubleViewModel: HiddenTroubleViewModel
+ private var mainDicModels: MutableList = ArrayList()
+ private var subDicModels: MutableList = ArrayList()
+ private var selectedMainTypePosition = 0
+ private var selectedSubTypePosition = 0
+
+ override fun initViewBinding(): ActivityAddHiddenTroubleBinding {
+ return ActivityAddHiddenTroubleBinding.inflate(layoutInflater)
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun observeRequestState() {
+ hiddenTroubleViewModel.loadState.observe(this) {
+ if (it == LoadState.Loading) {
+ LoadingDialogHub.show(this, "隐患添加中,请稍后...")
+ } else {
+ LoadingDialogHub.dismiss()
+ finish()
+ "隐患添加成功".show(this)
+ }
+ }
+
+ imageFileViewModel.loadState.observe(this) {
+ if (it == LoadState.Loading) {
+ "图片上传中,请稍后...".show(this)
+ }
+ }
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ //转为实体类
+ mainDicModels = RuntimeCache.mainDicModels
+ val mainTypeArray = ArrayList()
+ mainDicModels.forEach {
+ mainTypeArray.add(it.name)
+ }
+ val mainTypeAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, mainTypeArray)
+ binding.mainTypeSpinner.adapter = mainTypeAdapter
+
+ configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java]
+ configViewModel.getDictionaryByCode(this, "pitfallSmallType")
+ configViewModel.dictionary.observe(this) {
+ if (it.code == 200) {
+ subDicModels = it.data
+ val subTypeArray = ArrayList()
+ subDicModels.forEach { dic ->
+ subTypeArray.add(dic.name)
+ }
+ val subTypeAdapter = ArrayAdapter(
+ this, android.R.layout.simple_list_item_1, subTypeArray
+ )
+ binding.subTypeSpinner.adapter = subTypeAdapter
+ }
+ }
+
+ //左外边距,左内边距,TextView宽度,内间距,右内边距,右外边距
+ val viewWidth = getScreenWidth() - (15 + 15 + 65 + 10 + 15 + 15).dp2px(this)
+ imageAdapter = EditableImageAdapter(this, recyclerViewImages, viewWidth, 3, 3)
+ binding.recyclerView.addItemDecoration(
+ RecyclerViewItemOffsets(marginOffset, marginOffset, marginOffset, marginOffset)
+ )
+ binding.recyclerView.adapter = imageAdapter
+
+ imageFileViewModel = ViewModelProvider(this)[ImageFileViewModel::class.java]
+ imageFileViewModel.resultModel.observe(this) {
+ if (it.code == 200) {
+ val url = it.data.toString()
+ val map = HashMap()
+ map["alarmImage"] = url
+ map["id"] = ""
+ map["inspectionAlarmId"] = ""
+ imagePaths.add(map)
+ recyclerViewImages.add(url.combineFilePath())
+ imageAdapter.notifyDataSetChanged()
+ }
+ }
+
+ hiddenTroubleViewModel = ViewModelProvider(this)[HiddenTroubleViewModel::class.java]
+ hiddenTroubleViewModel.addTroubleResult.observe(this) {
+ if (it.code == 200) {
+ Log.d(kTag, "troubleId: ${it.data}")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ binding.mainTypeSpinner.setSelection(0)
+ binding.mainTypeSpinner.onItemSelectedListener =
+ object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(
+ parent: AdapterView<*>?, view: View?, position: Int, id: Long
+ ) {
+ selectedMainTypePosition = position
+ }
+
+ override fun onNothingSelected(parent: AdapterView<*>?) {
+
+ }
+ }
+
+ binding.subTypeSpinner.setSelection(0)
+ binding.subTypeSpinner.onItemSelectedListener =
+ object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(
+ parent: AdapterView<*>?, view: View?, position: Int, id: Long
+ ) {
+ selectedSubTypePosition = position
+ }
+
+ override fun onNothingSelected(parent: AdapterView<*>?) {
+
+ }
+ }
+
+ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener {
+ override fun onAddImageClick() {
+ addImage()
+ }
+
+ override fun onItemClick(position: Int) {
+
+ }
+
+ override fun onItemLongClick(view: View?, position: Int) {
+ imagePaths.removeAt(position)
+ recyclerViewImages.removeAt(position)
+ imageAdapter.notifyDataSetChanged()
+ }
+ })
+
+ binding.confirmButton.setOnClickListener {
+ hiddenTroubleViewModel.addHiddenTrouble(
+ this,
+ selectedMainTypePosition.toString(),
+ selectedSubTypePosition.toString(),
+ RuntimeCache.sceneName,
+ subDicModels[selectedMainTypePosition].name,
+ "",
+ "",
+ binding.hiddenTroubleContentView.text.toString(),
+ RuntimeCache.scene,
+ RuntimeCache.inspectionId,
+ binding.hiddenTroubleNameView.text.toString(),
+ mainDicModels[selectedMainTypePosition].name,
+ "",
+ imagePaths.toTypedArray()
+ )
+ }
+
+ binding.cancelButton.setOnClickListener { finish() }
+ }
+
+ private fun addImage() {
+ //mat转图片
+ val bitmap = Bitmap.createBitmap(
+ RuntimeCache.mat.width(),
+ RuntimeCache.mat.height(),
+ Bitmap.Config.ARGB_8888
+ )
+ Utils.matToBitmap(RuntimeCache.mat, bitmap, true)
+ val imagePath = "${createImageFileDir()}/${System.currentTimeMillis()}.png"
+ bitmap.saveImage(imagePath)
+ imagePath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ imageFileViewModel.uploadImage(file)
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/view/CheckManifestBySceneActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/CheckManifestBySceneActivity.kt
new file mode 100644
index 0000000..1e7bae2
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/view/CheckManifestBySceneActivity.kt
@@ -0,0 +1,45 @@
+package com.casic.br.ar.app.view
+
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import com.casic.br.ar.app.adapter.TopViewPagerAdapter
+import com.casic.br.ar.app.databinding.ActivityCheckManifestBySceneBinding
+import com.casic.br.ar.app.fragment.CheckManifestFragment
+import com.casic.br.ar.app.fragment.HiddenTroubleFragment
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+
+class CheckManifestBySceneActivity : KotlinBaseActivity() {
+
+ private var fragmentPages = ArrayList()
+
+ override fun initEvent() {
+ binding.confirmButton.setOnClickListener { finish() }
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ val subPageTitles = arrayOf("${RuntimeCache.sceneName}检查清单", "隐患列表")
+ fragmentPages.add(CheckManifestFragment())
+ fragmentPages.add(HiddenTroubleFragment())
+
+ val topViewPagerAdapter = TopViewPagerAdapter(
+ supportFragmentManager, subPageTitles, fragmentPages
+ )
+ //页面永不销毁
+ binding.viewPager.offscreenPageLimit = fragmentPages.size
+ binding.viewPager.adapter = topViewPagerAdapter
+ binding.tabLayout.setupWithViewPager(binding.viewPager)
+ }
+
+ override fun initViewBinding(): ActivityCheckManifestBySceneBinding {
+ return ActivityCheckManifestBySceneBinding.inflate(layoutInflater)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt
index af8ef35..2c0252c 100644
--- a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt
+++ b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt
@@ -26,20 +26,24 @@
import com.casic.br.ar.app.model.DictionaryModel
import com.casic.br.ar.app.utils.LocaleConstant
import com.casic.br.ar.app.utils.LocationManager
+import com.casic.br.ar.app.utils.RuntimeCache
import com.casic.br.ar.app.vm.AlarmViewModel
import com.casic.br.ar.app.vm.ConfigViewModel
import com.casic.br.ar.app.vm.ImageFileViewModel
import com.casic.br.ar.app.vm.InspectionViewModel
import com.casic.br.ar.app.widgets.DetectResultDialog
import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.extensions.show
import com.pengxh.kt.lite.extensions.timestampToDate
import com.pengxh.kt.lite.extensions.timestampToTime
import com.pengxh.kt.lite.extensions.toJson
-import com.pengxh.kt.lite.utils.Constant
import com.pengxh.kt.lite.utils.SaveKeyValues
import com.pengxh.kt.lite.utils.WeakReferenceHandler
import com.pengxh.kt.lite.widget.dialog.AlertControlDialog
+import com.rokid.glass.instruct.InstructLifeManager
+import com.rokid.glass.instruct.entity.EntityKey
+import com.rokid.glass.instruct.entity.InstructEntity
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
@@ -47,7 +51,7 @@
import java.io.File
class CheckModeActivity : KotlinBaseActivity(), SurfaceHolder.Callback,
- INativeCallback, Handler.Callback {
+ INativeCallback, Handler.Callback, InstructLifeManager.IInstructLifeListener {
private val kTag = "StartCheckActivity"
private val context = this
@@ -65,10 +69,8 @@
private lateinit var imageFileViewModel: ImageFileViewModel
private lateinit var alarmViewModel: AlarmViewModel
private var inspectionAddress = ""
- private var inspectionId = ""
private var mainDicModels: MutableList = ArrayList()
private var isDetectTarget = false
- private var detectedScene = ""
private var alarmCode = ""
override fun initOnCreate(savedInstanceState: Bundle?) {
@@ -82,11 +84,11 @@
useClassify = false, useSegmentation = false, useDetect = true
)
- yolov8ncnn.openCamera(1)
-
binding.surfaceView.holder.setFormat(PixelFormat.RGBA_8888)
binding.surfaceView.holder.addCallback(this)
+ yolov8ncnn.openCamera(1)
+
locationManager.getCurrentLocation(false, object : LocationManager.OnGetLocationListener {
override fun onAMapLocationGet(location: AMapLocation?) {
location?.apply {
@@ -108,7 +110,7 @@
)
inspectionViewModel.addResultModel.observe(this) {
if (it.code == 200) {
- inspectionId = it.data
+ RuntimeCache.inspectionId = it.data
}
}
@@ -123,15 +125,45 @@
imageFileViewModel = ViewModelProvider(this)[ImageFileViewModel::class.java]
imageFileViewModel.resultModel.observe(this) {
if (it.code == 200) {
- alarmViewModel.uploadDetectTargetAlarm(
- context, alarmCode, it.data.toString(), inspectionId, detectedScene
- )
+ alarmViewModel.uploadDetectTargetAlarm(context, alarmCode, it.data.toString())
}
}
}
override fun initEvent() {
-
+ val instructLifeManager = InstructLifeManager(this, lifecycle, this)
+ instructLifeManager.addInstructEntity(
+ InstructEntity()
+ .addEntityKey(EntityKey("打开检查清单", "da kai jian cha qing dan"))
+ .setShowTips(true)
+ .setIgnoreHelp(false)
+ .setCallback { _, _, _ ->
+ /**
+ * 根据场景查看检查清单
+ * */
+ navigatePageTo()
+ }
+ ).addInstructEntity(
+ InstructEntity()
+ .addEntityKey(EntityKey("添加隐患", "tian jia yin huan"))
+ .setShowTips(true)
+ .setIgnoreHelp(false)
+ .setCallback { _, _, _ ->
+ RuntimeCache.mat = mat
+ RuntimeCache.mainDicModels = mainDicModels
+ navigatePageTo()
+ }
+ ).addInstructEntity(
+ InstructEntity()
+ .addEntityKey(EntityKey("结束检查", "jie shu jian cha"))
+ .setShowTips(true)
+ .setIgnoreHelp(false)
+ .setCallback { _, _, _ ->
+ Intent(this, CheckResultActivity::class.java).also {
+ stopTaskLauncher.launch(it)
+ }
+ }
+ )
}
override fun initViewBinding(): ActivityCheckModeBinding {
@@ -149,9 +181,9 @@
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
if (keyCode == 4) {
- val intent = Intent(this, CheckResultActivity::class.java)
- intent.putExtra(Constant.INTENT_PARAM, inspectionId)
- stopTaskLauncher.launch(intent)
+ Intent(this, CheckResultActivity::class.java).also {
+ stopTaskLauncher.launch(it)
+ }
}
return super.onKeyDown(keyCode, event)
}
@@ -162,7 +194,6 @@
if (it.resultCode == Activity.RESULT_OK) {
lifecycleScope.launch(Dispatchers.Main) {
yolov8ncnn.closeCamera()
- mat.release()
delay(1000)
@@ -208,14 +239,14 @@
detectResults.forEach {
val label = LocaleConstant.CLASS_NAMES_ARRAY[it.type]
- if (label.isInScene(detectedScene)) {
+ if (label.isInScene(RuntimeCache.sceneName)) {
targetSet.add(label)
}
}
//只显示隐患
var warnings = ""
- when (detectedScene) {
+ when (RuntimeCache.sceneName) {
"配电箱" -> {
if (!detectResults.isContains(16)) {
warnings = "配电箱无警示标识"
@@ -402,6 +433,10 @@
val label = LocaleConstant.CLASS_NAMES_ARRAY[firstYoloResult]
val scene = label.getSceneByTarget()
+ if (scene == "未知场景") {
+ return
+ }
+
val message = weakReferenceHandler.obtainMessage()
message.what = 2024082901
message.obj = scene
@@ -421,7 +456,7 @@
.setOnDialogButtonClickListener(object :
AlertControlDialog.OnDialogButtonClickListener {
override fun onConfirmClick() {
- detectedScene = scene
+ RuntimeCache.sceneName = scene
detectedSceneSet.add(scene)
binding.titleView.text = scene
@@ -467,6 +502,19 @@
override fun onDestroy() {
super.onDestroy()
+ mat.release()
locationManager.stopLocation()
}
+
+ override fun onInterceptCommand(command: String?): Boolean {
+ return false
+ }
+
+ override fun onTipsUiReady() {
+
+ }
+
+ override fun onHelpLayerShow(show: Boolean) {
+
+ }
}
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index b007d28..7cb37f7 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -31,5 +31,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 04f725b..9a00059 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -64,7 +64,7 @@
}
dependencies {
-//基础依赖库
+ //基础依赖库
implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.10'
implementation 'androidx.core:core-ktx:1.9.0'
def androidx_version = '1.6.1'
@@ -120,4 +120,5 @@
//生成二维码
implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
implementation project(':sdk')
+ implementation 'com.rokid.ai.glass:instructsdk:1.7.8'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index de85667..50019c7 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -70,6 +70,14 @@
android:name=".view.CheckModeActivity"
android:screenOrientation="landscape" />
+
+
diff --git a/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
new file mode 100644
index 0000000..1deea58
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
@@ -0,0 +1,18 @@
+package com.casic.br.ar.app.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class TopViewPagerAdapter(
+ fragmentManager: FragmentManager,
+ private val pageTitles: Array,
+ private val pages: List
+) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
+
+ override fun getItem(position: Int) = pages[position]
+
+ override fun getCount() = pages.size
+
+ override fun getPageTitle(position: Int) = pageTitles[position]
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
index 66f49cf..cf7240b 100644
--- a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
@@ -2,6 +2,8 @@
import android.app.Application
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.rokid.glass.instruct.VoiceInstruction
+import org.opencv.android.OpenCVLoader
class BaseApplication : Application() {
@@ -10,5 +12,8 @@
override fun onCreate() {
super.onCreate()
SaveKeyValues.initSharedPreferences(this)
+ VoiceInstruction.init(this, false)
+ //初始化OpenCV
+ OpenCVLoader.initLocal()
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt b/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt
new file mode 100644
index 0000000..86be402
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt
@@ -0,0 +1,120 @@
+package com.casic.br.ar.app.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.R
+import com.casic.br.ar.app.databinding.FragmentCheckManifestBinding
+import com.casic.br.ar.app.model.SceneCheckManifestModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.vm.CheckManifestViewModel
+import com.casic.br.ar.app.vm.ConfigViewModel
+import com.casic.br.ar.app.widgets.CheckStandardSheet
+import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
+import com.pengxh.kt.lite.adapter.ViewHolder
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class CheckManifestFragment : KotlinBaseFragment() {
+
+ private val kTag = "CheckManifestFragment"
+ private lateinit var configViewModel: ConfigViewModel
+ private lateinit var checkManifestViewModel: CheckManifestViewModel
+
+ override fun initEvent() {
+
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ //detectedScene转为字典值
+ configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java]
+ configViewModel.getDictionaryByCode(requireContext(), "securityScene")
+ configViewModel.dictionary.observe(this) {
+ if (it.code == 200) {
+ for (dic in it.data) {
+ if (dic.name == RuntimeCache.sceneName) {
+ checkManifestViewModel.getCheckManifestByScene(requireContext(), dic.value)
+ return@observe
+ }
+ }
+ }
+ }
+
+ checkManifestViewModel = ViewModelProvider(this)[CheckManifestViewModel::class.java]
+ checkManifestViewModel.sceneManifestResult.observe(this) {
+ if (it.code == 200) {
+ //去重
+ val mainClassSet = HashSet()
+ it.data.forEach { row ->
+ mainClassSet.add(row.typeName)
+ }
+ val typeNameAdapter = object : NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_l_2, mainClassSet.toMutableList()
+ ) {
+ override fun convertView(viewHolder: ViewHolder, position: Int, item: String) {
+ viewHolder.setText(R.id.troubleMainClassView, item)
+ }
+ }
+ binding.leftRecyclerView.adapter = typeNameAdapter
+
+ if (mainClassSet.isEmpty()) {
+ return@observe
+ }
+ //默认加载第一项的数据
+ initSubRecyclerView(it, mainClassSet.first())
+ typeNameAdapter.setOnItemClickedListener(object :
+ NormalRecyclerAdapter.OnItemClickedListener {
+ override fun onItemClicked(position: Int, t: String) {
+ initSubRecyclerView(it, t)
+ }
+ })
+ }
+ }
+ }
+
+ private fun initSubRecyclerView(parent: SceneCheckManifestModel, selectedType: String) {
+ //根据大类查询隐患内容
+ val contentSet = HashSet()
+ for (row in parent.data) {
+ if (row.typeName == selectedType) {
+ contentSet.add(row.checkItem)
+ }
+ }
+ val contentAdapter = object : NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_l_3, contentSet.toMutableList()
+ ) {
+ override fun convertView(viewHolder: ViewHolder, position: Int, item: String) {
+ viewHolder.setText(R.id.troubleIndexView, "${position + 1}、")
+ .setText(R.id.troubleNameView, item)
+ .setOnClickListener(R.id.showImageView) {
+ //显示行业标准
+ for (row in parent.data) {
+ if (row.checkItem == item) {
+ CheckStandardSheet.Builder()
+ .setContext(requireContext())
+ .setSheetValue(row.checkStandard)
+ .build().show()
+ return@setOnClickListener
+ }
+ }
+ }
+ }
+ }
+ binding.rightRecyclerView.adapter = contentAdapter
+ }
+
+ override fun initViewBinding(
+ inflater: LayoutInflater,
+ container: ViewGroup?
+ ): FragmentCheckManifestBinding {
+ return FragmentCheckManifestBinding.inflate(inflater, container, false)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt b/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt
new file mode 100644
index 0000000..2ddb65c
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt
@@ -0,0 +1,91 @@
+package com.casic.br.ar.app.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.R
+import com.casic.br.ar.app.databinding.FragmentHiddenTroubleBinding
+import com.casic.br.ar.app.extensions.combineFilePath
+import com.casic.br.ar.app.model.HiddenTroubleListResultModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.view.BigImageActivity
+import com.casic.br.ar.app.vm.InspectionViewModel
+import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
+import com.pengxh.kt.lite.adapter.ViewHolder
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.extensions.show
+
+
+class HiddenTroubleFragment : KotlinBaseFragment() {
+
+ private lateinit var inspectionViewModel: InspectionViewModel
+
+ override fun initEvent() {
+
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java]
+ inspectionViewModel.getHiddenTroublesByInspectionId(
+ requireContext(), RuntimeCache.inspectionId
+ )
+ inspectionViewModel.troublesResultModel.observe(this) {
+ if (it.code == 200) {
+ if (it.data.isEmpty()) {
+ binding.tipsView.visibility = View.VISIBLE
+ binding.recyclerView.visibility = View.GONE
+ } else {
+ binding.recyclerView.visibility = View.VISIBLE
+ binding.tipsView.visibility = View.GONE
+
+ val troublesAdapter = object :
+ NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_by_id_l_2, it.data
+ ) {
+ override fun convertView(
+ viewHolder: ViewHolder, position: Int,
+ item: HiddenTroubleListResultModel.DataModel
+ ) {
+ viewHolder.setText(R.id.troubleIndexView, "${position + 1}、")
+ .setText(R.id.troubleNameView, item.name)
+ .setOnClickListener(R.id.deleteTroubleView) {
+ //TODO 删除隐患
+ }
+ .setOnClickListener(R.id.showImageView) {
+ if (item.imageList.isEmpty()) {
+ "此隐患暂无图片".show(requireContext())
+ return@setOnClickListener
+ }
+
+ val images = ArrayList()
+ item.imageList.forEach { imageModel ->
+ images.add(imageModel.alarmImage.combineFilePath())
+ }
+ requireContext().navigatePageTo(0, images)
+ }
+ }
+ }
+ binding.recyclerView.adapter = troublesAdapter
+ }
+ }
+ }
+ }
+
+ override fun initViewBinding(
+ inflater: LayoutInflater,
+ container: ViewGroup?
+ ): FragmentHiddenTroubleBinding {
+ return FragmentHiddenTroubleBinding.inflate(inflater, container, false)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java
new file mode 100644
index 0000000..ba1d738
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java
@@ -0,0 +1,41 @@
+package com.casic.br.ar.app.model;
+
+public class AddHiddenTroubleResultModel {
+
+ private int code;
+ private String data;
+ private String message;
+ private boolean success;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+}
diff --git a/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java b/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java
new file mode 100644
index 0000000..993ef8d
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java
@@ -0,0 +1,208 @@
+package com.casic.br.ar.app.model;
+
+import java.util.List;
+
+public class SceneCheckManifestModel {
+
+ private int code;
+ private List data;
+ private String message;
+ private boolean success;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public List getData() {
+ return data;
+ }
+
+ public void setData(List data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+
+ public static class DataModel {
+ private List> basisList;
+ private String checkItem;
+ private String checkMethod;
+ private String checkObject;
+ private String checkObjectName;
+ private String checkStandard;
+ private String createTime;
+ private String createUserId;
+ private String createUserName;
+ private String id;
+ private String remark;
+ private String scene;
+ private String sceneName;
+ private String type;
+ private String typeName;
+ private String updateTime;
+ private String updateUserId;
+ private String updateUserName;
+
+ public List> getBasisList() {
+ return basisList;
+ }
+
+ public void setBasisList(List> basisList) {
+ this.basisList = basisList;
+ }
+
+ public String getCheckItem() {
+ return checkItem;
+ }
+
+ public void setCheckItem(String checkItem) {
+ this.checkItem = checkItem;
+ }
+
+ public String getCheckMethod() {
+ return checkMethod;
+ }
+
+ public void setCheckMethod(String checkMethod) {
+ this.checkMethod = checkMethod;
+ }
+
+ public String getCheckObject() {
+ return checkObject;
+ }
+
+ public void setCheckObject(String checkObject) {
+ this.checkObject = checkObject;
+ }
+
+ public String getCheckObjectName() {
+ return checkObjectName;
+ }
+
+ public void setCheckObjectName(String checkObjectName) {
+ this.checkObjectName = checkObjectName;
+ }
+
+ public String getCheckStandard() {
+ return checkStandard;
+ }
+
+ public void setCheckStandard(String checkStandard) {
+ this.checkStandard = checkStandard;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getCreateUserId() {
+ return createUserId;
+ }
+
+ public void setCreateUserId(String createUserId) {
+ this.createUserId = createUserId;
+ }
+
+ public String getCreateUserName() {
+ return createUserName;
+ }
+
+ public void setCreateUserName(String createUserName) {
+ this.createUserName = createUserName;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getScene() {
+ return scene;
+ }
+
+ public void setScene(String scene) {
+ this.scene = scene;
+ }
+
+ public String getSceneName() {
+ return sceneName;
+ }
+
+ public void setSceneName(String sceneName) {
+ this.sceneName = sceneName;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getTypeName() {
+ return typeName;
+ }
+
+ public void setTypeName(String typeName) {
+ this.typeName = typeName;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ public String getUpdateUserId() {
+ return updateUserId;
+ }
+
+ public void setUpdateUserId(String updateUserId) {
+ this.updateUserId = updateUserId;
+ }
+
+ public String getUpdateUserName() {
+ return updateUserName;
+ }
+
+ public void setUpdateUserName(String updateUserName) {
+ this.updateUserName = updateUserName;
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt
index 4d617a4..43db667 100644
--- a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt
@@ -96,6 +96,15 @@
): String
/**
+ * 添加隐患
+ */
+ @POST("/inspection-record/addAlarm")
+ suspend fun addHiddenTrouble(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
+
+ /**
* 根据场景获取获取隐患目录
*/
@GET("/alarm-menu/listPage")
@@ -119,7 +128,7 @@
* 根据场景获取获取检查清单
*/
@GET("/check-menu/listPage")
- suspend fun getCheckManifestByScene(
+ suspend fun getCheckManifestByPage(
@Header("token") token: String,
@Query("scene") scene: String,
@Query("offset") offset: Int,
@@ -127,6 +136,18 @@
): String
/**
+ * 获取检查清单-不分页
+ */
+ @GET("/check-menu/list")
+ suspend fun getCheckManifest(
+ @Header("token") token: String,
+ @Query("keyword") keyword: String,
+ @Query("type") type: String,
+ @Query("scene") scene: String,
+ @Query("checkObject") checkObject: String
+ ): String
+
+ /**
* 获取指导视频
*/
@GET("/knowledge-base/listPage")
diff --git a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt
index 8c35212..beedfe1 100644
--- a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt
@@ -2,7 +2,10 @@
import com.casic.br.ar.app.utils.AuthenticationHelper
import com.casic.br.ar.app.utils.LocaleConstant
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.google.gson.Gson
import com.google.gson.JsonObject
+import com.google.gson.reflect.TypeToken
import com.pengxh.kt.lite.utils.RetrofitFactory
import com.pengxh.kt.lite.utils.SaveKeyValues
import okhttp3.MediaType.Companion.toMediaType
@@ -30,6 +33,9 @@
RetrofitFactory.createRetrofit(httpConfig, timeout = 20)
}
+ private val gson by lazy { Gson() }
+ private val typeToken = object : TypeToken>>() {}.type
+
/**
* 验证PublicKey
*/
@@ -133,6 +139,45 @@
}
/**
+ * 添加隐患
+ */
+ suspend fun addHiddenTrouble(
+ mainClass: String,
+ subClass: String,
+ sceneName: String,
+ subClassName: String,
+ basis: String,
+ alarmMenuId: String,
+ content: String,
+ scene: String,
+ inspectionId: String,
+ name: String,
+ mainClassName: String,
+ id: String,
+ imageList: Array>
+ ): String {
+ val param = JsonObject()
+ param.addProperty("mainClass", mainClass)
+ param.addProperty("subClass", subClass)
+ param.addProperty("sceneName", sceneName)
+ param.addProperty("subClassName", subClassName)
+ param.addProperty("basis", basis)
+ param.addProperty("alarmMenuId", alarmMenuId)
+ param.addProperty("content", content)
+ param.addProperty("scene", scene)
+ param.addProperty("inspectionId", inspectionId)
+ param.addProperty("name", name)
+ param.addProperty("mainClassName", mainClassName)
+ param.addProperty("id", id)
+ param.add("imageList", gson.toJsonTree(imageList, typeToken).asJsonArray)
+ val requestBody = param.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+
+ return api.addHiddenTrouble(AuthenticationHelper.token, requestBody)
+ }
+
+ /**
* 根据场景获取获取隐患目录
*/
suspend fun getHiddenTroubleByScene(scene: String, offset: Int): String {
@@ -151,13 +196,22 @@
/**
* 根据场景获取获取隐患目录
*/
- suspend fun getCheckManifestByScene(scene: String, offset: Int): String {
- return api.getCheckManifestByScene(
+ suspend fun getCheckManifestByPage(scene: String, offset: Int): String {
+ return api.getCheckManifestByPage(
AuthenticationHelper.token, scene, offset, LocaleConstant.PAGE_LIMIT
)
}
/**
+ * 获取检查清单-不分页
+ */
+ suspend fun getCheckManifest(
+ keyword: String, type: String, scene: String, checkObject: String
+ ): String {
+ return api.getCheckManifest(AuthenticationHelper.token, keyword, type, scene, checkObject)
+ }
+
+ /**
* 获取指导视频
*/
suspend fun getGuideVideoByPage(keywords: String, classId: String, offset: Int): String {
@@ -212,17 +266,12 @@
/**
* 推送报警信息
* */
- suspend fun uploadDetectTargetAlarm(
- alamCode: String,
- alarmlmgPath: String,
- inspectionld: String,
- scene: String
- ): String {
+ suspend fun uploadDetectTargetAlarm(alarmCode: String, alarmImgPath: String): String {
val param = JsonObject()
- param.addProperty("alamCode", alamCode)
- param.addProperty("alarmlmgPath", alarmlmgPath)
- param.addProperty("inspectionld", inspectionld)
- param.addProperty("scene", scene)
+ param.addProperty("alarmCode", alarmCode)
+ param.addProperty("alarmImgPath", alarmImgPath)
+ param.addProperty("inspectionId", RuntimeCache.inspectionId)
+ param.addProperty("scene", RuntimeCache.sceneName)
val requestBody = param.toString().toRequestBody(
"application/json;charset=UTF-8".toMediaType()
diff --git a/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt
new file mode 100644
index 0000000..143e287
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt
@@ -0,0 +1,14 @@
+package com.casic.br.ar.app.utils
+
+import com.casic.br.ar.app.model.DictionaryModel
+import org.opencv.core.Mat
+
+object RuntimeCache {
+ //TODO 未引用未赋值
+ var scene = ""
+
+ var sceneName = ""
+ var inspectionId = ""
+ var mainDicModels: MutableList = ArrayList()
+ lateinit var mat: Mat
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt
new file mode 100644
index 0000000..989b751
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt
@@ -0,0 +1,217 @@
+package com.casic.br.ar.app.view
+
+import android.graphics.Bitmap
+import android.os.Bundle
+import android.util.Log
+import android.view.View
+import android.widget.AdapterView
+import android.widget.ArrayAdapter
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.databinding.ActivityAddHiddenTroubleBinding
+import com.casic.br.ar.app.extensions.combineFilePath
+import com.casic.br.ar.app.extensions.compressImage
+import com.casic.br.ar.app.model.DictionaryModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.vm.ConfigViewModel
+import com.casic.br.ar.app.vm.HiddenTroubleViewModel
+import com.casic.br.ar.app.vm.ImageFileViewModel
+import com.casic.br.operationsite.test.callback.OnImageCompressListener
+import com.pengxh.kt.lite.adapter.EditableImageAdapter
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets
+import com.pengxh.kt.lite.extensions.createImageFileDir
+import com.pengxh.kt.lite.extensions.dp2px
+import com.pengxh.kt.lite.extensions.getScreenWidth
+import com.pengxh.kt.lite.extensions.saveImage
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.LoadState
+import com.pengxh.kt.lite.utils.LoadingDialogHub
+import org.opencv.android.Utils
+import java.io.File
+
+class AddHiddenTroubleActivity : KotlinBaseActivity() {
+
+ private val kTag = "AddHiddenTroubleActivity"
+ private val context = this
+ private val imagePaths = ArrayList>()
+ private val recyclerViewImages = ArrayList()
+ private val marginOffset by lazy { 1.dp2px(this) }
+ private lateinit var imageAdapter: EditableImageAdapter
+ private lateinit var imageFileViewModel: ImageFileViewModel
+ private lateinit var configViewModel: ConfigViewModel
+ private lateinit var hiddenTroubleViewModel: HiddenTroubleViewModel
+ private var mainDicModels: MutableList = ArrayList()
+ private var subDicModels: MutableList = ArrayList()
+ private var selectedMainTypePosition = 0
+ private var selectedSubTypePosition = 0
+
+ override fun initViewBinding(): ActivityAddHiddenTroubleBinding {
+ return ActivityAddHiddenTroubleBinding.inflate(layoutInflater)
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun observeRequestState() {
+ hiddenTroubleViewModel.loadState.observe(this) {
+ if (it == LoadState.Loading) {
+ LoadingDialogHub.show(this, "隐患添加中,请稍后...")
+ } else {
+ LoadingDialogHub.dismiss()
+ finish()
+ "隐患添加成功".show(this)
+ }
+ }
+
+ imageFileViewModel.loadState.observe(this) {
+ if (it == LoadState.Loading) {
+ "图片上传中,请稍后...".show(this)
+ }
+ }
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ //转为实体类
+ mainDicModels = RuntimeCache.mainDicModels
+ val mainTypeArray = ArrayList()
+ mainDicModels.forEach {
+ mainTypeArray.add(it.name)
+ }
+ val mainTypeAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, mainTypeArray)
+ binding.mainTypeSpinner.adapter = mainTypeAdapter
+
+ configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java]
+ configViewModel.getDictionaryByCode(this, "pitfallSmallType")
+ configViewModel.dictionary.observe(this) {
+ if (it.code == 200) {
+ subDicModels = it.data
+ val subTypeArray = ArrayList()
+ subDicModels.forEach { dic ->
+ subTypeArray.add(dic.name)
+ }
+ val subTypeAdapter = ArrayAdapter(
+ this, android.R.layout.simple_list_item_1, subTypeArray
+ )
+ binding.subTypeSpinner.adapter = subTypeAdapter
+ }
+ }
+
+ //左外边距,左内边距,TextView宽度,内间距,右内边距,右外边距
+ val viewWidth = getScreenWidth() - (15 + 15 + 65 + 10 + 15 + 15).dp2px(this)
+ imageAdapter = EditableImageAdapter(this, recyclerViewImages, viewWidth, 3, 3)
+ binding.recyclerView.addItemDecoration(
+ RecyclerViewItemOffsets(marginOffset, marginOffset, marginOffset, marginOffset)
+ )
+ binding.recyclerView.adapter = imageAdapter
+
+ imageFileViewModel = ViewModelProvider(this)[ImageFileViewModel::class.java]
+ imageFileViewModel.resultModel.observe(this) {
+ if (it.code == 200) {
+ val url = it.data.toString()
+ val map = HashMap()
+ map["alarmImage"] = url
+ map["id"] = ""
+ map["inspectionAlarmId"] = ""
+ imagePaths.add(map)
+ recyclerViewImages.add(url.combineFilePath())
+ imageAdapter.notifyDataSetChanged()
+ }
+ }
+
+ hiddenTroubleViewModel = ViewModelProvider(this)[HiddenTroubleViewModel::class.java]
+ hiddenTroubleViewModel.addTroubleResult.observe(this) {
+ if (it.code == 200) {
+ Log.d(kTag, "troubleId: ${it.data}")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ binding.mainTypeSpinner.setSelection(0)
+ binding.mainTypeSpinner.onItemSelectedListener =
+ object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(
+ parent: AdapterView<*>?, view: View?, position: Int, id: Long
+ ) {
+ selectedMainTypePosition = position
+ }
+
+ override fun onNothingSelected(parent: AdapterView<*>?) {
+
+ }
+ }
+
+ binding.subTypeSpinner.setSelection(0)
+ binding.subTypeSpinner.onItemSelectedListener =
+ object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(
+ parent: AdapterView<*>?, view: View?, position: Int, id: Long
+ ) {
+ selectedSubTypePosition = position
+ }
+
+ override fun onNothingSelected(parent: AdapterView<*>?) {
+
+ }
+ }
+
+ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener {
+ override fun onAddImageClick() {
+ addImage()
+ }
+
+ override fun onItemClick(position: Int) {
+
+ }
+
+ override fun onItemLongClick(view: View?, position: Int) {
+ imagePaths.removeAt(position)
+ recyclerViewImages.removeAt(position)
+ imageAdapter.notifyDataSetChanged()
+ }
+ })
+
+ binding.confirmButton.setOnClickListener {
+ hiddenTroubleViewModel.addHiddenTrouble(
+ this,
+ selectedMainTypePosition.toString(),
+ selectedSubTypePosition.toString(),
+ RuntimeCache.sceneName,
+ subDicModels[selectedMainTypePosition].name,
+ "",
+ "",
+ binding.hiddenTroubleContentView.text.toString(),
+ RuntimeCache.scene,
+ RuntimeCache.inspectionId,
+ binding.hiddenTroubleNameView.text.toString(),
+ mainDicModels[selectedMainTypePosition].name,
+ "",
+ imagePaths.toTypedArray()
+ )
+ }
+
+ binding.cancelButton.setOnClickListener { finish() }
+ }
+
+ private fun addImage() {
+ //mat转图片
+ val bitmap = Bitmap.createBitmap(
+ RuntimeCache.mat.width(),
+ RuntimeCache.mat.height(),
+ Bitmap.Config.ARGB_8888
+ )
+ Utils.matToBitmap(RuntimeCache.mat, bitmap, true)
+ val imagePath = "${createImageFileDir()}/${System.currentTimeMillis()}.png"
+ bitmap.saveImage(imagePath)
+ imagePath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ imageFileViewModel.uploadImage(file)
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/view/CheckManifestBySceneActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/CheckManifestBySceneActivity.kt
new file mode 100644
index 0000000..1e7bae2
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/view/CheckManifestBySceneActivity.kt
@@ -0,0 +1,45 @@
+package com.casic.br.ar.app.view
+
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import com.casic.br.ar.app.adapter.TopViewPagerAdapter
+import com.casic.br.ar.app.databinding.ActivityCheckManifestBySceneBinding
+import com.casic.br.ar.app.fragment.CheckManifestFragment
+import com.casic.br.ar.app.fragment.HiddenTroubleFragment
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+
+class CheckManifestBySceneActivity : KotlinBaseActivity() {
+
+ private var fragmentPages = ArrayList()
+
+ override fun initEvent() {
+ binding.confirmButton.setOnClickListener { finish() }
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ val subPageTitles = arrayOf("${RuntimeCache.sceneName}检查清单", "隐患列表")
+ fragmentPages.add(CheckManifestFragment())
+ fragmentPages.add(HiddenTroubleFragment())
+
+ val topViewPagerAdapter = TopViewPagerAdapter(
+ supportFragmentManager, subPageTitles, fragmentPages
+ )
+ //页面永不销毁
+ binding.viewPager.offscreenPageLimit = fragmentPages.size
+ binding.viewPager.adapter = topViewPagerAdapter
+ binding.tabLayout.setupWithViewPager(binding.viewPager)
+ }
+
+ override fun initViewBinding(): ActivityCheckManifestBySceneBinding {
+ return ActivityCheckManifestBySceneBinding.inflate(layoutInflater)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt
index af8ef35..2c0252c 100644
--- a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt
+++ b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt
@@ -26,20 +26,24 @@
import com.casic.br.ar.app.model.DictionaryModel
import com.casic.br.ar.app.utils.LocaleConstant
import com.casic.br.ar.app.utils.LocationManager
+import com.casic.br.ar.app.utils.RuntimeCache
import com.casic.br.ar.app.vm.AlarmViewModel
import com.casic.br.ar.app.vm.ConfigViewModel
import com.casic.br.ar.app.vm.ImageFileViewModel
import com.casic.br.ar.app.vm.InspectionViewModel
import com.casic.br.ar.app.widgets.DetectResultDialog
import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.extensions.show
import com.pengxh.kt.lite.extensions.timestampToDate
import com.pengxh.kt.lite.extensions.timestampToTime
import com.pengxh.kt.lite.extensions.toJson
-import com.pengxh.kt.lite.utils.Constant
import com.pengxh.kt.lite.utils.SaveKeyValues
import com.pengxh.kt.lite.utils.WeakReferenceHandler
import com.pengxh.kt.lite.widget.dialog.AlertControlDialog
+import com.rokid.glass.instruct.InstructLifeManager
+import com.rokid.glass.instruct.entity.EntityKey
+import com.rokid.glass.instruct.entity.InstructEntity
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
@@ -47,7 +51,7 @@
import java.io.File
class CheckModeActivity : KotlinBaseActivity(), SurfaceHolder.Callback,
- INativeCallback, Handler.Callback {
+ INativeCallback, Handler.Callback, InstructLifeManager.IInstructLifeListener {
private val kTag = "StartCheckActivity"
private val context = this
@@ -65,10 +69,8 @@
private lateinit var imageFileViewModel: ImageFileViewModel
private lateinit var alarmViewModel: AlarmViewModel
private var inspectionAddress = ""
- private var inspectionId = ""
private var mainDicModels: MutableList = ArrayList()
private var isDetectTarget = false
- private var detectedScene = ""
private var alarmCode = ""
override fun initOnCreate(savedInstanceState: Bundle?) {
@@ -82,11 +84,11 @@
useClassify = false, useSegmentation = false, useDetect = true
)
- yolov8ncnn.openCamera(1)
-
binding.surfaceView.holder.setFormat(PixelFormat.RGBA_8888)
binding.surfaceView.holder.addCallback(this)
+ yolov8ncnn.openCamera(1)
+
locationManager.getCurrentLocation(false, object : LocationManager.OnGetLocationListener {
override fun onAMapLocationGet(location: AMapLocation?) {
location?.apply {
@@ -108,7 +110,7 @@
)
inspectionViewModel.addResultModel.observe(this) {
if (it.code == 200) {
- inspectionId = it.data
+ RuntimeCache.inspectionId = it.data
}
}
@@ -123,15 +125,45 @@
imageFileViewModel = ViewModelProvider(this)[ImageFileViewModel::class.java]
imageFileViewModel.resultModel.observe(this) {
if (it.code == 200) {
- alarmViewModel.uploadDetectTargetAlarm(
- context, alarmCode, it.data.toString(), inspectionId, detectedScene
- )
+ alarmViewModel.uploadDetectTargetAlarm(context, alarmCode, it.data.toString())
}
}
}
override fun initEvent() {
-
+ val instructLifeManager = InstructLifeManager(this, lifecycle, this)
+ instructLifeManager.addInstructEntity(
+ InstructEntity()
+ .addEntityKey(EntityKey("打开检查清单", "da kai jian cha qing dan"))
+ .setShowTips(true)
+ .setIgnoreHelp(false)
+ .setCallback { _, _, _ ->
+ /**
+ * 根据场景查看检查清单
+ * */
+ navigatePageTo()
+ }
+ ).addInstructEntity(
+ InstructEntity()
+ .addEntityKey(EntityKey("添加隐患", "tian jia yin huan"))
+ .setShowTips(true)
+ .setIgnoreHelp(false)
+ .setCallback { _, _, _ ->
+ RuntimeCache.mat = mat
+ RuntimeCache.mainDicModels = mainDicModels
+ navigatePageTo()
+ }
+ ).addInstructEntity(
+ InstructEntity()
+ .addEntityKey(EntityKey("结束检查", "jie shu jian cha"))
+ .setShowTips(true)
+ .setIgnoreHelp(false)
+ .setCallback { _, _, _ ->
+ Intent(this, CheckResultActivity::class.java).also {
+ stopTaskLauncher.launch(it)
+ }
+ }
+ )
}
override fun initViewBinding(): ActivityCheckModeBinding {
@@ -149,9 +181,9 @@
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
if (keyCode == 4) {
- val intent = Intent(this, CheckResultActivity::class.java)
- intent.putExtra(Constant.INTENT_PARAM, inspectionId)
- stopTaskLauncher.launch(intent)
+ Intent(this, CheckResultActivity::class.java).also {
+ stopTaskLauncher.launch(it)
+ }
}
return super.onKeyDown(keyCode, event)
}
@@ -162,7 +194,6 @@
if (it.resultCode == Activity.RESULT_OK) {
lifecycleScope.launch(Dispatchers.Main) {
yolov8ncnn.closeCamera()
- mat.release()
delay(1000)
@@ -208,14 +239,14 @@
detectResults.forEach {
val label = LocaleConstant.CLASS_NAMES_ARRAY[it.type]
- if (label.isInScene(detectedScene)) {
+ if (label.isInScene(RuntimeCache.sceneName)) {
targetSet.add(label)
}
}
//只显示隐患
var warnings = ""
- when (detectedScene) {
+ when (RuntimeCache.sceneName) {
"配电箱" -> {
if (!detectResults.isContains(16)) {
warnings = "配电箱无警示标识"
@@ -402,6 +433,10 @@
val label = LocaleConstant.CLASS_NAMES_ARRAY[firstYoloResult]
val scene = label.getSceneByTarget()
+ if (scene == "未知场景") {
+ return
+ }
+
val message = weakReferenceHandler.obtainMessage()
message.what = 2024082901
message.obj = scene
@@ -421,7 +456,7 @@
.setOnDialogButtonClickListener(object :
AlertControlDialog.OnDialogButtonClickListener {
override fun onConfirmClick() {
- detectedScene = scene
+ RuntimeCache.sceneName = scene
detectedSceneSet.add(scene)
binding.titleView.text = scene
@@ -467,6 +502,19 @@
override fun onDestroy() {
super.onDestroy()
+ mat.release()
locationManager.stopLocation()
}
+
+ override fun onInterceptCommand(command: String?): Boolean {
+ return false
+ }
+
+ override fun onTipsUiReady() {
+
+ }
+
+ override fun onHelpLayerShow(show: Boolean) {
+
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/view/CheckResultActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/CheckResultActivity.kt
index 300269b..a525a0f 100644
--- a/app/src/main/java/com/casic/br/ar/app/view/CheckResultActivity.kt
+++ b/app/src/main/java/com/casic/br/ar/app/view/CheckResultActivity.kt
@@ -8,6 +8,7 @@
import com.casic.br.ar.app.databinding.ActivityCheckResultBinding
import com.casic.br.ar.app.extensions.combineFilePath
import com.casic.br.ar.app.model.HiddenTroubleListResultModel
+import com.casic.br.ar.app.utils.RuntimeCache
import com.casic.br.ar.app.vm.InspectionViewModel
import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
import com.pengxh.kt.lite.adapter.ViewHolder
@@ -15,7 +16,6 @@
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.extensions.show
import com.pengxh.kt.lite.extensions.timestampToCompleteDate
-import com.pengxh.kt.lite.utils.Constant
import com.pengxh.kt.lite.utils.LoadState
class CheckResultActivity : KotlinBaseActivity() {
@@ -23,12 +23,11 @@
private val kTag = "CheckResultActivity"
private val context = this
private lateinit var inspectionViewModel: InspectionViewModel
- private lateinit var inspectionId: String
override fun initEvent() {
binding.confirmButton.setOnClickListener {
inspectionViewModel.stopInspection(
- this, inspectionId,
+ this, RuntimeCache.inspectionId,
System.currentTimeMillis().timestampToCompleteDate(),
binding.inputSiteView.text.toString()
)
@@ -38,9 +37,8 @@
}
override fun initOnCreate(savedInstanceState: Bundle?) {
- inspectionId = intent.getStringExtra(Constant.INTENT_PARAM) as String
inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java]
- inspectionViewModel.getHiddenTroublesByInspectionId(this, inspectionId)
+ inspectionViewModel.getHiddenTroublesByInspectionId(this, RuntimeCache.inspectionId)
inspectionViewModel.troublesResultModel.observe(this) {
if (it.code == 200) {
val troublesAdapter = object :
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index b007d28..7cb37f7 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -31,5 +31,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 04f725b..9a00059 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -64,7 +64,7 @@
}
dependencies {
-//基础依赖库
+ //基础依赖库
implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.10'
implementation 'androidx.core:core-ktx:1.9.0'
def androidx_version = '1.6.1'
@@ -120,4 +120,5 @@
//生成二维码
implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
implementation project(':sdk')
+ implementation 'com.rokid.ai.glass:instructsdk:1.7.8'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index de85667..50019c7 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -70,6 +70,14 @@
android:name=".view.CheckModeActivity"
android:screenOrientation="landscape" />
+
+
diff --git a/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
new file mode 100644
index 0000000..1deea58
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/adapter/TopViewPagerAdapter.kt
@@ -0,0 +1,18 @@
+package com.casic.br.ar.app.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class TopViewPagerAdapter(
+ fragmentManager: FragmentManager,
+ private val pageTitles: Array,
+ private val pages: List
+) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
+
+ override fun getItem(position: Int) = pages[position]
+
+ override fun getCount() = pages.size
+
+ override fun getPageTitle(position: Int) = pageTitles[position]
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
index 66f49cf..cf7240b 100644
--- a/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/br/ar/app/base/BaseApplication.kt
@@ -2,6 +2,8 @@
import android.app.Application
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.rokid.glass.instruct.VoiceInstruction
+import org.opencv.android.OpenCVLoader
class BaseApplication : Application() {
@@ -10,5 +12,8 @@
override fun onCreate() {
super.onCreate()
SaveKeyValues.initSharedPreferences(this)
+ VoiceInstruction.init(this, false)
+ //初始化OpenCV
+ OpenCVLoader.initLocal()
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt b/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt
new file mode 100644
index 0000000..86be402
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/fragment/CheckManifestFragment.kt
@@ -0,0 +1,120 @@
+package com.casic.br.ar.app.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.R
+import com.casic.br.ar.app.databinding.FragmentCheckManifestBinding
+import com.casic.br.ar.app.model.SceneCheckManifestModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.vm.CheckManifestViewModel
+import com.casic.br.ar.app.vm.ConfigViewModel
+import com.casic.br.ar.app.widgets.CheckStandardSheet
+import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
+import com.pengxh.kt.lite.adapter.ViewHolder
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class CheckManifestFragment : KotlinBaseFragment() {
+
+ private val kTag = "CheckManifestFragment"
+ private lateinit var configViewModel: ConfigViewModel
+ private lateinit var checkManifestViewModel: CheckManifestViewModel
+
+ override fun initEvent() {
+
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ //detectedScene转为字典值
+ configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java]
+ configViewModel.getDictionaryByCode(requireContext(), "securityScene")
+ configViewModel.dictionary.observe(this) {
+ if (it.code == 200) {
+ for (dic in it.data) {
+ if (dic.name == RuntimeCache.sceneName) {
+ checkManifestViewModel.getCheckManifestByScene(requireContext(), dic.value)
+ return@observe
+ }
+ }
+ }
+ }
+
+ checkManifestViewModel = ViewModelProvider(this)[CheckManifestViewModel::class.java]
+ checkManifestViewModel.sceneManifestResult.observe(this) {
+ if (it.code == 200) {
+ //去重
+ val mainClassSet = HashSet()
+ it.data.forEach { row ->
+ mainClassSet.add(row.typeName)
+ }
+ val typeNameAdapter = object : NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_l_2, mainClassSet.toMutableList()
+ ) {
+ override fun convertView(viewHolder: ViewHolder, position: Int, item: String) {
+ viewHolder.setText(R.id.troubleMainClassView, item)
+ }
+ }
+ binding.leftRecyclerView.adapter = typeNameAdapter
+
+ if (mainClassSet.isEmpty()) {
+ return@observe
+ }
+ //默认加载第一项的数据
+ initSubRecyclerView(it, mainClassSet.first())
+ typeNameAdapter.setOnItemClickedListener(object :
+ NormalRecyclerAdapter.OnItemClickedListener {
+ override fun onItemClicked(position: Int, t: String) {
+ initSubRecyclerView(it, t)
+ }
+ })
+ }
+ }
+ }
+
+ private fun initSubRecyclerView(parent: SceneCheckManifestModel, selectedType: String) {
+ //根据大类查询隐患内容
+ val contentSet = HashSet()
+ for (row in parent.data) {
+ if (row.typeName == selectedType) {
+ contentSet.add(row.checkItem)
+ }
+ }
+ val contentAdapter = object : NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_l_3, contentSet.toMutableList()
+ ) {
+ override fun convertView(viewHolder: ViewHolder, position: Int, item: String) {
+ viewHolder.setText(R.id.troubleIndexView, "${position + 1}、")
+ .setText(R.id.troubleNameView, item)
+ .setOnClickListener(R.id.showImageView) {
+ //显示行业标准
+ for (row in parent.data) {
+ if (row.checkItem == item) {
+ CheckStandardSheet.Builder()
+ .setContext(requireContext())
+ .setSheetValue(row.checkStandard)
+ .build().show()
+ return@setOnClickListener
+ }
+ }
+ }
+ }
+ }
+ binding.rightRecyclerView.adapter = contentAdapter
+ }
+
+ override fun initViewBinding(
+ inflater: LayoutInflater,
+ container: ViewGroup?
+ ): FragmentCheckManifestBinding {
+ return FragmentCheckManifestBinding.inflate(inflater, container, false)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt b/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt
new file mode 100644
index 0000000..2ddb65c
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/fragment/HiddenTroubleFragment.kt
@@ -0,0 +1,91 @@
+package com.casic.br.ar.app.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.R
+import com.casic.br.ar.app.databinding.FragmentHiddenTroubleBinding
+import com.casic.br.ar.app.extensions.combineFilePath
+import com.casic.br.ar.app.model.HiddenTroubleListResultModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.view.BigImageActivity
+import com.casic.br.ar.app.vm.InspectionViewModel
+import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter
+import com.pengxh.kt.lite.adapter.ViewHolder
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.extensions.show
+
+
+class HiddenTroubleFragment : KotlinBaseFragment() {
+
+ private lateinit var inspectionViewModel: InspectionViewModel
+
+ override fun initEvent() {
+
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java]
+ inspectionViewModel.getHiddenTroublesByInspectionId(
+ requireContext(), RuntimeCache.inspectionId
+ )
+ inspectionViewModel.troublesResultModel.observe(this) {
+ if (it.code == 200) {
+ if (it.data.isEmpty()) {
+ binding.tipsView.visibility = View.VISIBLE
+ binding.recyclerView.visibility = View.GONE
+ } else {
+ binding.recyclerView.visibility = View.VISIBLE
+ binding.tipsView.visibility = View.GONE
+
+ val troublesAdapter = object :
+ NormalRecyclerAdapter(
+ R.layout.item_hidden_trouble_by_id_l_2, it.data
+ ) {
+ override fun convertView(
+ viewHolder: ViewHolder, position: Int,
+ item: HiddenTroubleListResultModel.DataModel
+ ) {
+ viewHolder.setText(R.id.troubleIndexView, "${position + 1}、")
+ .setText(R.id.troubleNameView, item.name)
+ .setOnClickListener(R.id.deleteTroubleView) {
+ //TODO 删除隐患
+ }
+ .setOnClickListener(R.id.showImageView) {
+ if (item.imageList.isEmpty()) {
+ "此隐患暂无图片".show(requireContext())
+ return@setOnClickListener
+ }
+
+ val images = ArrayList()
+ item.imageList.forEach { imageModel ->
+ images.add(imageModel.alarmImage.combineFilePath())
+ }
+ requireContext().navigatePageTo(0, images)
+ }
+ }
+ }
+ binding.recyclerView.adapter = troublesAdapter
+ }
+ }
+ }
+ }
+
+ override fun initViewBinding(
+ inflater: LayoutInflater,
+ container: ViewGroup?
+ ): FragmentHiddenTroubleBinding {
+ return FragmentHiddenTroubleBinding.inflate(inflater, container, false)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java
new file mode 100644
index 0000000..ba1d738
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/model/AddHiddenTroubleResultModel.java
@@ -0,0 +1,41 @@
+package com.casic.br.ar.app.model;
+
+public class AddHiddenTroubleResultModel {
+
+ private int code;
+ private String data;
+ private String message;
+ private boolean success;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+}
diff --git a/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java b/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java
new file mode 100644
index 0000000..993ef8d
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/model/SceneCheckManifestModel.java
@@ -0,0 +1,208 @@
+package com.casic.br.ar.app.model;
+
+import java.util.List;
+
+public class SceneCheckManifestModel {
+
+ private int code;
+ private List data;
+ private String message;
+ private boolean success;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public List getData() {
+ return data;
+ }
+
+ public void setData(List data) {
+ this.data = data;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+
+ public static class DataModel {
+ private List> basisList;
+ private String checkItem;
+ private String checkMethod;
+ private String checkObject;
+ private String checkObjectName;
+ private String checkStandard;
+ private String createTime;
+ private String createUserId;
+ private String createUserName;
+ private String id;
+ private String remark;
+ private String scene;
+ private String sceneName;
+ private String type;
+ private String typeName;
+ private String updateTime;
+ private String updateUserId;
+ private String updateUserName;
+
+ public List> getBasisList() {
+ return basisList;
+ }
+
+ public void setBasisList(List> basisList) {
+ this.basisList = basisList;
+ }
+
+ public String getCheckItem() {
+ return checkItem;
+ }
+
+ public void setCheckItem(String checkItem) {
+ this.checkItem = checkItem;
+ }
+
+ public String getCheckMethod() {
+ return checkMethod;
+ }
+
+ public void setCheckMethod(String checkMethod) {
+ this.checkMethod = checkMethod;
+ }
+
+ public String getCheckObject() {
+ return checkObject;
+ }
+
+ public void setCheckObject(String checkObject) {
+ this.checkObject = checkObject;
+ }
+
+ public String getCheckObjectName() {
+ return checkObjectName;
+ }
+
+ public void setCheckObjectName(String checkObjectName) {
+ this.checkObjectName = checkObjectName;
+ }
+
+ public String getCheckStandard() {
+ return checkStandard;
+ }
+
+ public void setCheckStandard(String checkStandard) {
+ this.checkStandard = checkStandard;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getCreateUserId() {
+ return createUserId;
+ }
+
+ public void setCreateUserId(String createUserId) {
+ this.createUserId = createUserId;
+ }
+
+ public String getCreateUserName() {
+ return createUserName;
+ }
+
+ public void setCreateUserName(String createUserName) {
+ this.createUserName = createUserName;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getScene() {
+ return scene;
+ }
+
+ public void setScene(String scene) {
+ this.scene = scene;
+ }
+
+ public String getSceneName() {
+ return sceneName;
+ }
+
+ public void setSceneName(String sceneName) {
+ this.sceneName = sceneName;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getTypeName() {
+ return typeName;
+ }
+
+ public void setTypeName(String typeName) {
+ this.typeName = typeName;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ public String getUpdateUserId() {
+ return updateUserId;
+ }
+
+ public void setUpdateUserId(String updateUserId) {
+ this.updateUserId = updateUserId;
+ }
+
+ public String getUpdateUserName() {
+ return updateUserName;
+ }
+
+ public void setUpdateUserName(String updateUserName) {
+ this.updateUserName = updateUserName;
+ }
+ }
+}
diff --git a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt
index 4d617a4..43db667 100644
--- a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitService.kt
@@ -96,6 +96,15 @@
): String
/**
+ * 添加隐患
+ */
+ @POST("/inspection-record/addAlarm")
+ suspend fun addHiddenTrouble(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
+
+ /**
* 根据场景获取获取隐患目录
*/
@GET("/alarm-menu/listPage")
@@ -119,7 +128,7 @@
* 根据场景获取获取检查清单
*/
@GET("/check-menu/listPage")
- suspend fun getCheckManifestByScene(
+ suspend fun getCheckManifestByPage(
@Header("token") token: String,
@Query("scene") scene: String,
@Query("offset") offset: Int,
@@ -127,6 +136,18 @@
): String
/**
+ * 获取检查清单-不分页
+ */
+ @GET("/check-menu/list")
+ suspend fun getCheckManifest(
+ @Header("token") token: String,
+ @Query("keyword") keyword: String,
+ @Query("type") type: String,
+ @Query("scene") scene: String,
+ @Query("checkObject") checkObject: String
+ ): String
+
+ /**
* 获取指导视频
*/
@GET("/knowledge-base/listPage")
diff --git a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt
index 8c35212..beedfe1 100644
--- a/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/br/ar/app/retrofit/RetrofitServiceManager.kt
@@ -2,7 +2,10 @@
import com.casic.br.ar.app.utils.AuthenticationHelper
import com.casic.br.ar.app.utils.LocaleConstant
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.google.gson.Gson
import com.google.gson.JsonObject
+import com.google.gson.reflect.TypeToken
import com.pengxh.kt.lite.utils.RetrofitFactory
import com.pengxh.kt.lite.utils.SaveKeyValues
import okhttp3.MediaType.Companion.toMediaType
@@ -30,6 +33,9 @@
RetrofitFactory.createRetrofit(httpConfig, timeout = 20)
}
+ private val gson by lazy { Gson() }
+ private val typeToken = object : TypeToken>>() {}.type
+
/**
* 验证PublicKey
*/
@@ -133,6 +139,45 @@
}
/**
+ * 添加隐患
+ */
+ suspend fun addHiddenTrouble(
+ mainClass: String,
+ subClass: String,
+ sceneName: String,
+ subClassName: String,
+ basis: String,
+ alarmMenuId: String,
+ content: String,
+ scene: String,
+ inspectionId: String,
+ name: String,
+ mainClassName: String,
+ id: String,
+ imageList: Array>
+ ): String {
+ val param = JsonObject()
+ param.addProperty("mainClass", mainClass)
+ param.addProperty("subClass", subClass)
+ param.addProperty("sceneName", sceneName)
+ param.addProperty("subClassName", subClassName)
+ param.addProperty("basis", basis)
+ param.addProperty("alarmMenuId", alarmMenuId)
+ param.addProperty("content", content)
+ param.addProperty("scene", scene)
+ param.addProperty("inspectionId", inspectionId)
+ param.addProperty("name", name)
+ param.addProperty("mainClassName", mainClassName)
+ param.addProperty("id", id)
+ param.add("imageList", gson.toJsonTree(imageList, typeToken).asJsonArray)
+ val requestBody = param.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+
+ return api.addHiddenTrouble(AuthenticationHelper.token, requestBody)
+ }
+
+ /**
* 根据场景获取获取隐患目录
*/
suspend fun getHiddenTroubleByScene(scene: String, offset: Int): String {
@@ -151,13 +196,22 @@
/**
* 根据场景获取获取隐患目录
*/
- suspend fun getCheckManifestByScene(scene: String, offset: Int): String {
- return api.getCheckManifestByScene(
+ suspend fun getCheckManifestByPage(scene: String, offset: Int): String {
+ return api.getCheckManifestByPage(
AuthenticationHelper.token, scene, offset, LocaleConstant.PAGE_LIMIT
)
}
/**
+ * 获取检查清单-不分页
+ */
+ suspend fun getCheckManifest(
+ keyword: String, type: String, scene: String, checkObject: String
+ ): String {
+ return api.getCheckManifest(AuthenticationHelper.token, keyword, type, scene, checkObject)
+ }
+
+ /**
* 获取指导视频
*/
suspend fun getGuideVideoByPage(keywords: String, classId: String, offset: Int): String {
@@ -212,17 +266,12 @@
/**
* 推送报警信息
* */
- suspend fun uploadDetectTargetAlarm(
- alamCode: String,
- alarmlmgPath: String,
- inspectionld: String,
- scene: String
- ): String {
+ suspend fun uploadDetectTargetAlarm(alarmCode: String, alarmImgPath: String): String {
val param = JsonObject()
- param.addProperty("alamCode", alamCode)
- param.addProperty("alarmlmgPath", alarmlmgPath)
- param.addProperty("inspectionld", inspectionld)
- param.addProperty("scene", scene)
+ param.addProperty("alarmCode", alarmCode)
+ param.addProperty("alarmImgPath", alarmImgPath)
+ param.addProperty("inspectionId", RuntimeCache.inspectionId)
+ param.addProperty("scene", RuntimeCache.sceneName)
val requestBody = param.toString().toRequestBody(
"application/json;charset=UTF-8".toMediaType()
diff --git a/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt
new file mode 100644
index 0000000..143e287
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/utils/RuntimeCache.kt
@@ -0,0 +1,14 @@
+package com.casic.br.ar.app.utils
+
+import com.casic.br.ar.app.model.DictionaryModel
+import org.opencv.core.Mat
+
+object RuntimeCache {
+ //TODO 未引用未赋值
+ var scene = ""
+
+ var sceneName = ""
+ var inspectionId = ""
+ var mainDicModels: MutableList = ArrayList()
+ lateinit var mat: Mat
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt
new file mode 100644
index 0000000..989b751
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/view/AddHiddenTroubleActivity.kt
@@ -0,0 +1,217 @@
+package com.casic.br.ar.app.view
+
+import android.graphics.Bitmap
+import android.os.Bundle
+import android.util.Log
+import android.view.View
+import android.widget.AdapterView
+import android.widget.ArrayAdapter
+import androidx.lifecycle.ViewModelProvider
+import com.casic.br.ar.app.databinding.ActivityAddHiddenTroubleBinding
+import com.casic.br.ar.app.extensions.combineFilePath
+import com.casic.br.ar.app.extensions.compressImage
+import com.casic.br.ar.app.model.DictionaryModel
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.casic.br.ar.app.vm.ConfigViewModel
+import com.casic.br.ar.app.vm.HiddenTroubleViewModel
+import com.casic.br.ar.app.vm.ImageFileViewModel
+import com.casic.br.operationsite.test.callback.OnImageCompressListener
+import com.pengxh.kt.lite.adapter.EditableImageAdapter
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets
+import com.pengxh.kt.lite.extensions.createImageFileDir
+import com.pengxh.kt.lite.extensions.dp2px
+import com.pengxh.kt.lite.extensions.getScreenWidth
+import com.pengxh.kt.lite.extensions.saveImage
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.LoadState
+import com.pengxh.kt.lite.utils.LoadingDialogHub
+import org.opencv.android.Utils
+import java.io.File
+
+class AddHiddenTroubleActivity : KotlinBaseActivity() {
+
+ private val kTag = "AddHiddenTroubleActivity"
+ private val context = this
+ private val imagePaths = ArrayList>()
+ private val recyclerViewImages = ArrayList()
+ private val marginOffset by lazy { 1.dp2px(this) }
+ private lateinit var imageAdapter: EditableImageAdapter
+ private lateinit var imageFileViewModel: ImageFileViewModel
+ private lateinit var configViewModel: ConfigViewModel
+ private lateinit var hiddenTroubleViewModel: HiddenTroubleViewModel
+ private var mainDicModels: MutableList = ArrayList()
+ private var subDicModels: MutableList = ArrayList()
+ private var selectedMainTypePosition = 0
+ private var selectedSubTypePosition = 0
+
+ override fun initViewBinding(): ActivityAddHiddenTroubleBinding {
+ return ActivityAddHiddenTroubleBinding.inflate(layoutInflater)
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun observeRequestState() {
+ hiddenTroubleViewModel.loadState.observe(this) {
+ if (it == LoadState.Loading) {
+ LoadingDialogHub.show(this, "隐患添加中,请稍后...")
+ } else {
+ LoadingDialogHub.dismiss()
+ finish()
+ "隐患添加成功".show(this)
+ }
+ }
+
+ imageFileViewModel.loadState.observe(this) {
+ if (it == LoadState.Loading) {
+ "图片上传中,请稍后...".show(this)
+ }
+ }
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ //转为实体类
+ mainDicModels = RuntimeCache.mainDicModels
+ val mainTypeArray = ArrayList()
+ mainDicModels.forEach {
+ mainTypeArray.add(it.name)
+ }
+ val mainTypeAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, mainTypeArray)
+ binding.mainTypeSpinner.adapter = mainTypeAdapter
+
+ configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java]
+ configViewModel.getDictionaryByCode(this, "pitfallSmallType")
+ configViewModel.dictionary.observe(this) {
+ if (it.code == 200) {
+ subDicModels = it.data
+ val subTypeArray = ArrayList()
+ subDicModels.forEach { dic ->
+ subTypeArray.add(dic.name)
+ }
+ val subTypeAdapter = ArrayAdapter(
+ this, android.R.layout.simple_list_item_1, subTypeArray
+ )
+ binding.subTypeSpinner.adapter = subTypeAdapter
+ }
+ }
+
+ //左外边距,左内边距,TextView宽度,内间距,右内边距,右外边距
+ val viewWidth = getScreenWidth() - (15 + 15 + 65 + 10 + 15 + 15).dp2px(this)
+ imageAdapter = EditableImageAdapter(this, recyclerViewImages, viewWidth, 3, 3)
+ binding.recyclerView.addItemDecoration(
+ RecyclerViewItemOffsets(marginOffset, marginOffset, marginOffset, marginOffset)
+ )
+ binding.recyclerView.adapter = imageAdapter
+
+ imageFileViewModel = ViewModelProvider(this)[ImageFileViewModel::class.java]
+ imageFileViewModel.resultModel.observe(this) {
+ if (it.code == 200) {
+ val url = it.data.toString()
+ val map = HashMap()
+ map["alarmImage"] = url
+ map["id"] = ""
+ map["inspectionAlarmId"] = ""
+ imagePaths.add(map)
+ recyclerViewImages.add(url.combineFilePath())
+ imageAdapter.notifyDataSetChanged()
+ }
+ }
+
+ hiddenTroubleViewModel = ViewModelProvider(this)[HiddenTroubleViewModel::class.java]
+ hiddenTroubleViewModel.addTroubleResult.observe(this) {
+ if (it.code == 200) {
+ Log.d(kTag, "troubleId: ${it.data}")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ binding.mainTypeSpinner.setSelection(0)
+ binding.mainTypeSpinner.onItemSelectedListener =
+ object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(
+ parent: AdapterView<*>?, view: View?, position: Int, id: Long
+ ) {
+ selectedMainTypePosition = position
+ }
+
+ override fun onNothingSelected(parent: AdapterView<*>?) {
+
+ }
+ }
+
+ binding.subTypeSpinner.setSelection(0)
+ binding.subTypeSpinner.onItemSelectedListener =
+ object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(
+ parent: AdapterView<*>?, view: View?, position: Int, id: Long
+ ) {
+ selectedSubTypePosition = position
+ }
+
+ override fun onNothingSelected(parent: AdapterView<*>?) {
+
+ }
+ }
+
+ imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener {
+ override fun onAddImageClick() {
+ addImage()
+ }
+
+ override fun onItemClick(position: Int) {
+
+ }
+
+ override fun onItemLongClick(view: View?, position: Int) {
+ imagePaths.removeAt(position)
+ recyclerViewImages.removeAt(position)
+ imageAdapter.notifyDataSetChanged()
+ }
+ })
+
+ binding.confirmButton.setOnClickListener {
+ hiddenTroubleViewModel.addHiddenTrouble(
+ this,
+ selectedMainTypePosition.toString(),
+ selectedSubTypePosition.toString(),
+ RuntimeCache.sceneName,
+ subDicModels[selectedMainTypePosition].name,
+ "",
+ "",
+ binding.hiddenTroubleContentView.text.toString(),
+ RuntimeCache.scene,
+ RuntimeCache.inspectionId,
+ binding.hiddenTroubleNameView.text.toString(),
+ mainDicModels[selectedMainTypePosition].name,
+ "",
+ imagePaths.toTypedArray()
+ )
+ }
+
+ binding.cancelButton.setOnClickListener { finish() }
+ }
+
+ private fun addImage() {
+ //mat转图片
+ val bitmap = Bitmap.createBitmap(
+ RuntimeCache.mat.width(),
+ RuntimeCache.mat.height(),
+ Bitmap.Config.ARGB_8888
+ )
+ Utils.matToBitmap(RuntimeCache.mat, bitmap, true)
+ val imagePath = "${createImageFileDir()}/${System.currentTimeMillis()}.png"
+ bitmap.saveImage(imagePath)
+ imagePath.compressImage(this, object : OnImageCompressListener {
+ override fun onSuccess(file: File) {
+ imageFileViewModel.uploadImage(file)
+ }
+
+ override fun onError(e: Throwable) {
+ e.printStackTrace()
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ar/app/view/CheckManifestBySceneActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/CheckManifestBySceneActivity.kt
new file mode 100644
index 0000000..1e7bae2
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ar/app/view/CheckManifestBySceneActivity.kt
@@ -0,0 +1,45 @@
+package com.casic.br.ar.app.view
+
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import com.casic.br.ar.app.adapter.TopViewPagerAdapter
+import com.casic.br.ar.app.databinding.ActivityCheckManifestBySceneBinding
+import com.casic.br.ar.app.fragment.CheckManifestFragment
+import com.casic.br.ar.app.fragment.HiddenTroubleFragment
+import com.casic.br.ar.app.utils.RuntimeCache
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+
+class CheckManifestBySceneActivity : KotlinBaseActivity() {
+
+ private var fragmentPages = ArrayList