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