diff --git a/app/build.gradle b/app/build.gradle
index c86566b..b3a6cfc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,7 +31,6 @@
coroutines 'enable'
}
}
- buildToolsVersion '30.0.3'
}
dependencies {
@@ -81,4 +80,6 @@
implementation 'io.github.youth5201314:banner:2.2.2'
//WebView
implementation 'com.just.agentweb:agentweb-androidx:4.1.4'
+ //日期选择器
+ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1'
}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index c86566b..b3a6cfc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,7 +31,6 @@
coroutines 'enable'
}
}
- buildToolsVersion '30.0.3'
}
dependencies {
@@ -81,4 +80,6 @@
implementation 'io.github.youth5201314:banner:2.2.2'
//WebView
implementation 'com.just.agentweb:agentweb-androidx:4.1.4'
+ //日期选择器
+ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f9514b2..45a9414 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -40,8 +40,10 @@
-
-
+
+
+
+
diff --git a/app/build.gradle b/app/build.gradle
index c86566b..b3a6cfc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,7 +31,6 @@
coroutines 'enable'
}
}
- buildToolsVersion '30.0.3'
}
dependencies {
@@ -81,4 +80,6 @@
implementation 'io.github.youth5201314:banner:2.2.2'
//WebView
implementation 'com.just.agentweb:agentweb-androidx:4.1.4'
+ //日期选择器
+ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f9514b2..45a9414 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -40,8 +40,10 @@
-
-
+
+
+
+
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
new file mode 100644
index 0000000..d3584c4
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
@@ -0,0 +1,13 @@
+package com.casic.qd.smartwell.extensions
+
+/**
+ * ArrayList扩展方法
+ */
+
+fun addAll(vararg args: String): ArrayList {
+ val result = ArrayList()
+ args.forEach {
+ result.add(it)
+ }
+ return result
+}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index c86566b..b3a6cfc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,7 +31,6 @@
coroutines 'enable'
}
}
- buildToolsVersion '30.0.3'
}
dependencies {
@@ -81,4 +80,6 @@
implementation 'io.github.youth5201314:banner:2.2.2'
//WebView
implementation 'com.just.agentweb:agentweb-androidx:4.1.4'
+ //日期选择器
+ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f9514b2..45a9414 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -40,8 +40,10 @@
-
-
+
+
+
+
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
new file mode 100644
index 0000000..d3584c4
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
@@ -0,0 +1,13 @@
+package com.casic.qd.smartwell.extensions
+
+/**
+ * ArrayList扩展方法
+ */
+
+fun addAll(vararg args: String): ArrayList {
+ val result = ArrayList()
+ args.forEach {
+ result.add(it)
+ }
+ return result
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
new file mode 100644
index 0000000..7f68e3b
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
@@ -0,0 +1,21 @@
+package com.casic.qd.smartwell.extensions
+
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.*
+
+fun Long.timestampToTime(): String =
+ SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(Date(this))
+
+fun Long.isEarlierThanStart(date: String): Boolean {
+ if (date.isBlank()) {
+ return false
+ }
+ val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA)
+ try {
+ return this < dateFormat.parse(date)!!.time
+ } catch (e: ParseException) {
+
+ }
+ return true
+}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index c86566b..b3a6cfc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,7 +31,6 @@
coroutines 'enable'
}
}
- buildToolsVersion '30.0.3'
}
dependencies {
@@ -81,4 +80,6 @@
implementation 'io.github.youth5201314:banner:2.2.2'
//WebView
implementation 'com.just.agentweb:agentweb-androidx:4.1.4'
+ //日期选择器
+ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f9514b2..45a9414 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -40,8 +40,10 @@
-
-
+
+
+
+
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
new file mode 100644
index 0000000..d3584c4
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
@@ -0,0 +1,13 @@
+package com.casic.qd.smartwell.extensions
+
+/**
+ * ArrayList扩展方法
+ */
+
+fun addAll(vararg args: String): ArrayList {
+ val result = ArrayList()
+ args.forEach {
+ result.add(it)
+ }
+ return result
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
new file mode 100644
index 0000000..7f68e3b
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
@@ -0,0 +1,21 @@
+package com.casic.qd.smartwell.extensions
+
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.*
+
+fun Long.timestampToTime(): String =
+ SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(Date(this))
+
+fun Long.isEarlierThanStart(date: String): Boolean {
+ if (date.isBlank()) {
+ return false
+ }
+ val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA)
+ try {
+ return this < dateFormat.parse(date)!!.time
+ } catch (e: ParseException) {
+
+ }
+ return true
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
new file mode 100644
index 0000000..3802496
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
@@ -0,0 +1,18 @@
+package com.casic.qd.smartwell.model
+
+class AlarmContentModel {
+ var code = 0
+ var data: DataBean? = null
+ var message: String? = null
+
+ class DataBean {
+ var list: List? = null
+
+ class ListBean {
+ var deviceType: String? = null
+ var alarmType: String? = null
+ var name: String? = null
+ var value: String? = null
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index c86566b..b3a6cfc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,7 +31,6 @@
coroutines 'enable'
}
}
- buildToolsVersion '30.0.3'
}
dependencies {
@@ -81,4 +80,6 @@
implementation 'io.github.youth5201314:banner:2.2.2'
//WebView
implementation 'com.just.agentweb:agentweb-androidx:4.1.4'
+ //日期选择器
+ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f9514b2..45a9414 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -40,8 +40,10 @@
-
-
+
+
+
+
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
new file mode 100644
index 0000000..d3584c4
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
@@ -0,0 +1,13 @@
+package com.casic.qd.smartwell.extensions
+
+/**
+ * ArrayList扩展方法
+ */
+
+fun addAll(vararg args: String): ArrayList {
+ val result = ArrayList()
+ args.forEach {
+ result.add(it)
+ }
+ return result
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
new file mode 100644
index 0000000..7f68e3b
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
@@ -0,0 +1,21 @@
+package com.casic.qd.smartwell.extensions
+
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.*
+
+fun Long.timestampToTime(): String =
+ SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(Date(this))
+
+fun Long.isEarlierThanStart(date: String): Boolean {
+ if (date.isBlank()) {
+ return false
+ }
+ val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA)
+ try {
+ return this < dateFormat.parse(date)!!.time
+ } catch (e: ParseException) {
+
+ }
+ return true
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
new file mode 100644
index 0000000..3802496
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
@@ -0,0 +1,18 @@
+package com.casic.qd.smartwell.model
+
+class AlarmContentModel {
+ var code = 0
+ var data: DataBean? = null
+ var message: String? = null
+
+ class DataBean {
+ var list: List? = null
+
+ class ListBean {
+ var deviceType: String? = null
+ var alarmType: String? = null
+ var name: String? = null
+ var value: String? = null
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
new file mode 100644
index 0000000..ba9a6c7
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
@@ -0,0 +1,14 @@
+package com.casic.qd.smartwell.model
+
+class AlarmTypeModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var name: String? = null
+ var id: String? = null
+ var value: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index c86566b..b3a6cfc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,7 +31,6 @@
coroutines 'enable'
}
}
- buildToolsVersion '30.0.3'
}
dependencies {
@@ -81,4 +80,6 @@
implementation 'io.github.youth5201314:banner:2.2.2'
//WebView
implementation 'com.just.agentweb:agentweb-androidx:4.1.4'
+ //日期选择器
+ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f9514b2..45a9414 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -40,8 +40,10 @@
-
-
+
+
+
+
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
new file mode 100644
index 0000000..d3584c4
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
@@ -0,0 +1,13 @@
+package com.casic.qd.smartwell.extensions
+
+/**
+ * ArrayList扩展方法
+ */
+
+fun addAll(vararg args: String): ArrayList {
+ val result = ArrayList()
+ args.forEach {
+ result.add(it)
+ }
+ return result
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
new file mode 100644
index 0000000..7f68e3b
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
@@ -0,0 +1,21 @@
+package com.casic.qd.smartwell.extensions
+
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.*
+
+fun Long.timestampToTime(): String =
+ SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(Date(this))
+
+fun Long.isEarlierThanStart(date: String): Boolean {
+ if (date.isBlank()) {
+ return false
+ }
+ val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA)
+ try {
+ return this < dateFormat.parse(date)!!.time
+ } catch (e: ParseException) {
+
+ }
+ return true
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
new file mode 100644
index 0000000..3802496
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
@@ -0,0 +1,18 @@
+package com.casic.qd.smartwell.model
+
+class AlarmContentModel {
+ var code = 0
+ var data: DataBean? = null
+ var message: String? = null
+
+ class DataBean {
+ var list: List? = null
+
+ class ListBean {
+ var deviceType: String? = null
+ var alarmType: String? = null
+ var name: String? = null
+ var value: String? = null
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
new file mode 100644
index 0000000..ba9a6c7
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
@@ -0,0 +1,14 @@
+package com.casic.qd.smartwell.model
+
+class AlarmTypeModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var name: String? = null
+ var id: String? = null
+ var value: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
new file mode 100644
index 0000000..8761adf
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
@@ -0,0 +1,25 @@
+package com.casic.qd.smartwell.model
+
+class AreaModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var id: String? = null
+ var isSync: String? = null
+ var lat: String? = null
+ var level = 0
+ var levelName: String? = null
+ var lng: String? = null
+ var name: String? = null
+ var num = 0
+ var pName: String? = null
+ var pid: String? = null
+ var pids: String? = null
+ var simplename: String? = null
+ var targetIdSync: String? = null
+ var targetPidSync: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index c86566b..b3a6cfc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,7 +31,6 @@
coroutines 'enable'
}
}
- buildToolsVersion '30.0.3'
}
dependencies {
@@ -81,4 +80,6 @@
implementation 'io.github.youth5201314:banner:2.2.2'
//WebView
implementation 'com.just.agentweb:agentweb-androidx:4.1.4'
+ //日期选择器
+ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f9514b2..45a9414 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -40,8 +40,10 @@
-
-
+
+
+
+
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
new file mode 100644
index 0000000..d3584c4
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
@@ -0,0 +1,13 @@
+package com.casic.qd.smartwell.extensions
+
+/**
+ * ArrayList扩展方法
+ */
+
+fun addAll(vararg args: String): ArrayList {
+ val result = ArrayList()
+ args.forEach {
+ result.add(it)
+ }
+ return result
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
new file mode 100644
index 0000000..7f68e3b
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
@@ -0,0 +1,21 @@
+package com.casic.qd.smartwell.extensions
+
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.*
+
+fun Long.timestampToTime(): String =
+ SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(Date(this))
+
+fun Long.isEarlierThanStart(date: String): Boolean {
+ if (date.isBlank()) {
+ return false
+ }
+ val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA)
+ try {
+ return this < dateFormat.parse(date)!!.time
+ } catch (e: ParseException) {
+
+ }
+ return true
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
new file mode 100644
index 0000000..3802496
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
@@ -0,0 +1,18 @@
+package com.casic.qd.smartwell.model
+
+class AlarmContentModel {
+ var code = 0
+ var data: DataBean? = null
+ var message: String? = null
+
+ class DataBean {
+ var list: List? = null
+
+ class ListBean {
+ var deviceType: String? = null
+ var alarmType: String? = null
+ var name: String? = null
+ var value: String? = null
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
new file mode 100644
index 0000000..ba9a6c7
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
@@ -0,0 +1,14 @@
+package com.casic.qd.smartwell.model
+
+class AlarmTypeModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var name: String? = null
+ var id: String? = null
+ var value: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
new file mode 100644
index 0000000..8761adf
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
@@ -0,0 +1,25 @@
+package com.casic.qd.smartwell.model
+
+class AreaModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var id: String? = null
+ var isSync: String? = null
+ var lat: String? = null
+ var level = 0
+ var levelName: String? = null
+ var lng: String? = null
+ var name: String? = null
+ var num = 0
+ var pName: String? = null
+ var pid: String? = null
+ var pids: String? = null
+ var simplename: String? = null
+ var targetIdSync: String? = null
+ var targetPidSync: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
index d73ecc1..ec902a8 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
@@ -12,6 +12,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L
val HOME_ICONS = arrayOf(
R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics,
diff --git a/app/build.gradle b/app/build.gradle
index c86566b..b3a6cfc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,7 +31,6 @@
coroutines 'enable'
}
}
- buildToolsVersion '30.0.3'
}
dependencies {
@@ -81,4 +80,6 @@
implementation 'io.github.youth5201314:banner:2.2.2'
//WebView
implementation 'com.just.agentweb:agentweb-androidx:4.1.4'
+ //日期选择器
+ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f9514b2..45a9414 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -40,8 +40,10 @@
-
-
+
+
+
+
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
new file mode 100644
index 0000000..d3584c4
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
@@ -0,0 +1,13 @@
+package com.casic.qd.smartwell.extensions
+
+/**
+ * ArrayList扩展方法
+ */
+
+fun addAll(vararg args: String): ArrayList {
+ val result = ArrayList()
+ args.forEach {
+ result.add(it)
+ }
+ return result
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
new file mode 100644
index 0000000..7f68e3b
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
@@ -0,0 +1,21 @@
+package com.casic.qd.smartwell.extensions
+
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.*
+
+fun Long.timestampToTime(): String =
+ SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(Date(this))
+
+fun Long.isEarlierThanStart(date: String): Boolean {
+ if (date.isBlank()) {
+ return false
+ }
+ val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA)
+ try {
+ return this < dateFormat.parse(date)!!.time
+ } catch (e: ParseException) {
+
+ }
+ return true
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
new file mode 100644
index 0000000..3802496
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
@@ -0,0 +1,18 @@
+package com.casic.qd.smartwell.model
+
+class AlarmContentModel {
+ var code = 0
+ var data: DataBean? = null
+ var message: String? = null
+
+ class DataBean {
+ var list: List? = null
+
+ class ListBean {
+ var deviceType: String? = null
+ var alarmType: String? = null
+ var name: String? = null
+ var value: String? = null
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
new file mode 100644
index 0000000..ba9a6c7
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
@@ -0,0 +1,14 @@
+package com.casic.qd.smartwell.model
+
+class AlarmTypeModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var name: String? = null
+ var id: String? = null
+ var value: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
new file mode 100644
index 0000000..8761adf
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
@@ -0,0 +1,25 @@
+package com.casic.qd.smartwell.model
+
+class AreaModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var id: String? = null
+ var isSync: String? = null
+ var lat: String? = null
+ var level = 0
+ var levelName: String? = null
+ var lng: String? = null
+ var name: String? = null
+ var num = 0
+ var pName: String? = null
+ var pid: String? = null
+ var pids: String? = null
+ var simplename: String? = null
+ var targetIdSync: String? = null
+ var targetPidSync: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
index d73ecc1..ec902a8 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
@@ -12,6 +12,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L
val HOME_ICONS = arrayOf(
R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics,
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
index 15c30fc..7081e2c 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
@@ -85,4 +85,42 @@
@Field("jobStatus") jobStatus: String,
@Field("handleMessage") handleMessage: String
): String
+
+ /**
+ * 获取告警类型
+ */
+ @GET("/dict/code/alarmType")
+ suspend fun obtainAlarmType(@Header("token") token: String): String
+
+ /**
+ * 根据类型获取告警内容
+ */
+ @GET("/alarm/contentType")
+ suspend fun obtainAlarmContent(
+ @Header("token") token: String,
+ @Query("alarmType") alarmType: String
+ ): String
+
+ /**
+ * 获取区域
+ */
+ @GET("/device/getAreas")
+ suspend fun obtainArea(@Header("token") token: String): String
+
+ /**
+ * 查询告警
+ * */
+ @GET("/alarm/list")
+ suspend fun obtainSearchResult(
+ @Header("token") token: String,
+ @Query("keywords") keywords: String?,
+ @Query("alarmType") alarmType: String?,
+ @Query("areaId") areaId: String?,
+ @Query("alarmContentType") alarmContentType: String?,
+ @Query("beginTime") beginTime: String?,
+ @Query("endTime") endTime: String?,
+ @Query("status") status: String?,
+ @Query("offset") offset: Int,
+ @Query("limit") limit: Int
+ ): String
}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index c86566b..b3a6cfc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,7 +31,6 @@
coroutines 'enable'
}
}
- buildToolsVersion '30.0.3'
}
dependencies {
@@ -81,4 +80,6 @@
implementation 'io.github.youth5201314:banner:2.2.2'
//WebView
implementation 'com.just.agentweb:agentweb-androidx:4.1.4'
+ //日期选择器
+ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f9514b2..45a9414 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -40,8 +40,10 @@
-
-
+
+
+
+
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
new file mode 100644
index 0000000..d3584c4
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
@@ -0,0 +1,13 @@
+package com.casic.qd.smartwell.extensions
+
+/**
+ * ArrayList扩展方法
+ */
+
+fun addAll(vararg args: String): ArrayList {
+ val result = ArrayList()
+ args.forEach {
+ result.add(it)
+ }
+ return result
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
new file mode 100644
index 0000000..7f68e3b
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
@@ -0,0 +1,21 @@
+package com.casic.qd.smartwell.extensions
+
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.*
+
+fun Long.timestampToTime(): String =
+ SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(Date(this))
+
+fun Long.isEarlierThanStart(date: String): Boolean {
+ if (date.isBlank()) {
+ return false
+ }
+ val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA)
+ try {
+ return this < dateFormat.parse(date)!!.time
+ } catch (e: ParseException) {
+
+ }
+ return true
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
new file mode 100644
index 0000000..3802496
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
@@ -0,0 +1,18 @@
+package com.casic.qd.smartwell.model
+
+class AlarmContentModel {
+ var code = 0
+ var data: DataBean? = null
+ var message: String? = null
+
+ class DataBean {
+ var list: List? = null
+
+ class ListBean {
+ var deviceType: String? = null
+ var alarmType: String? = null
+ var name: String? = null
+ var value: String? = null
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
new file mode 100644
index 0000000..ba9a6c7
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
@@ -0,0 +1,14 @@
+package com.casic.qd.smartwell.model
+
+class AlarmTypeModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var name: String? = null
+ var id: String? = null
+ var value: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
new file mode 100644
index 0000000..8761adf
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
@@ -0,0 +1,25 @@
+package com.casic.qd.smartwell.model
+
+class AreaModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var id: String? = null
+ var isSync: String? = null
+ var lat: String? = null
+ var level = 0
+ var levelName: String? = null
+ var lng: String? = null
+ var name: String? = null
+ var num = 0
+ var pName: String? = null
+ var pid: String? = null
+ var pids: String? = null
+ var simplename: String? = null
+ var targetIdSync: String? = null
+ var targetPidSync: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
index d73ecc1..ec902a8 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
@@ -12,6 +12,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L
val HOME_ICONS = arrayOf(
R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics,
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
index 15c30fc..7081e2c 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
@@ -85,4 +85,42 @@
@Field("jobStatus") jobStatus: String,
@Field("handleMessage") handleMessage: String
): String
+
+ /**
+ * 获取告警类型
+ */
+ @GET("/dict/code/alarmType")
+ suspend fun obtainAlarmType(@Header("token") token: String): String
+
+ /**
+ * 根据类型获取告警内容
+ */
+ @GET("/alarm/contentType")
+ suspend fun obtainAlarmContent(
+ @Header("token") token: String,
+ @Query("alarmType") alarmType: String
+ ): String
+
+ /**
+ * 获取区域
+ */
+ @GET("/device/getAreas")
+ suspend fun obtainArea(@Header("token") token: String): String
+
+ /**
+ * 查询告警
+ * */
+ @GET("/alarm/list")
+ suspend fun obtainSearchResult(
+ @Header("token") token: String,
+ @Query("keywords") keywords: String?,
+ @Query("alarmType") alarmType: String?,
+ @Query("areaId") areaId: String?,
+ @Query("alarmContentType") alarmContentType: String?,
+ @Query("beginTime") beginTime: String?,
+ @Query("endTime") endTime: String?,
+ @Query("status") status: String?,
+ @Query("offset") offset: Int,
+ @Query("limit") limit: Int
+ ): String
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
index a6f4726..9190ef1 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
@@ -81,4 +81,52 @@
): String {
return api.obtainOperationResult(AuthenticationHelper.token!!, id, jobStatus, handleMessage)
}
+
+ /**
+ * 获取告警类型
+ */
+ suspend fun obtainAlarmType(): String {
+ return api.obtainAlarmType(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 根据类型获取告警内容
+ */
+ suspend fun obtainAlarmContent(type: String): String {
+ return api.obtainAlarmContent(AuthenticationHelper.token!!, type)
+ }
+
+ /**
+ * 获取区域
+ */
+ suspend fun obtainArea(): String {
+ return api.obtainArea(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 查询告警
+ */
+ suspend fun obtainSearchResult(
+ keywords: String?,
+ alarmType: String?,
+ areaId: String?,
+ alarmContentType: String?,
+ beginTime: String?,
+ endTime: String?,
+ status: String?,
+ page: Int
+ ): String {
+ return api.obtainSearchResult(
+ AuthenticationHelper.token!!,
+ keywords,
+ alarmType,
+ areaId,
+ alarmContentType,
+ beginTime,
+ endTime,
+ status,
+ page,
+ Constant.PAGE_LIMIT
+ )
+ }
}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index c86566b..b3a6cfc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,7 +31,6 @@
coroutines 'enable'
}
}
- buildToolsVersion '30.0.3'
}
dependencies {
@@ -81,4 +80,6 @@
implementation 'io.github.youth5201314:banner:2.2.2'
//WebView
implementation 'com.just.agentweb:agentweb-androidx:4.1.4'
+ //日期选择器
+ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f9514b2..45a9414 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -40,8 +40,10 @@
-
-
+
+
+
+
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
new file mode 100644
index 0000000..d3584c4
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
@@ -0,0 +1,13 @@
+package com.casic.qd.smartwell.extensions
+
+/**
+ * ArrayList扩展方法
+ */
+
+fun addAll(vararg args: String): ArrayList {
+ val result = ArrayList()
+ args.forEach {
+ result.add(it)
+ }
+ return result
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
new file mode 100644
index 0000000..7f68e3b
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
@@ -0,0 +1,21 @@
+package com.casic.qd.smartwell.extensions
+
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.*
+
+fun Long.timestampToTime(): String =
+ SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(Date(this))
+
+fun Long.isEarlierThanStart(date: String): Boolean {
+ if (date.isBlank()) {
+ return false
+ }
+ val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA)
+ try {
+ return this < dateFormat.parse(date)!!.time
+ } catch (e: ParseException) {
+
+ }
+ return true
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
new file mode 100644
index 0000000..3802496
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
@@ -0,0 +1,18 @@
+package com.casic.qd.smartwell.model
+
+class AlarmContentModel {
+ var code = 0
+ var data: DataBean? = null
+ var message: String? = null
+
+ class DataBean {
+ var list: List? = null
+
+ class ListBean {
+ var deviceType: String? = null
+ var alarmType: String? = null
+ var name: String? = null
+ var value: String? = null
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
new file mode 100644
index 0000000..ba9a6c7
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
@@ -0,0 +1,14 @@
+package com.casic.qd.smartwell.model
+
+class AlarmTypeModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var name: String? = null
+ var id: String? = null
+ var value: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
new file mode 100644
index 0000000..8761adf
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
@@ -0,0 +1,25 @@
+package com.casic.qd.smartwell.model
+
+class AreaModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var id: String? = null
+ var isSync: String? = null
+ var lat: String? = null
+ var level = 0
+ var levelName: String? = null
+ var lng: String? = null
+ var name: String? = null
+ var num = 0
+ var pName: String? = null
+ var pid: String? = null
+ var pids: String? = null
+ var simplename: String? = null
+ var targetIdSync: String? = null
+ var targetPidSync: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
index d73ecc1..ec902a8 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
@@ -12,6 +12,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L
val HOME_ICONS = arrayOf(
R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics,
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
index 15c30fc..7081e2c 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
@@ -85,4 +85,42 @@
@Field("jobStatus") jobStatus: String,
@Field("handleMessage") handleMessage: String
): String
+
+ /**
+ * 获取告警类型
+ */
+ @GET("/dict/code/alarmType")
+ suspend fun obtainAlarmType(@Header("token") token: String): String
+
+ /**
+ * 根据类型获取告警内容
+ */
+ @GET("/alarm/contentType")
+ suspend fun obtainAlarmContent(
+ @Header("token") token: String,
+ @Query("alarmType") alarmType: String
+ ): String
+
+ /**
+ * 获取区域
+ */
+ @GET("/device/getAreas")
+ suspend fun obtainArea(@Header("token") token: String): String
+
+ /**
+ * 查询告警
+ * */
+ @GET("/alarm/list")
+ suspend fun obtainSearchResult(
+ @Header("token") token: String,
+ @Query("keywords") keywords: String?,
+ @Query("alarmType") alarmType: String?,
+ @Query("areaId") areaId: String?,
+ @Query("alarmContentType") alarmContentType: String?,
+ @Query("beginTime") beginTime: String?,
+ @Query("endTime") endTime: String?,
+ @Query("status") status: String?,
+ @Query("offset") offset: Int,
+ @Query("limit") limit: Int
+ ): String
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
index a6f4726..9190ef1 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
@@ -81,4 +81,52 @@
): String {
return api.obtainOperationResult(AuthenticationHelper.token!!, id, jobStatus, handleMessage)
}
+
+ /**
+ * 获取告警类型
+ */
+ suspend fun obtainAlarmType(): String {
+ return api.obtainAlarmType(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 根据类型获取告警内容
+ */
+ suspend fun obtainAlarmContent(type: String): String {
+ return api.obtainAlarmContent(AuthenticationHelper.token!!, type)
+ }
+
+ /**
+ * 获取区域
+ */
+ suspend fun obtainArea(): String {
+ return api.obtainArea(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 查询告警
+ */
+ suspend fun obtainSearchResult(
+ keywords: String?,
+ alarmType: String?,
+ areaId: String?,
+ alarmContentType: String?,
+ beginTime: String?,
+ endTime: String?,
+ status: String?,
+ page: Int
+ ): String {
+ return api.obtainSearchResult(
+ AuthenticationHelper.token!!,
+ keywords,
+ alarmType,
+ areaId,
+ alarmContentType,
+ beginTime,
+ endTime,
+ status,
+ page,
+ Constant.PAGE_LIMIT
+ )
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
index b0debb7..8fcd142 100644
--- a/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
@@ -118,6 +118,10 @@
}
}
})
+
+ rightOptionView.setOnClickListener {
+ this.navigatePageTo(SearchAlarmActivity::class.java)
+ }
}
private fun obtainAlarmList(pageIndex: Int) {
diff --git a/app/build.gradle b/app/build.gradle
index c86566b..b3a6cfc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,7 +31,6 @@
coroutines 'enable'
}
}
- buildToolsVersion '30.0.3'
}
dependencies {
@@ -81,4 +80,6 @@
implementation 'io.github.youth5201314:banner:2.2.2'
//WebView
implementation 'com.just.agentweb:agentweb-androidx:4.1.4'
+ //日期选择器
+ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f9514b2..45a9414 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -40,8 +40,10 @@
-
-
+
+
+
+
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
new file mode 100644
index 0000000..d3584c4
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
@@ -0,0 +1,13 @@
+package com.casic.qd.smartwell.extensions
+
+/**
+ * ArrayList扩展方法
+ */
+
+fun addAll(vararg args: String): ArrayList {
+ val result = ArrayList()
+ args.forEach {
+ result.add(it)
+ }
+ return result
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
new file mode 100644
index 0000000..7f68e3b
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
@@ -0,0 +1,21 @@
+package com.casic.qd.smartwell.extensions
+
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.*
+
+fun Long.timestampToTime(): String =
+ SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(Date(this))
+
+fun Long.isEarlierThanStart(date: String): Boolean {
+ if (date.isBlank()) {
+ return false
+ }
+ val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA)
+ try {
+ return this < dateFormat.parse(date)!!.time
+ } catch (e: ParseException) {
+
+ }
+ return true
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
new file mode 100644
index 0000000..3802496
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
@@ -0,0 +1,18 @@
+package com.casic.qd.smartwell.model
+
+class AlarmContentModel {
+ var code = 0
+ var data: DataBean? = null
+ var message: String? = null
+
+ class DataBean {
+ var list: List? = null
+
+ class ListBean {
+ var deviceType: String? = null
+ var alarmType: String? = null
+ var name: String? = null
+ var value: String? = null
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
new file mode 100644
index 0000000..ba9a6c7
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
@@ -0,0 +1,14 @@
+package com.casic.qd.smartwell.model
+
+class AlarmTypeModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var name: String? = null
+ var id: String? = null
+ var value: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
new file mode 100644
index 0000000..8761adf
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
@@ -0,0 +1,25 @@
+package com.casic.qd.smartwell.model
+
+class AreaModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var id: String? = null
+ var isSync: String? = null
+ var lat: String? = null
+ var level = 0
+ var levelName: String? = null
+ var lng: String? = null
+ var name: String? = null
+ var num = 0
+ var pName: String? = null
+ var pid: String? = null
+ var pids: String? = null
+ var simplename: String? = null
+ var targetIdSync: String? = null
+ var targetPidSync: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
index d73ecc1..ec902a8 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
@@ -12,6 +12,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L
val HOME_ICONS = arrayOf(
R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics,
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
index 15c30fc..7081e2c 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
@@ -85,4 +85,42 @@
@Field("jobStatus") jobStatus: String,
@Field("handleMessage") handleMessage: String
): String
+
+ /**
+ * 获取告警类型
+ */
+ @GET("/dict/code/alarmType")
+ suspend fun obtainAlarmType(@Header("token") token: String): String
+
+ /**
+ * 根据类型获取告警内容
+ */
+ @GET("/alarm/contentType")
+ suspend fun obtainAlarmContent(
+ @Header("token") token: String,
+ @Query("alarmType") alarmType: String
+ ): String
+
+ /**
+ * 获取区域
+ */
+ @GET("/device/getAreas")
+ suspend fun obtainArea(@Header("token") token: String): String
+
+ /**
+ * 查询告警
+ * */
+ @GET("/alarm/list")
+ suspend fun obtainSearchResult(
+ @Header("token") token: String,
+ @Query("keywords") keywords: String?,
+ @Query("alarmType") alarmType: String?,
+ @Query("areaId") areaId: String?,
+ @Query("alarmContentType") alarmContentType: String?,
+ @Query("beginTime") beginTime: String?,
+ @Query("endTime") endTime: String?,
+ @Query("status") status: String?,
+ @Query("offset") offset: Int,
+ @Query("limit") limit: Int
+ ): String
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
index a6f4726..9190ef1 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
@@ -81,4 +81,52 @@
): String {
return api.obtainOperationResult(AuthenticationHelper.token!!, id, jobStatus, handleMessage)
}
+
+ /**
+ * 获取告警类型
+ */
+ suspend fun obtainAlarmType(): String {
+ return api.obtainAlarmType(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 根据类型获取告警内容
+ */
+ suspend fun obtainAlarmContent(type: String): String {
+ return api.obtainAlarmContent(AuthenticationHelper.token!!, type)
+ }
+
+ /**
+ * 获取区域
+ */
+ suspend fun obtainArea(): String {
+ return api.obtainArea(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 查询告警
+ */
+ suspend fun obtainSearchResult(
+ keywords: String?,
+ alarmType: String?,
+ areaId: String?,
+ alarmContentType: String?,
+ beginTime: String?,
+ endTime: String?,
+ status: String?,
+ page: Int
+ ): String {
+ return api.obtainSearchResult(
+ AuthenticationHelper.token!!,
+ keywords,
+ alarmType,
+ areaId,
+ alarmContentType,
+ beginTime,
+ endTime,
+ status,
+ page,
+ Constant.PAGE_LIMIT
+ )
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
index b0debb7..8fcd142 100644
--- a/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
@@ -118,6 +118,10 @@
}
}
})
+
+ rightOptionView.setOnClickListener {
+ this.navigatePageTo(SearchAlarmActivity::class.java)
+ }
}
private fun obtainAlarmList(pageIndex: Int) {
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt
new file mode 100644
index 0000000..aef4154
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt
@@ -0,0 +1,168 @@
+package com.casic.qd.smartwell.view
+
+import android.view.View
+import androidx.lifecycle.ViewModelProvider
+import com.casic.qd.smartwell.R
+import com.casic.qd.smartwell.base.BaseActivity
+import com.casic.qd.smartwell.extensions.*
+import com.casic.qd.smartwell.model.AreaModel
+import com.casic.qd.smartwell.utils.Constant
+import com.casic.qd.smartwell.vm.AlarmContentViewModel
+import com.casic.qd.smartwell.vm.AlarmTypeViewModel
+import com.casic.qd.smartwell.vm.AreaViewModel
+import com.jzxiang.pickerview.TimePickerDialog
+import com.jzxiang.pickerview.data.Type
+import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet.BottomListSheetBuilder
+import kotlinx.android.synthetic.main.activity_alarm_search.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SearchAlarmActivity : BaseActivity() {
+
+ private val kTag = "SearchAlarmActivity"
+ private lateinit var alarmTypeViewModel: AlarmTypeViewModel
+ private lateinit var alarmContentViewModel: AlarmContentViewModel
+ private lateinit var areaViewModel: AreaViewModel
+ private var alarmType = ""
+ private var alarmContent = ""
+ private var firstLevelArea: MutableList = ArrayList()
+ private var secondLevelArea: MutableList = ArrayList()
+ private var thirdLevelArea: MutableList = ArrayList()
+ private var areaModels: MutableList = ArrayList()
+
+ override fun initLayoutView(): Int = R.layout.activity_alarm_search
+
+ override fun setupTopBarLayout() {
+ titleView.text = "告警查询"
+ leftBackView.visibility = View.GONE
+ }
+
+ override fun initData() {
+ //告警类型
+ alarmTypeViewModel = ViewModelProvider(this).get(AlarmTypeViewModel::class.java)
+ //告警内容
+ alarmContentViewModel = ViewModelProvider(this).get(AlarmContentViewModel::class.java)
+ //区域
+ areaViewModel = ViewModelProvider(this).get(AreaViewModel::class.java)
+ }
+
+ override fun initEvent() {
+ selectTypeView.setOnClickListener {
+ alarmTypeViewModel.obtainAlarmType()
+ }
+ alarmTypeViewModel.typeModel.observe(this, {
+ if (it.code == 200) {
+ val sheetBuilder = BottomListSheetBuilder(this)
+ sheetBuilder.setTitle("告警类型")
+ it.data?.forEach { dataBean ->
+ sheetBuilder.addItem(dataBean.name)
+ }
+ sheetBuilder.setGravityCenter(true)
+ .setOnSheetItemClickListener { dialog, itemView, position, tag ->
+ alarmTypeView.text = tag
+ alarmType = it.data!![position].value.toString()
+
+ //告警类型变了之后需要清空告警内容
+ alarmContentView.text = ""
+ dialog.dismiss()
+ }.build().show()
+ }
+ })
+
+ selectContentView.setOnClickListener {
+ //获取类型对应的报警内容
+ alarmContentViewModel.obtainAlarmContent(alarmType)
+ }
+ alarmContentViewModel.contentModel.observe(this, {
+ if (it.code == 200) {
+ val sheetBuilder = BottomListSheetBuilder(this)
+ sheetBuilder.setTitle("告警内容")
+ it.data?.list?.forEach { dataBean ->
+ sheetBuilder.addItem(dataBean.name)
+ }
+ sheetBuilder.setGravityCenter(true)
+ .setOnSheetItemClickListener { dialog, itemView, position, tag ->
+ alarmContentView.text = tag
+ alarmContent = it.data!!.list!![position].value.toString()
+
+ dialog.dismiss()
+ }.build().show()
+ }
+ })
+
+ //地区三级联动
+ selectAreaView.setOnClickListener {
+ areaViewModel.obtainArea()
+ }
+ areaViewModel.areaModel.observe(this, {
+ if (it.code == 200) {
+ it.data?.forEach { dataBean ->
+ when (dataBean.level) {
+ 2 -> firstLevelArea.add(dataBean)
+ 3 -> secondLevelArea.add(dataBean)
+ 4 -> thirdLevelArea.add(dataBean)
+ }
+ }
+ //TODO 绑定区域
+// Log.d(kTag, Gson().toJson(firstLevelArea))
+// Log.d(kTag, Gson().toJson(secondLevelArea))
+// Log.d(kTag, Gson().toJson(thirdLevelArea))
+ }
+ })
+
+ startTimeView.setOnClickListener {
+ TimePickerDialog.Builder()
+ .setThemeColor(R.color.mainThemeColor.convertColor())
+ .setTitleStringId("请选择开始时间")
+ .setWheelItemTextSize(16)
+ .setCyclic(false)
+ .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS)
+ .setMaxMillseconds(System.currentTimeMillis())
+ .setType(Type.ALL)
+ .setCallBack { _: TimePickerDialog?, millSeconds: Long ->
+ startTimeView.text = millSeconds.timestampToTime()
+ }.build().show(supportFragmentManager, "all")
+ }
+
+ endTimeView.setOnClickListener {
+ TimePickerDialog.Builder()
+ .setThemeColor(R.color.mainThemeColor.convertColor())
+ .setTitleStringId("请选择结束时间")
+ .setWheelItemTextSize(16)
+ .setCyclic(false)
+ .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS)
+ .setMaxMillseconds(System.currentTimeMillis())
+ .setType(Type.ALL)
+ .setCallBack { _: TimePickerDialog?, millSeconds: Long ->
+ if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) {
+ "结束时间不合法,不能早于开始时间".show()
+ return@setCallBack
+ }
+ endTimeView.text = millSeconds.timestampToTime()
+ }.build().show(supportFragmentManager, "all")
+ }
+
+ searchButton.setChangeAlphaWhenPress(true)
+ searchButton.setOnClickListener {
+ //页面跳转,将查询参数传过去
+ //TODO areaId待定
+ navigatePageTo(
+ SearchResultActivity::class.java, addAll(
+ wellCodeView.text.toString().trim(),
+ alarmType,
+ "",
+ alarmContent,
+ startTimeView.text.toString(),
+ endTimeView.text.toString()
+ )
+ )
+ }
+
+ clearButton.setChangeAlphaWhenPress(true)
+ clearButton.setOnClickListener {
+ alarmTypeView.text = ""
+ alarmContentView.text = ""
+ startTimeView.text = ""
+ endTimeView.text = ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index c86566b..b3a6cfc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,7 +31,6 @@
coroutines 'enable'
}
}
- buildToolsVersion '30.0.3'
}
dependencies {
@@ -81,4 +80,6 @@
implementation 'io.github.youth5201314:banner:2.2.2'
//WebView
implementation 'com.just.agentweb:agentweb-androidx:4.1.4'
+ //日期选择器
+ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f9514b2..45a9414 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -40,8 +40,10 @@
-
-
+
+
+
+
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
new file mode 100644
index 0000000..d3584c4
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
@@ -0,0 +1,13 @@
+package com.casic.qd.smartwell.extensions
+
+/**
+ * ArrayList扩展方法
+ */
+
+fun addAll(vararg args: String): ArrayList {
+ val result = ArrayList()
+ args.forEach {
+ result.add(it)
+ }
+ return result
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
new file mode 100644
index 0000000..7f68e3b
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
@@ -0,0 +1,21 @@
+package com.casic.qd.smartwell.extensions
+
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.*
+
+fun Long.timestampToTime(): String =
+ SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(Date(this))
+
+fun Long.isEarlierThanStart(date: String): Boolean {
+ if (date.isBlank()) {
+ return false
+ }
+ val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA)
+ try {
+ return this < dateFormat.parse(date)!!.time
+ } catch (e: ParseException) {
+
+ }
+ return true
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
new file mode 100644
index 0000000..3802496
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
@@ -0,0 +1,18 @@
+package com.casic.qd.smartwell.model
+
+class AlarmContentModel {
+ var code = 0
+ var data: DataBean? = null
+ var message: String? = null
+
+ class DataBean {
+ var list: List? = null
+
+ class ListBean {
+ var deviceType: String? = null
+ var alarmType: String? = null
+ var name: String? = null
+ var value: String? = null
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
new file mode 100644
index 0000000..ba9a6c7
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
@@ -0,0 +1,14 @@
+package com.casic.qd.smartwell.model
+
+class AlarmTypeModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var name: String? = null
+ var id: String? = null
+ var value: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
new file mode 100644
index 0000000..8761adf
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
@@ -0,0 +1,25 @@
+package com.casic.qd.smartwell.model
+
+class AreaModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var id: String? = null
+ var isSync: String? = null
+ var lat: String? = null
+ var level = 0
+ var levelName: String? = null
+ var lng: String? = null
+ var name: String? = null
+ var num = 0
+ var pName: String? = null
+ var pid: String? = null
+ var pids: String? = null
+ var simplename: String? = null
+ var targetIdSync: String? = null
+ var targetPidSync: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
index d73ecc1..ec902a8 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
@@ -12,6 +12,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L
val HOME_ICONS = arrayOf(
R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics,
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
index 15c30fc..7081e2c 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
@@ -85,4 +85,42 @@
@Field("jobStatus") jobStatus: String,
@Field("handleMessage") handleMessage: String
): String
+
+ /**
+ * 获取告警类型
+ */
+ @GET("/dict/code/alarmType")
+ suspend fun obtainAlarmType(@Header("token") token: String): String
+
+ /**
+ * 根据类型获取告警内容
+ */
+ @GET("/alarm/contentType")
+ suspend fun obtainAlarmContent(
+ @Header("token") token: String,
+ @Query("alarmType") alarmType: String
+ ): String
+
+ /**
+ * 获取区域
+ */
+ @GET("/device/getAreas")
+ suspend fun obtainArea(@Header("token") token: String): String
+
+ /**
+ * 查询告警
+ * */
+ @GET("/alarm/list")
+ suspend fun obtainSearchResult(
+ @Header("token") token: String,
+ @Query("keywords") keywords: String?,
+ @Query("alarmType") alarmType: String?,
+ @Query("areaId") areaId: String?,
+ @Query("alarmContentType") alarmContentType: String?,
+ @Query("beginTime") beginTime: String?,
+ @Query("endTime") endTime: String?,
+ @Query("status") status: String?,
+ @Query("offset") offset: Int,
+ @Query("limit") limit: Int
+ ): String
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
index a6f4726..9190ef1 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
@@ -81,4 +81,52 @@
): String {
return api.obtainOperationResult(AuthenticationHelper.token!!, id, jobStatus, handleMessage)
}
+
+ /**
+ * 获取告警类型
+ */
+ suspend fun obtainAlarmType(): String {
+ return api.obtainAlarmType(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 根据类型获取告警内容
+ */
+ suspend fun obtainAlarmContent(type: String): String {
+ return api.obtainAlarmContent(AuthenticationHelper.token!!, type)
+ }
+
+ /**
+ * 获取区域
+ */
+ suspend fun obtainArea(): String {
+ return api.obtainArea(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 查询告警
+ */
+ suspend fun obtainSearchResult(
+ keywords: String?,
+ alarmType: String?,
+ areaId: String?,
+ alarmContentType: String?,
+ beginTime: String?,
+ endTime: String?,
+ status: String?,
+ page: Int
+ ): String {
+ return api.obtainSearchResult(
+ AuthenticationHelper.token!!,
+ keywords,
+ alarmType,
+ areaId,
+ alarmContentType,
+ beginTime,
+ endTime,
+ status,
+ page,
+ Constant.PAGE_LIMIT
+ )
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
index b0debb7..8fcd142 100644
--- a/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
@@ -118,6 +118,10 @@
}
}
})
+
+ rightOptionView.setOnClickListener {
+ this.navigatePageTo(SearchAlarmActivity::class.java)
+ }
}
private fun obtainAlarmList(pageIndex: Int) {
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt
new file mode 100644
index 0000000..aef4154
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt
@@ -0,0 +1,168 @@
+package com.casic.qd.smartwell.view
+
+import android.view.View
+import androidx.lifecycle.ViewModelProvider
+import com.casic.qd.smartwell.R
+import com.casic.qd.smartwell.base.BaseActivity
+import com.casic.qd.smartwell.extensions.*
+import com.casic.qd.smartwell.model.AreaModel
+import com.casic.qd.smartwell.utils.Constant
+import com.casic.qd.smartwell.vm.AlarmContentViewModel
+import com.casic.qd.smartwell.vm.AlarmTypeViewModel
+import com.casic.qd.smartwell.vm.AreaViewModel
+import com.jzxiang.pickerview.TimePickerDialog
+import com.jzxiang.pickerview.data.Type
+import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet.BottomListSheetBuilder
+import kotlinx.android.synthetic.main.activity_alarm_search.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SearchAlarmActivity : BaseActivity() {
+
+ private val kTag = "SearchAlarmActivity"
+ private lateinit var alarmTypeViewModel: AlarmTypeViewModel
+ private lateinit var alarmContentViewModel: AlarmContentViewModel
+ private lateinit var areaViewModel: AreaViewModel
+ private var alarmType = ""
+ private var alarmContent = ""
+ private var firstLevelArea: MutableList = ArrayList()
+ private var secondLevelArea: MutableList = ArrayList()
+ private var thirdLevelArea: MutableList = ArrayList()
+ private var areaModels: MutableList = ArrayList()
+
+ override fun initLayoutView(): Int = R.layout.activity_alarm_search
+
+ override fun setupTopBarLayout() {
+ titleView.text = "告警查询"
+ leftBackView.visibility = View.GONE
+ }
+
+ override fun initData() {
+ //告警类型
+ alarmTypeViewModel = ViewModelProvider(this).get(AlarmTypeViewModel::class.java)
+ //告警内容
+ alarmContentViewModel = ViewModelProvider(this).get(AlarmContentViewModel::class.java)
+ //区域
+ areaViewModel = ViewModelProvider(this).get(AreaViewModel::class.java)
+ }
+
+ override fun initEvent() {
+ selectTypeView.setOnClickListener {
+ alarmTypeViewModel.obtainAlarmType()
+ }
+ alarmTypeViewModel.typeModel.observe(this, {
+ if (it.code == 200) {
+ val sheetBuilder = BottomListSheetBuilder(this)
+ sheetBuilder.setTitle("告警类型")
+ it.data?.forEach { dataBean ->
+ sheetBuilder.addItem(dataBean.name)
+ }
+ sheetBuilder.setGravityCenter(true)
+ .setOnSheetItemClickListener { dialog, itemView, position, tag ->
+ alarmTypeView.text = tag
+ alarmType = it.data!![position].value.toString()
+
+ //告警类型变了之后需要清空告警内容
+ alarmContentView.text = ""
+ dialog.dismiss()
+ }.build().show()
+ }
+ })
+
+ selectContentView.setOnClickListener {
+ //获取类型对应的报警内容
+ alarmContentViewModel.obtainAlarmContent(alarmType)
+ }
+ alarmContentViewModel.contentModel.observe(this, {
+ if (it.code == 200) {
+ val sheetBuilder = BottomListSheetBuilder(this)
+ sheetBuilder.setTitle("告警内容")
+ it.data?.list?.forEach { dataBean ->
+ sheetBuilder.addItem(dataBean.name)
+ }
+ sheetBuilder.setGravityCenter(true)
+ .setOnSheetItemClickListener { dialog, itemView, position, tag ->
+ alarmContentView.text = tag
+ alarmContent = it.data!!.list!![position].value.toString()
+
+ dialog.dismiss()
+ }.build().show()
+ }
+ })
+
+ //地区三级联动
+ selectAreaView.setOnClickListener {
+ areaViewModel.obtainArea()
+ }
+ areaViewModel.areaModel.observe(this, {
+ if (it.code == 200) {
+ it.data?.forEach { dataBean ->
+ when (dataBean.level) {
+ 2 -> firstLevelArea.add(dataBean)
+ 3 -> secondLevelArea.add(dataBean)
+ 4 -> thirdLevelArea.add(dataBean)
+ }
+ }
+ //TODO 绑定区域
+// Log.d(kTag, Gson().toJson(firstLevelArea))
+// Log.d(kTag, Gson().toJson(secondLevelArea))
+// Log.d(kTag, Gson().toJson(thirdLevelArea))
+ }
+ })
+
+ startTimeView.setOnClickListener {
+ TimePickerDialog.Builder()
+ .setThemeColor(R.color.mainThemeColor.convertColor())
+ .setTitleStringId("请选择开始时间")
+ .setWheelItemTextSize(16)
+ .setCyclic(false)
+ .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS)
+ .setMaxMillseconds(System.currentTimeMillis())
+ .setType(Type.ALL)
+ .setCallBack { _: TimePickerDialog?, millSeconds: Long ->
+ startTimeView.text = millSeconds.timestampToTime()
+ }.build().show(supportFragmentManager, "all")
+ }
+
+ endTimeView.setOnClickListener {
+ TimePickerDialog.Builder()
+ .setThemeColor(R.color.mainThemeColor.convertColor())
+ .setTitleStringId("请选择结束时间")
+ .setWheelItemTextSize(16)
+ .setCyclic(false)
+ .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS)
+ .setMaxMillseconds(System.currentTimeMillis())
+ .setType(Type.ALL)
+ .setCallBack { _: TimePickerDialog?, millSeconds: Long ->
+ if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) {
+ "结束时间不合法,不能早于开始时间".show()
+ return@setCallBack
+ }
+ endTimeView.text = millSeconds.timestampToTime()
+ }.build().show(supportFragmentManager, "all")
+ }
+
+ searchButton.setChangeAlphaWhenPress(true)
+ searchButton.setOnClickListener {
+ //页面跳转,将查询参数传过去
+ //TODO areaId待定
+ navigatePageTo(
+ SearchResultActivity::class.java, addAll(
+ wellCodeView.text.toString().trim(),
+ alarmType,
+ "",
+ alarmContent,
+ startTimeView.text.toString(),
+ endTimeView.text.toString()
+ )
+ )
+ }
+
+ clearButton.setChangeAlphaWhenPress(true)
+ clearButton.setOnClickListener {
+ alarmTypeView.text = ""
+ alarmContentView.text = ""
+ startTimeView.text = ""
+ endTimeView.text = ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt
new file mode 100644
index 0000000..32d0a3a
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt
@@ -0,0 +1,223 @@
+package com.casic.qd.smartwell.view
+
+import android.annotation.SuppressLint
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.os.Handler
+import android.os.Looper
+import android.os.Message
+import android.view.View
+import androidx.lifecycle.ViewModelProvider
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.casic.qd.smartwell.R
+import com.casic.qd.smartwell.adapter.AlarmListAdapter
+import com.casic.qd.smartwell.base.BaseActivity
+import com.casic.qd.smartwell.extensions.navigatePageTo
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.showEmptyPage
+import com.casic.qd.smartwell.model.AlarmListModel
+import com.casic.qd.smartwell.utils.BroadcastReceiverManager
+import com.casic.qd.smartwell.utils.Constant
+import com.casic.qd.smartwell.utils.DialogHelper
+import com.casic.qd.smartwell.utils.LoadState
+import com.casic.qd.smartwell.vm.CancelAlarmViewModel
+import com.casic.qd.smartwell.vm.SearchAlarmViewModel
+import com.casic.qd.smartwell.widgets.CancelAlarmDialog
+import kotlinx.android.synthetic.main.activity_alarm_search_result.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_empty_view.*
+import java.lang.ref.WeakReference
+
+class SearchResultActivity : BaseActivity() {
+ private lateinit var weakReferenceHandler: WeakReferenceHandler
+ private lateinit var searchAlarmViewModel: SearchAlarmViewModel
+ private lateinit var cancelAlarmViewModel: CancelAlarmViewModel
+ private lateinit var args: ArrayList
+ private lateinit var alarmListAdapter: AlarmListAdapter
+ private var dataBeans: MutableList = ArrayList()
+ private var pageIndex = 1
+ private var isRefresh = false
+ private var isLoadMore = false
+
+ override fun initLayoutView(): Int = R.layout.activity_alarm_search_result
+
+ override fun setupTopBarLayout() {
+ titleView.text = "查询结果"
+ leftBackView.visibility = View.GONE
+ }
+
+ override fun initData() {
+ args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!!
+ weakReferenceHandler = WeakReferenceHandler(this)
+ searchAlarmViewModel = ViewModelProvider(this).get(SearchAlarmViewModel::class.java)
+ cancelAlarmViewModel = ViewModelProvider(this).get(CancelAlarmViewModel::class.java)
+ //注册广播接收者
+ BroadcastReceiverManager.instance.addAction(Constant.CANCEL_ALARM_ACTION,
+ object : BroadcastReceiver() {
+ override fun onReceive(context: Context?, intent: Intent?) {
+ //收到广播相当于做了一次列表刷新
+ isRefresh = true
+ pageIndex = 1
+ obtainSearchResult(args, pageIndex)
+ }
+ })
+ }
+
+ override fun initEvent() {
+ obtainSearchResult(args, pageIndex)
+ searchAlarmViewModel.listModel.observe(this, {
+ if (it.code == 200) {
+ val dataRows = it.data?.rows
+ when {
+ isRefresh -> {
+ dataBeans.clear()
+ dataBeans = dataRows!!
+ resultRefreshLayout.finishRefresh()
+ isRefresh = false
+ }
+ isLoadMore -> {
+ if (dataRows?.size == 0) {
+ "到底了,别拉了".show()
+ }
+ dataBeans.addAll(dataRows!!)
+ resultRefreshLayout.finishLoadMore()
+ isLoadMore = false
+ }
+ else -> {
+ dataBeans = dataRows!!
+ }
+ }
+ weakReferenceHandler.sendEmptyMessage(2022041501)
+ }
+ })
+ searchAlarmViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "数据加载中,请稍后")
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+ resultRefreshLayout.setOnRefreshListener {
+ isRefresh = true
+ //刷新之后页码重置
+ pageIndex = 1
+ obtainSearchResult(args, pageIndex)
+ }
+ resultRefreshLayout.setOnLoadMoreListener {
+ isLoadMore = true
+ pageIndex++
+ obtainSearchResult(args, pageIndex)
+ }
+
+ //消警状态处理
+ cancelAlarmViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "处理中,请稍后")
+ }
+ is LoadState.Success -> {
+ DialogHelper.dismissLoadingDialog()
+ //刷新列表
+ BroadcastReceiverManager.instance.sendBroadcast(
+ Constant.CANCEL_ALARM_ACTION, ""
+ )
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+ }
+
+ private fun obtainSearchResult(args: ArrayList, pageIndex: Int) {
+ searchAlarmViewModel.obtainSearchResult(
+ args[0], args[1], args[2], args[3], args[4], args[5], "1", pageIndex
+ )
+ }
+
+ private class WeakReferenceHandler(activity: SearchResultActivity) :
+ Handler(Looper.getMainLooper()) {
+ private val reference: WeakReference = WeakReference(activity)
+
+ @SuppressLint("NotifyDataSetChanged")
+ override fun handleMessage(msg: Message) {
+ super.handleMessage(msg)
+ val activity = reference.get()!!
+ if (msg.what == 2022041501) {
+ if (activity.isRefresh || activity.isLoadMore) {
+ activity.alarmListAdapter.notifyDataSetChanged()
+ } else { //首次加载数据
+ if (activity.dataBeans.size == 0) {
+ activity.emptyView!!.showEmptyPage {
+ activity.obtainSearchResult(activity.args, activity.pageIndex)
+ }
+ } else {
+ activity.emptyView!!.hide()
+ activity.alarmListAdapter = AlarmListAdapter(activity, activity.dataBeans)
+ activity.resultRecyclerView!!.layoutManager = LinearLayoutManager(activity)
+ activity.resultRecyclerView!!.adapter = activity.alarmListAdapter
+ activity.alarmListAdapter.setOnItemClickListener(object :
+ AlarmListAdapter.OnItemClickListener {
+ override fun onClicked(position: Int) {
+ val wellId = activity.dataBeans[position].wellId.toString()
+ if (wellId.isBlank()) {
+ "井编号异常,无法查看详情".show()
+ return
+ }
+ activity.navigatePageTo(WellDetailActivity::class.java, wellId)
+ }
+
+ override fun onOperationClicked(position: Int) {
+ val wellDetail = activity.dataBeans[position]
+ CancelAlarmDialog.Builder()
+ .setContext(activity)
+ .setTitle("取消告警")
+ .setHintMessage("请输入详细的告警取消原因")
+ .setNegativeButton("取消")
+ .setPositiveButton("确定")
+ .setOnDialogButtonClickListener(object :
+ CancelAlarmDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick(
+ spinnerValue: String, inputValue: String
+ ) {
+ /**
+ * http://111.198.10.15:20104/alarm/cancelAlarm?id=&jobStatus=3&handleMessage=2fsdf
+ * POST
+ * */
+ val id = wellDetail.jobId
+ if (id.toString().isBlank()) {
+ "操作失败,告警ID异常".show()
+ return
+ }
+ val jobStatus = when (spinnerValue) {
+ "已处理" -> "3"
+ "无需处理" -> "4"
+ else -> ""
+ }
+ activity.cancelAlarmViewModel.obtainOperationResult(
+ id!!, jobStatus, inputValue
+ )
+ }
+
+ override fun onCancelClick() {
+
+ }
+ }).build().show()
+ }
+ })
+ }
+ }
+ }
+ }
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ //解注册广播接收者,防止内存泄漏
+ BroadcastReceiverManager.instance.destroy(Constant.CANCEL_ALARM_ACTION)
+ }
+}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index c86566b..b3a6cfc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,7 +31,6 @@
coroutines 'enable'
}
}
- buildToolsVersion '30.0.3'
}
dependencies {
@@ -81,4 +80,6 @@
implementation 'io.github.youth5201314:banner:2.2.2'
//WebView
implementation 'com.just.agentweb:agentweb-androidx:4.1.4'
+ //日期选择器
+ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f9514b2..45a9414 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -40,8 +40,10 @@
-
-
+
+
+
+
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
new file mode 100644
index 0000000..d3584c4
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
@@ -0,0 +1,13 @@
+package com.casic.qd.smartwell.extensions
+
+/**
+ * ArrayList扩展方法
+ */
+
+fun addAll(vararg args: String): ArrayList {
+ val result = ArrayList()
+ args.forEach {
+ result.add(it)
+ }
+ return result
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
new file mode 100644
index 0000000..7f68e3b
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
@@ -0,0 +1,21 @@
+package com.casic.qd.smartwell.extensions
+
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.*
+
+fun Long.timestampToTime(): String =
+ SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(Date(this))
+
+fun Long.isEarlierThanStart(date: String): Boolean {
+ if (date.isBlank()) {
+ return false
+ }
+ val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA)
+ try {
+ return this < dateFormat.parse(date)!!.time
+ } catch (e: ParseException) {
+
+ }
+ return true
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
new file mode 100644
index 0000000..3802496
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
@@ -0,0 +1,18 @@
+package com.casic.qd.smartwell.model
+
+class AlarmContentModel {
+ var code = 0
+ var data: DataBean? = null
+ var message: String? = null
+
+ class DataBean {
+ var list: List? = null
+
+ class ListBean {
+ var deviceType: String? = null
+ var alarmType: String? = null
+ var name: String? = null
+ var value: String? = null
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
new file mode 100644
index 0000000..ba9a6c7
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
@@ -0,0 +1,14 @@
+package com.casic.qd.smartwell.model
+
+class AlarmTypeModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var name: String? = null
+ var id: String? = null
+ var value: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
new file mode 100644
index 0000000..8761adf
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
@@ -0,0 +1,25 @@
+package com.casic.qd.smartwell.model
+
+class AreaModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var id: String? = null
+ var isSync: String? = null
+ var lat: String? = null
+ var level = 0
+ var levelName: String? = null
+ var lng: String? = null
+ var name: String? = null
+ var num = 0
+ var pName: String? = null
+ var pid: String? = null
+ var pids: String? = null
+ var simplename: String? = null
+ var targetIdSync: String? = null
+ var targetPidSync: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
index d73ecc1..ec902a8 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
@@ -12,6 +12,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L
val HOME_ICONS = arrayOf(
R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics,
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
index 15c30fc..7081e2c 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
@@ -85,4 +85,42 @@
@Field("jobStatus") jobStatus: String,
@Field("handleMessage") handleMessage: String
): String
+
+ /**
+ * 获取告警类型
+ */
+ @GET("/dict/code/alarmType")
+ suspend fun obtainAlarmType(@Header("token") token: String): String
+
+ /**
+ * 根据类型获取告警内容
+ */
+ @GET("/alarm/contentType")
+ suspend fun obtainAlarmContent(
+ @Header("token") token: String,
+ @Query("alarmType") alarmType: String
+ ): String
+
+ /**
+ * 获取区域
+ */
+ @GET("/device/getAreas")
+ suspend fun obtainArea(@Header("token") token: String): String
+
+ /**
+ * 查询告警
+ * */
+ @GET("/alarm/list")
+ suspend fun obtainSearchResult(
+ @Header("token") token: String,
+ @Query("keywords") keywords: String?,
+ @Query("alarmType") alarmType: String?,
+ @Query("areaId") areaId: String?,
+ @Query("alarmContentType") alarmContentType: String?,
+ @Query("beginTime") beginTime: String?,
+ @Query("endTime") endTime: String?,
+ @Query("status") status: String?,
+ @Query("offset") offset: Int,
+ @Query("limit") limit: Int
+ ): String
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
index a6f4726..9190ef1 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
@@ -81,4 +81,52 @@
): String {
return api.obtainOperationResult(AuthenticationHelper.token!!, id, jobStatus, handleMessage)
}
+
+ /**
+ * 获取告警类型
+ */
+ suspend fun obtainAlarmType(): String {
+ return api.obtainAlarmType(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 根据类型获取告警内容
+ */
+ suspend fun obtainAlarmContent(type: String): String {
+ return api.obtainAlarmContent(AuthenticationHelper.token!!, type)
+ }
+
+ /**
+ * 获取区域
+ */
+ suspend fun obtainArea(): String {
+ return api.obtainArea(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 查询告警
+ */
+ suspend fun obtainSearchResult(
+ keywords: String?,
+ alarmType: String?,
+ areaId: String?,
+ alarmContentType: String?,
+ beginTime: String?,
+ endTime: String?,
+ status: String?,
+ page: Int
+ ): String {
+ return api.obtainSearchResult(
+ AuthenticationHelper.token!!,
+ keywords,
+ alarmType,
+ areaId,
+ alarmContentType,
+ beginTime,
+ endTime,
+ status,
+ page,
+ Constant.PAGE_LIMIT
+ )
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
index b0debb7..8fcd142 100644
--- a/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
@@ -118,6 +118,10 @@
}
}
})
+
+ rightOptionView.setOnClickListener {
+ this.navigatePageTo(SearchAlarmActivity::class.java)
+ }
}
private fun obtainAlarmList(pageIndex: Int) {
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt
new file mode 100644
index 0000000..aef4154
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt
@@ -0,0 +1,168 @@
+package com.casic.qd.smartwell.view
+
+import android.view.View
+import androidx.lifecycle.ViewModelProvider
+import com.casic.qd.smartwell.R
+import com.casic.qd.smartwell.base.BaseActivity
+import com.casic.qd.smartwell.extensions.*
+import com.casic.qd.smartwell.model.AreaModel
+import com.casic.qd.smartwell.utils.Constant
+import com.casic.qd.smartwell.vm.AlarmContentViewModel
+import com.casic.qd.smartwell.vm.AlarmTypeViewModel
+import com.casic.qd.smartwell.vm.AreaViewModel
+import com.jzxiang.pickerview.TimePickerDialog
+import com.jzxiang.pickerview.data.Type
+import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet.BottomListSheetBuilder
+import kotlinx.android.synthetic.main.activity_alarm_search.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SearchAlarmActivity : BaseActivity() {
+
+ private val kTag = "SearchAlarmActivity"
+ private lateinit var alarmTypeViewModel: AlarmTypeViewModel
+ private lateinit var alarmContentViewModel: AlarmContentViewModel
+ private lateinit var areaViewModel: AreaViewModel
+ private var alarmType = ""
+ private var alarmContent = ""
+ private var firstLevelArea: MutableList = ArrayList()
+ private var secondLevelArea: MutableList = ArrayList()
+ private var thirdLevelArea: MutableList = ArrayList()
+ private var areaModels: MutableList = ArrayList()
+
+ override fun initLayoutView(): Int = R.layout.activity_alarm_search
+
+ override fun setupTopBarLayout() {
+ titleView.text = "告警查询"
+ leftBackView.visibility = View.GONE
+ }
+
+ override fun initData() {
+ //告警类型
+ alarmTypeViewModel = ViewModelProvider(this).get(AlarmTypeViewModel::class.java)
+ //告警内容
+ alarmContentViewModel = ViewModelProvider(this).get(AlarmContentViewModel::class.java)
+ //区域
+ areaViewModel = ViewModelProvider(this).get(AreaViewModel::class.java)
+ }
+
+ override fun initEvent() {
+ selectTypeView.setOnClickListener {
+ alarmTypeViewModel.obtainAlarmType()
+ }
+ alarmTypeViewModel.typeModel.observe(this, {
+ if (it.code == 200) {
+ val sheetBuilder = BottomListSheetBuilder(this)
+ sheetBuilder.setTitle("告警类型")
+ it.data?.forEach { dataBean ->
+ sheetBuilder.addItem(dataBean.name)
+ }
+ sheetBuilder.setGravityCenter(true)
+ .setOnSheetItemClickListener { dialog, itemView, position, tag ->
+ alarmTypeView.text = tag
+ alarmType = it.data!![position].value.toString()
+
+ //告警类型变了之后需要清空告警内容
+ alarmContentView.text = ""
+ dialog.dismiss()
+ }.build().show()
+ }
+ })
+
+ selectContentView.setOnClickListener {
+ //获取类型对应的报警内容
+ alarmContentViewModel.obtainAlarmContent(alarmType)
+ }
+ alarmContentViewModel.contentModel.observe(this, {
+ if (it.code == 200) {
+ val sheetBuilder = BottomListSheetBuilder(this)
+ sheetBuilder.setTitle("告警内容")
+ it.data?.list?.forEach { dataBean ->
+ sheetBuilder.addItem(dataBean.name)
+ }
+ sheetBuilder.setGravityCenter(true)
+ .setOnSheetItemClickListener { dialog, itemView, position, tag ->
+ alarmContentView.text = tag
+ alarmContent = it.data!!.list!![position].value.toString()
+
+ dialog.dismiss()
+ }.build().show()
+ }
+ })
+
+ //地区三级联动
+ selectAreaView.setOnClickListener {
+ areaViewModel.obtainArea()
+ }
+ areaViewModel.areaModel.observe(this, {
+ if (it.code == 200) {
+ it.data?.forEach { dataBean ->
+ when (dataBean.level) {
+ 2 -> firstLevelArea.add(dataBean)
+ 3 -> secondLevelArea.add(dataBean)
+ 4 -> thirdLevelArea.add(dataBean)
+ }
+ }
+ //TODO 绑定区域
+// Log.d(kTag, Gson().toJson(firstLevelArea))
+// Log.d(kTag, Gson().toJson(secondLevelArea))
+// Log.d(kTag, Gson().toJson(thirdLevelArea))
+ }
+ })
+
+ startTimeView.setOnClickListener {
+ TimePickerDialog.Builder()
+ .setThemeColor(R.color.mainThemeColor.convertColor())
+ .setTitleStringId("请选择开始时间")
+ .setWheelItemTextSize(16)
+ .setCyclic(false)
+ .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS)
+ .setMaxMillseconds(System.currentTimeMillis())
+ .setType(Type.ALL)
+ .setCallBack { _: TimePickerDialog?, millSeconds: Long ->
+ startTimeView.text = millSeconds.timestampToTime()
+ }.build().show(supportFragmentManager, "all")
+ }
+
+ endTimeView.setOnClickListener {
+ TimePickerDialog.Builder()
+ .setThemeColor(R.color.mainThemeColor.convertColor())
+ .setTitleStringId("请选择结束时间")
+ .setWheelItemTextSize(16)
+ .setCyclic(false)
+ .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS)
+ .setMaxMillseconds(System.currentTimeMillis())
+ .setType(Type.ALL)
+ .setCallBack { _: TimePickerDialog?, millSeconds: Long ->
+ if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) {
+ "结束时间不合法,不能早于开始时间".show()
+ return@setCallBack
+ }
+ endTimeView.text = millSeconds.timestampToTime()
+ }.build().show(supportFragmentManager, "all")
+ }
+
+ searchButton.setChangeAlphaWhenPress(true)
+ searchButton.setOnClickListener {
+ //页面跳转,将查询参数传过去
+ //TODO areaId待定
+ navigatePageTo(
+ SearchResultActivity::class.java, addAll(
+ wellCodeView.text.toString().trim(),
+ alarmType,
+ "",
+ alarmContent,
+ startTimeView.text.toString(),
+ endTimeView.text.toString()
+ )
+ )
+ }
+
+ clearButton.setChangeAlphaWhenPress(true)
+ clearButton.setOnClickListener {
+ alarmTypeView.text = ""
+ alarmContentView.text = ""
+ startTimeView.text = ""
+ endTimeView.text = ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt
new file mode 100644
index 0000000..32d0a3a
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt
@@ -0,0 +1,223 @@
+package com.casic.qd.smartwell.view
+
+import android.annotation.SuppressLint
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.os.Handler
+import android.os.Looper
+import android.os.Message
+import android.view.View
+import androidx.lifecycle.ViewModelProvider
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.casic.qd.smartwell.R
+import com.casic.qd.smartwell.adapter.AlarmListAdapter
+import com.casic.qd.smartwell.base.BaseActivity
+import com.casic.qd.smartwell.extensions.navigatePageTo
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.showEmptyPage
+import com.casic.qd.smartwell.model.AlarmListModel
+import com.casic.qd.smartwell.utils.BroadcastReceiverManager
+import com.casic.qd.smartwell.utils.Constant
+import com.casic.qd.smartwell.utils.DialogHelper
+import com.casic.qd.smartwell.utils.LoadState
+import com.casic.qd.smartwell.vm.CancelAlarmViewModel
+import com.casic.qd.smartwell.vm.SearchAlarmViewModel
+import com.casic.qd.smartwell.widgets.CancelAlarmDialog
+import kotlinx.android.synthetic.main.activity_alarm_search_result.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_empty_view.*
+import java.lang.ref.WeakReference
+
+class SearchResultActivity : BaseActivity() {
+ private lateinit var weakReferenceHandler: WeakReferenceHandler
+ private lateinit var searchAlarmViewModel: SearchAlarmViewModel
+ private lateinit var cancelAlarmViewModel: CancelAlarmViewModel
+ private lateinit var args: ArrayList
+ private lateinit var alarmListAdapter: AlarmListAdapter
+ private var dataBeans: MutableList = ArrayList()
+ private var pageIndex = 1
+ private var isRefresh = false
+ private var isLoadMore = false
+
+ override fun initLayoutView(): Int = R.layout.activity_alarm_search_result
+
+ override fun setupTopBarLayout() {
+ titleView.text = "查询结果"
+ leftBackView.visibility = View.GONE
+ }
+
+ override fun initData() {
+ args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!!
+ weakReferenceHandler = WeakReferenceHandler(this)
+ searchAlarmViewModel = ViewModelProvider(this).get(SearchAlarmViewModel::class.java)
+ cancelAlarmViewModel = ViewModelProvider(this).get(CancelAlarmViewModel::class.java)
+ //注册广播接收者
+ BroadcastReceiverManager.instance.addAction(Constant.CANCEL_ALARM_ACTION,
+ object : BroadcastReceiver() {
+ override fun onReceive(context: Context?, intent: Intent?) {
+ //收到广播相当于做了一次列表刷新
+ isRefresh = true
+ pageIndex = 1
+ obtainSearchResult(args, pageIndex)
+ }
+ })
+ }
+
+ override fun initEvent() {
+ obtainSearchResult(args, pageIndex)
+ searchAlarmViewModel.listModel.observe(this, {
+ if (it.code == 200) {
+ val dataRows = it.data?.rows
+ when {
+ isRefresh -> {
+ dataBeans.clear()
+ dataBeans = dataRows!!
+ resultRefreshLayout.finishRefresh()
+ isRefresh = false
+ }
+ isLoadMore -> {
+ if (dataRows?.size == 0) {
+ "到底了,别拉了".show()
+ }
+ dataBeans.addAll(dataRows!!)
+ resultRefreshLayout.finishLoadMore()
+ isLoadMore = false
+ }
+ else -> {
+ dataBeans = dataRows!!
+ }
+ }
+ weakReferenceHandler.sendEmptyMessage(2022041501)
+ }
+ })
+ searchAlarmViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "数据加载中,请稍后")
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+ resultRefreshLayout.setOnRefreshListener {
+ isRefresh = true
+ //刷新之后页码重置
+ pageIndex = 1
+ obtainSearchResult(args, pageIndex)
+ }
+ resultRefreshLayout.setOnLoadMoreListener {
+ isLoadMore = true
+ pageIndex++
+ obtainSearchResult(args, pageIndex)
+ }
+
+ //消警状态处理
+ cancelAlarmViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "处理中,请稍后")
+ }
+ is LoadState.Success -> {
+ DialogHelper.dismissLoadingDialog()
+ //刷新列表
+ BroadcastReceiverManager.instance.sendBroadcast(
+ Constant.CANCEL_ALARM_ACTION, ""
+ )
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+ }
+
+ private fun obtainSearchResult(args: ArrayList, pageIndex: Int) {
+ searchAlarmViewModel.obtainSearchResult(
+ args[0], args[1], args[2], args[3], args[4], args[5], "1", pageIndex
+ )
+ }
+
+ private class WeakReferenceHandler(activity: SearchResultActivity) :
+ Handler(Looper.getMainLooper()) {
+ private val reference: WeakReference = WeakReference(activity)
+
+ @SuppressLint("NotifyDataSetChanged")
+ override fun handleMessage(msg: Message) {
+ super.handleMessage(msg)
+ val activity = reference.get()!!
+ if (msg.what == 2022041501) {
+ if (activity.isRefresh || activity.isLoadMore) {
+ activity.alarmListAdapter.notifyDataSetChanged()
+ } else { //首次加载数据
+ if (activity.dataBeans.size == 0) {
+ activity.emptyView!!.showEmptyPage {
+ activity.obtainSearchResult(activity.args, activity.pageIndex)
+ }
+ } else {
+ activity.emptyView!!.hide()
+ activity.alarmListAdapter = AlarmListAdapter(activity, activity.dataBeans)
+ activity.resultRecyclerView!!.layoutManager = LinearLayoutManager(activity)
+ activity.resultRecyclerView!!.adapter = activity.alarmListAdapter
+ activity.alarmListAdapter.setOnItemClickListener(object :
+ AlarmListAdapter.OnItemClickListener {
+ override fun onClicked(position: Int) {
+ val wellId = activity.dataBeans[position].wellId.toString()
+ if (wellId.isBlank()) {
+ "井编号异常,无法查看详情".show()
+ return
+ }
+ activity.navigatePageTo(WellDetailActivity::class.java, wellId)
+ }
+
+ override fun onOperationClicked(position: Int) {
+ val wellDetail = activity.dataBeans[position]
+ CancelAlarmDialog.Builder()
+ .setContext(activity)
+ .setTitle("取消告警")
+ .setHintMessage("请输入详细的告警取消原因")
+ .setNegativeButton("取消")
+ .setPositiveButton("确定")
+ .setOnDialogButtonClickListener(object :
+ CancelAlarmDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick(
+ spinnerValue: String, inputValue: String
+ ) {
+ /**
+ * http://111.198.10.15:20104/alarm/cancelAlarm?id=&jobStatus=3&handleMessage=2fsdf
+ * POST
+ * */
+ val id = wellDetail.jobId
+ if (id.toString().isBlank()) {
+ "操作失败,告警ID异常".show()
+ return
+ }
+ val jobStatus = when (spinnerValue) {
+ "已处理" -> "3"
+ "无需处理" -> "4"
+ else -> ""
+ }
+ activity.cancelAlarmViewModel.obtainOperationResult(
+ id!!, jobStatus, inputValue
+ )
+ }
+
+ override fun onCancelClick() {
+
+ }
+ }).build().show()
+ }
+ })
+ }
+ }
+ }
+ }
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ //解注册广播接收者,防止内存泄漏
+ BroadcastReceiverManager.instance.destroy(Constant.CANCEL_ALARM_ACTION)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AlarmContentViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmContentViewModel.kt
new file mode 100644
index 0000000..8c1d4e3
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmContentViewModel.kt
@@ -0,0 +1,32 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AlarmContentModel
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class AlarmContentViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val contentModel = MutableLiveData()
+
+ fun obtainAlarmContent(type: String) = launch({
+ val response = RetrofitServiceManager.obtainAlarmContent(type)
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ contentModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ response.toErrorMessage().show()
+ }
+ }, {
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index c86566b..b3a6cfc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,7 +31,6 @@
coroutines 'enable'
}
}
- buildToolsVersion '30.0.3'
}
dependencies {
@@ -81,4 +80,6 @@
implementation 'io.github.youth5201314:banner:2.2.2'
//WebView
implementation 'com.just.agentweb:agentweb-androidx:4.1.4'
+ //日期选择器
+ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f9514b2..45a9414 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -40,8 +40,10 @@
-
-
+
+
+
+
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
new file mode 100644
index 0000000..d3584c4
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
@@ -0,0 +1,13 @@
+package com.casic.qd.smartwell.extensions
+
+/**
+ * ArrayList扩展方法
+ */
+
+fun addAll(vararg args: String): ArrayList {
+ val result = ArrayList()
+ args.forEach {
+ result.add(it)
+ }
+ return result
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
new file mode 100644
index 0000000..7f68e3b
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
@@ -0,0 +1,21 @@
+package com.casic.qd.smartwell.extensions
+
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.*
+
+fun Long.timestampToTime(): String =
+ SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(Date(this))
+
+fun Long.isEarlierThanStart(date: String): Boolean {
+ if (date.isBlank()) {
+ return false
+ }
+ val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA)
+ try {
+ return this < dateFormat.parse(date)!!.time
+ } catch (e: ParseException) {
+
+ }
+ return true
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
new file mode 100644
index 0000000..3802496
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
@@ -0,0 +1,18 @@
+package com.casic.qd.smartwell.model
+
+class AlarmContentModel {
+ var code = 0
+ var data: DataBean? = null
+ var message: String? = null
+
+ class DataBean {
+ var list: List? = null
+
+ class ListBean {
+ var deviceType: String? = null
+ var alarmType: String? = null
+ var name: String? = null
+ var value: String? = null
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
new file mode 100644
index 0000000..ba9a6c7
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
@@ -0,0 +1,14 @@
+package com.casic.qd.smartwell.model
+
+class AlarmTypeModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var name: String? = null
+ var id: String? = null
+ var value: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
new file mode 100644
index 0000000..8761adf
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
@@ -0,0 +1,25 @@
+package com.casic.qd.smartwell.model
+
+class AreaModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var id: String? = null
+ var isSync: String? = null
+ var lat: String? = null
+ var level = 0
+ var levelName: String? = null
+ var lng: String? = null
+ var name: String? = null
+ var num = 0
+ var pName: String? = null
+ var pid: String? = null
+ var pids: String? = null
+ var simplename: String? = null
+ var targetIdSync: String? = null
+ var targetPidSync: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
index d73ecc1..ec902a8 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
@@ -12,6 +12,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L
val HOME_ICONS = arrayOf(
R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics,
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
index 15c30fc..7081e2c 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
@@ -85,4 +85,42 @@
@Field("jobStatus") jobStatus: String,
@Field("handleMessage") handleMessage: String
): String
+
+ /**
+ * 获取告警类型
+ */
+ @GET("/dict/code/alarmType")
+ suspend fun obtainAlarmType(@Header("token") token: String): String
+
+ /**
+ * 根据类型获取告警内容
+ */
+ @GET("/alarm/contentType")
+ suspend fun obtainAlarmContent(
+ @Header("token") token: String,
+ @Query("alarmType") alarmType: String
+ ): String
+
+ /**
+ * 获取区域
+ */
+ @GET("/device/getAreas")
+ suspend fun obtainArea(@Header("token") token: String): String
+
+ /**
+ * 查询告警
+ * */
+ @GET("/alarm/list")
+ suspend fun obtainSearchResult(
+ @Header("token") token: String,
+ @Query("keywords") keywords: String?,
+ @Query("alarmType") alarmType: String?,
+ @Query("areaId") areaId: String?,
+ @Query("alarmContentType") alarmContentType: String?,
+ @Query("beginTime") beginTime: String?,
+ @Query("endTime") endTime: String?,
+ @Query("status") status: String?,
+ @Query("offset") offset: Int,
+ @Query("limit") limit: Int
+ ): String
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
index a6f4726..9190ef1 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
@@ -81,4 +81,52 @@
): String {
return api.obtainOperationResult(AuthenticationHelper.token!!, id, jobStatus, handleMessage)
}
+
+ /**
+ * 获取告警类型
+ */
+ suspend fun obtainAlarmType(): String {
+ return api.obtainAlarmType(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 根据类型获取告警内容
+ */
+ suspend fun obtainAlarmContent(type: String): String {
+ return api.obtainAlarmContent(AuthenticationHelper.token!!, type)
+ }
+
+ /**
+ * 获取区域
+ */
+ suspend fun obtainArea(): String {
+ return api.obtainArea(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 查询告警
+ */
+ suspend fun obtainSearchResult(
+ keywords: String?,
+ alarmType: String?,
+ areaId: String?,
+ alarmContentType: String?,
+ beginTime: String?,
+ endTime: String?,
+ status: String?,
+ page: Int
+ ): String {
+ return api.obtainSearchResult(
+ AuthenticationHelper.token!!,
+ keywords,
+ alarmType,
+ areaId,
+ alarmContentType,
+ beginTime,
+ endTime,
+ status,
+ page,
+ Constant.PAGE_LIMIT
+ )
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
index b0debb7..8fcd142 100644
--- a/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
@@ -118,6 +118,10 @@
}
}
})
+
+ rightOptionView.setOnClickListener {
+ this.navigatePageTo(SearchAlarmActivity::class.java)
+ }
}
private fun obtainAlarmList(pageIndex: Int) {
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt
new file mode 100644
index 0000000..aef4154
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt
@@ -0,0 +1,168 @@
+package com.casic.qd.smartwell.view
+
+import android.view.View
+import androidx.lifecycle.ViewModelProvider
+import com.casic.qd.smartwell.R
+import com.casic.qd.smartwell.base.BaseActivity
+import com.casic.qd.smartwell.extensions.*
+import com.casic.qd.smartwell.model.AreaModel
+import com.casic.qd.smartwell.utils.Constant
+import com.casic.qd.smartwell.vm.AlarmContentViewModel
+import com.casic.qd.smartwell.vm.AlarmTypeViewModel
+import com.casic.qd.smartwell.vm.AreaViewModel
+import com.jzxiang.pickerview.TimePickerDialog
+import com.jzxiang.pickerview.data.Type
+import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet.BottomListSheetBuilder
+import kotlinx.android.synthetic.main.activity_alarm_search.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SearchAlarmActivity : BaseActivity() {
+
+ private val kTag = "SearchAlarmActivity"
+ private lateinit var alarmTypeViewModel: AlarmTypeViewModel
+ private lateinit var alarmContentViewModel: AlarmContentViewModel
+ private lateinit var areaViewModel: AreaViewModel
+ private var alarmType = ""
+ private var alarmContent = ""
+ private var firstLevelArea: MutableList = ArrayList()
+ private var secondLevelArea: MutableList = ArrayList()
+ private var thirdLevelArea: MutableList = ArrayList()
+ private var areaModels: MutableList = ArrayList()
+
+ override fun initLayoutView(): Int = R.layout.activity_alarm_search
+
+ override fun setupTopBarLayout() {
+ titleView.text = "告警查询"
+ leftBackView.visibility = View.GONE
+ }
+
+ override fun initData() {
+ //告警类型
+ alarmTypeViewModel = ViewModelProvider(this).get(AlarmTypeViewModel::class.java)
+ //告警内容
+ alarmContentViewModel = ViewModelProvider(this).get(AlarmContentViewModel::class.java)
+ //区域
+ areaViewModel = ViewModelProvider(this).get(AreaViewModel::class.java)
+ }
+
+ override fun initEvent() {
+ selectTypeView.setOnClickListener {
+ alarmTypeViewModel.obtainAlarmType()
+ }
+ alarmTypeViewModel.typeModel.observe(this, {
+ if (it.code == 200) {
+ val sheetBuilder = BottomListSheetBuilder(this)
+ sheetBuilder.setTitle("告警类型")
+ it.data?.forEach { dataBean ->
+ sheetBuilder.addItem(dataBean.name)
+ }
+ sheetBuilder.setGravityCenter(true)
+ .setOnSheetItemClickListener { dialog, itemView, position, tag ->
+ alarmTypeView.text = tag
+ alarmType = it.data!![position].value.toString()
+
+ //告警类型变了之后需要清空告警内容
+ alarmContentView.text = ""
+ dialog.dismiss()
+ }.build().show()
+ }
+ })
+
+ selectContentView.setOnClickListener {
+ //获取类型对应的报警内容
+ alarmContentViewModel.obtainAlarmContent(alarmType)
+ }
+ alarmContentViewModel.contentModel.observe(this, {
+ if (it.code == 200) {
+ val sheetBuilder = BottomListSheetBuilder(this)
+ sheetBuilder.setTitle("告警内容")
+ it.data?.list?.forEach { dataBean ->
+ sheetBuilder.addItem(dataBean.name)
+ }
+ sheetBuilder.setGravityCenter(true)
+ .setOnSheetItemClickListener { dialog, itemView, position, tag ->
+ alarmContentView.text = tag
+ alarmContent = it.data!!.list!![position].value.toString()
+
+ dialog.dismiss()
+ }.build().show()
+ }
+ })
+
+ //地区三级联动
+ selectAreaView.setOnClickListener {
+ areaViewModel.obtainArea()
+ }
+ areaViewModel.areaModel.observe(this, {
+ if (it.code == 200) {
+ it.data?.forEach { dataBean ->
+ when (dataBean.level) {
+ 2 -> firstLevelArea.add(dataBean)
+ 3 -> secondLevelArea.add(dataBean)
+ 4 -> thirdLevelArea.add(dataBean)
+ }
+ }
+ //TODO 绑定区域
+// Log.d(kTag, Gson().toJson(firstLevelArea))
+// Log.d(kTag, Gson().toJson(secondLevelArea))
+// Log.d(kTag, Gson().toJson(thirdLevelArea))
+ }
+ })
+
+ startTimeView.setOnClickListener {
+ TimePickerDialog.Builder()
+ .setThemeColor(R.color.mainThemeColor.convertColor())
+ .setTitleStringId("请选择开始时间")
+ .setWheelItemTextSize(16)
+ .setCyclic(false)
+ .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS)
+ .setMaxMillseconds(System.currentTimeMillis())
+ .setType(Type.ALL)
+ .setCallBack { _: TimePickerDialog?, millSeconds: Long ->
+ startTimeView.text = millSeconds.timestampToTime()
+ }.build().show(supportFragmentManager, "all")
+ }
+
+ endTimeView.setOnClickListener {
+ TimePickerDialog.Builder()
+ .setThemeColor(R.color.mainThemeColor.convertColor())
+ .setTitleStringId("请选择结束时间")
+ .setWheelItemTextSize(16)
+ .setCyclic(false)
+ .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS)
+ .setMaxMillseconds(System.currentTimeMillis())
+ .setType(Type.ALL)
+ .setCallBack { _: TimePickerDialog?, millSeconds: Long ->
+ if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) {
+ "结束时间不合法,不能早于开始时间".show()
+ return@setCallBack
+ }
+ endTimeView.text = millSeconds.timestampToTime()
+ }.build().show(supportFragmentManager, "all")
+ }
+
+ searchButton.setChangeAlphaWhenPress(true)
+ searchButton.setOnClickListener {
+ //页面跳转,将查询参数传过去
+ //TODO areaId待定
+ navigatePageTo(
+ SearchResultActivity::class.java, addAll(
+ wellCodeView.text.toString().trim(),
+ alarmType,
+ "",
+ alarmContent,
+ startTimeView.text.toString(),
+ endTimeView.text.toString()
+ )
+ )
+ }
+
+ clearButton.setChangeAlphaWhenPress(true)
+ clearButton.setOnClickListener {
+ alarmTypeView.text = ""
+ alarmContentView.text = ""
+ startTimeView.text = ""
+ endTimeView.text = ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt
new file mode 100644
index 0000000..32d0a3a
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt
@@ -0,0 +1,223 @@
+package com.casic.qd.smartwell.view
+
+import android.annotation.SuppressLint
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.os.Handler
+import android.os.Looper
+import android.os.Message
+import android.view.View
+import androidx.lifecycle.ViewModelProvider
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.casic.qd.smartwell.R
+import com.casic.qd.smartwell.adapter.AlarmListAdapter
+import com.casic.qd.smartwell.base.BaseActivity
+import com.casic.qd.smartwell.extensions.navigatePageTo
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.showEmptyPage
+import com.casic.qd.smartwell.model.AlarmListModel
+import com.casic.qd.smartwell.utils.BroadcastReceiverManager
+import com.casic.qd.smartwell.utils.Constant
+import com.casic.qd.smartwell.utils.DialogHelper
+import com.casic.qd.smartwell.utils.LoadState
+import com.casic.qd.smartwell.vm.CancelAlarmViewModel
+import com.casic.qd.smartwell.vm.SearchAlarmViewModel
+import com.casic.qd.smartwell.widgets.CancelAlarmDialog
+import kotlinx.android.synthetic.main.activity_alarm_search_result.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_empty_view.*
+import java.lang.ref.WeakReference
+
+class SearchResultActivity : BaseActivity() {
+ private lateinit var weakReferenceHandler: WeakReferenceHandler
+ private lateinit var searchAlarmViewModel: SearchAlarmViewModel
+ private lateinit var cancelAlarmViewModel: CancelAlarmViewModel
+ private lateinit var args: ArrayList
+ private lateinit var alarmListAdapter: AlarmListAdapter
+ private var dataBeans: MutableList = ArrayList()
+ private var pageIndex = 1
+ private var isRefresh = false
+ private var isLoadMore = false
+
+ override fun initLayoutView(): Int = R.layout.activity_alarm_search_result
+
+ override fun setupTopBarLayout() {
+ titleView.text = "查询结果"
+ leftBackView.visibility = View.GONE
+ }
+
+ override fun initData() {
+ args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!!
+ weakReferenceHandler = WeakReferenceHandler(this)
+ searchAlarmViewModel = ViewModelProvider(this).get(SearchAlarmViewModel::class.java)
+ cancelAlarmViewModel = ViewModelProvider(this).get(CancelAlarmViewModel::class.java)
+ //注册广播接收者
+ BroadcastReceiverManager.instance.addAction(Constant.CANCEL_ALARM_ACTION,
+ object : BroadcastReceiver() {
+ override fun onReceive(context: Context?, intent: Intent?) {
+ //收到广播相当于做了一次列表刷新
+ isRefresh = true
+ pageIndex = 1
+ obtainSearchResult(args, pageIndex)
+ }
+ })
+ }
+
+ override fun initEvent() {
+ obtainSearchResult(args, pageIndex)
+ searchAlarmViewModel.listModel.observe(this, {
+ if (it.code == 200) {
+ val dataRows = it.data?.rows
+ when {
+ isRefresh -> {
+ dataBeans.clear()
+ dataBeans = dataRows!!
+ resultRefreshLayout.finishRefresh()
+ isRefresh = false
+ }
+ isLoadMore -> {
+ if (dataRows?.size == 0) {
+ "到底了,别拉了".show()
+ }
+ dataBeans.addAll(dataRows!!)
+ resultRefreshLayout.finishLoadMore()
+ isLoadMore = false
+ }
+ else -> {
+ dataBeans = dataRows!!
+ }
+ }
+ weakReferenceHandler.sendEmptyMessage(2022041501)
+ }
+ })
+ searchAlarmViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "数据加载中,请稍后")
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+ resultRefreshLayout.setOnRefreshListener {
+ isRefresh = true
+ //刷新之后页码重置
+ pageIndex = 1
+ obtainSearchResult(args, pageIndex)
+ }
+ resultRefreshLayout.setOnLoadMoreListener {
+ isLoadMore = true
+ pageIndex++
+ obtainSearchResult(args, pageIndex)
+ }
+
+ //消警状态处理
+ cancelAlarmViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "处理中,请稍后")
+ }
+ is LoadState.Success -> {
+ DialogHelper.dismissLoadingDialog()
+ //刷新列表
+ BroadcastReceiverManager.instance.sendBroadcast(
+ Constant.CANCEL_ALARM_ACTION, ""
+ )
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+ }
+
+ private fun obtainSearchResult(args: ArrayList, pageIndex: Int) {
+ searchAlarmViewModel.obtainSearchResult(
+ args[0], args[1], args[2], args[3], args[4], args[5], "1", pageIndex
+ )
+ }
+
+ private class WeakReferenceHandler(activity: SearchResultActivity) :
+ Handler(Looper.getMainLooper()) {
+ private val reference: WeakReference = WeakReference(activity)
+
+ @SuppressLint("NotifyDataSetChanged")
+ override fun handleMessage(msg: Message) {
+ super.handleMessage(msg)
+ val activity = reference.get()!!
+ if (msg.what == 2022041501) {
+ if (activity.isRefresh || activity.isLoadMore) {
+ activity.alarmListAdapter.notifyDataSetChanged()
+ } else { //首次加载数据
+ if (activity.dataBeans.size == 0) {
+ activity.emptyView!!.showEmptyPage {
+ activity.obtainSearchResult(activity.args, activity.pageIndex)
+ }
+ } else {
+ activity.emptyView!!.hide()
+ activity.alarmListAdapter = AlarmListAdapter(activity, activity.dataBeans)
+ activity.resultRecyclerView!!.layoutManager = LinearLayoutManager(activity)
+ activity.resultRecyclerView!!.adapter = activity.alarmListAdapter
+ activity.alarmListAdapter.setOnItemClickListener(object :
+ AlarmListAdapter.OnItemClickListener {
+ override fun onClicked(position: Int) {
+ val wellId = activity.dataBeans[position].wellId.toString()
+ if (wellId.isBlank()) {
+ "井编号异常,无法查看详情".show()
+ return
+ }
+ activity.navigatePageTo(WellDetailActivity::class.java, wellId)
+ }
+
+ override fun onOperationClicked(position: Int) {
+ val wellDetail = activity.dataBeans[position]
+ CancelAlarmDialog.Builder()
+ .setContext(activity)
+ .setTitle("取消告警")
+ .setHintMessage("请输入详细的告警取消原因")
+ .setNegativeButton("取消")
+ .setPositiveButton("确定")
+ .setOnDialogButtonClickListener(object :
+ CancelAlarmDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick(
+ spinnerValue: String, inputValue: String
+ ) {
+ /**
+ * http://111.198.10.15:20104/alarm/cancelAlarm?id=&jobStatus=3&handleMessage=2fsdf
+ * POST
+ * */
+ val id = wellDetail.jobId
+ if (id.toString().isBlank()) {
+ "操作失败,告警ID异常".show()
+ return
+ }
+ val jobStatus = when (spinnerValue) {
+ "已处理" -> "3"
+ "无需处理" -> "4"
+ else -> ""
+ }
+ activity.cancelAlarmViewModel.obtainOperationResult(
+ id!!, jobStatus, inputValue
+ )
+ }
+
+ override fun onCancelClick() {
+
+ }
+ }).build().show()
+ }
+ })
+ }
+ }
+ }
+ }
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ //解注册广播接收者,防止内存泄漏
+ BroadcastReceiverManager.instance.destroy(Constant.CANCEL_ALARM_ACTION)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AlarmContentViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmContentViewModel.kt
new file mode 100644
index 0000000..8c1d4e3
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmContentViewModel.kt
@@ -0,0 +1,32 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AlarmContentModel
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class AlarmContentViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val contentModel = MutableLiveData()
+
+ fun obtainAlarmContent(type: String) = launch({
+ val response = RetrofitServiceManager.obtainAlarmContent(type)
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ contentModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ response.toErrorMessage().show()
+ }
+ }, {
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AlarmTypeViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmTypeViewModel.kt
new file mode 100644
index 0000000..dcaa579
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmTypeViewModel.kt
@@ -0,0 +1,32 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AlarmTypeModel
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class AlarmTypeViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val typeModel = MutableLiveData()
+
+ fun obtainAlarmType() = launch({
+ val response = RetrofitServiceManager.obtainAlarmType()
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ typeModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ response.toErrorMessage().show()
+ }
+ }, {
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index c86566b..b3a6cfc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,7 +31,6 @@
coroutines 'enable'
}
}
- buildToolsVersion '30.0.3'
}
dependencies {
@@ -81,4 +80,6 @@
implementation 'io.github.youth5201314:banner:2.2.2'
//WebView
implementation 'com.just.agentweb:agentweb-androidx:4.1.4'
+ //日期选择器
+ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f9514b2..45a9414 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -40,8 +40,10 @@
-
-
+
+
+
+
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
new file mode 100644
index 0000000..d3584c4
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
@@ -0,0 +1,13 @@
+package com.casic.qd.smartwell.extensions
+
+/**
+ * ArrayList扩展方法
+ */
+
+fun addAll(vararg args: String): ArrayList {
+ val result = ArrayList()
+ args.forEach {
+ result.add(it)
+ }
+ return result
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
new file mode 100644
index 0000000..7f68e3b
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
@@ -0,0 +1,21 @@
+package com.casic.qd.smartwell.extensions
+
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.*
+
+fun Long.timestampToTime(): String =
+ SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(Date(this))
+
+fun Long.isEarlierThanStart(date: String): Boolean {
+ if (date.isBlank()) {
+ return false
+ }
+ val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA)
+ try {
+ return this < dateFormat.parse(date)!!.time
+ } catch (e: ParseException) {
+
+ }
+ return true
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
new file mode 100644
index 0000000..3802496
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
@@ -0,0 +1,18 @@
+package com.casic.qd.smartwell.model
+
+class AlarmContentModel {
+ var code = 0
+ var data: DataBean? = null
+ var message: String? = null
+
+ class DataBean {
+ var list: List? = null
+
+ class ListBean {
+ var deviceType: String? = null
+ var alarmType: String? = null
+ var name: String? = null
+ var value: String? = null
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
new file mode 100644
index 0000000..ba9a6c7
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
@@ -0,0 +1,14 @@
+package com.casic.qd.smartwell.model
+
+class AlarmTypeModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var name: String? = null
+ var id: String? = null
+ var value: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
new file mode 100644
index 0000000..8761adf
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
@@ -0,0 +1,25 @@
+package com.casic.qd.smartwell.model
+
+class AreaModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var id: String? = null
+ var isSync: String? = null
+ var lat: String? = null
+ var level = 0
+ var levelName: String? = null
+ var lng: String? = null
+ var name: String? = null
+ var num = 0
+ var pName: String? = null
+ var pid: String? = null
+ var pids: String? = null
+ var simplename: String? = null
+ var targetIdSync: String? = null
+ var targetPidSync: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
index d73ecc1..ec902a8 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
@@ -12,6 +12,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L
val HOME_ICONS = arrayOf(
R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics,
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
index 15c30fc..7081e2c 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
@@ -85,4 +85,42 @@
@Field("jobStatus") jobStatus: String,
@Field("handleMessage") handleMessage: String
): String
+
+ /**
+ * 获取告警类型
+ */
+ @GET("/dict/code/alarmType")
+ suspend fun obtainAlarmType(@Header("token") token: String): String
+
+ /**
+ * 根据类型获取告警内容
+ */
+ @GET("/alarm/contentType")
+ suspend fun obtainAlarmContent(
+ @Header("token") token: String,
+ @Query("alarmType") alarmType: String
+ ): String
+
+ /**
+ * 获取区域
+ */
+ @GET("/device/getAreas")
+ suspend fun obtainArea(@Header("token") token: String): String
+
+ /**
+ * 查询告警
+ * */
+ @GET("/alarm/list")
+ suspend fun obtainSearchResult(
+ @Header("token") token: String,
+ @Query("keywords") keywords: String?,
+ @Query("alarmType") alarmType: String?,
+ @Query("areaId") areaId: String?,
+ @Query("alarmContentType") alarmContentType: String?,
+ @Query("beginTime") beginTime: String?,
+ @Query("endTime") endTime: String?,
+ @Query("status") status: String?,
+ @Query("offset") offset: Int,
+ @Query("limit") limit: Int
+ ): String
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
index a6f4726..9190ef1 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
@@ -81,4 +81,52 @@
): String {
return api.obtainOperationResult(AuthenticationHelper.token!!, id, jobStatus, handleMessage)
}
+
+ /**
+ * 获取告警类型
+ */
+ suspend fun obtainAlarmType(): String {
+ return api.obtainAlarmType(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 根据类型获取告警内容
+ */
+ suspend fun obtainAlarmContent(type: String): String {
+ return api.obtainAlarmContent(AuthenticationHelper.token!!, type)
+ }
+
+ /**
+ * 获取区域
+ */
+ suspend fun obtainArea(): String {
+ return api.obtainArea(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 查询告警
+ */
+ suspend fun obtainSearchResult(
+ keywords: String?,
+ alarmType: String?,
+ areaId: String?,
+ alarmContentType: String?,
+ beginTime: String?,
+ endTime: String?,
+ status: String?,
+ page: Int
+ ): String {
+ return api.obtainSearchResult(
+ AuthenticationHelper.token!!,
+ keywords,
+ alarmType,
+ areaId,
+ alarmContentType,
+ beginTime,
+ endTime,
+ status,
+ page,
+ Constant.PAGE_LIMIT
+ )
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
index b0debb7..8fcd142 100644
--- a/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
@@ -118,6 +118,10 @@
}
}
})
+
+ rightOptionView.setOnClickListener {
+ this.navigatePageTo(SearchAlarmActivity::class.java)
+ }
}
private fun obtainAlarmList(pageIndex: Int) {
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt
new file mode 100644
index 0000000..aef4154
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt
@@ -0,0 +1,168 @@
+package com.casic.qd.smartwell.view
+
+import android.view.View
+import androidx.lifecycle.ViewModelProvider
+import com.casic.qd.smartwell.R
+import com.casic.qd.smartwell.base.BaseActivity
+import com.casic.qd.smartwell.extensions.*
+import com.casic.qd.smartwell.model.AreaModel
+import com.casic.qd.smartwell.utils.Constant
+import com.casic.qd.smartwell.vm.AlarmContentViewModel
+import com.casic.qd.smartwell.vm.AlarmTypeViewModel
+import com.casic.qd.smartwell.vm.AreaViewModel
+import com.jzxiang.pickerview.TimePickerDialog
+import com.jzxiang.pickerview.data.Type
+import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet.BottomListSheetBuilder
+import kotlinx.android.synthetic.main.activity_alarm_search.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SearchAlarmActivity : BaseActivity() {
+
+ private val kTag = "SearchAlarmActivity"
+ private lateinit var alarmTypeViewModel: AlarmTypeViewModel
+ private lateinit var alarmContentViewModel: AlarmContentViewModel
+ private lateinit var areaViewModel: AreaViewModel
+ private var alarmType = ""
+ private var alarmContent = ""
+ private var firstLevelArea: MutableList = ArrayList()
+ private var secondLevelArea: MutableList = ArrayList()
+ private var thirdLevelArea: MutableList = ArrayList()
+ private var areaModels: MutableList = ArrayList()
+
+ override fun initLayoutView(): Int = R.layout.activity_alarm_search
+
+ override fun setupTopBarLayout() {
+ titleView.text = "告警查询"
+ leftBackView.visibility = View.GONE
+ }
+
+ override fun initData() {
+ //告警类型
+ alarmTypeViewModel = ViewModelProvider(this).get(AlarmTypeViewModel::class.java)
+ //告警内容
+ alarmContentViewModel = ViewModelProvider(this).get(AlarmContentViewModel::class.java)
+ //区域
+ areaViewModel = ViewModelProvider(this).get(AreaViewModel::class.java)
+ }
+
+ override fun initEvent() {
+ selectTypeView.setOnClickListener {
+ alarmTypeViewModel.obtainAlarmType()
+ }
+ alarmTypeViewModel.typeModel.observe(this, {
+ if (it.code == 200) {
+ val sheetBuilder = BottomListSheetBuilder(this)
+ sheetBuilder.setTitle("告警类型")
+ it.data?.forEach { dataBean ->
+ sheetBuilder.addItem(dataBean.name)
+ }
+ sheetBuilder.setGravityCenter(true)
+ .setOnSheetItemClickListener { dialog, itemView, position, tag ->
+ alarmTypeView.text = tag
+ alarmType = it.data!![position].value.toString()
+
+ //告警类型变了之后需要清空告警内容
+ alarmContentView.text = ""
+ dialog.dismiss()
+ }.build().show()
+ }
+ })
+
+ selectContentView.setOnClickListener {
+ //获取类型对应的报警内容
+ alarmContentViewModel.obtainAlarmContent(alarmType)
+ }
+ alarmContentViewModel.contentModel.observe(this, {
+ if (it.code == 200) {
+ val sheetBuilder = BottomListSheetBuilder(this)
+ sheetBuilder.setTitle("告警内容")
+ it.data?.list?.forEach { dataBean ->
+ sheetBuilder.addItem(dataBean.name)
+ }
+ sheetBuilder.setGravityCenter(true)
+ .setOnSheetItemClickListener { dialog, itemView, position, tag ->
+ alarmContentView.text = tag
+ alarmContent = it.data!!.list!![position].value.toString()
+
+ dialog.dismiss()
+ }.build().show()
+ }
+ })
+
+ //地区三级联动
+ selectAreaView.setOnClickListener {
+ areaViewModel.obtainArea()
+ }
+ areaViewModel.areaModel.observe(this, {
+ if (it.code == 200) {
+ it.data?.forEach { dataBean ->
+ when (dataBean.level) {
+ 2 -> firstLevelArea.add(dataBean)
+ 3 -> secondLevelArea.add(dataBean)
+ 4 -> thirdLevelArea.add(dataBean)
+ }
+ }
+ //TODO 绑定区域
+// Log.d(kTag, Gson().toJson(firstLevelArea))
+// Log.d(kTag, Gson().toJson(secondLevelArea))
+// Log.d(kTag, Gson().toJson(thirdLevelArea))
+ }
+ })
+
+ startTimeView.setOnClickListener {
+ TimePickerDialog.Builder()
+ .setThemeColor(R.color.mainThemeColor.convertColor())
+ .setTitleStringId("请选择开始时间")
+ .setWheelItemTextSize(16)
+ .setCyclic(false)
+ .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS)
+ .setMaxMillseconds(System.currentTimeMillis())
+ .setType(Type.ALL)
+ .setCallBack { _: TimePickerDialog?, millSeconds: Long ->
+ startTimeView.text = millSeconds.timestampToTime()
+ }.build().show(supportFragmentManager, "all")
+ }
+
+ endTimeView.setOnClickListener {
+ TimePickerDialog.Builder()
+ .setThemeColor(R.color.mainThemeColor.convertColor())
+ .setTitleStringId("请选择结束时间")
+ .setWheelItemTextSize(16)
+ .setCyclic(false)
+ .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS)
+ .setMaxMillseconds(System.currentTimeMillis())
+ .setType(Type.ALL)
+ .setCallBack { _: TimePickerDialog?, millSeconds: Long ->
+ if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) {
+ "结束时间不合法,不能早于开始时间".show()
+ return@setCallBack
+ }
+ endTimeView.text = millSeconds.timestampToTime()
+ }.build().show(supportFragmentManager, "all")
+ }
+
+ searchButton.setChangeAlphaWhenPress(true)
+ searchButton.setOnClickListener {
+ //页面跳转,将查询参数传过去
+ //TODO areaId待定
+ navigatePageTo(
+ SearchResultActivity::class.java, addAll(
+ wellCodeView.text.toString().trim(),
+ alarmType,
+ "",
+ alarmContent,
+ startTimeView.text.toString(),
+ endTimeView.text.toString()
+ )
+ )
+ }
+
+ clearButton.setChangeAlphaWhenPress(true)
+ clearButton.setOnClickListener {
+ alarmTypeView.text = ""
+ alarmContentView.text = ""
+ startTimeView.text = ""
+ endTimeView.text = ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt
new file mode 100644
index 0000000..32d0a3a
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt
@@ -0,0 +1,223 @@
+package com.casic.qd.smartwell.view
+
+import android.annotation.SuppressLint
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.os.Handler
+import android.os.Looper
+import android.os.Message
+import android.view.View
+import androidx.lifecycle.ViewModelProvider
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.casic.qd.smartwell.R
+import com.casic.qd.smartwell.adapter.AlarmListAdapter
+import com.casic.qd.smartwell.base.BaseActivity
+import com.casic.qd.smartwell.extensions.navigatePageTo
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.showEmptyPage
+import com.casic.qd.smartwell.model.AlarmListModel
+import com.casic.qd.smartwell.utils.BroadcastReceiverManager
+import com.casic.qd.smartwell.utils.Constant
+import com.casic.qd.smartwell.utils.DialogHelper
+import com.casic.qd.smartwell.utils.LoadState
+import com.casic.qd.smartwell.vm.CancelAlarmViewModel
+import com.casic.qd.smartwell.vm.SearchAlarmViewModel
+import com.casic.qd.smartwell.widgets.CancelAlarmDialog
+import kotlinx.android.synthetic.main.activity_alarm_search_result.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_empty_view.*
+import java.lang.ref.WeakReference
+
+class SearchResultActivity : BaseActivity() {
+ private lateinit var weakReferenceHandler: WeakReferenceHandler
+ private lateinit var searchAlarmViewModel: SearchAlarmViewModel
+ private lateinit var cancelAlarmViewModel: CancelAlarmViewModel
+ private lateinit var args: ArrayList
+ private lateinit var alarmListAdapter: AlarmListAdapter
+ private var dataBeans: MutableList = ArrayList()
+ private var pageIndex = 1
+ private var isRefresh = false
+ private var isLoadMore = false
+
+ override fun initLayoutView(): Int = R.layout.activity_alarm_search_result
+
+ override fun setupTopBarLayout() {
+ titleView.text = "查询结果"
+ leftBackView.visibility = View.GONE
+ }
+
+ override fun initData() {
+ args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!!
+ weakReferenceHandler = WeakReferenceHandler(this)
+ searchAlarmViewModel = ViewModelProvider(this).get(SearchAlarmViewModel::class.java)
+ cancelAlarmViewModel = ViewModelProvider(this).get(CancelAlarmViewModel::class.java)
+ //注册广播接收者
+ BroadcastReceiverManager.instance.addAction(Constant.CANCEL_ALARM_ACTION,
+ object : BroadcastReceiver() {
+ override fun onReceive(context: Context?, intent: Intent?) {
+ //收到广播相当于做了一次列表刷新
+ isRefresh = true
+ pageIndex = 1
+ obtainSearchResult(args, pageIndex)
+ }
+ })
+ }
+
+ override fun initEvent() {
+ obtainSearchResult(args, pageIndex)
+ searchAlarmViewModel.listModel.observe(this, {
+ if (it.code == 200) {
+ val dataRows = it.data?.rows
+ when {
+ isRefresh -> {
+ dataBeans.clear()
+ dataBeans = dataRows!!
+ resultRefreshLayout.finishRefresh()
+ isRefresh = false
+ }
+ isLoadMore -> {
+ if (dataRows?.size == 0) {
+ "到底了,别拉了".show()
+ }
+ dataBeans.addAll(dataRows!!)
+ resultRefreshLayout.finishLoadMore()
+ isLoadMore = false
+ }
+ else -> {
+ dataBeans = dataRows!!
+ }
+ }
+ weakReferenceHandler.sendEmptyMessage(2022041501)
+ }
+ })
+ searchAlarmViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "数据加载中,请稍后")
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+ resultRefreshLayout.setOnRefreshListener {
+ isRefresh = true
+ //刷新之后页码重置
+ pageIndex = 1
+ obtainSearchResult(args, pageIndex)
+ }
+ resultRefreshLayout.setOnLoadMoreListener {
+ isLoadMore = true
+ pageIndex++
+ obtainSearchResult(args, pageIndex)
+ }
+
+ //消警状态处理
+ cancelAlarmViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "处理中,请稍后")
+ }
+ is LoadState.Success -> {
+ DialogHelper.dismissLoadingDialog()
+ //刷新列表
+ BroadcastReceiverManager.instance.sendBroadcast(
+ Constant.CANCEL_ALARM_ACTION, ""
+ )
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+ }
+
+ private fun obtainSearchResult(args: ArrayList, pageIndex: Int) {
+ searchAlarmViewModel.obtainSearchResult(
+ args[0], args[1], args[2], args[3], args[4], args[5], "1", pageIndex
+ )
+ }
+
+ private class WeakReferenceHandler(activity: SearchResultActivity) :
+ Handler(Looper.getMainLooper()) {
+ private val reference: WeakReference = WeakReference(activity)
+
+ @SuppressLint("NotifyDataSetChanged")
+ override fun handleMessage(msg: Message) {
+ super.handleMessage(msg)
+ val activity = reference.get()!!
+ if (msg.what == 2022041501) {
+ if (activity.isRefresh || activity.isLoadMore) {
+ activity.alarmListAdapter.notifyDataSetChanged()
+ } else { //首次加载数据
+ if (activity.dataBeans.size == 0) {
+ activity.emptyView!!.showEmptyPage {
+ activity.obtainSearchResult(activity.args, activity.pageIndex)
+ }
+ } else {
+ activity.emptyView!!.hide()
+ activity.alarmListAdapter = AlarmListAdapter(activity, activity.dataBeans)
+ activity.resultRecyclerView!!.layoutManager = LinearLayoutManager(activity)
+ activity.resultRecyclerView!!.adapter = activity.alarmListAdapter
+ activity.alarmListAdapter.setOnItemClickListener(object :
+ AlarmListAdapter.OnItemClickListener {
+ override fun onClicked(position: Int) {
+ val wellId = activity.dataBeans[position].wellId.toString()
+ if (wellId.isBlank()) {
+ "井编号异常,无法查看详情".show()
+ return
+ }
+ activity.navigatePageTo(WellDetailActivity::class.java, wellId)
+ }
+
+ override fun onOperationClicked(position: Int) {
+ val wellDetail = activity.dataBeans[position]
+ CancelAlarmDialog.Builder()
+ .setContext(activity)
+ .setTitle("取消告警")
+ .setHintMessage("请输入详细的告警取消原因")
+ .setNegativeButton("取消")
+ .setPositiveButton("确定")
+ .setOnDialogButtonClickListener(object :
+ CancelAlarmDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick(
+ spinnerValue: String, inputValue: String
+ ) {
+ /**
+ * http://111.198.10.15:20104/alarm/cancelAlarm?id=&jobStatus=3&handleMessage=2fsdf
+ * POST
+ * */
+ val id = wellDetail.jobId
+ if (id.toString().isBlank()) {
+ "操作失败,告警ID异常".show()
+ return
+ }
+ val jobStatus = when (spinnerValue) {
+ "已处理" -> "3"
+ "无需处理" -> "4"
+ else -> ""
+ }
+ activity.cancelAlarmViewModel.obtainOperationResult(
+ id!!, jobStatus, inputValue
+ )
+ }
+
+ override fun onCancelClick() {
+
+ }
+ }).build().show()
+ }
+ })
+ }
+ }
+ }
+ }
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ //解注册广播接收者,防止内存泄漏
+ BroadcastReceiverManager.instance.destroy(Constant.CANCEL_ALARM_ACTION)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AlarmContentViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmContentViewModel.kt
new file mode 100644
index 0000000..8c1d4e3
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmContentViewModel.kt
@@ -0,0 +1,32 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AlarmContentModel
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class AlarmContentViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val contentModel = MutableLiveData()
+
+ fun obtainAlarmContent(type: String) = launch({
+ val response = RetrofitServiceManager.obtainAlarmContent(type)
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ contentModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ response.toErrorMessage().show()
+ }
+ }, {
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AlarmTypeViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmTypeViewModel.kt
new file mode 100644
index 0000000..dcaa579
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmTypeViewModel.kt
@@ -0,0 +1,32 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AlarmTypeModel
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class AlarmTypeViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val typeModel = MutableLiveData()
+
+ fun obtainAlarmType() = launch({
+ val response = RetrofitServiceManager.obtainAlarmType()
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ typeModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ response.toErrorMessage().show()
+ }
+ }, {
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AreaViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AreaViewModel.kt
new file mode 100644
index 0000000..6d06350
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/AreaViewModel.kt
@@ -0,0 +1,32 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AreaModel
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class AreaViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val areaModel = MutableLiveData()
+
+ fun obtainArea() = launch({
+ val response = RetrofitServiceManager.obtainArea()
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ areaModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ response.toErrorMessage().show()
+ }
+ }, {
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index c86566b..b3a6cfc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,7 +31,6 @@
coroutines 'enable'
}
}
- buildToolsVersion '30.0.3'
}
dependencies {
@@ -81,4 +80,6 @@
implementation 'io.github.youth5201314:banner:2.2.2'
//WebView
implementation 'com.just.agentweb:agentweb-androidx:4.1.4'
+ //日期选择器
+ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f9514b2..45a9414 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -40,8 +40,10 @@
-
-
+
+
+
+
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
new file mode 100644
index 0000000..d3584c4
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
@@ -0,0 +1,13 @@
+package com.casic.qd.smartwell.extensions
+
+/**
+ * ArrayList扩展方法
+ */
+
+fun addAll(vararg args: String): ArrayList {
+ val result = ArrayList()
+ args.forEach {
+ result.add(it)
+ }
+ return result
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
new file mode 100644
index 0000000..7f68e3b
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
@@ -0,0 +1,21 @@
+package com.casic.qd.smartwell.extensions
+
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.*
+
+fun Long.timestampToTime(): String =
+ SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(Date(this))
+
+fun Long.isEarlierThanStart(date: String): Boolean {
+ if (date.isBlank()) {
+ return false
+ }
+ val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA)
+ try {
+ return this < dateFormat.parse(date)!!.time
+ } catch (e: ParseException) {
+
+ }
+ return true
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
new file mode 100644
index 0000000..3802496
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
@@ -0,0 +1,18 @@
+package com.casic.qd.smartwell.model
+
+class AlarmContentModel {
+ var code = 0
+ var data: DataBean? = null
+ var message: String? = null
+
+ class DataBean {
+ var list: List? = null
+
+ class ListBean {
+ var deviceType: String? = null
+ var alarmType: String? = null
+ var name: String? = null
+ var value: String? = null
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
new file mode 100644
index 0000000..ba9a6c7
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
@@ -0,0 +1,14 @@
+package com.casic.qd.smartwell.model
+
+class AlarmTypeModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var name: String? = null
+ var id: String? = null
+ var value: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
new file mode 100644
index 0000000..8761adf
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
@@ -0,0 +1,25 @@
+package com.casic.qd.smartwell.model
+
+class AreaModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var id: String? = null
+ var isSync: String? = null
+ var lat: String? = null
+ var level = 0
+ var levelName: String? = null
+ var lng: String? = null
+ var name: String? = null
+ var num = 0
+ var pName: String? = null
+ var pid: String? = null
+ var pids: String? = null
+ var simplename: String? = null
+ var targetIdSync: String? = null
+ var targetPidSync: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
index d73ecc1..ec902a8 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
@@ -12,6 +12,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L
val HOME_ICONS = arrayOf(
R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics,
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
index 15c30fc..7081e2c 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
@@ -85,4 +85,42 @@
@Field("jobStatus") jobStatus: String,
@Field("handleMessage") handleMessage: String
): String
+
+ /**
+ * 获取告警类型
+ */
+ @GET("/dict/code/alarmType")
+ suspend fun obtainAlarmType(@Header("token") token: String): String
+
+ /**
+ * 根据类型获取告警内容
+ */
+ @GET("/alarm/contentType")
+ suspend fun obtainAlarmContent(
+ @Header("token") token: String,
+ @Query("alarmType") alarmType: String
+ ): String
+
+ /**
+ * 获取区域
+ */
+ @GET("/device/getAreas")
+ suspend fun obtainArea(@Header("token") token: String): String
+
+ /**
+ * 查询告警
+ * */
+ @GET("/alarm/list")
+ suspend fun obtainSearchResult(
+ @Header("token") token: String,
+ @Query("keywords") keywords: String?,
+ @Query("alarmType") alarmType: String?,
+ @Query("areaId") areaId: String?,
+ @Query("alarmContentType") alarmContentType: String?,
+ @Query("beginTime") beginTime: String?,
+ @Query("endTime") endTime: String?,
+ @Query("status") status: String?,
+ @Query("offset") offset: Int,
+ @Query("limit") limit: Int
+ ): String
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
index a6f4726..9190ef1 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
@@ -81,4 +81,52 @@
): String {
return api.obtainOperationResult(AuthenticationHelper.token!!, id, jobStatus, handleMessage)
}
+
+ /**
+ * 获取告警类型
+ */
+ suspend fun obtainAlarmType(): String {
+ return api.obtainAlarmType(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 根据类型获取告警内容
+ */
+ suspend fun obtainAlarmContent(type: String): String {
+ return api.obtainAlarmContent(AuthenticationHelper.token!!, type)
+ }
+
+ /**
+ * 获取区域
+ */
+ suspend fun obtainArea(): String {
+ return api.obtainArea(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 查询告警
+ */
+ suspend fun obtainSearchResult(
+ keywords: String?,
+ alarmType: String?,
+ areaId: String?,
+ alarmContentType: String?,
+ beginTime: String?,
+ endTime: String?,
+ status: String?,
+ page: Int
+ ): String {
+ return api.obtainSearchResult(
+ AuthenticationHelper.token!!,
+ keywords,
+ alarmType,
+ areaId,
+ alarmContentType,
+ beginTime,
+ endTime,
+ status,
+ page,
+ Constant.PAGE_LIMIT
+ )
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
index b0debb7..8fcd142 100644
--- a/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
@@ -118,6 +118,10 @@
}
}
})
+
+ rightOptionView.setOnClickListener {
+ this.navigatePageTo(SearchAlarmActivity::class.java)
+ }
}
private fun obtainAlarmList(pageIndex: Int) {
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt
new file mode 100644
index 0000000..aef4154
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt
@@ -0,0 +1,168 @@
+package com.casic.qd.smartwell.view
+
+import android.view.View
+import androidx.lifecycle.ViewModelProvider
+import com.casic.qd.smartwell.R
+import com.casic.qd.smartwell.base.BaseActivity
+import com.casic.qd.smartwell.extensions.*
+import com.casic.qd.smartwell.model.AreaModel
+import com.casic.qd.smartwell.utils.Constant
+import com.casic.qd.smartwell.vm.AlarmContentViewModel
+import com.casic.qd.smartwell.vm.AlarmTypeViewModel
+import com.casic.qd.smartwell.vm.AreaViewModel
+import com.jzxiang.pickerview.TimePickerDialog
+import com.jzxiang.pickerview.data.Type
+import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet.BottomListSheetBuilder
+import kotlinx.android.synthetic.main.activity_alarm_search.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SearchAlarmActivity : BaseActivity() {
+
+ private val kTag = "SearchAlarmActivity"
+ private lateinit var alarmTypeViewModel: AlarmTypeViewModel
+ private lateinit var alarmContentViewModel: AlarmContentViewModel
+ private lateinit var areaViewModel: AreaViewModel
+ private var alarmType = ""
+ private var alarmContent = ""
+ private var firstLevelArea: MutableList = ArrayList()
+ private var secondLevelArea: MutableList = ArrayList()
+ private var thirdLevelArea: MutableList = ArrayList()
+ private var areaModels: MutableList = ArrayList()
+
+ override fun initLayoutView(): Int = R.layout.activity_alarm_search
+
+ override fun setupTopBarLayout() {
+ titleView.text = "告警查询"
+ leftBackView.visibility = View.GONE
+ }
+
+ override fun initData() {
+ //告警类型
+ alarmTypeViewModel = ViewModelProvider(this).get(AlarmTypeViewModel::class.java)
+ //告警内容
+ alarmContentViewModel = ViewModelProvider(this).get(AlarmContentViewModel::class.java)
+ //区域
+ areaViewModel = ViewModelProvider(this).get(AreaViewModel::class.java)
+ }
+
+ override fun initEvent() {
+ selectTypeView.setOnClickListener {
+ alarmTypeViewModel.obtainAlarmType()
+ }
+ alarmTypeViewModel.typeModel.observe(this, {
+ if (it.code == 200) {
+ val sheetBuilder = BottomListSheetBuilder(this)
+ sheetBuilder.setTitle("告警类型")
+ it.data?.forEach { dataBean ->
+ sheetBuilder.addItem(dataBean.name)
+ }
+ sheetBuilder.setGravityCenter(true)
+ .setOnSheetItemClickListener { dialog, itemView, position, tag ->
+ alarmTypeView.text = tag
+ alarmType = it.data!![position].value.toString()
+
+ //告警类型变了之后需要清空告警内容
+ alarmContentView.text = ""
+ dialog.dismiss()
+ }.build().show()
+ }
+ })
+
+ selectContentView.setOnClickListener {
+ //获取类型对应的报警内容
+ alarmContentViewModel.obtainAlarmContent(alarmType)
+ }
+ alarmContentViewModel.contentModel.observe(this, {
+ if (it.code == 200) {
+ val sheetBuilder = BottomListSheetBuilder(this)
+ sheetBuilder.setTitle("告警内容")
+ it.data?.list?.forEach { dataBean ->
+ sheetBuilder.addItem(dataBean.name)
+ }
+ sheetBuilder.setGravityCenter(true)
+ .setOnSheetItemClickListener { dialog, itemView, position, tag ->
+ alarmContentView.text = tag
+ alarmContent = it.data!!.list!![position].value.toString()
+
+ dialog.dismiss()
+ }.build().show()
+ }
+ })
+
+ //地区三级联动
+ selectAreaView.setOnClickListener {
+ areaViewModel.obtainArea()
+ }
+ areaViewModel.areaModel.observe(this, {
+ if (it.code == 200) {
+ it.data?.forEach { dataBean ->
+ when (dataBean.level) {
+ 2 -> firstLevelArea.add(dataBean)
+ 3 -> secondLevelArea.add(dataBean)
+ 4 -> thirdLevelArea.add(dataBean)
+ }
+ }
+ //TODO 绑定区域
+// Log.d(kTag, Gson().toJson(firstLevelArea))
+// Log.d(kTag, Gson().toJson(secondLevelArea))
+// Log.d(kTag, Gson().toJson(thirdLevelArea))
+ }
+ })
+
+ startTimeView.setOnClickListener {
+ TimePickerDialog.Builder()
+ .setThemeColor(R.color.mainThemeColor.convertColor())
+ .setTitleStringId("请选择开始时间")
+ .setWheelItemTextSize(16)
+ .setCyclic(false)
+ .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS)
+ .setMaxMillseconds(System.currentTimeMillis())
+ .setType(Type.ALL)
+ .setCallBack { _: TimePickerDialog?, millSeconds: Long ->
+ startTimeView.text = millSeconds.timestampToTime()
+ }.build().show(supportFragmentManager, "all")
+ }
+
+ endTimeView.setOnClickListener {
+ TimePickerDialog.Builder()
+ .setThemeColor(R.color.mainThemeColor.convertColor())
+ .setTitleStringId("请选择结束时间")
+ .setWheelItemTextSize(16)
+ .setCyclic(false)
+ .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS)
+ .setMaxMillseconds(System.currentTimeMillis())
+ .setType(Type.ALL)
+ .setCallBack { _: TimePickerDialog?, millSeconds: Long ->
+ if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) {
+ "结束时间不合法,不能早于开始时间".show()
+ return@setCallBack
+ }
+ endTimeView.text = millSeconds.timestampToTime()
+ }.build().show(supportFragmentManager, "all")
+ }
+
+ searchButton.setChangeAlphaWhenPress(true)
+ searchButton.setOnClickListener {
+ //页面跳转,将查询参数传过去
+ //TODO areaId待定
+ navigatePageTo(
+ SearchResultActivity::class.java, addAll(
+ wellCodeView.text.toString().trim(),
+ alarmType,
+ "",
+ alarmContent,
+ startTimeView.text.toString(),
+ endTimeView.text.toString()
+ )
+ )
+ }
+
+ clearButton.setChangeAlphaWhenPress(true)
+ clearButton.setOnClickListener {
+ alarmTypeView.text = ""
+ alarmContentView.text = ""
+ startTimeView.text = ""
+ endTimeView.text = ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt
new file mode 100644
index 0000000..32d0a3a
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt
@@ -0,0 +1,223 @@
+package com.casic.qd.smartwell.view
+
+import android.annotation.SuppressLint
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.os.Handler
+import android.os.Looper
+import android.os.Message
+import android.view.View
+import androidx.lifecycle.ViewModelProvider
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.casic.qd.smartwell.R
+import com.casic.qd.smartwell.adapter.AlarmListAdapter
+import com.casic.qd.smartwell.base.BaseActivity
+import com.casic.qd.smartwell.extensions.navigatePageTo
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.showEmptyPage
+import com.casic.qd.smartwell.model.AlarmListModel
+import com.casic.qd.smartwell.utils.BroadcastReceiverManager
+import com.casic.qd.smartwell.utils.Constant
+import com.casic.qd.smartwell.utils.DialogHelper
+import com.casic.qd.smartwell.utils.LoadState
+import com.casic.qd.smartwell.vm.CancelAlarmViewModel
+import com.casic.qd.smartwell.vm.SearchAlarmViewModel
+import com.casic.qd.smartwell.widgets.CancelAlarmDialog
+import kotlinx.android.synthetic.main.activity_alarm_search_result.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_empty_view.*
+import java.lang.ref.WeakReference
+
+class SearchResultActivity : BaseActivity() {
+ private lateinit var weakReferenceHandler: WeakReferenceHandler
+ private lateinit var searchAlarmViewModel: SearchAlarmViewModel
+ private lateinit var cancelAlarmViewModel: CancelAlarmViewModel
+ private lateinit var args: ArrayList
+ private lateinit var alarmListAdapter: AlarmListAdapter
+ private var dataBeans: MutableList = ArrayList()
+ private var pageIndex = 1
+ private var isRefresh = false
+ private var isLoadMore = false
+
+ override fun initLayoutView(): Int = R.layout.activity_alarm_search_result
+
+ override fun setupTopBarLayout() {
+ titleView.text = "查询结果"
+ leftBackView.visibility = View.GONE
+ }
+
+ override fun initData() {
+ args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!!
+ weakReferenceHandler = WeakReferenceHandler(this)
+ searchAlarmViewModel = ViewModelProvider(this).get(SearchAlarmViewModel::class.java)
+ cancelAlarmViewModel = ViewModelProvider(this).get(CancelAlarmViewModel::class.java)
+ //注册广播接收者
+ BroadcastReceiverManager.instance.addAction(Constant.CANCEL_ALARM_ACTION,
+ object : BroadcastReceiver() {
+ override fun onReceive(context: Context?, intent: Intent?) {
+ //收到广播相当于做了一次列表刷新
+ isRefresh = true
+ pageIndex = 1
+ obtainSearchResult(args, pageIndex)
+ }
+ })
+ }
+
+ override fun initEvent() {
+ obtainSearchResult(args, pageIndex)
+ searchAlarmViewModel.listModel.observe(this, {
+ if (it.code == 200) {
+ val dataRows = it.data?.rows
+ when {
+ isRefresh -> {
+ dataBeans.clear()
+ dataBeans = dataRows!!
+ resultRefreshLayout.finishRefresh()
+ isRefresh = false
+ }
+ isLoadMore -> {
+ if (dataRows?.size == 0) {
+ "到底了,别拉了".show()
+ }
+ dataBeans.addAll(dataRows!!)
+ resultRefreshLayout.finishLoadMore()
+ isLoadMore = false
+ }
+ else -> {
+ dataBeans = dataRows!!
+ }
+ }
+ weakReferenceHandler.sendEmptyMessage(2022041501)
+ }
+ })
+ searchAlarmViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "数据加载中,请稍后")
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+ resultRefreshLayout.setOnRefreshListener {
+ isRefresh = true
+ //刷新之后页码重置
+ pageIndex = 1
+ obtainSearchResult(args, pageIndex)
+ }
+ resultRefreshLayout.setOnLoadMoreListener {
+ isLoadMore = true
+ pageIndex++
+ obtainSearchResult(args, pageIndex)
+ }
+
+ //消警状态处理
+ cancelAlarmViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "处理中,请稍后")
+ }
+ is LoadState.Success -> {
+ DialogHelper.dismissLoadingDialog()
+ //刷新列表
+ BroadcastReceiverManager.instance.sendBroadcast(
+ Constant.CANCEL_ALARM_ACTION, ""
+ )
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+ }
+
+ private fun obtainSearchResult(args: ArrayList, pageIndex: Int) {
+ searchAlarmViewModel.obtainSearchResult(
+ args[0], args[1], args[2], args[3], args[4], args[5], "1", pageIndex
+ )
+ }
+
+ private class WeakReferenceHandler(activity: SearchResultActivity) :
+ Handler(Looper.getMainLooper()) {
+ private val reference: WeakReference = WeakReference(activity)
+
+ @SuppressLint("NotifyDataSetChanged")
+ override fun handleMessage(msg: Message) {
+ super.handleMessage(msg)
+ val activity = reference.get()!!
+ if (msg.what == 2022041501) {
+ if (activity.isRefresh || activity.isLoadMore) {
+ activity.alarmListAdapter.notifyDataSetChanged()
+ } else { //首次加载数据
+ if (activity.dataBeans.size == 0) {
+ activity.emptyView!!.showEmptyPage {
+ activity.obtainSearchResult(activity.args, activity.pageIndex)
+ }
+ } else {
+ activity.emptyView!!.hide()
+ activity.alarmListAdapter = AlarmListAdapter(activity, activity.dataBeans)
+ activity.resultRecyclerView!!.layoutManager = LinearLayoutManager(activity)
+ activity.resultRecyclerView!!.adapter = activity.alarmListAdapter
+ activity.alarmListAdapter.setOnItemClickListener(object :
+ AlarmListAdapter.OnItemClickListener {
+ override fun onClicked(position: Int) {
+ val wellId = activity.dataBeans[position].wellId.toString()
+ if (wellId.isBlank()) {
+ "井编号异常,无法查看详情".show()
+ return
+ }
+ activity.navigatePageTo(WellDetailActivity::class.java, wellId)
+ }
+
+ override fun onOperationClicked(position: Int) {
+ val wellDetail = activity.dataBeans[position]
+ CancelAlarmDialog.Builder()
+ .setContext(activity)
+ .setTitle("取消告警")
+ .setHintMessage("请输入详细的告警取消原因")
+ .setNegativeButton("取消")
+ .setPositiveButton("确定")
+ .setOnDialogButtonClickListener(object :
+ CancelAlarmDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick(
+ spinnerValue: String, inputValue: String
+ ) {
+ /**
+ * http://111.198.10.15:20104/alarm/cancelAlarm?id=&jobStatus=3&handleMessage=2fsdf
+ * POST
+ * */
+ val id = wellDetail.jobId
+ if (id.toString().isBlank()) {
+ "操作失败,告警ID异常".show()
+ return
+ }
+ val jobStatus = when (spinnerValue) {
+ "已处理" -> "3"
+ "无需处理" -> "4"
+ else -> ""
+ }
+ activity.cancelAlarmViewModel.obtainOperationResult(
+ id!!, jobStatus, inputValue
+ )
+ }
+
+ override fun onCancelClick() {
+
+ }
+ }).build().show()
+ }
+ })
+ }
+ }
+ }
+ }
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ //解注册广播接收者,防止内存泄漏
+ BroadcastReceiverManager.instance.destroy(Constant.CANCEL_ALARM_ACTION)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AlarmContentViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmContentViewModel.kt
new file mode 100644
index 0000000..8c1d4e3
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmContentViewModel.kt
@@ -0,0 +1,32 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AlarmContentModel
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class AlarmContentViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val contentModel = MutableLiveData()
+
+ fun obtainAlarmContent(type: String) = launch({
+ val response = RetrofitServiceManager.obtainAlarmContent(type)
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ contentModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ response.toErrorMessage().show()
+ }
+ }, {
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AlarmTypeViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmTypeViewModel.kt
new file mode 100644
index 0000000..dcaa579
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmTypeViewModel.kt
@@ -0,0 +1,32 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AlarmTypeModel
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class AlarmTypeViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val typeModel = MutableLiveData()
+
+ fun obtainAlarmType() = launch({
+ val response = RetrofitServiceManager.obtainAlarmType()
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ typeModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ response.toErrorMessage().show()
+ }
+ }, {
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AreaViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AreaViewModel.kt
new file mode 100644
index 0000000..6d06350
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/AreaViewModel.kt
@@ -0,0 +1,32 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AreaModel
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class AreaViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val areaModel = MutableLiveData()
+
+ fun obtainArea() = launch({
+ val response = RetrofitServiceManager.obtainArea()
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ areaModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ response.toErrorMessage().show()
+ }
+ }, {
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/SearchAlarmViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/SearchAlarmViewModel.kt
new file mode 100644
index 0000000..c3fc1da
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/SearchAlarmViewModel.kt
@@ -0,0 +1,48 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AlarmListModel
+import com.casic.qd.smartwell.utils.LoadState
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class SearchAlarmViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val listModel = MutableLiveData()
+
+ fun obtainSearchResult(
+ keywords: String?,
+ alarmType: String?,
+ areaId: String?,
+ alarmContentType: String?,
+ beginTime: String?,
+ endTime: String?,
+ status: String?,
+ page: Int
+ ) = launch({
+ loadState.value = LoadState.Loading
+ val response = RetrofitServiceManager.obtainSearchResult(
+ keywords, alarmType, areaId, alarmContentType, beginTime, endTime, status, page
+ )
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ loadState.value = LoadState.Success
+ listModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ loadState.value = LoadState.Fail
+ response.toErrorMessage().show()
+ }
+ }, {
+ loadState.value = LoadState.Fail
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index c86566b..b3a6cfc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,7 +31,6 @@
coroutines 'enable'
}
}
- buildToolsVersion '30.0.3'
}
dependencies {
@@ -81,4 +80,6 @@
implementation 'io.github.youth5201314:banner:2.2.2'
//WebView
implementation 'com.just.agentweb:agentweb-androidx:4.1.4'
+ //日期选择器
+ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f9514b2..45a9414 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -40,8 +40,10 @@
-
-
+
+
+
+
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
new file mode 100644
index 0000000..d3584c4
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
@@ -0,0 +1,13 @@
+package com.casic.qd.smartwell.extensions
+
+/**
+ * ArrayList扩展方法
+ */
+
+fun addAll(vararg args: String): ArrayList {
+ val result = ArrayList()
+ args.forEach {
+ result.add(it)
+ }
+ return result
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
new file mode 100644
index 0000000..7f68e3b
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
@@ -0,0 +1,21 @@
+package com.casic.qd.smartwell.extensions
+
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.*
+
+fun Long.timestampToTime(): String =
+ SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(Date(this))
+
+fun Long.isEarlierThanStart(date: String): Boolean {
+ if (date.isBlank()) {
+ return false
+ }
+ val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA)
+ try {
+ return this < dateFormat.parse(date)!!.time
+ } catch (e: ParseException) {
+
+ }
+ return true
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
new file mode 100644
index 0000000..3802496
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
@@ -0,0 +1,18 @@
+package com.casic.qd.smartwell.model
+
+class AlarmContentModel {
+ var code = 0
+ var data: DataBean? = null
+ var message: String? = null
+
+ class DataBean {
+ var list: List? = null
+
+ class ListBean {
+ var deviceType: String? = null
+ var alarmType: String? = null
+ var name: String? = null
+ var value: String? = null
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
new file mode 100644
index 0000000..ba9a6c7
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
@@ -0,0 +1,14 @@
+package com.casic.qd.smartwell.model
+
+class AlarmTypeModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var name: String? = null
+ var id: String? = null
+ var value: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
new file mode 100644
index 0000000..8761adf
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
@@ -0,0 +1,25 @@
+package com.casic.qd.smartwell.model
+
+class AreaModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var id: String? = null
+ var isSync: String? = null
+ var lat: String? = null
+ var level = 0
+ var levelName: String? = null
+ var lng: String? = null
+ var name: String? = null
+ var num = 0
+ var pName: String? = null
+ var pid: String? = null
+ var pids: String? = null
+ var simplename: String? = null
+ var targetIdSync: String? = null
+ var targetPidSync: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
index d73ecc1..ec902a8 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
@@ -12,6 +12,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L
val HOME_ICONS = arrayOf(
R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics,
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
index 15c30fc..7081e2c 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
@@ -85,4 +85,42 @@
@Field("jobStatus") jobStatus: String,
@Field("handleMessage") handleMessage: String
): String
+
+ /**
+ * 获取告警类型
+ */
+ @GET("/dict/code/alarmType")
+ suspend fun obtainAlarmType(@Header("token") token: String): String
+
+ /**
+ * 根据类型获取告警内容
+ */
+ @GET("/alarm/contentType")
+ suspend fun obtainAlarmContent(
+ @Header("token") token: String,
+ @Query("alarmType") alarmType: String
+ ): String
+
+ /**
+ * 获取区域
+ */
+ @GET("/device/getAreas")
+ suspend fun obtainArea(@Header("token") token: String): String
+
+ /**
+ * 查询告警
+ * */
+ @GET("/alarm/list")
+ suspend fun obtainSearchResult(
+ @Header("token") token: String,
+ @Query("keywords") keywords: String?,
+ @Query("alarmType") alarmType: String?,
+ @Query("areaId") areaId: String?,
+ @Query("alarmContentType") alarmContentType: String?,
+ @Query("beginTime") beginTime: String?,
+ @Query("endTime") endTime: String?,
+ @Query("status") status: String?,
+ @Query("offset") offset: Int,
+ @Query("limit") limit: Int
+ ): String
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
index a6f4726..9190ef1 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
@@ -81,4 +81,52 @@
): String {
return api.obtainOperationResult(AuthenticationHelper.token!!, id, jobStatus, handleMessage)
}
+
+ /**
+ * 获取告警类型
+ */
+ suspend fun obtainAlarmType(): String {
+ return api.obtainAlarmType(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 根据类型获取告警内容
+ */
+ suspend fun obtainAlarmContent(type: String): String {
+ return api.obtainAlarmContent(AuthenticationHelper.token!!, type)
+ }
+
+ /**
+ * 获取区域
+ */
+ suspend fun obtainArea(): String {
+ return api.obtainArea(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 查询告警
+ */
+ suspend fun obtainSearchResult(
+ keywords: String?,
+ alarmType: String?,
+ areaId: String?,
+ alarmContentType: String?,
+ beginTime: String?,
+ endTime: String?,
+ status: String?,
+ page: Int
+ ): String {
+ return api.obtainSearchResult(
+ AuthenticationHelper.token!!,
+ keywords,
+ alarmType,
+ areaId,
+ alarmContentType,
+ beginTime,
+ endTime,
+ status,
+ page,
+ Constant.PAGE_LIMIT
+ )
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
index b0debb7..8fcd142 100644
--- a/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
@@ -118,6 +118,10 @@
}
}
})
+
+ rightOptionView.setOnClickListener {
+ this.navigatePageTo(SearchAlarmActivity::class.java)
+ }
}
private fun obtainAlarmList(pageIndex: Int) {
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt
new file mode 100644
index 0000000..aef4154
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt
@@ -0,0 +1,168 @@
+package com.casic.qd.smartwell.view
+
+import android.view.View
+import androidx.lifecycle.ViewModelProvider
+import com.casic.qd.smartwell.R
+import com.casic.qd.smartwell.base.BaseActivity
+import com.casic.qd.smartwell.extensions.*
+import com.casic.qd.smartwell.model.AreaModel
+import com.casic.qd.smartwell.utils.Constant
+import com.casic.qd.smartwell.vm.AlarmContentViewModel
+import com.casic.qd.smartwell.vm.AlarmTypeViewModel
+import com.casic.qd.smartwell.vm.AreaViewModel
+import com.jzxiang.pickerview.TimePickerDialog
+import com.jzxiang.pickerview.data.Type
+import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet.BottomListSheetBuilder
+import kotlinx.android.synthetic.main.activity_alarm_search.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SearchAlarmActivity : BaseActivity() {
+
+ private val kTag = "SearchAlarmActivity"
+ private lateinit var alarmTypeViewModel: AlarmTypeViewModel
+ private lateinit var alarmContentViewModel: AlarmContentViewModel
+ private lateinit var areaViewModel: AreaViewModel
+ private var alarmType = ""
+ private var alarmContent = ""
+ private var firstLevelArea: MutableList = ArrayList()
+ private var secondLevelArea: MutableList = ArrayList()
+ private var thirdLevelArea: MutableList = ArrayList()
+ private var areaModels: MutableList = ArrayList()
+
+ override fun initLayoutView(): Int = R.layout.activity_alarm_search
+
+ override fun setupTopBarLayout() {
+ titleView.text = "告警查询"
+ leftBackView.visibility = View.GONE
+ }
+
+ override fun initData() {
+ //告警类型
+ alarmTypeViewModel = ViewModelProvider(this).get(AlarmTypeViewModel::class.java)
+ //告警内容
+ alarmContentViewModel = ViewModelProvider(this).get(AlarmContentViewModel::class.java)
+ //区域
+ areaViewModel = ViewModelProvider(this).get(AreaViewModel::class.java)
+ }
+
+ override fun initEvent() {
+ selectTypeView.setOnClickListener {
+ alarmTypeViewModel.obtainAlarmType()
+ }
+ alarmTypeViewModel.typeModel.observe(this, {
+ if (it.code == 200) {
+ val sheetBuilder = BottomListSheetBuilder(this)
+ sheetBuilder.setTitle("告警类型")
+ it.data?.forEach { dataBean ->
+ sheetBuilder.addItem(dataBean.name)
+ }
+ sheetBuilder.setGravityCenter(true)
+ .setOnSheetItemClickListener { dialog, itemView, position, tag ->
+ alarmTypeView.text = tag
+ alarmType = it.data!![position].value.toString()
+
+ //告警类型变了之后需要清空告警内容
+ alarmContentView.text = ""
+ dialog.dismiss()
+ }.build().show()
+ }
+ })
+
+ selectContentView.setOnClickListener {
+ //获取类型对应的报警内容
+ alarmContentViewModel.obtainAlarmContent(alarmType)
+ }
+ alarmContentViewModel.contentModel.observe(this, {
+ if (it.code == 200) {
+ val sheetBuilder = BottomListSheetBuilder(this)
+ sheetBuilder.setTitle("告警内容")
+ it.data?.list?.forEach { dataBean ->
+ sheetBuilder.addItem(dataBean.name)
+ }
+ sheetBuilder.setGravityCenter(true)
+ .setOnSheetItemClickListener { dialog, itemView, position, tag ->
+ alarmContentView.text = tag
+ alarmContent = it.data!!.list!![position].value.toString()
+
+ dialog.dismiss()
+ }.build().show()
+ }
+ })
+
+ //地区三级联动
+ selectAreaView.setOnClickListener {
+ areaViewModel.obtainArea()
+ }
+ areaViewModel.areaModel.observe(this, {
+ if (it.code == 200) {
+ it.data?.forEach { dataBean ->
+ when (dataBean.level) {
+ 2 -> firstLevelArea.add(dataBean)
+ 3 -> secondLevelArea.add(dataBean)
+ 4 -> thirdLevelArea.add(dataBean)
+ }
+ }
+ //TODO 绑定区域
+// Log.d(kTag, Gson().toJson(firstLevelArea))
+// Log.d(kTag, Gson().toJson(secondLevelArea))
+// Log.d(kTag, Gson().toJson(thirdLevelArea))
+ }
+ })
+
+ startTimeView.setOnClickListener {
+ TimePickerDialog.Builder()
+ .setThemeColor(R.color.mainThemeColor.convertColor())
+ .setTitleStringId("请选择开始时间")
+ .setWheelItemTextSize(16)
+ .setCyclic(false)
+ .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS)
+ .setMaxMillseconds(System.currentTimeMillis())
+ .setType(Type.ALL)
+ .setCallBack { _: TimePickerDialog?, millSeconds: Long ->
+ startTimeView.text = millSeconds.timestampToTime()
+ }.build().show(supportFragmentManager, "all")
+ }
+
+ endTimeView.setOnClickListener {
+ TimePickerDialog.Builder()
+ .setThemeColor(R.color.mainThemeColor.convertColor())
+ .setTitleStringId("请选择结束时间")
+ .setWheelItemTextSize(16)
+ .setCyclic(false)
+ .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS)
+ .setMaxMillseconds(System.currentTimeMillis())
+ .setType(Type.ALL)
+ .setCallBack { _: TimePickerDialog?, millSeconds: Long ->
+ if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) {
+ "结束时间不合法,不能早于开始时间".show()
+ return@setCallBack
+ }
+ endTimeView.text = millSeconds.timestampToTime()
+ }.build().show(supportFragmentManager, "all")
+ }
+
+ searchButton.setChangeAlphaWhenPress(true)
+ searchButton.setOnClickListener {
+ //页面跳转,将查询参数传过去
+ //TODO areaId待定
+ navigatePageTo(
+ SearchResultActivity::class.java, addAll(
+ wellCodeView.text.toString().trim(),
+ alarmType,
+ "",
+ alarmContent,
+ startTimeView.text.toString(),
+ endTimeView.text.toString()
+ )
+ )
+ }
+
+ clearButton.setChangeAlphaWhenPress(true)
+ clearButton.setOnClickListener {
+ alarmTypeView.text = ""
+ alarmContentView.text = ""
+ startTimeView.text = ""
+ endTimeView.text = ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt
new file mode 100644
index 0000000..32d0a3a
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt
@@ -0,0 +1,223 @@
+package com.casic.qd.smartwell.view
+
+import android.annotation.SuppressLint
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.os.Handler
+import android.os.Looper
+import android.os.Message
+import android.view.View
+import androidx.lifecycle.ViewModelProvider
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.casic.qd.smartwell.R
+import com.casic.qd.smartwell.adapter.AlarmListAdapter
+import com.casic.qd.smartwell.base.BaseActivity
+import com.casic.qd.smartwell.extensions.navigatePageTo
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.showEmptyPage
+import com.casic.qd.smartwell.model.AlarmListModel
+import com.casic.qd.smartwell.utils.BroadcastReceiverManager
+import com.casic.qd.smartwell.utils.Constant
+import com.casic.qd.smartwell.utils.DialogHelper
+import com.casic.qd.smartwell.utils.LoadState
+import com.casic.qd.smartwell.vm.CancelAlarmViewModel
+import com.casic.qd.smartwell.vm.SearchAlarmViewModel
+import com.casic.qd.smartwell.widgets.CancelAlarmDialog
+import kotlinx.android.synthetic.main.activity_alarm_search_result.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_empty_view.*
+import java.lang.ref.WeakReference
+
+class SearchResultActivity : BaseActivity() {
+ private lateinit var weakReferenceHandler: WeakReferenceHandler
+ private lateinit var searchAlarmViewModel: SearchAlarmViewModel
+ private lateinit var cancelAlarmViewModel: CancelAlarmViewModel
+ private lateinit var args: ArrayList
+ private lateinit var alarmListAdapter: AlarmListAdapter
+ private var dataBeans: MutableList = ArrayList()
+ private var pageIndex = 1
+ private var isRefresh = false
+ private var isLoadMore = false
+
+ override fun initLayoutView(): Int = R.layout.activity_alarm_search_result
+
+ override fun setupTopBarLayout() {
+ titleView.text = "查询结果"
+ leftBackView.visibility = View.GONE
+ }
+
+ override fun initData() {
+ args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!!
+ weakReferenceHandler = WeakReferenceHandler(this)
+ searchAlarmViewModel = ViewModelProvider(this).get(SearchAlarmViewModel::class.java)
+ cancelAlarmViewModel = ViewModelProvider(this).get(CancelAlarmViewModel::class.java)
+ //注册广播接收者
+ BroadcastReceiverManager.instance.addAction(Constant.CANCEL_ALARM_ACTION,
+ object : BroadcastReceiver() {
+ override fun onReceive(context: Context?, intent: Intent?) {
+ //收到广播相当于做了一次列表刷新
+ isRefresh = true
+ pageIndex = 1
+ obtainSearchResult(args, pageIndex)
+ }
+ })
+ }
+
+ override fun initEvent() {
+ obtainSearchResult(args, pageIndex)
+ searchAlarmViewModel.listModel.observe(this, {
+ if (it.code == 200) {
+ val dataRows = it.data?.rows
+ when {
+ isRefresh -> {
+ dataBeans.clear()
+ dataBeans = dataRows!!
+ resultRefreshLayout.finishRefresh()
+ isRefresh = false
+ }
+ isLoadMore -> {
+ if (dataRows?.size == 0) {
+ "到底了,别拉了".show()
+ }
+ dataBeans.addAll(dataRows!!)
+ resultRefreshLayout.finishLoadMore()
+ isLoadMore = false
+ }
+ else -> {
+ dataBeans = dataRows!!
+ }
+ }
+ weakReferenceHandler.sendEmptyMessage(2022041501)
+ }
+ })
+ searchAlarmViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "数据加载中,请稍后")
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+ resultRefreshLayout.setOnRefreshListener {
+ isRefresh = true
+ //刷新之后页码重置
+ pageIndex = 1
+ obtainSearchResult(args, pageIndex)
+ }
+ resultRefreshLayout.setOnLoadMoreListener {
+ isLoadMore = true
+ pageIndex++
+ obtainSearchResult(args, pageIndex)
+ }
+
+ //消警状态处理
+ cancelAlarmViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "处理中,请稍后")
+ }
+ is LoadState.Success -> {
+ DialogHelper.dismissLoadingDialog()
+ //刷新列表
+ BroadcastReceiverManager.instance.sendBroadcast(
+ Constant.CANCEL_ALARM_ACTION, ""
+ )
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+ }
+
+ private fun obtainSearchResult(args: ArrayList, pageIndex: Int) {
+ searchAlarmViewModel.obtainSearchResult(
+ args[0], args[1], args[2], args[3], args[4], args[5], "1", pageIndex
+ )
+ }
+
+ private class WeakReferenceHandler(activity: SearchResultActivity) :
+ Handler(Looper.getMainLooper()) {
+ private val reference: WeakReference = WeakReference(activity)
+
+ @SuppressLint("NotifyDataSetChanged")
+ override fun handleMessage(msg: Message) {
+ super.handleMessage(msg)
+ val activity = reference.get()!!
+ if (msg.what == 2022041501) {
+ if (activity.isRefresh || activity.isLoadMore) {
+ activity.alarmListAdapter.notifyDataSetChanged()
+ } else { //首次加载数据
+ if (activity.dataBeans.size == 0) {
+ activity.emptyView!!.showEmptyPage {
+ activity.obtainSearchResult(activity.args, activity.pageIndex)
+ }
+ } else {
+ activity.emptyView!!.hide()
+ activity.alarmListAdapter = AlarmListAdapter(activity, activity.dataBeans)
+ activity.resultRecyclerView!!.layoutManager = LinearLayoutManager(activity)
+ activity.resultRecyclerView!!.adapter = activity.alarmListAdapter
+ activity.alarmListAdapter.setOnItemClickListener(object :
+ AlarmListAdapter.OnItemClickListener {
+ override fun onClicked(position: Int) {
+ val wellId = activity.dataBeans[position].wellId.toString()
+ if (wellId.isBlank()) {
+ "井编号异常,无法查看详情".show()
+ return
+ }
+ activity.navigatePageTo(WellDetailActivity::class.java, wellId)
+ }
+
+ override fun onOperationClicked(position: Int) {
+ val wellDetail = activity.dataBeans[position]
+ CancelAlarmDialog.Builder()
+ .setContext(activity)
+ .setTitle("取消告警")
+ .setHintMessage("请输入详细的告警取消原因")
+ .setNegativeButton("取消")
+ .setPositiveButton("确定")
+ .setOnDialogButtonClickListener(object :
+ CancelAlarmDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick(
+ spinnerValue: String, inputValue: String
+ ) {
+ /**
+ * http://111.198.10.15:20104/alarm/cancelAlarm?id=&jobStatus=3&handleMessage=2fsdf
+ * POST
+ * */
+ val id = wellDetail.jobId
+ if (id.toString().isBlank()) {
+ "操作失败,告警ID异常".show()
+ return
+ }
+ val jobStatus = when (spinnerValue) {
+ "已处理" -> "3"
+ "无需处理" -> "4"
+ else -> ""
+ }
+ activity.cancelAlarmViewModel.obtainOperationResult(
+ id!!, jobStatus, inputValue
+ )
+ }
+
+ override fun onCancelClick() {
+
+ }
+ }).build().show()
+ }
+ })
+ }
+ }
+ }
+ }
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ //解注册广播接收者,防止内存泄漏
+ BroadcastReceiverManager.instance.destroy(Constant.CANCEL_ALARM_ACTION)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AlarmContentViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmContentViewModel.kt
new file mode 100644
index 0000000..8c1d4e3
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmContentViewModel.kt
@@ -0,0 +1,32 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AlarmContentModel
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class AlarmContentViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val contentModel = MutableLiveData()
+
+ fun obtainAlarmContent(type: String) = launch({
+ val response = RetrofitServiceManager.obtainAlarmContent(type)
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ contentModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ response.toErrorMessage().show()
+ }
+ }, {
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AlarmTypeViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmTypeViewModel.kt
new file mode 100644
index 0000000..dcaa579
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmTypeViewModel.kt
@@ -0,0 +1,32 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AlarmTypeModel
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class AlarmTypeViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val typeModel = MutableLiveData()
+
+ fun obtainAlarmType() = launch({
+ val response = RetrofitServiceManager.obtainAlarmType()
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ typeModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ response.toErrorMessage().show()
+ }
+ }, {
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AreaViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AreaViewModel.kt
new file mode 100644
index 0000000..6d06350
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/AreaViewModel.kt
@@ -0,0 +1,32 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AreaModel
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class AreaViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val areaModel = MutableLiveData()
+
+ fun obtainArea() = launch({
+ val response = RetrofitServiceManager.obtainArea()
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ areaModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ response.toErrorMessage().show()
+ }
+ }, {
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/SearchAlarmViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/SearchAlarmViewModel.kt
new file mode 100644
index 0000000..c3fc1da
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/SearchAlarmViewModel.kt
@@ -0,0 +1,48 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AlarmListModel
+import com.casic.qd.smartwell.utils.LoadState
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class SearchAlarmViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val listModel = MutableLiveData()
+
+ fun obtainSearchResult(
+ keywords: String?,
+ alarmType: String?,
+ areaId: String?,
+ alarmContentType: String?,
+ beginTime: String?,
+ endTime: String?,
+ status: String?,
+ page: Int
+ ) = launch({
+ loadState.value = LoadState.Loading
+ val response = RetrofitServiceManager.obtainSearchResult(
+ keywords, alarmType, areaId, alarmContentType, beginTime, endTime, status, page
+ )
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ loadState.value = LoadState.Success
+ listModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ loadState.value = LoadState.Fail
+ response.toErrorMessage().show()
+ }
+ }, {
+ loadState.value = LoadState.Fail
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_down.xml b/app/src/main/res/drawable/ic_down.xml
new file mode 100644
index 0000000..c6d8b0d
--- /dev/null
+++ b/app/src/main/res/drawable/ic_down.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/build.gradle b/app/build.gradle
index c86566b..b3a6cfc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,7 +31,6 @@
coroutines 'enable'
}
}
- buildToolsVersion '30.0.3'
}
dependencies {
@@ -81,4 +80,6 @@
implementation 'io.github.youth5201314:banner:2.2.2'
//WebView
implementation 'com.just.agentweb:agentweb-androidx:4.1.4'
+ //日期选择器
+ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f9514b2..45a9414 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -40,8 +40,10 @@
-
-
+
+
+
+
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
new file mode 100644
index 0000000..d3584c4
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
@@ -0,0 +1,13 @@
+package com.casic.qd.smartwell.extensions
+
+/**
+ * ArrayList扩展方法
+ */
+
+fun addAll(vararg args: String): ArrayList {
+ val result = ArrayList()
+ args.forEach {
+ result.add(it)
+ }
+ return result
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
new file mode 100644
index 0000000..7f68e3b
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
@@ -0,0 +1,21 @@
+package com.casic.qd.smartwell.extensions
+
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.*
+
+fun Long.timestampToTime(): String =
+ SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(Date(this))
+
+fun Long.isEarlierThanStart(date: String): Boolean {
+ if (date.isBlank()) {
+ return false
+ }
+ val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA)
+ try {
+ return this < dateFormat.parse(date)!!.time
+ } catch (e: ParseException) {
+
+ }
+ return true
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
new file mode 100644
index 0000000..3802496
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
@@ -0,0 +1,18 @@
+package com.casic.qd.smartwell.model
+
+class AlarmContentModel {
+ var code = 0
+ var data: DataBean? = null
+ var message: String? = null
+
+ class DataBean {
+ var list: List? = null
+
+ class ListBean {
+ var deviceType: String? = null
+ var alarmType: String? = null
+ var name: String? = null
+ var value: String? = null
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
new file mode 100644
index 0000000..ba9a6c7
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
@@ -0,0 +1,14 @@
+package com.casic.qd.smartwell.model
+
+class AlarmTypeModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var name: String? = null
+ var id: String? = null
+ var value: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
new file mode 100644
index 0000000..8761adf
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
@@ -0,0 +1,25 @@
+package com.casic.qd.smartwell.model
+
+class AreaModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var id: String? = null
+ var isSync: String? = null
+ var lat: String? = null
+ var level = 0
+ var levelName: String? = null
+ var lng: String? = null
+ var name: String? = null
+ var num = 0
+ var pName: String? = null
+ var pid: String? = null
+ var pids: String? = null
+ var simplename: String? = null
+ var targetIdSync: String? = null
+ var targetPidSync: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
index d73ecc1..ec902a8 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
@@ -12,6 +12,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L
val HOME_ICONS = arrayOf(
R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics,
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
index 15c30fc..7081e2c 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
@@ -85,4 +85,42 @@
@Field("jobStatus") jobStatus: String,
@Field("handleMessage") handleMessage: String
): String
+
+ /**
+ * 获取告警类型
+ */
+ @GET("/dict/code/alarmType")
+ suspend fun obtainAlarmType(@Header("token") token: String): String
+
+ /**
+ * 根据类型获取告警内容
+ */
+ @GET("/alarm/contentType")
+ suspend fun obtainAlarmContent(
+ @Header("token") token: String,
+ @Query("alarmType") alarmType: String
+ ): String
+
+ /**
+ * 获取区域
+ */
+ @GET("/device/getAreas")
+ suspend fun obtainArea(@Header("token") token: String): String
+
+ /**
+ * 查询告警
+ * */
+ @GET("/alarm/list")
+ suspend fun obtainSearchResult(
+ @Header("token") token: String,
+ @Query("keywords") keywords: String?,
+ @Query("alarmType") alarmType: String?,
+ @Query("areaId") areaId: String?,
+ @Query("alarmContentType") alarmContentType: String?,
+ @Query("beginTime") beginTime: String?,
+ @Query("endTime") endTime: String?,
+ @Query("status") status: String?,
+ @Query("offset") offset: Int,
+ @Query("limit") limit: Int
+ ): String
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
index a6f4726..9190ef1 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
@@ -81,4 +81,52 @@
): String {
return api.obtainOperationResult(AuthenticationHelper.token!!, id, jobStatus, handleMessage)
}
+
+ /**
+ * 获取告警类型
+ */
+ suspend fun obtainAlarmType(): String {
+ return api.obtainAlarmType(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 根据类型获取告警内容
+ */
+ suspend fun obtainAlarmContent(type: String): String {
+ return api.obtainAlarmContent(AuthenticationHelper.token!!, type)
+ }
+
+ /**
+ * 获取区域
+ */
+ suspend fun obtainArea(): String {
+ return api.obtainArea(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 查询告警
+ */
+ suspend fun obtainSearchResult(
+ keywords: String?,
+ alarmType: String?,
+ areaId: String?,
+ alarmContentType: String?,
+ beginTime: String?,
+ endTime: String?,
+ status: String?,
+ page: Int
+ ): String {
+ return api.obtainSearchResult(
+ AuthenticationHelper.token!!,
+ keywords,
+ alarmType,
+ areaId,
+ alarmContentType,
+ beginTime,
+ endTime,
+ status,
+ page,
+ Constant.PAGE_LIMIT
+ )
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
index b0debb7..8fcd142 100644
--- a/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
@@ -118,6 +118,10 @@
}
}
})
+
+ rightOptionView.setOnClickListener {
+ this.navigatePageTo(SearchAlarmActivity::class.java)
+ }
}
private fun obtainAlarmList(pageIndex: Int) {
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt
new file mode 100644
index 0000000..aef4154
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt
@@ -0,0 +1,168 @@
+package com.casic.qd.smartwell.view
+
+import android.view.View
+import androidx.lifecycle.ViewModelProvider
+import com.casic.qd.smartwell.R
+import com.casic.qd.smartwell.base.BaseActivity
+import com.casic.qd.smartwell.extensions.*
+import com.casic.qd.smartwell.model.AreaModel
+import com.casic.qd.smartwell.utils.Constant
+import com.casic.qd.smartwell.vm.AlarmContentViewModel
+import com.casic.qd.smartwell.vm.AlarmTypeViewModel
+import com.casic.qd.smartwell.vm.AreaViewModel
+import com.jzxiang.pickerview.TimePickerDialog
+import com.jzxiang.pickerview.data.Type
+import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet.BottomListSheetBuilder
+import kotlinx.android.synthetic.main.activity_alarm_search.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SearchAlarmActivity : BaseActivity() {
+
+ private val kTag = "SearchAlarmActivity"
+ private lateinit var alarmTypeViewModel: AlarmTypeViewModel
+ private lateinit var alarmContentViewModel: AlarmContentViewModel
+ private lateinit var areaViewModel: AreaViewModel
+ private var alarmType = ""
+ private var alarmContent = ""
+ private var firstLevelArea: MutableList = ArrayList()
+ private var secondLevelArea: MutableList = ArrayList()
+ private var thirdLevelArea: MutableList = ArrayList()
+ private var areaModels: MutableList = ArrayList()
+
+ override fun initLayoutView(): Int = R.layout.activity_alarm_search
+
+ override fun setupTopBarLayout() {
+ titleView.text = "告警查询"
+ leftBackView.visibility = View.GONE
+ }
+
+ override fun initData() {
+ //告警类型
+ alarmTypeViewModel = ViewModelProvider(this).get(AlarmTypeViewModel::class.java)
+ //告警内容
+ alarmContentViewModel = ViewModelProvider(this).get(AlarmContentViewModel::class.java)
+ //区域
+ areaViewModel = ViewModelProvider(this).get(AreaViewModel::class.java)
+ }
+
+ override fun initEvent() {
+ selectTypeView.setOnClickListener {
+ alarmTypeViewModel.obtainAlarmType()
+ }
+ alarmTypeViewModel.typeModel.observe(this, {
+ if (it.code == 200) {
+ val sheetBuilder = BottomListSheetBuilder(this)
+ sheetBuilder.setTitle("告警类型")
+ it.data?.forEach { dataBean ->
+ sheetBuilder.addItem(dataBean.name)
+ }
+ sheetBuilder.setGravityCenter(true)
+ .setOnSheetItemClickListener { dialog, itemView, position, tag ->
+ alarmTypeView.text = tag
+ alarmType = it.data!![position].value.toString()
+
+ //告警类型变了之后需要清空告警内容
+ alarmContentView.text = ""
+ dialog.dismiss()
+ }.build().show()
+ }
+ })
+
+ selectContentView.setOnClickListener {
+ //获取类型对应的报警内容
+ alarmContentViewModel.obtainAlarmContent(alarmType)
+ }
+ alarmContentViewModel.contentModel.observe(this, {
+ if (it.code == 200) {
+ val sheetBuilder = BottomListSheetBuilder(this)
+ sheetBuilder.setTitle("告警内容")
+ it.data?.list?.forEach { dataBean ->
+ sheetBuilder.addItem(dataBean.name)
+ }
+ sheetBuilder.setGravityCenter(true)
+ .setOnSheetItemClickListener { dialog, itemView, position, tag ->
+ alarmContentView.text = tag
+ alarmContent = it.data!!.list!![position].value.toString()
+
+ dialog.dismiss()
+ }.build().show()
+ }
+ })
+
+ //地区三级联动
+ selectAreaView.setOnClickListener {
+ areaViewModel.obtainArea()
+ }
+ areaViewModel.areaModel.observe(this, {
+ if (it.code == 200) {
+ it.data?.forEach { dataBean ->
+ when (dataBean.level) {
+ 2 -> firstLevelArea.add(dataBean)
+ 3 -> secondLevelArea.add(dataBean)
+ 4 -> thirdLevelArea.add(dataBean)
+ }
+ }
+ //TODO 绑定区域
+// Log.d(kTag, Gson().toJson(firstLevelArea))
+// Log.d(kTag, Gson().toJson(secondLevelArea))
+// Log.d(kTag, Gson().toJson(thirdLevelArea))
+ }
+ })
+
+ startTimeView.setOnClickListener {
+ TimePickerDialog.Builder()
+ .setThemeColor(R.color.mainThemeColor.convertColor())
+ .setTitleStringId("请选择开始时间")
+ .setWheelItemTextSize(16)
+ .setCyclic(false)
+ .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS)
+ .setMaxMillseconds(System.currentTimeMillis())
+ .setType(Type.ALL)
+ .setCallBack { _: TimePickerDialog?, millSeconds: Long ->
+ startTimeView.text = millSeconds.timestampToTime()
+ }.build().show(supportFragmentManager, "all")
+ }
+
+ endTimeView.setOnClickListener {
+ TimePickerDialog.Builder()
+ .setThemeColor(R.color.mainThemeColor.convertColor())
+ .setTitleStringId("请选择结束时间")
+ .setWheelItemTextSize(16)
+ .setCyclic(false)
+ .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS)
+ .setMaxMillseconds(System.currentTimeMillis())
+ .setType(Type.ALL)
+ .setCallBack { _: TimePickerDialog?, millSeconds: Long ->
+ if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) {
+ "结束时间不合法,不能早于开始时间".show()
+ return@setCallBack
+ }
+ endTimeView.text = millSeconds.timestampToTime()
+ }.build().show(supportFragmentManager, "all")
+ }
+
+ searchButton.setChangeAlphaWhenPress(true)
+ searchButton.setOnClickListener {
+ //页面跳转,将查询参数传过去
+ //TODO areaId待定
+ navigatePageTo(
+ SearchResultActivity::class.java, addAll(
+ wellCodeView.text.toString().trim(),
+ alarmType,
+ "",
+ alarmContent,
+ startTimeView.text.toString(),
+ endTimeView.text.toString()
+ )
+ )
+ }
+
+ clearButton.setChangeAlphaWhenPress(true)
+ clearButton.setOnClickListener {
+ alarmTypeView.text = ""
+ alarmContentView.text = ""
+ startTimeView.text = ""
+ endTimeView.text = ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt
new file mode 100644
index 0000000..32d0a3a
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt
@@ -0,0 +1,223 @@
+package com.casic.qd.smartwell.view
+
+import android.annotation.SuppressLint
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.os.Handler
+import android.os.Looper
+import android.os.Message
+import android.view.View
+import androidx.lifecycle.ViewModelProvider
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.casic.qd.smartwell.R
+import com.casic.qd.smartwell.adapter.AlarmListAdapter
+import com.casic.qd.smartwell.base.BaseActivity
+import com.casic.qd.smartwell.extensions.navigatePageTo
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.showEmptyPage
+import com.casic.qd.smartwell.model.AlarmListModel
+import com.casic.qd.smartwell.utils.BroadcastReceiverManager
+import com.casic.qd.smartwell.utils.Constant
+import com.casic.qd.smartwell.utils.DialogHelper
+import com.casic.qd.smartwell.utils.LoadState
+import com.casic.qd.smartwell.vm.CancelAlarmViewModel
+import com.casic.qd.smartwell.vm.SearchAlarmViewModel
+import com.casic.qd.smartwell.widgets.CancelAlarmDialog
+import kotlinx.android.synthetic.main.activity_alarm_search_result.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_empty_view.*
+import java.lang.ref.WeakReference
+
+class SearchResultActivity : BaseActivity() {
+ private lateinit var weakReferenceHandler: WeakReferenceHandler
+ private lateinit var searchAlarmViewModel: SearchAlarmViewModel
+ private lateinit var cancelAlarmViewModel: CancelAlarmViewModel
+ private lateinit var args: ArrayList
+ private lateinit var alarmListAdapter: AlarmListAdapter
+ private var dataBeans: MutableList = ArrayList()
+ private var pageIndex = 1
+ private var isRefresh = false
+ private var isLoadMore = false
+
+ override fun initLayoutView(): Int = R.layout.activity_alarm_search_result
+
+ override fun setupTopBarLayout() {
+ titleView.text = "查询结果"
+ leftBackView.visibility = View.GONE
+ }
+
+ override fun initData() {
+ args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!!
+ weakReferenceHandler = WeakReferenceHandler(this)
+ searchAlarmViewModel = ViewModelProvider(this).get(SearchAlarmViewModel::class.java)
+ cancelAlarmViewModel = ViewModelProvider(this).get(CancelAlarmViewModel::class.java)
+ //注册广播接收者
+ BroadcastReceiverManager.instance.addAction(Constant.CANCEL_ALARM_ACTION,
+ object : BroadcastReceiver() {
+ override fun onReceive(context: Context?, intent: Intent?) {
+ //收到广播相当于做了一次列表刷新
+ isRefresh = true
+ pageIndex = 1
+ obtainSearchResult(args, pageIndex)
+ }
+ })
+ }
+
+ override fun initEvent() {
+ obtainSearchResult(args, pageIndex)
+ searchAlarmViewModel.listModel.observe(this, {
+ if (it.code == 200) {
+ val dataRows = it.data?.rows
+ when {
+ isRefresh -> {
+ dataBeans.clear()
+ dataBeans = dataRows!!
+ resultRefreshLayout.finishRefresh()
+ isRefresh = false
+ }
+ isLoadMore -> {
+ if (dataRows?.size == 0) {
+ "到底了,别拉了".show()
+ }
+ dataBeans.addAll(dataRows!!)
+ resultRefreshLayout.finishLoadMore()
+ isLoadMore = false
+ }
+ else -> {
+ dataBeans = dataRows!!
+ }
+ }
+ weakReferenceHandler.sendEmptyMessage(2022041501)
+ }
+ })
+ searchAlarmViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "数据加载中,请稍后")
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+ resultRefreshLayout.setOnRefreshListener {
+ isRefresh = true
+ //刷新之后页码重置
+ pageIndex = 1
+ obtainSearchResult(args, pageIndex)
+ }
+ resultRefreshLayout.setOnLoadMoreListener {
+ isLoadMore = true
+ pageIndex++
+ obtainSearchResult(args, pageIndex)
+ }
+
+ //消警状态处理
+ cancelAlarmViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "处理中,请稍后")
+ }
+ is LoadState.Success -> {
+ DialogHelper.dismissLoadingDialog()
+ //刷新列表
+ BroadcastReceiverManager.instance.sendBroadcast(
+ Constant.CANCEL_ALARM_ACTION, ""
+ )
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+ }
+
+ private fun obtainSearchResult(args: ArrayList, pageIndex: Int) {
+ searchAlarmViewModel.obtainSearchResult(
+ args[0], args[1], args[2], args[3], args[4], args[5], "1", pageIndex
+ )
+ }
+
+ private class WeakReferenceHandler(activity: SearchResultActivity) :
+ Handler(Looper.getMainLooper()) {
+ private val reference: WeakReference = WeakReference(activity)
+
+ @SuppressLint("NotifyDataSetChanged")
+ override fun handleMessage(msg: Message) {
+ super.handleMessage(msg)
+ val activity = reference.get()!!
+ if (msg.what == 2022041501) {
+ if (activity.isRefresh || activity.isLoadMore) {
+ activity.alarmListAdapter.notifyDataSetChanged()
+ } else { //首次加载数据
+ if (activity.dataBeans.size == 0) {
+ activity.emptyView!!.showEmptyPage {
+ activity.obtainSearchResult(activity.args, activity.pageIndex)
+ }
+ } else {
+ activity.emptyView!!.hide()
+ activity.alarmListAdapter = AlarmListAdapter(activity, activity.dataBeans)
+ activity.resultRecyclerView!!.layoutManager = LinearLayoutManager(activity)
+ activity.resultRecyclerView!!.adapter = activity.alarmListAdapter
+ activity.alarmListAdapter.setOnItemClickListener(object :
+ AlarmListAdapter.OnItemClickListener {
+ override fun onClicked(position: Int) {
+ val wellId = activity.dataBeans[position].wellId.toString()
+ if (wellId.isBlank()) {
+ "井编号异常,无法查看详情".show()
+ return
+ }
+ activity.navigatePageTo(WellDetailActivity::class.java, wellId)
+ }
+
+ override fun onOperationClicked(position: Int) {
+ val wellDetail = activity.dataBeans[position]
+ CancelAlarmDialog.Builder()
+ .setContext(activity)
+ .setTitle("取消告警")
+ .setHintMessage("请输入详细的告警取消原因")
+ .setNegativeButton("取消")
+ .setPositiveButton("确定")
+ .setOnDialogButtonClickListener(object :
+ CancelAlarmDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick(
+ spinnerValue: String, inputValue: String
+ ) {
+ /**
+ * http://111.198.10.15:20104/alarm/cancelAlarm?id=&jobStatus=3&handleMessage=2fsdf
+ * POST
+ * */
+ val id = wellDetail.jobId
+ if (id.toString().isBlank()) {
+ "操作失败,告警ID异常".show()
+ return
+ }
+ val jobStatus = when (spinnerValue) {
+ "已处理" -> "3"
+ "无需处理" -> "4"
+ else -> ""
+ }
+ activity.cancelAlarmViewModel.obtainOperationResult(
+ id!!, jobStatus, inputValue
+ )
+ }
+
+ override fun onCancelClick() {
+
+ }
+ }).build().show()
+ }
+ })
+ }
+ }
+ }
+ }
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ //解注册广播接收者,防止内存泄漏
+ BroadcastReceiverManager.instance.destroy(Constant.CANCEL_ALARM_ACTION)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AlarmContentViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmContentViewModel.kt
new file mode 100644
index 0000000..8c1d4e3
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmContentViewModel.kt
@@ -0,0 +1,32 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AlarmContentModel
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class AlarmContentViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val contentModel = MutableLiveData()
+
+ fun obtainAlarmContent(type: String) = launch({
+ val response = RetrofitServiceManager.obtainAlarmContent(type)
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ contentModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ response.toErrorMessage().show()
+ }
+ }, {
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AlarmTypeViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmTypeViewModel.kt
new file mode 100644
index 0000000..dcaa579
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmTypeViewModel.kt
@@ -0,0 +1,32 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AlarmTypeModel
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class AlarmTypeViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val typeModel = MutableLiveData()
+
+ fun obtainAlarmType() = launch({
+ val response = RetrofitServiceManager.obtainAlarmType()
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ typeModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ response.toErrorMessage().show()
+ }
+ }, {
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AreaViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AreaViewModel.kt
new file mode 100644
index 0000000..6d06350
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/AreaViewModel.kt
@@ -0,0 +1,32 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AreaModel
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class AreaViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val areaModel = MutableLiveData()
+
+ fun obtainArea() = launch({
+ val response = RetrofitServiceManager.obtainArea()
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ areaModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ response.toErrorMessage().show()
+ }
+ }, {
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/SearchAlarmViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/SearchAlarmViewModel.kt
new file mode 100644
index 0000000..c3fc1da
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/SearchAlarmViewModel.kt
@@ -0,0 +1,48 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AlarmListModel
+import com.casic.qd.smartwell.utils.LoadState
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class SearchAlarmViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val listModel = MutableLiveData()
+
+ fun obtainSearchResult(
+ keywords: String?,
+ alarmType: String?,
+ areaId: String?,
+ alarmContentType: String?,
+ beginTime: String?,
+ endTime: String?,
+ status: String?,
+ page: Int
+ ) = launch({
+ loadState.value = LoadState.Loading
+ val response = RetrofitServiceManager.obtainSearchResult(
+ keywords, alarmType, areaId, alarmContentType, beginTime, endTime, status, page
+ )
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ loadState.value = LoadState.Success
+ listModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ loadState.value = LoadState.Fail
+ response.toErrorMessage().show()
+ }
+ }, {
+ loadState.value = LoadState.Fail
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_down.xml b/app/src/main/res/drawable/ic_down.xml
new file mode 100644
index 0000000..c6d8b0d
--- /dev/null
+++ b/app/src/main/res/drawable/ic_down.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_alarm_search.xml b/app/src/main/res/layout/activity_alarm_search.xml
new file mode 100644
index 0000000..3c9a5a7
--- /dev/null
+++ b/app/src/main/res/layout/activity_alarm_search.xml
@@ -0,0 +1,199 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index c86566b..b3a6cfc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,7 +31,6 @@
coroutines 'enable'
}
}
- buildToolsVersion '30.0.3'
}
dependencies {
@@ -81,4 +80,6 @@
implementation 'io.github.youth5201314:banner:2.2.2'
//WebView
implementation 'com.just.agentweb:agentweb-androidx:4.1.4'
+ //日期选择器
+ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f9514b2..45a9414 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -40,8 +40,10 @@
-
-
+
+
+
+
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
new file mode 100644
index 0000000..d3584c4
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
@@ -0,0 +1,13 @@
+package com.casic.qd.smartwell.extensions
+
+/**
+ * ArrayList扩展方法
+ */
+
+fun addAll(vararg args: String): ArrayList {
+ val result = ArrayList()
+ args.forEach {
+ result.add(it)
+ }
+ return result
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
new file mode 100644
index 0000000..7f68e3b
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
@@ -0,0 +1,21 @@
+package com.casic.qd.smartwell.extensions
+
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.*
+
+fun Long.timestampToTime(): String =
+ SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(Date(this))
+
+fun Long.isEarlierThanStart(date: String): Boolean {
+ if (date.isBlank()) {
+ return false
+ }
+ val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA)
+ try {
+ return this < dateFormat.parse(date)!!.time
+ } catch (e: ParseException) {
+
+ }
+ return true
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
new file mode 100644
index 0000000..3802496
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
@@ -0,0 +1,18 @@
+package com.casic.qd.smartwell.model
+
+class AlarmContentModel {
+ var code = 0
+ var data: DataBean? = null
+ var message: String? = null
+
+ class DataBean {
+ var list: List? = null
+
+ class ListBean {
+ var deviceType: String? = null
+ var alarmType: String? = null
+ var name: String? = null
+ var value: String? = null
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
new file mode 100644
index 0000000..ba9a6c7
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
@@ -0,0 +1,14 @@
+package com.casic.qd.smartwell.model
+
+class AlarmTypeModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var name: String? = null
+ var id: String? = null
+ var value: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
new file mode 100644
index 0000000..8761adf
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
@@ -0,0 +1,25 @@
+package com.casic.qd.smartwell.model
+
+class AreaModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var id: String? = null
+ var isSync: String? = null
+ var lat: String? = null
+ var level = 0
+ var levelName: String? = null
+ var lng: String? = null
+ var name: String? = null
+ var num = 0
+ var pName: String? = null
+ var pid: String? = null
+ var pids: String? = null
+ var simplename: String? = null
+ var targetIdSync: String? = null
+ var targetPidSync: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
index d73ecc1..ec902a8 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
@@ -12,6 +12,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L
val HOME_ICONS = arrayOf(
R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics,
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
index 15c30fc..7081e2c 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
@@ -85,4 +85,42 @@
@Field("jobStatus") jobStatus: String,
@Field("handleMessage") handleMessage: String
): String
+
+ /**
+ * 获取告警类型
+ */
+ @GET("/dict/code/alarmType")
+ suspend fun obtainAlarmType(@Header("token") token: String): String
+
+ /**
+ * 根据类型获取告警内容
+ */
+ @GET("/alarm/contentType")
+ suspend fun obtainAlarmContent(
+ @Header("token") token: String,
+ @Query("alarmType") alarmType: String
+ ): String
+
+ /**
+ * 获取区域
+ */
+ @GET("/device/getAreas")
+ suspend fun obtainArea(@Header("token") token: String): String
+
+ /**
+ * 查询告警
+ * */
+ @GET("/alarm/list")
+ suspend fun obtainSearchResult(
+ @Header("token") token: String,
+ @Query("keywords") keywords: String?,
+ @Query("alarmType") alarmType: String?,
+ @Query("areaId") areaId: String?,
+ @Query("alarmContentType") alarmContentType: String?,
+ @Query("beginTime") beginTime: String?,
+ @Query("endTime") endTime: String?,
+ @Query("status") status: String?,
+ @Query("offset") offset: Int,
+ @Query("limit") limit: Int
+ ): String
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
index a6f4726..9190ef1 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
@@ -81,4 +81,52 @@
): String {
return api.obtainOperationResult(AuthenticationHelper.token!!, id, jobStatus, handleMessage)
}
+
+ /**
+ * 获取告警类型
+ */
+ suspend fun obtainAlarmType(): String {
+ return api.obtainAlarmType(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 根据类型获取告警内容
+ */
+ suspend fun obtainAlarmContent(type: String): String {
+ return api.obtainAlarmContent(AuthenticationHelper.token!!, type)
+ }
+
+ /**
+ * 获取区域
+ */
+ suspend fun obtainArea(): String {
+ return api.obtainArea(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 查询告警
+ */
+ suspend fun obtainSearchResult(
+ keywords: String?,
+ alarmType: String?,
+ areaId: String?,
+ alarmContentType: String?,
+ beginTime: String?,
+ endTime: String?,
+ status: String?,
+ page: Int
+ ): String {
+ return api.obtainSearchResult(
+ AuthenticationHelper.token!!,
+ keywords,
+ alarmType,
+ areaId,
+ alarmContentType,
+ beginTime,
+ endTime,
+ status,
+ page,
+ Constant.PAGE_LIMIT
+ )
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
index b0debb7..8fcd142 100644
--- a/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
@@ -118,6 +118,10 @@
}
}
})
+
+ rightOptionView.setOnClickListener {
+ this.navigatePageTo(SearchAlarmActivity::class.java)
+ }
}
private fun obtainAlarmList(pageIndex: Int) {
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt
new file mode 100644
index 0000000..aef4154
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt
@@ -0,0 +1,168 @@
+package com.casic.qd.smartwell.view
+
+import android.view.View
+import androidx.lifecycle.ViewModelProvider
+import com.casic.qd.smartwell.R
+import com.casic.qd.smartwell.base.BaseActivity
+import com.casic.qd.smartwell.extensions.*
+import com.casic.qd.smartwell.model.AreaModel
+import com.casic.qd.smartwell.utils.Constant
+import com.casic.qd.smartwell.vm.AlarmContentViewModel
+import com.casic.qd.smartwell.vm.AlarmTypeViewModel
+import com.casic.qd.smartwell.vm.AreaViewModel
+import com.jzxiang.pickerview.TimePickerDialog
+import com.jzxiang.pickerview.data.Type
+import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet.BottomListSheetBuilder
+import kotlinx.android.synthetic.main.activity_alarm_search.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SearchAlarmActivity : BaseActivity() {
+
+ private val kTag = "SearchAlarmActivity"
+ private lateinit var alarmTypeViewModel: AlarmTypeViewModel
+ private lateinit var alarmContentViewModel: AlarmContentViewModel
+ private lateinit var areaViewModel: AreaViewModel
+ private var alarmType = ""
+ private var alarmContent = ""
+ private var firstLevelArea: MutableList = ArrayList()
+ private var secondLevelArea: MutableList = ArrayList()
+ private var thirdLevelArea: MutableList = ArrayList()
+ private var areaModels: MutableList = ArrayList()
+
+ override fun initLayoutView(): Int = R.layout.activity_alarm_search
+
+ override fun setupTopBarLayout() {
+ titleView.text = "告警查询"
+ leftBackView.visibility = View.GONE
+ }
+
+ override fun initData() {
+ //告警类型
+ alarmTypeViewModel = ViewModelProvider(this).get(AlarmTypeViewModel::class.java)
+ //告警内容
+ alarmContentViewModel = ViewModelProvider(this).get(AlarmContentViewModel::class.java)
+ //区域
+ areaViewModel = ViewModelProvider(this).get(AreaViewModel::class.java)
+ }
+
+ override fun initEvent() {
+ selectTypeView.setOnClickListener {
+ alarmTypeViewModel.obtainAlarmType()
+ }
+ alarmTypeViewModel.typeModel.observe(this, {
+ if (it.code == 200) {
+ val sheetBuilder = BottomListSheetBuilder(this)
+ sheetBuilder.setTitle("告警类型")
+ it.data?.forEach { dataBean ->
+ sheetBuilder.addItem(dataBean.name)
+ }
+ sheetBuilder.setGravityCenter(true)
+ .setOnSheetItemClickListener { dialog, itemView, position, tag ->
+ alarmTypeView.text = tag
+ alarmType = it.data!![position].value.toString()
+
+ //告警类型变了之后需要清空告警内容
+ alarmContentView.text = ""
+ dialog.dismiss()
+ }.build().show()
+ }
+ })
+
+ selectContentView.setOnClickListener {
+ //获取类型对应的报警内容
+ alarmContentViewModel.obtainAlarmContent(alarmType)
+ }
+ alarmContentViewModel.contentModel.observe(this, {
+ if (it.code == 200) {
+ val sheetBuilder = BottomListSheetBuilder(this)
+ sheetBuilder.setTitle("告警内容")
+ it.data?.list?.forEach { dataBean ->
+ sheetBuilder.addItem(dataBean.name)
+ }
+ sheetBuilder.setGravityCenter(true)
+ .setOnSheetItemClickListener { dialog, itemView, position, tag ->
+ alarmContentView.text = tag
+ alarmContent = it.data!!.list!![position].value.toString()
+
+ dialog.dismiss()
+ }.build().show()
+ }
+ })
+
+ //地区三级联动
+ selectAreaView.setOnClickListener {
+ areaViewModel.obtainArea()
+ }
+ areaViewModel.areaModel.observe(this, {
+ if (it.code == 200) {
+ it.data?.forEach { dataBean ->
+ when (dataBean.level) {
+ 2 -> firstLevelArea.add(dataBean)
+ 3 -> secondLevelArea.add(dataBean)
+ 4 -> thirdLevelArea.add(dataBean)
+ }
+ }
+ //TODO 绑定区域
+// Log.d(kTag, Gson().toJson(firstLevelArea))
+// Log.d(kTag, Gson().toJson(secondLevelArea))
+// Log.d(kTag, Gson().toJson(thirdLevelArea))
+ }
+ })
+
+ startTimeView.setOnClickListener {
+ TimePickerDialog.Builder()
+ .setThemeColor(R.color.mainThemeColor.convertColor())
+ .setTitleStringId("请选择开始时间")
+ .setWheelItemTextSize(16)
+ .setCyclic(false)
+ .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS)
+ .setMaxMillseconds(System.currentTimeMillis())
+ .setType(Type.ALL)
+ .setCallBack { _: TimePickerDialog?, millSeconds: Long ->
+ startTimeView.text = millSeconds.timestampToTime()
+ }.build().show(supportFragmentManager, "all")
+ }
+
+ endTimeView.setOnClickListener {
+ TimePickerDialog.Builder()
+ .setThemeColor(R.color.mainThemeColor.convertColor())
+ .setTitleStringId("请选择结束时间")
+ .setWheelItemTextSize(16)
+ .setCyclic(false)
+ .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS)
+ .setMaxMillseconds(System.currentTimeMillis())
+ .setType(Type.ALL)
+ .setCallBack { _: TimePickerDialog?, millSeconds: Long ->
+ if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) {
+ "结束时间不合法,不能早于开始时间".show()
+ return@setCallBack
+ }
+ endTimeView.text = millSeconds.timestampToTime()
+ }.build().show(supportFragmentManager, "all")
+ }
+
+ searchButton.setChangeAlphaWhenPress(true)
+ searchButton.setOnClickListener {
+ //页面跳转,将查询参数传过去
+ //TODO areaId待定
+ navigatePageTo(
+ SearchResultActivity::class.java, addAll(
+ wellCodeView.text.toString().trim(),
+ alarmType,
+ "",
+ alarmContent,
+ startTimeView.text.toString(),
+ endTimeView.text.toString()
+ )
+ )
+ }
+
+ clearButton.setChangeAlphaWhenPress(true)
+ clearButton.setOnClickListener {
+ alarmTypeView.text = ""
+ alarmContentView.text = ""
+ startTimeView.text = ""
+ endTimeView.text = ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt
new file mode 100644
index 0000000..32d0a3a
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt
@@ -0,0 +1,223 @@
+package com.casic.qd.smartwell.view
+
+import android.annotation.SuppressLint
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.os.Handler
+import android.os.Looper
+import android.os.Message
+import android.view.View
+import androidx.lifecycle.ViewModelProvider
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.casic.qd.smartwell.R
+import com.casic.qd.smartwell.adapter.AlarmListAdapter
+import com.casic.qd.smartwell.base.BaseActivity
+import com.casic.qd.smartwell.extensions.navigatePageTo
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.showEmptyPage
+import com.casic.qd.smartwell.model.AlarmListModel
+import com.casic.qd.smartwell.utils.BroadcastReceiverManager
+import com.casic.qd.smartwell.utils.Constant
+import com.casic.qd.smartwell.utils.DialogHelper
+import com.casic.qd.smartwell.utils.LoadState
+import com.casic.qd.smartwell.vm.CancelAlarmViewModel
+import com.casic.qd.smartwell.vm.SearchAlarmViewModel
+import com.casic.qd.smartwell.widgets.CancelAlarmDialog
+import kotlinx.android.synthetic.main.activity_alarm_search_result.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_empty_view.*
+import java.lang.ref.WeakReference
+
+class SearchResultActivity : BaseActivity() {
+ private lateinit var weakReferenceHandler: WeakReferenceHandler
+ private lateinit var searchAlarmViewModel: SearchAlarmViewModel
+ private lateinit var cancelAlarmViewModel: CancelAlarmViewModel
+ private lateinit var args: ArrayList
+ private lateinit var alarmListAdapter: AlarmListAdapter
+ private var dataBeans: MutableList = ArrayList()
+ private var pageIndex = 1
+ private var isRefresh = false
+ private var isLoadMore = false
+
+ override fun initLayoutView(): Int = R.layout.activity_alarm_search_result
+
+ override fun setupTopBarLayout() {
+ titleView.text = "查询结果"
+ leftBackView.visibility = View.GONE
+ }
+
+ override fun initData() {
+ args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!!
+ weakReferenceHandler = WeakReferenceHandler(this)
+ searchAlarmViewModel = ViewModelProvider(this).get(SearchAlarmViewModel::class.java)
+ cancelAlarmViewModel = ViewModelProvider(this).get(CancelAlarmViewModel::class.java)
+ //注册广播接收者
+ BroadcastReceiverManager.instance.addAction(Constant.CANCEL_ALARM_ACTION,
+ object : BroadcastReceiver() {
+ override fun onReceive(context: Context?, intent: Intent?) {
+ //收到广播相当于做了一次列表刷新
+ isRefresh = true
+ pageIndex = 1
+ obtainSearchResult(args, pageIndex)
+ }
+ })
+ }
+
+ override fun initEvent() {
+ obtainSearchResult(args, pageIndex)
+ searchAlarmViewModel.listModel.observe(this, {
+ if (it.code == 200) {
+ val dataRows = it.data?.rows
+ when {
+ isRefresh -> {
+ dataBeans.clear()
+ dataBeans = dataRows!!
+ resultRefreshLayout.finishRefresh()
+ isRefresh = false
+ }
+ isLoadMore -> {
+ if (dataRows?.size == 0) {
+ "到底了,别拉了".show()
+ }
+ dataBeans.addAll(dataRows!!)
+ resultRefreshLayout.finishLoadMore()
+ isLoadMore = false
+ }
+ else -> {
+ dataBeans = dataRows!!
+ }
+ }
+ weakReferenceHandler.sendEmptyMessage(2022041501)
+ }
+ })
+ searchAlarmViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "数据加载中,请稍后")
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+ resultRefreshLayout.setOnRefreshListener {
+ isRefresh = true
+ //刷新之后页码重置
+ pageIndex = 1
+ obtainSearchResult(args, pageIndex)
+ }
+ resultRefreshLayout.setOnLoadMoreListener {
+ isLoadMore = true
+ pageIndex++
+ obtainSearchResult(args, pageIndex)
+ }
+
+ //消警状态处理
+ cancelAlarmViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "处理中,请稍后")
+ }
+ is LoadState.Success -> {
+ DialogHelper.dismissLoadingDialog()
+ //刷新列表
+ BroadcastReceiverManager.instance.sendBroadcast(
+ Constant.CANCEL_ALARM_ACTION, ""
+ )
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+ }
+
+ private fun obtainSearchResult(args: ArrayList, pageIndex: Int) {
+ searchAlarmViewModel.obtainSearchResult(
+ args[0], args[1], args[2], args[3], args[4], args[5], "1", pageIndex
+ )
+ }
+
+ private class WeakReferenceHandler(activity: SearchResultActivity) :
+ Handler(Looper.getMainLooper()) {
+ private val reference: WeakReference = WeakReference(activity)
+
+ @SuppressLint("NotifyDataSetChanged")
+ override fun handleMessage(msg: Message) {
+ super.handleMessage(msg)
+ val activity = reference.get()!!
+ if (msg.what == 2022041501) {
+ if (activity.isRefresh || activity.isLoadMore) {
+ activity.alarmListAdapter.notifyDataSetChanged()
+ } else { //首次加载数据
+ if (activity.dataBeans.size == 0) {
+ activity.emptyView!!.showEmptyPage {
+ activity.obtainSearchResult(activity.args, activity.pageIndex)
+ }
+ } else {
+ activity.emptyView!!.hide()
+ activity.alarmListAdapter = AlarmListAdapter(activity, activity.dataBeans)
+ activity.resultRecyclerView!!.layoutManager = LinearLayoutManager(activity)
+ activity.resultRecyclerView!!.adapter = activity.alarmListAdapter
+ activity.alarmListAdapter.setOnItemClickListener(object :
+ AlarmListAdapter.OnItemClickListener {
+ override fun onClicked(position: Int) {
+ val wellId = activity.dataBeans[position].wellId.toString()
+ if (wellId.isBlank()) {
+ "井编号异常,无法查看详情".show()
+ return
+ }
+ activity.navigatePageTo(WellDetailActivity::class.java, wellId)
+ }
+
+ override fun onOperationClicked(position: Int) {
+ val wellDetail = activity.dataBeans[position]
+ CancelAlarmDialog.Builder()
+ .setContext(activity)
+ .setTitle("取消告警")
+ .setHintMessage("请输入详细的告警取消原因")
+ .setNegativeButton("取消")
+ .setPositiveButton("确定")
+ .setOnDialogButtonClickListener(object :
+ CancelAlarmDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick(
+ spinnerValue: String, inputValue: String
+ ) {
+ /**
+ * http://111.198.10.15:20104/alarm/cancelAlarm?id=&jobStatus=3&handleMessage=2fsdf
+ * POST
+ * */
+ val id = wellDetail.jobId
+ if (id.toString().isBlank()) {
+ "操作失败,告警ID异常".show()
+ return
+ }
+ val jobStatus = when (spinnerValue) {
+ "已处理" -> "3"
+ "无需处理" -> "4"
+ else -> ""
+ }
+ activity.cancelAlarmViewModel.obtainOperationResult(
+ id!!, jobStatus, inputValue
+ )
+ }
+
+ override fun onCancelClick() {
+
+ }
+ }).build().show()
+ }
+ })
+ }
+ }
+ }
+ }
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ //解注册广播接收者,防止内存泄漏
+ BroadcastReceiverManager.instance.destroy(Constant.CANCEL_ALARM_ACTION)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AlarmContentViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmContentViewModel.kt
new file mode 100644
index 0000000..8c1d4e3
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmContentViewModel.kt
@@ -0,0 +1,32 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AlarmContentModel
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class AlarmContentViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val contentModel = MutableLiveData()
+
+ fun obtainAlarmContent(type: String) = launch({
+ val response = RetrofitServiceManager.obtainAlarmContent(type)
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ contentModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ response.toErrorMessage().show()
+ }
+ }, {
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AlarmTypeViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmTypeViewModel.kt
new file mode 100644
index 0000000..dcaa579
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmTypeViewModel.kt
@@ -0,0 +1,32 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AlarmTypeModel
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class AlarmTypeViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val typeModel = MutableLiveData()
+
+ fun obtainAlarmType() = launch({
+ val response = RetrofitServiceManager.obtainAlarmType()
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ typeModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ response.toErrorMessage().show()
+ }
+ }, {
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AreaViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AreaViewModel.kt
new file mode 100644
index 0000000..6d06350
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/AreaViewModel.kt
@@ -0,0 +1,32 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AreaModel
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class AreaViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val areaModel = MutableLiveData()
+
+ fun obtainArea() = launch({
+ val response = RetrofitServiceManager.obtainArea()
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ areaModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ response.toErrorMessage().show()
+ }
+ }, {
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/SearchAlarmViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/SearchAlarmViewModel.kt
new file mode 100644
index 0000000..c3fc1da
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/SearchAlarmViewModel.kt
@@ -0,0 +1,48 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AlarmListModel
+import com.casic.qd.smartwell.utils.LoadState
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class SearchAlarmViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val listModel = MutableLiveData()
+
+ fun obtainSearchResult(
+ keywords: String?,
+ alarmType: String?,
+ areaId: String?,
+ alarmContentType: String?,
+ beginTime: String?,
+ endTime: String?,
+ status: String?,
+ page: Int
+ ) = launch({
+ loadState.value = LoadState.Loading
+ val response = RetrofitServiceManager.obtainSearchResult(
+ keywords, alarmType, areaId, alarmContentType, beginTime, endTime, status, page
+ )
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ loadState.value = LoadState.Success
+ listModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ loadState.value = LoadState.Fail
+ response.toErrorMessage().show()
+ }
+ }, {
+ loadState.value = LoadState.Fail
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_down.xml b/app/src/main/res/drawable/ic_down.xml
new file mode 100644
index 0000000..c6d8b0d
--- /dev/null
+++ b/app/src/main/res/drawable/ic_down.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_alarm_search.xml b/app/src/main/res/layout/activity_alarm_search.xml
new file mode 100644
index 0000000..3c9a5a7
--- /dev/null
+++ b/app/src/main/res/layout/activity_alarm_search.xml
@@ -0,0 +1,199 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_alarm_search_result.xml b/app/src/main/res/layout/activity_alarm_search_result.xml
new file mode 100644
index 0000000..c6512d5
--- /dev/null
+++ b/app/src/main/res/layout/activity_alarm_search_result.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index c86566b..b3a6cfc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,7 +31,6 @@
coroutines 'enable'
}
}
- buildToolsVersion '30.0.3'
}
dependencies {
@@ -81,4 +80,6 @@
implementation 'io.github.youth5201314:banner:2.2.2'
//WebView
implementation 'com.just.agentweb:agentweb-androidx:4.1.4'
+ //日期选择器
+ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f9514b2..45a9414 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -40,8 +40,10 @@
-
-
+
+
+
+
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
new file mode 100644
index 0000000..d3584c4
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ArrayList.kt
@@ -0,0 +1,13 @@
+package com.casic.qd.smartwell.extensions
+
+/**
+ * ArrayList扩展方法
+ */
+
+fun addAll(vararg args: String): ArrayList {
+ val result = ArrayList()
+ args.forEach {
+ result.add(it)
+ }
+ return result
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
new file mode 100644
index 0000000..7f68e3b
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Long.kt
@@ -0,0 +1,21 @@
+package com.casic.qd.smartwell.extensions
+
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.*
+
+fun Long.timestampToTime(): String =
+ SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(Date(this))
+
+fun Long.isEarlierThanStart(date: String): Boolean {
+ if (date.isBlank()) {
+ return false
+ }
+ val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA)
+ try {
+ return this < dateFormat.parse(date)!!.time
+ } catch (e: ParseException) {
+
+ }
+ return true
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
new file mode 100644
index 0000000..3802496
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmContentModel.kt
@@ -0,0 +1,18 @@
+package com.casic.qd.smartwell.model
+
+class AlarmContentModel {
+ var code = 0
+ var data: DataBean? = null
+ var message: String? = null
+
+ class DataBean {
+ var list: List? = null
+
+ class ListBean {
+ var deviceType: String? = null
+ var alarmType: String? = null
+ var name: String? = null
+ var value: String? = null
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
new file mode 100644
index 0000000..ba9a6c7
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AlarmTypeModel.kt
@@ -0,0 +1,14 @@
+package com.casic.qd.smartwell.model
+
+class AlarmTypeModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var name: String? = null
+ var id: String? = null
+ var value: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
new file mode 100644
index 0000000..8761adf
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/model/AreaModel.kt
@@ -0,0 +1,25 @@
+package com.casic.qd.smartwell.model
+
+class AreaModel {
+ var code = 0
+ var data: List? = null
+ var message: String? = null
+ var isSuccess = false
+
+ class DataBean {
+ var id: String? = null
+ var isSync: String? = null
+ var lat: String? = null
+ var level = 0
+ var levelName: String? = null
+ var lng: String? = null
+ var name: String? = null
+ var num = 0
+ var pName: String? = null
+ var pid: String? = null
+ var pids: String? = null
+ var simplename: String? = null
+ var targetIdSync: String? = null
+ var targetPidSync: String? = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
index d73ecc1..ec902a8 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt
@@ -12,6 +12,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L
val HOME_ICONS = arrayOf(
R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics,
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
index 15c30fc..7081e2c 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt
@@ -85,4 +85,42 @@
@Field("jobStatus") jobStatus: String,
@Field("handleMessage") handleMessage: String
): String
+
+ /**
+ * 获取告警类型
+ */
+ @GET("/dict/code/alarmType")
+ suspend fun obtainAlarmType(@Header("token") token: String): String
+
+ /**
+ * 根据类型获取告警内容
+ */
+ @GET("/alarm/contentType")
+ suspend fun obtainAlarmContent(
+ @Header("token") token: String,
+ @Query("alarmType") alarmType: String
+ ): String
+
+ /**
+ * 获取区域
+ */
+ @GET("/device/getAreas")
+ suspend fun obtainArea(@Header("token") token: String): String
+
+ /**
+ * 查询告警
+ * */
+ @GET("/alarm/list")
+ suspend fun obtainSearchResult(
+ @Header("token") token: String,
+ @Query("keywords") keywords: String?,
+ @Query("alarmType") alarmType: String?,
+ @Query("areaId") areaId: String?,
+ @Query("alarmContentType") alarmContentType: String?,
+ @Query("beginTime") beginTime: String?,
+ @Query("endTime") endTime: String?,
+ @Query("status") status: String?,
+ @Query("offset") offset: Int,
+ @Query("limit") limit: Int
+ ): String
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
index a6f4726..9190ef1 100644
--- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt
@@ -81,4 +81,52 @@
): String {
return api.obtainOperationResult(AuthenticationHelper.token!!, id, jobStatus, handleMessage)
}
+
+ /**
+ * 获取告警类型
+ */
+ suspend fun obtainAlarmType(): String {
+ return api.obtainAlarmType(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 根据类型获取告警内容
+ */
+ suspend fun obtainAlarmContent(type: String): String {
+ return api.obtainAlarmContent(AuthenticationHelper.token!!, type)
+ }
+
+ /**
+ * 获取区域
+ */
+ suspend fun obtainArea(): String {
+ return api.obtainArea(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 查询告警
+ */
+ suspend fun obtainSearchResult(
+ keywords: String?,
+ alarmType: String?,
+ areaId: String?,
+ alarmContentType: String?,
+ beginTime: String?,
+ endTime: String?,
+ status: String?,
+ page: Int
+ ): String {
+ return api.obtainSearchResult(
+ AuthenticationHelper.token!!,
+ keywords,
+ alarmType,
+ areaId,
+ alarmContentType,
+ beginTime,
+ endTime,
+ status,
+ page,
+ Constant.PAGE_LIMIT
+ )
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
index b0debb7..8fcd142 100644
--- a/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
+++ b/app/src/main/java/com/casic/qd/smartwell/view/AlarmManagementActivity.kt
@@ -118,6 +118,10 @@
}
}
})
+
+ rightOptionView.setOnClickListener {
+ this.navigatePageTo(SearchAlarmActivity::class.java)
+ }
}
private fun obtainAlarmList(pageIndex: Int) {
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt
new file mode 100644
index 0000000..aef4154
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt
@@ -0,0 +1,168 @@
+package com.casic.qd.smartwell.view
+
+import android.view.View
+import androidx.lifecycle.ViewModelProvider
+import com.casic.qd.smartwell.R
+import com.casic.qd.smartwell.base.BaseActivity
+import com.casic.qd.smartwell.extensions.*
+import com.casic.qd.smartwell.model.AreaModel
+import com.casic.qd.smartwell.utils.Constant
+import com.casic.qd.smartwell.vm.AlarmContentViewModel
+import com.casic.qd.smartwell.vm.AlarmTypeViewModel
+import com.casic.qd.smartwell.vm.AreaViewModel
+import com.jzxiang.pickerview.TimePickerDialog
+import com.jzxiang.pickerview.data.Type
+import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet.BottomListSheetBuilder
+import kotlinx.android.synthetic.main.activity_alarm_search.*
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class SearchAlarmActivity : BaseActivity() {
+
+ private val kTag = "SearchAlarmActivity"
+ private lateinit var alarmTypeViewModel: AlarmTypeViewModel
+ private lateinit var alarmContentViewModel: AlarmContentViewModel
+ private lateinit var areaViewModel: AreaViewModel
+ private var alarmType = ""
+ private var alarmContent = ""
+ private var firstLevelArea: MutableList = ArrayList()
+ private var secondLevelArea: MutableList = ArrayList()
+ private var thirdLevelArea: MutableList = ArrayList()
+ private var areaModels: MutableList = ArrayList()
+
+ override fun initLayoutView(): Int = R.layout.activity_alarm_search
+
+ override fun setupTopBarLayout() {
+ titleView.text = "告警查询"
+ leftBackView.visibility = View.GONE
+ }
+
+ override fun initData() {
+ //告警类型
+ alarmTypeViewModel = ViewModelProvider(this).get(AlarmTypeViewModel::class.java)
+ //告警内容
+ alarmContentViewModel = ViewModelProvider(this).get(AlarmContentViewModel::class.java)
+ //区域
+ areaViewModel = ViewModelProvider(this).get(AreaViewModel::class.java)
+ }
+
+ override fun initEvent() {
+ selectTypeView.setOnClickListener {
+ alarmTypeViewModel.obtainAlarmType()
+ }
+ alarmTypeViewModel.typeModel.observe(this, {
+ if (it.code == 200) {
+ val sheetBuilder = BottomListSheetBuilder(this)
+ sheetBuilder.setTitle("告警类型")
+ it.data?.forEach { dataBean ->
+ sheetBuilder.addItem(dataBean.name)
+ }
+ sheetBuilder.setGravityCenter(true)
+ .setOnSheetItemClickListener { dialog, itemView, position, tag ->
+ alarmTypeView.text = tag
+ alarmType = it.data!![position].value.toString()
+
+ //告警类型变了之后需要清空告警内容
+ alarmContentView.text = ""
+ dialog.dismiss()
+ }.build().show()
+ }
+ })
+
+ selectContentView.setOnClickListener {
+ //获取类型对应的报警内容
+ alarmContentViewModel.obtainAlarmContent(alarmType)
+ }
+ alarmContentViewModel.contentModel.observe(this, {
+ if (it.code == 200) {
+ val sheetBuilder = BottomListSheetBuilder(this)
+ sheetBuilder.setTitle("告警内容")
+ it.data?.list?.forEach { dataBean ->
+ sheetBuilder.addItem(dataBean.name)
+ }
+ sheetBuilder.setGravityCenter(true)
+ .setOnSheetItemClickListener { dialog, itemView, position, tag ->
+ alarmContentView.text = tag
+ alarmContent = it.data!!.list!![position].value.toString()
+
+ dialog.dismiss()
+ }.build().show()
+ }
+ })
+
+ //地区三级联动
+ selectAreaView.setOnClickListener {
+ areaViewModel.obtainArea()
+ }
+ areaViewModel.areaModel.observe(this, {
+ if (it.code == 200) {
+ it.data?.forEach { dataBean ->
+ when (dataBean.level) {
+ 2 -> firstLevelArea.add(dataBean)
+ 3 -> secondLevelArea.add(dataBean)
+ 4 -> thirdLevelArea.add(dataBean)
+ }
+ }
+ //TODO 绑定区域
+// Log.d(kTag, Gson().toJson(firstLevelArea))
+// Log.d(kTag, Gson().toJson(secondLevelArea))
+// Log.d(kTag, Gson().toJson(thirdLevelArea))
+ }
+ })
+
+ startTimeView.setOnClickListener {
+ TimePickerDialog.Builder()
+ .setThemeColor(R.color.mainThemeColor.convertColor())
+ .setTitleStringId("请选择开始时间")
+ .setWheelItemTextSize(16)
+ .setCyclic(false)
+ .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS)
+ .setMaxMillseconds(System.currentTimeMillis())
+ .setType(Type.ALL)
+ .setCallBack { _: TimePickerDialog?, millSeconds: Long ->
+ startTimeView.text = millSeconds.timestampToTime()
+ }.build().show(supportFragmentManager, "all")
+ }
+
+ endTimeView.setOnClickListener {
+ TimePickerDialog.Builder()
+ .setThemeColor(R.color.mainThemeColor.convertColor())
+ .setTitleStringId("请选择结束时间")
+ .setWheelItemTextSize(16)
+ .setCyclic(false)
+ .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS)
+ .setMaxMillseconds(System.currentTimeMillis())
+ .setType(Type.ALL)
+ .setCallBack { _: TimePickerDialog?, millSeconds: Long ->
+ if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) {
+ "结束时间不合法,不能早于开始时间".show()
+ return@setCallBack
+ }
+ endTimeView.text = millSeconds.timestampToTime()
+ }.build().show(supportFragmentManager, "all")
+ }
+
+ searchButton.setChangeAlphaWhenPress(true)
+ searchButton.setOnClickListener {
+ //页面跳转,将查询参数传过去
+ //TODO areaId待定
+ navigatePageTo(
+ SearchResultActivity::class.java, addAll(
+ wellCodeView.text.toString().trim(),
+ alarmType,
+ "",
+ alarmContent,
+ startTimeView.text.toString(),
+ endTimeView.text.toString()
+ )
+ )
+ }
+
+ clearButton.setChangeAlphaWhenPress(true)
+ clearButton.setOnClickListener {
+ alarmTypeView.text = ""
+ alarmContentView.text = ""
+ startTimeView.text = ""
+ endTimeView.text = ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt
new file mode 100644
index 0000000..32d0a3a
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt
@@ -0,0 +1,223 @@
+package com.casic.qd.smartwell.view
+
+import android.annotation.SuppressLint
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.os.Handler
+import android.os.Looper
+import android.os.Message
+import android.view.View
+import androidx.lifecycle.ViewModelProvider
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.casic.qd.smartwell.R
+import com.casic.qd.smartwell.adapter.AlarmListAdapter
+import com.casic.qd.smartwell.base.BaseActivity
+import com.casic.qd.smartwell.extensions.navigatePageTo
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.showEmptyPage
+import com.casic.qd.smartwell.model.AlarmListModel
+import com.casic.qd.smartwell.utils.BroadcastReceiverManager
+import com.casic.qd.smartwell.utils.Constant
+import com.casic.qd.smartwell.utils.DialogHelper
+import com.casic.qd.smartwell.utils.LoadState
+import com.casic.qd.smartwell.vm.CancelAlarmViewModel
+import com.casic.qd.smartwell.vm.SearchAlarmViewModel
+import com.casic.qd.smartwell.widgets.CancelAlarmDialog
+import kotlinx.android.synthetic.main.activity_alarm_search_result.*
+import kotlinx.android.synthetic.main.include_base_title.*
+import kotlinx.android.synthetic.main.include_empty_view.*
+import java.lang.ref.WeakReference
+
+class SearchResultActivity : BaseActivity() {
+ private lateinit var weakReferenceHandler: WeakReferenceHandler
+ private lateinit var searchAlarmViewModel: SearchAlarmViewModel
+ private lateinit var cancelAlarmViewModel: CancelAlarmViewModel
+ private lateinit var args: ArrayList
+ private lateinit var alarmListAdapter: AlarmListAdapter
+ private var dataBeans: MutableList = ArrayList()
+ private var pageIndex = 1
+ private var isRefresh = false
+ private var isLoadMore = false
+
+ override fun initLayoutView(): Int = R.layout.activity_alarm_search_result
+
+ override fun setupTopBarLayout() {
+ titleView.text = "查询结果"
+ leftBackView.visibility = View.GONE
+ }
+
+ override fun initData() {
+ args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!!
+ weakReferenceHandler = WeakReferenceHandler(this)
+ searchAlarmViewModel = ViewModelProvider(this).get(SearchAlarmViewModel::class.java)
+ cancelAlarmViewModel = ViewModelProvider(this).get(CancelAlarmViewModel::class.java)
+ //注册广播接收者
+ BroadcastReceiverManager.instance.addAction(Constant.CANCEL_ALARM_ACTION,
+ object : BroadcastReceiver() {
+ override fun onReceive(context: Context?, intent: Intent?) {
+ //收到广播相当于做了一次列表刷新
+ isRefresh = true
+ pageIndex = 1
+ obtainSearchResult(args, pageIndex)
+ }
+ })
+ }
+
+ override fun initEvent() {
+ obtainSearchResult(args, pageIndex)
+ searchAlarmViewModel.listModel.observe(this, {
+ if (it.code == 200) {
+ val dataRows = it.data?.rows
+ when {
+ isRefresh -> {
+ dataBeans.clear()
+ dataBeans = dataRows!!
+ resultRefreshLayout.finishRefresh()
+ isRefresh = false
+ }
+ isLoadMore -> {
+ if (dataRows?.size == 0) {
+ "到底了,别拉了".show()
+ }
+ dataBeans.addAll(dataRows!!)
+ resultRefreshLayout.finishLoadMore()
+ isLoadMore = false
+ }
+ else -> {
+ dataBeans = dataRows!!
+ }
+ }
+ weakReferenceHandler.sendEmptyMessage(2022041501)
+ }
+ })
+ searchAlarmViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "数据加载中,请稍后")
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+ resultRefreshLayout.setOnRefreshListener {
+ isRefresh = true
+ //刷新之后页码重置
+ pageIndex = 1
+ obtainSearchResult(args, pageIndex)
+ }
+ resultRefreshLayout.setOnLoadMoreListener {
+ isLoadMore = true
+ pageIndex++
+ obtainSearchResult(args, pageIndex)
+ }
+
+ //消警状态处理
+ cancelAlarmViewModel.loadState.observe(this, {
+ when (it) {
+ is LoadState.Loading -> {
+ DialogHelper.showLoadingDialog(this, "处理中,请稍后")
+ }
+ is LoadState.Success -> {
+ DialogHelper.dismissLoadingDialog()
+ //刷新列表
+ BroadcastReceiverManager.instance.sendBroadcast(
+ Constant.CANCEL_ALARM_ACTION, ""
+ )
+ }
+ else -> {
+ DialogHelper.dismissLoadingDialog()
+ }
+ }
+ })
+ }
+
+ private fun obtainSearchResult(args: ArrayList, pageIndex: Int) {
+ searchAlarmViewModel.obtainSearchResult(
+ args[0], args[1], args[2], args[3], args[4], args[5], "1", pageIndex
+ )
+ }
+
+ private class WeakReferenceHandler(activity: SearchResultActivity) :
+ Handler(Looper.getMainLooper()) {
+ private val reference: WeakReference = WeakReference(activity)
+
+ @SuppressLint("NotifyDataSetChanged")
+ override fun handleMessage(msg: Message) {
+ super.handleMessage(msg)
+ val activity = reference.get()!!
+ if (msg.what == 2022041501) {
+ if (activity.isRefresh || activity.isLoadMore) {
+ activity.alarmListAdapter.notifyDataSetChanged()
+ } else { //首次加载数据
+ if (activity.dataBeans.size == 0) {
+ activity.emptyView!!.showEmptyPage {
+ activity.obtainSearchResult(activity.args, activity.pageIndex)
+ }
+ } else {
+ activity.emptyView!!.hide()
+ activity.alarmListAdapter = AlarmListAdapter(activity, activity.dataBeans)
+ activity.resultRecyclerView!!.layoutManager = LinearLayoutManager(activity)
+ activity.resultRecyclerView!!.adapter = activity.alarmListAdapter
+ activity.alarmListAdapter.setOnItemClickListener(object :
+ AlarmListAdapter.OnItemClickListener {
+ override fun onClicked(position: Int) {
+ val wellId = activity.dataBeans[position].wellId.toString()
+ if (wellId.isBlank()) {
+ "井编号异常,无法查看详情".show()
+ return
+ }
+ activity.navigatePageTo(WellDetailActivity::class.java, wellId)
+ }
+
+ override fun onOperationClicked(position: Int) {
+ val wellDetail = activity.dataBeans[position]
+ CancelAlarmDialog.Builder()
+ .setContext(activity)
+ .setTitle("取消告警")
+ .setHintMessage("请输入详细的告警取消原因")
+ .setNegativeButton("取消")
+ .setPositiveButton("确定")
+ .setOnDialogButtonClickListener(object :
+ CancelAlarmDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick(
+ spinnerValue: String, inputValue: String
+ ) {
+ /**
+ * http://111.198.10.15:20104/alarm/cancelAlarm?id=&jobStatus=3&handleMessage=2fsdf
+ * POST
+ * */
+ val id = wellDetail.jobId
+ if (id.toString().isBlank()) {
+ "操作失败,告警ID异常".show()
+ return
+ }
+ val jobStatus = when (spinnerValue) {
+ "已处理" -> "3"
+ "无需处理" -> "4"
+ else -> ""
+ }
+ activity.cancelAlarmViewModel.obtainOperationResult(
+ id!!, jobStatus, inputValue
+ )
+ }
+
+ override fun onCancelClick() {
+
+ }
+ }).build().show()
+ }
+ })
+ }
+ }
+ }
+ }
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ //解注册广播接收者,防止内存泄漏
+ BroadcastReceiverManager.instance.destroy(Constant.CANCEL_ALARM_ACTION)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AlarmContentViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmContentViewModel.kt
new file mode 100644
index 0000000..8c1d4e3
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmContentViewModel.kt
@@ -0,0 +1,32 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AlarmContentModel
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class AlarmContentViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val contentModel = MutableLiveData()
+
+ fun obtainAlarmContent(type: String) = launch({
+ val response = RetrofitServiceManager.obtainAlarmContent(type)
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ contentModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ response.toErrorMessage().show()
+ }
+ }, {
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AlarmTypeViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmTypeViewModel.kt
new file mode 100644
index 0000000..dcaa579
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/AlarmTypeViewModel.kt
@@ -0,0 +1,32 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AlarmTypeModel
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class AlarmTypeViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val typeModel = MutableLiveData()
+
+ fun obtainAlarmType() = launch({
+ val response = RetrofitServiceManager.obtainAlarmType()
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ typeModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ response.toErrorMessage().show()
+ }
+ }, {
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AreaViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AreaViewModel.kt
new file mode 100644
index 0000000..6d06350
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/AreaViewModel.kt
@@ -0,0 +1,32 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AreaModel
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class AreaViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val areaModel = MutableLiveData()
+
+ fun obtainArea() = launch({
+ val response = RetrofitServiceManager.obtainArea()
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ areaModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ response.toErrorMessage().show()
+ }
+ }, {
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/SearchAlarmViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/SearchAlarmViewModel.kt
new file mode 100644
index 0000000..c3fc1da
--- /dev/null
+++ b/app/src/main/java/com/casic/qd/smartwell/vm/SearchAlarmViewModel.kt
@@ -0,0 +1,48 @@
+package com.casic.qd.smartwell.vm
+
+import androidx.lifecycle.MutableLiveData
+import com.casic.qd.smartwell.base.BaseViewModel
+import com.casic.qd.smartwell.extensions.launch
+import com.casic.qd.smartwell.extensions.separateResponseCode
+import com.casic.qd.smartwell.extensions.show
+import com.casic.qd.smartwell.extensions.toErrorMessage
+import com.casic.qd.smartwell.model.AlarmListModel
+import com.casic.qd.smartwell.utils.LoadState
+import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class SearchAlarmViewModel : BaseViewModel() {
+
+ private val gson = Gson()
+ val listModel = MutableLiveData()
+
+ fun obtainSearchResult(
+ keywords: String?,
+ alarmType: String?,
+ areaId: String?,
+ alarmContentType: String?,
+ beginTime: String?,
+ endTime: String?,
+ status: String?,
+ page: Int
+ ) = launch({
+ loadState.value = LoadState.Loading
+ val response = RetrofitServiceManager.obtainSearchResult(
+ keywords, alarmType, areaId, alarmContentType, beginTime, endTime, status, page
+ )
+ val responseCode = response.separateResponseCode()
+ if (responseCode == 200) {
+ loadState.value = LoadState.Success
+ listModel.value = gson.fromJson(
+ response, object : TypeToken() {}.type
+ )
+ } else {
+ loadState.value = LoadState.Fail
+ response.toErrorMessage().show()
+ }
+ }, {
+ loadState.value = LoadState.Fail
+ "服务器异常".show()
+ })
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_down.xml b/app/src/main/res/drawable/ic_down.xml
new file mode 100644
index 0000000..c6d8b0d
--- /dev/null
+++ b/app/src/main/res/drawable/ic_down.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_alarm_search.xml b/app/src/main/res/layout/activity_alarm_search.xml
new file mode 100644
index 0000000..3c9a5a7
--- /dev/null
+++ b/app/src/main/res/layout/activity_alarm_search.xml
@@ -0,0 +1,199 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_alarm_search_result.xml b/app/src/main/res/layout/activity_alarm_search_result.xml
new file mode 100644
index 0000000..c6512d5
--- /dev/null
+++ b/app/src/main/res/layout/activity_alarm_search_result.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index bf18772..6c19cc3 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -18,7 +18,6 @@
- @dimen/titleFontSize
- @color/mainThemeColor
- @color/mainThemeColor
- - 0dp
- @dimen/dp_5