diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5f605ca..1fe841c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5f605ca..1fe841c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt new file mode 100644 index 0000000..9996a4b --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt @@ -0,0 +1,54 @@ +package com.casic.smart.town.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.model.AlarmListModel + +class AlarmAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv_l, parent, false) + ) + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.deviceTypeNameView.text = String.format("设备类型:${rowsBean.deviceTypeName}") + holder.deviceStateView.text = rowsBean.onlineStateName + holder.locationView.text = String.format("异常点位置:${rowsBean.position}") + holder.installDateView.text = String.format("安装时间:${rowsBean.installDate}") + + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceTypeNameView: TextView = view.findViewById(R.id.deviceTypeNameView) + var deviceStateView: TextView = view.findViewById(R.id.deviceStateView) + var locationView: TextView = view.findViewById(R.id.locationView) + var installDateView: TextView = view.findViewById(R.id.installDateView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5f605ca..1fe841c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt new file mode 100644 index 0000000..9996a4b --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt @@ -0,0 +1,54 @@ +package com.casic.smart.town.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.model.AlarmListModel + +class AlarmAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv_l, parent, false) + ) + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.deviceTypeNameView.text = String.format("设备类型:${rowsBean.deviceTypeName}") + holder.deviceStateView.text = rowsBean.onlineStateName + holder.locationView.text = String.format("异常点位置:${rowsBean.position}") + holder.installDateView.text = String.format("安装时间:${rowsBean.installDate}") + + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceTypeNameView: TextView = view.findViewById(R.id.deviceTypeNameView) + var deviceStateView: TextView = view.findViewById(R.id.deviceStateView) + var locationView: TextView = view.findViewById(R.id.locationView) + var installDateView: TextView = view.findViewById(R.id.installDateView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt index 650e201..84ca796 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt @@ -1,9 +1,27 @@ package com.casic.smart.town.sanxi.fragment +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.adapter.AlarmAdapter +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.view.DeviceOnMapActivity +import com.casic.smart.town.sanxi.vm.AlarmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_alarm.* -class AlarmPageFragment: KotlinBaseFragment() { +class AlarmPageFragment : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var alarmAdapter: AlarmAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initLayoutView(): Int = R.layout.fragment_alarm @@ -16,10 +34,79 @@ } override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + alarmViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022102801) + } + }) } override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListData() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListData() + } + } + override fun onResume() { + super.onResume() + pageIndex = 1 + getAlarmListData() + } + + private fun getAlarmListData() { + alarmViewModel.getAlarmListData("", "", pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022102801) { + if (isRefresh || isLoadMore) { + alarmAdapter.notifyDataSetChanged() + } else { + alarmAdapter = AlarmAdapter(requireContext(), dataBeans) + alarmRecyclerView!!.adapter = alarmAdapter + alarmAdapter.setOnItemClickListener(object : + AlarmAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val deviceId = dataBeans[position].id.toString() + if (deviceId.isBlank()) { + "设备ID异常,无法查看位置".show(requireContext()) + return + } + requireContext().navigatePageTo(deviceId) + } + }) + } + } + true } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5f605ca..1fe841c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt new file mode 100644 index 0000000..9996a4b --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt @@ -0,0 +1,54 @@ +package com.casic.smart.town.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.model.AlarmListModel + +class AlarmAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv_l, parent, false) + ) + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.deviceTypeNameView.text = String.format("设备类型:${rowsBean.deviceTypeName}") + holder.deviceStateView.text = rowsBean.onlineStateName + holder.locationView.text = String.format("异常点位置:${rowsBean.position}") + holder.installDateView.text = String.format("安装时间:${rowsBean.installDate}") + + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceTypeNameView: TextView = view.findViewById(R.id.deviceTypeNameView) + var deviceStateView: TextView = view.findViewById(R.id.deviceStateView) + var locationView: TextView = view.findViewById(R.id.locationView) + var installDateView: TextView = view.findViewById(R.id.installDateView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt index 650e201..84ca796 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt @@ -1,9 +1,27 @@ package com.casic.smart.town.sanxi.fragment +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.adapter.AlarmAdapter +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.view.DeviceOnMapActivity +import com.casic.smart.town.sanxi.vm.AlarmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_alarm.* -class AlarmPageFragment: KotlinBaseFragment() { +class AlarmPageFragment : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var alarmAdapter: AlarmAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initLayoutView(): Int = R.layout.fragment_alarm @@ -16,10 +34,79 @@ } override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + alarmViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022102801) + } + }) } override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListData() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListData() + } + } + override fun onResume() { + super.onResume() + pageIndex = 1 + getAlarmListData() + } + + private fun getAlarmListData() { + alarmViewModel.getAlarmListData("", "", pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022102801) { + if (isRefresh || isLoadMore) { + alarmAdapter.notifyDataSetChanged() + } else { + alarmAdapter = AlarmAdapter(requireContext(), dataBeans) + alarmRecyclerView!!.adapter = alarmAdapter + alarmAdapter.setOnItemClickListener(object : + AlarmAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val deviceId = dataBeans[position].id.toString() + if (deviceId.isBlank()) { + "设备ID异常,无法查看位置".show(requireContext()) + return + } + requireContext().navigatePageTo(deviceId) + } + }) + } + } + true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java new file mode 100644 index 0000000..8c51878 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java @@ -0,0 +1,256 @@ +package com.casic.smart.town.sanxi.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataModel data; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public static class DataModel { + private List rows; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public static class RowsModel { + private String bfzt; + private String bfztName; + private String communication; + private String concenCode; + private String concenId; + private String deptName; + private String deptid; + private String devcode; + private String deviceName; + private String deviceType; + private String deviceTypeName; + private String id; + private String installDate; + private String installHeight; + private String modelId; + private String modelName; + private String onlineState; + private String onlineStateName; + private String position; + private String ts; + private String valid; + private String watchType; + private String wellCode; + private String wellId; + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCommunication() { + return communication; + } + + public void setCommunication(String communication) { + this.communication = communication; + } + + public String getConcenCode() { + return concenCode; + } + + public void setConcenCode(String concenCode) { + this.concenCode = concenCode; + } + + public String getConcenId() { + return concenId; + } + + public void setConcenId(String concenId) { + this.concenId = concenId; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getDeviceTypeName() { + return deviceTypeName; + } + + public void setDeviceTypeName(String deviceTypeName) { + this.deviceTypeName = deviceTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getInstallHeight() { + return installHeight; + } + + public void setInstallHeight(String installHeight) { + this.installHeight = installHeight; + } + + public String getModelId() { + return modelId; + } + + public void setModelId(String modelId) { + this.modelId = modelId; + } + + public String getModelName() { + return modelName; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellId() { + return wellId; + } + + public void setWellId(String wellId) { + this.wellId = wellId; + } + } + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5f605ca..1fe841c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt new file mode 100644 index 0000000..9996a4b --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt @@ -0,0 +1,54 @@ +package com.casic.smart.town.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.model.AlarmListModel + +class AlarmAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv_l, parent, false) + ) + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.deviceTypeNameView.text = String.format("设备类型:${rowsBean.deviceTypeName}") + holder.deviceStateView.text = rowsBean.onlineStateName + holder.locationView.text = String.format("异常点位置:${rowsBean.position}") + holder.installDateView.text = String.format("安装时间:${rowsBean.installDate}") + + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceTypeNameView: TextView = view.findViewById(R.id.deviceTypeNameView) + var deviceStateView: TextView = view.findViewById(R.id.deviceStateView) + var locationView: TextView = view.findViewById(R.id.locationView) + var installDateView: TextView = view.findViewById(R.id.installDateView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt index 650e201..84ca796 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt @@ -1,9 +1,27 @@ package com.casic.smart.town.sanxi.fragment +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.adapter.AlarmAdapter +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.view.DeviceOnMapActivity +import com.casic.smart.town.sanxi.vm.AlarmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_alarm.* -class AlarmPageFragment: KotlinBaseFragment() { +class AlarmPageFragment : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var alarmAdapter: AlarmAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initLayoutView(): Int = R.layout.fragment_alarm @@ -16,10 +34,79 @@ } override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + alarmViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022102801) + } + }) } override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListData() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListData() + } + } + override fun onResume() { + super.onResume() + pageIndex = 1 + getAlarmListData() + } + + private fun getAlarmListData() { + alarmViewModel.getAlarmListData("", "", pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022102801) { + if (isRefresh || isLoadMore) { + alarmAdapter.notifyDataSetChanged() + } else { + alarmAdapter = AlarmAdapter(requireContext(), dataBeans) + alarmRecyclerView!!.adapter = alarmAdapter + alarmAdapter.setOnItemClickListener(object : + AlarmAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val deviceId = dataBeans[position].id.toString() + if (deviceId.isBlank()) { + "设备ID异常,无法查看位置".show(requireContext()) + return + } + requireContext().navigatePageTo(deviceId) + } + }) + } + } + true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java new file mode 100644 index 0000000..8c51878 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java @@ -0,0 +1,256 @@ +package com.casic.smart.town.sanxi.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataModel data; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public static class DataModel { + private List rows; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public static class RowsModel { + private String bfzt; + private String bfztName; + private String communication; + private String concenCode; + private String concenId; + private String deptName; + private String deptid; + private String devcode; + private String deviceName; + private String deviceType; + private String deviceTypeName; + private String id; + private String installDate; + private String installHeight; + private String modelId; + private String modelName; + private String onlineState; + private String onlineStateName; + private String position; + private String ts; + private String valid; + private String watchType; + private String wellCode; + private String wellId; + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCommunication() { + return communication; + } + + public void setCommunication(String communication) { + this.communication = communication; + } + + public String getConcenCode() { + return concenCode; + } + + public void setConcenCode(String concenCode) { + this.concenCode = concenCode; + } + + public String getConcenId() { + return concenId; + } + + public void setConcenId(String concenId) { + this.concenId = concenId; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getDeviceTypeName() { + return deviceTypeName; + } + + public void setDeviceTypeName(String deviceTypeName) { + this.deviceTypeName = deviceTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getInstallHeight() { + return installHeight; + } + + public void setInstallHeight(String installHeight) { + this.installHeight = installHeight; + } + + public String getModelId() { + return modelId; + } + + public void setModelId(String modelId) { + this.modelId = modelId; + } + + public String getModelName() { + return modelName; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellId() { + return wellId; + } + + public void setWellId(String wellId) { + this.wellId = wellId; + } + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java new file mode 100644 index 0000000..6632b4a --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java @@ -0,0 +1,305 @@ +package com.casic.smart.town.sanxi.model; + +public class WellInfoModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String area; + private String bfzt; + private String bfztName; + private String coordinateX; + private String coordinateY; + private String deep; + private String deptName; + private String deptid; + private String deviceCount; + private String id; + private String latBaidu; + private String latGaode; + private String lngBaidu; + private String lngGaode; + private String notes; + private String photos; + private String position; + private String qu; + private String responsibleDept; + private String responsibleDeptName; + private String ts; + private String valid; + private String wellCode; + private String wellFlag1; + private String wellFlag2; + private String wellFlag3; + private String wellName; + private String wellType; + private String wellTypeName; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCoordinateX() { + return coordinateX; + } + + public void setCoordinateX(String coordinateX) { + this.coordinateX = coordinateX; + } + + public String getCoordinateY() { + return coordinateY; + } + + public void setCoordinateY(String coordinateY) { + this.coordinateY = coordinateY; + } + + public String getDeep() { + return deep; + } + + public void setDeep(String deep) { + this.deep = deep; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceCount() { + return deviceCount; + } + + public void setDeviceCount(String deviceCount) { + this.deviceCount = deviceCount; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLatBaidu() { + return latBaidu; + } + + public void setLatBaidu(String latBaidu) { + this.latBaidu = latBaidu; + } + + public String getLatGaode() { + return latGaode; + } + + public void setLatGaode(String latGaode) { + this.latGaode = latGaode; + } + + public String getLngBaidu() { + return lngBaidu; + } + + public void setLngBaidu(String lngBaidu) { + this.lngBaidu = lngBaidu; + } + + public String getLngGaode() { + return lngGaode; + } + + public void setLngGaode(String lngGaode) { + this.lngGaode = lngGaode; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } + + public String getPhotos() { + return photos; + } + + public void setPhotos(String photos) { + this.photos = photos; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getQu() { + return qu; + } + + public void setQu(String qu) { + this.qu = qu; + } + + public String getResponsibleDept() { + return responsibleDept; + } + + public void setResponsibleDept(String responsibleDept) { + this.responsibleDept = responsibleDept; + } + + public String getResponsibleDeptName() { + return responsibleDeptName; + } + + public void setResponsibleDeptName(String responsibleDeptName) { + this.responsibleDeptName = responsibleDeptName; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellFlag1() { + return wellFlag1; + } + + public void setWellFlag1(String wellFlag1) { + this.wellFlag1 = wellFlag1; + } + + public String getWellFlag2() { + return wellFlag2; + } + + public void setWellFlag2(String wellFlag2) { + this.wellFlag2 = wellFlag2; + } + + public String getWellFlag3() { + return wellFlag3; + } + + public void setWellFlag3(String wellFlag3) { + this.wellFlag3 = wellFlag3; + } + + public String getWellName() { + return wellName; + } + + public void setWellName(String wellName) { + this.wellName = wellName; + } + + public String getWellType() { + return wellType; + } + + public void setWellType(String wellType) { + this.wellType = wellType; + } + + public String getWellTypeName() { + return wellTypeName; + } + + public void setWellTypeName(String wellTypeName) { + this.wellTypeName = wellTypeName; + } + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5f605ca..1fe841c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt new file mode 100644 index 0000000..9996a4b --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt @@ -0,0 +1,54 @@ +package com.casic.smart.town.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.model.AlarmListModel + +class AlarmAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv_l, parent, false) + ) + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.deviceTypeNameView.text = String.format("设备类型:${rowsBean.deviceTypeName}") + holder.deviceStateView.text = rowsBean.onlineStateName + holder.locationView.text = String.format("异常点位置:${rowsBean.position}") + holder.installDateView.text = String.format("安装时间:${rowsBean.installDate}") + + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceTypeNameView: TextView = view.findViewById(R.id.deviceTypeNameView) + var deviceStateView: TextView = view.findViewById(R.id.deviceStateView) + var locationView: TextView = view.findViewById(R.id.locationView) + var installDateView: TextView = view.findViewById(R.id.installDateView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt index 650e201..84ca796 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt @@ -1,9 +1,27 @@ package com.casic.smart.town.sanxi.fragment +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.adapter.AlarmAdapter +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.view.DeviceOnMapActivity +import com.casic.smart.town.sanxi.vm.AlarmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_alarm.* -class AlarmPageFragment: KotlinBaseFragment() { +class AlarmPageFragment : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var alarmAdapter: AlarmAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initLayoutView(): Int = R.layout.fragment_alarm @@ -16,10 +34,79 @@ } override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + alarmViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022102801) + } + }) } override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListData() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListData() + } + } + override fun onResume() { + super.onResume() + pageIndex = 1 + getAlarmListData() + } + + private fun getAlarmListData() { + alarmViewModel.getAlarmListData("", "", pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022102801) { + if (isRefresh || isLoadMore) { + alarmAdapter.notifyDataSetChanged() + } else { + alarmAdapter = AlarmAdapter(requireContext(), dataBeans) + alarmRecyclerView!!.adapter = alarmAdapter + alarmAdapter.setOnItemClickListener(object : + AlarmAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val deviceId = dataBeans[position].id.toString() + if (deviceId.isBlank()) { + "设备ID异常,无法查看位置".show(requireContext()) + return + } + requireContext().navigatePageTo(deviceId) + } + }) + } + } + true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java new file mode 100644 index 0000000..8c51878 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java @@ -0,0 +1,256 @@ +package com.casic.smart.town.sanxi.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataModel data; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public static class DataModel { + private List rows; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public static class RowsModel { + private String bfzt; + private String bfztName; + private String communication; + private String concenCode; + private String concenId; + private String deptName; + private String deptid; + private String devcode; + private String deviceName; + private String deviceType; + private String deviceTypeName; + private String id; + private String installDate; + private String installHeight; + private String modelId; + private String modelName; + private String onlineState; + private String onlineStateName; + private String position; + private String ts; + private String valid; + private String watchType; + private String wellCode; + private String wellId; + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCommunication() { + return communication; + } + + public void setCommunication(String communication) { + this.communication = communication; + } + + public String getConcenCode() { + return concenCode; + } + + public void setConcenCode(String concenCode) { + this.concenCode = concenCode; + } + + public String getConcenId() { + return concenId; + } + + public void setConcenId(String concenId) { + this.concenId = concenId; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getDeviceTypeName() { + return deviceTypeName; + } + + public void setDeviceTypeName(String deviceTypeName) { + this.deviceTypeName = deviceTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getInstallHeight() { + return installHeight; + } + + public void setInstallHeight(String installHeight) { + this.installHeight = installHeight; + } + + public String getModelId() { + return modelId; + } + + public void setModelId(String modelId) { + this.modelId = modelId; + } + + public String getModelName() { + return modelName; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellId() { + return wellId; + } + + public void setWellId(String wellId) { + this.wellId = wellId; + } + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java new file mode 100644 index 0000000..6632b4a --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java @@ -0,0 +1,305 @@ +package com.casic.smart.town.sanxi.model; + +public class WellInfoModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String area; + private String bfzt; + private String bfztName; + private String coordinateX; + private String coordinateY; + private String deep; + private String deptName; + private String deptid; + private String deviceCount; + private String id; + private String latBaidu; + private String latGaode; + private String lngBaidu; + private String lngGaode; + private String notes; + private String photos; + private String position; + private String qu; + private String responsibleDept; + private String responsibleDeptName; + private String ts; + private String valid; + private String wellCode; + private String wellFlag1; + private String wellFlag2; + private String wellFlag3; + private String wellName; + private String wellType; + private String wellTypeName; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCoordinateX() { + return coordinateX; + } + + public void setCoordinateX(String coordinateX) { + this.coordinateX = coordinateX; + } + + public String getCoordinateY() { + return coordinateY; + } + + public void setCoordinateY(String coordinateY) { + this.coordinateY = coordinateY; + } + + public String getDeep() { + return deep; + } + + public void setDeep(String deep) { + this.deep = deep; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceCount() { + return deviceCount; + } + + public void setDeviceCount(String deviceCount) { + this.deviceCount = deviceCount; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLatBaidu() { + return latBaidu; + } + + public void setLatBaidu(String latBaidu) { + this.latBaidu = latBaidu; + } + + public String getLatGaode() { + return latGaode; + } + + public void setLatGaode(String latGaode) { + this.latGaode = latGaode; + } + + public String getLngBaidu() { + return lngBaidu; + } + + public void setLngBaidu(String lngBaidu) { + this.lngBaidu = lngBaidu; + } + + public String getLngGaode() { + return lngGaode; + } + + public void setLngGaode(String lngGaode) { + this.lngGaode = lngGaode; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } + + public String getPhotos() { + return photos; + } + + public void setPhotos(String photos) { + this.photos = photos; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getQu() { + return qu; + } + + public void setQu(String qu) { + this.qu = qu; + } + + public String getResponsibleDept() { + return responsibleDept; + } + + public void setResponsibleDept(String responsibleDept) { + this.responsibleDept = responsibleDept; + } + + public String getResponsibleDeptName() { + return responsibleDeptName; + } + + public void setResponsibleDeptName(String responsibleDeptName) { + this.responsibleDeptName = responsibleDeptName; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellFlag1() { + return wellFlag1; + } + + public void setWellFlag1(String wellFlag1) { + this.wellFlag1 = wellFlag1; + } + + public String getWellFlag2() { + return wellFlag2; + } + + public void setWellFlag2(String wellFlag2) { + this.wellFlag2 = wellFlag2; + } + + public String getWellFlag3() { + return wellFlag3; + } + + public void setWellFlag3(String wellFlag3) { + this.wellFlag3 = wellFlag3; + } + + public String getWellName() { + return wellName; + } + + public void setWellName(String wellName) { + this.wellName = wellName; + } + + public String getWellType() { + return wellType; + } + + public void setWellType(String wellType) { + this.wellType = wellType; + } + + public String getWellTypeName() { + return wellTypeName; + } + + public void setWellTypeName(String wellTypeName) { + this.wellTypeName = wellTypeName; + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt index 5b814d3..8b286d1 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt @@ -73,4 +73,22 @@ * */ @GET("/statics/deviceStaticsByType") suspend fun countDevice(@Header("token") token: String): String + + /** + * 异常设备状态列表 + * */ + @GET("/statics/deviceListPage") + suspend fun getAlarmListData( + @Header("token") token: String, + @Query("beginTime") beginTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + @GET("/statics/devicePosition") + suspend fun queryWellInfo( + @Header("token") token: String, + @Query("deviceId") deviceId: String + ): String } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5f605ca..1fe841c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt new file mode 100644 index 0000000..9996a4b --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt @@ -0,0 +1,54 @@ +package com.casic.smart.town.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.model.AlarmListModel + +class AlarmAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv_l, parent, false) + ) + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.deviceTypeNameView.text = String.format("设备类型:${rowsBean.deviceTypeName}") + holder.deviceStateView.text = rowsBean.onlineStateName + holder.locationView.text = String.format("异常点位置:${rowsBean.position}") + holder.installDateView.text = String.format("安装时间:${rowsBean.installDate}") + + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceTypeNameView: TextView = view.findViewById(R.id.deviceTypeNameView) + var deviceStateView: TextView = view.findViewById(R.id.deviceStateView) + var locationView: TextView = view.findViewById(R.id.locationView) + var installDateView: TextView = view.findViewById(R.id.installDateView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt index 650e201..84ca796 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt @@ -1,9 +1,27 @@ package com.casic.smart.town.sanxi.fragment +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.adapter.AlarmAdapter +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.view.DeviceOnMapActivity +import com.casic.smart.town.sanxi.vm.AlarmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_alarm.* -class AlarmPageFragment: KotlinBaseFragment() { +class AlarmPageFragment : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var alarmAdapter: AlarmAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initLayoutView(): Int = R.layout.fragment_alarm @@ -16,10 +34,79 @@ } override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + alarmViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022102801) + } + }) } override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListData() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListData() + } + } + override fun onResume() { + super.onResume() + pageIndex = 1 + getAlarmListData() + } + + private fun getAlarmListData() { + alarmViewModel.getAlarmListData("", "", pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022102801) { + if (isRefresh || isLoadMore) { + alarmAdapter.notifyDataSetChanged() + } else { + alarmAdapter = AlarmAdapter(requireContext(), dataBeans) + alarmRecyclerView!!.adapter = alarmAdapter + alarmAdapter.setOnItemClickListener(object : + AlarmAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val deviceId = dataBeans[position].id.toString() + if (deviceId.isBlank()) { + "设备ID异常,无法查看位置".show(requireContext()) + return + } + requireContext().navigatePageTo(deviceId) + } + }) + } + } + true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java new file mode 100644 index 0000000..8c51878 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java @@ -0,0 +1,256 @@ +package com.casic.smart.town.sanxi.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataModel data; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public static class DataModel { + private List rows; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public static class RowsModel { + private String bfzt; + private String bfztName; + private String communication; + private String concenCode; + private String concenId; + private String deptName; + private String deptid; + private String devcode; + private String deviceName; + private String deviceType; + private String deviceTypeName; + private String id; + private String installDate; + private String installHeight; + private String modelId; + private String modelName; + private String onlineState; + private String onlineStateName; + private String position; + private String ts; + private String valid; + private String watchType; + private String wellCode; + private String wellId; + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCommunication() { + return communication; + } + + public void setCommunication(String communication) { + this.communication = communication; + } + + public String getConcenCode() { + return concenCode; + } + + public void setConcenCode(String concenCode) { + this.concenCode = concenCode; + } + + public String getConcenId() { + return concenId; + } + + public void setConcenId(String concenId) { + this.concenId = concenId; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getDeviceTypeName() { + return deviceTypeName; + } + + public void setDeviceTypeName(String deviceTypeName) { + this.deviceTypeName = deviceTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getInstallHeight() { + return installHeight; + } + + public void setInstallHeight(String installHeight) { + this.installHeight = installHeight; + } + + public String getModelId() { + return modelId; + } + + public void setModelId(String modelId) { + this.modelId = modelId; + } + + public String getModelName() { + return modelName; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellId() { + return wellId; + } + + public void setWellId(String wellId) { + this.wellId = wellId; + } + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java new file mode 100644 index 0000000..6632b4a --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java @@ -0,0 +1,305 @@ +package com.casic.smart.town.sanxi.model; + +public class WellInfoModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String area; + private String bfzt; + private String bfztName; + private String coordinateX; + private String coordinateY; + private String deep; + private String deptName; + private String deptid; + private String deviceCount; + private String id; + private String latBaidu; + private String latGaode; + private String lngBaidu; + private String lngGaode; + private String notes; + private String photos; + private String position; + private String qu; + private String responsibleDept; + private String responsibleDeptName; + private String ts; + private String valid; + private String wellCode; + private String wellFlag1; + private String wellFlag2; + private String wellFlag3; + private String wellName; + private String wellType; + private String wellTypeName; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCoordinateX() { + return coordinateX; + } + + public void setCoordinateX(String coordinateX) { + this.coordinateX = coordinateX; + } + + public String getCoordinateY() { + return coordinateY; + } + + public void setCoordinateY(String coordinateY) { + this.coordinateY = coordinateY; + } + + public String getDeep() { + return deep; + } + + public void setDeep(String deep) { + this.deep = deep; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceCount() { + return deviceCount; + } + + public void setDeviceCount(String deviceCount) { + this.deviceCount = deviceCount; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLatBaidu() { + return latBaidu; + } + + public void setLatBaidu(String latBaidu) { + this.latBaidu = latBaidu; + } + + public String getLatGaode() { + return latGaode; + } + + public void setLatGaode(String latGaode) { + this.latGaode = latGaode; + } + + public String getLngBaidu() { + return lngBaidu; + } + + public void setLngBaidu(String lngBaidu) { + this.lngBaidu = lngBaidu; + } + + public String getLngGaode() { + return lngGaode; + } + + public void setLngGaode(String lngGaode) { + this.lngGaode = lngGaode; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } + + public String getPhotos() { + return photos; + } + + public void setPhotos(String photos) { + this.photos = photos; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getQu() { + return qu; + } + + public void setQu(String qu) { + this.qu = qu; + } + + public String getResponsibleDept() { + return responsibleDept; + } + + public void setResponsibleDept(String responsibleDept) { + this.responsibleDept = responsibleDept; + } + + public String getResponsibleDeptName() { + return responsibleDeptName; + } + + public void setResponsibleDeptName(String responsibleDeptName) { + this.responsibleDeptName = responsibleDeptName; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellFlag1() { + return wellFlag1; + } + + public void setWellFlag1(String wellFlag1) { + this.wellFlag1 = wellFlag1; + } + + public String getWellFlag2() { + return wellFlag2; + } + + public void setWellFlag2(String wellFlag2) { + this.wellFlag2 = wellFlag2; + } + + public String getWellFlag3() { + return wellFlag3; + } + + public void setWellFlag3(String wellFlag3) { + this.wellFlag3 = wellFlag3; + } + + public String getWellName() { + return wellName; + } + + public void setWellName(String wellName) { + this.wellName = wellName; + } + + public String getWellType() { + return wellType; + } + + public void setWellType(String wellType) { + this.wellType = wellType; + } + + public String getWellTypeName() { + return wellTypeName; + } + + public void setWellTypeName(String wellTypeName) { + this.wellTypeName = wellTypeName; + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt index 5b814d3..8b286d1 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt @@ -73,4 +73,22 @@ * */ @GET("/statics/deviceStaticsByType") suspend fun countDevice(@Header("token") token: String): String + + /** + * 异常设备状态列表 + * */ + @GET("/statics/deviceListPage") + suspend fun getAlarmListData( + @Header("token") token: String, + @Query("beginTime") beginTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + @GET("/statics/devicePosition") + suspend fun queryWellInfo( + @Header("token") token: String, + @Query("deviceId") deviceId: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt index 0d9cfc7..43c3d7d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt @@ -79,4 +79,18 @@ suspend fun countDevice(): String { return smartTownApi.countDevice(AuthenticationHelper.token!!) } + + suspend fun getAlarmListData(beginTime: String, endTime: String, offset: Int): String { + return smartTownApi.getAlarmListData( + AuthenticationHelper.token!!, + beginTime, + endTime, + LocaleConstant.PAGE_LIMIT, + offset + ) + } + + suspend fun queryWellInfo(deviceId: String): String { + return smartTownApi.queryWellInfo(AuthenticationHelper.token!!, deviceId) + } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5f605ca..1fe841c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt new file mode 100644 index 0000000..9996a4b --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt @@ -0,0 +1,54 @@ +package com.casic.smart.town.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.model.AlarmListModel + +class AlarmAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv_l, parent, false) + ) + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.deviceTypeNameView.text = String.format("设备类型:${rowsBean.deviceTypeName}") + holder.deviceStateView.text = rowsBean.onlineStateName + holder.locationView.text = String.format("异常点位置:${rowsBean.position}") + holder.installDateView.text = String.format("安装时间:${rowsBean.installDate}") + + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceTypeNameView: TextView = view.findViewById(R.id.deviceTypeNameView) + var deviceStateView: TextView = view.findViewById(R.id.deviceStateView) + var locationView: TextView = view.findViewById(R.id.locationView) + var installDateView: TextView = view.findViewById(R.id.installDateView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt index 650e201..84ca796 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt @@ -1,9 +1,27 @@ package com.casic.smart.town.sanxi.fragment +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.adapter.AlarmAdapter +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.view.DeviceOnMapActivity +import com.casic.smart.town.sanxi.vm.AlarmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_alarm.* -class AlarmPageFragment: KotlinBaseFragment() { +class AlarmPageFragment : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var alarmAdapter: AlarmAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initLayoutView(): Int = R.layout.fragment_alarm @@ -16,10 +34,79 @@ } override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + alarmViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022102801) + } + }) } override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListData() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListData() + } + } + override fun onResume() { + super.onResume() + pageIndex = 1 + getAlarmListData() + } + + private fun getAlarmListData() { + alarmViewModel.getAlarmListData("", "", pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022102801) { + if (isRefresh || isLoadMore) { + alarmAdapter.notifyDataSetChanged() + } else { + alarmAdapter = AlarmAdapter(requireContext(), dataBeans) + alarmRecyclerView!!.adapter = alarmAdapter + alarmAdapter.setOnItemClickListener(object : + AlarmAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val deviceId = dataBeans[position].id.toString() + if (deviceId.isBlank()) { + "设备ID异常,无法查看位置".show(requireContext()) + return + } + requireContext().navigatePageTo(deviceId) + } + }) + } + } + true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java new file mode 100644 index 0000000..8c51878 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java @@ -0,0 +1,256 @@ +package com.casic.smart.town.sanxi.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataModel data; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public static class DataModel { + private List rows; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public static class RowsModel { + private String bfzt; + private String bfztName; + private String communication; + private String concenCode; + private String concenId; + private String deptName; + private String deptid; + private String devcode; + private String deviceName; + private String deviceType; + private String deviceTypeName; + private String id; + private String installDate; + private String installHeight; + private String modelId; + private String modelName; + private String onlineState; + private String onlineStateName; + private String position; + private String ts; + private String valid; + private String watchType; + private String wellCode; + private String wellId; + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCommunication() { + return communication; + } + + public void setCommunication(String communication) { + this.communication = communication; + } + + public String getConcenCode() { + return concenCode; + } + + public void setConcenCode(String concenCode) { + this.concenCode = concenCode; + } + + public String getConcenId() { + return concenId; + } + + public void setConcenId(String concenId) { + this.concenId = concenId; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getDeviceTypeName() { + return deviceTypeName; + } + + public void setDeviceTypeName(String deviceTypeName) { + this.deviceTypeName = deviceTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getInstallHeight() { + return installHeight; + } + + public void setInstallHeight(String installHeight) { + this.installHeight = installHeight; + } + + public String getModelId() { + return modelId; + } + + public void setModelId(String modelId) { + this.modelId = modelId; + } + + public String getModelName() { + return modelName; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellId() { + return wellId; + } + + public void setWellId(String wellId) { + this.wellId = wellId; + } + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java new file mode 100644 index 0000000..6632b4a --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java @@ -0,0 +1,305 @@ +package com.casic.smart.town.sanxi.model; + +public class WellInfoModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String area; + private String bfzt; + private String bfztName; + private String coordinateX; + private String coordinateY; + private String deep; + private String deptName; + private String deptid; + private String deviceCount; + private String id; + private String latBaidu; + private String latGaode; + private String lngBaidu; + private String lngGaode; + private String notes; + private String photos; + private String position; + private String qu; + private String responsibleDept; + private String responsibleDeptName; + private String ts; + private String valid; + private String wellCode; + private String wellFlag1; + private String wellFlag2; + private String wellFlag3; + private String wellName; + private String wellType; + private String wellTypeName; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCoordinateX() { + return coordinateX; + } + + public void setCoordinateX(String coordinateX) { + this.coordinateX = coordinateX; + } + + public String getCoordinateY() { + return coordinateY; + } + + public void setCoordinateY(String coordinateY) { + this.coordinateY = coordinateY; + } + + public String getDeep() { + return deep; + } + + public void setDeep(String deep) { + this.deep = deep; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceCount() { + return deviceCount; + } + + public void setDeviceCount(String deviceCount) { + this.deviceCount = deviceCount; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLatBaidu() { + return latBaidu; + } + + public void setLatBaidu(String latBaidu) { + this.latBaidu = latBaidu; + } + + public String getLatGaode() { + return latGaode; + } + + public void setLatGaode(String latGaode) { + this.latGaode = latGaode; + } + + public String getLngBaidu() { + return lngBaidu; + } + + public void setLngBaidu(String lngBaidu) { + this.lngBaidu = lngBaidu; + } + + public String getLngGaode() { + return lngGaode; + } + + public void setLngGaode(String lngGaode) { + this.lngGaode = lngGaode; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } + + public String getPhotos() { + return photos; + } + + public void setPhotos(String photos) { + this.photos = photos; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getQu() { + return qu; + } + + public void setQu(String qu) { + this.qu = qu; + } + + public String getResponsibleDept() { + return responsibleDept; + } + + public void setResponsibleDept(String responsibleDept) { + this.responsibleDept = responsibleDept; + } + + public String getResponsibleDeptName() { + return responsibleDeptName; + } + + public void setResponsibleDeptName(String responsibleDeptName) { + this.responsibleDeptName = responsibleDeptName; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellFlag1() { + return wellFlag1; + } + + public void setWellFlag1(String wellFlag1) { + this.wellFlag1 = wellFlag1; + } + + public String getWellFlag2() { + return wellFlag2; + } + + public void setWellFlag2(String wellFlag2) { + this.wellFlag2 = wellFlag2; + } + + public String getWellFlag3() { + return wellFlag3; + } + + public void setWellFlag3(String wellFlag3) { + this.wellFlag3 = wellFlag3; + } + + public String getWellName() { + return wellName; + } + + public void setWellName(String wellName) { + this.wellName = wellName; + } + + public String getWellType() { + return wellType; + } + + public void setWellType(String wellType) { + this.wellType = wellType; + } + + public String getWellTypeName() { + return wellTypeName; + } + + public void setWellTypeName(String wellTypeName) { + this.wellTypeName = wellTypeName; + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt index 5b814d3..8b286d1 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt @@ -73,4 +73,22 @@ * */ @GET("/statics/deviceStaticsByType") suspend fun countDevice(@Header("token") token: String): String + + /** + * 异常设备状态列表 + * */ + @GET("/statics/deviceListPage") + suspend fun getAlarmListData( + @Header("token") token: String, + @Query("beginTime") beginTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + @GET("/statics/devicePosition") + suspend fun queryWellInfo( + @Header("token") token: String, + @Query("deviceId") deviceId: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt index 0d9cfc7..43c3d7d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt @@ -79,4 +79,18 @@ suspend fun countDevice(): String { return smartTownApi.countDevice(AuthenticationHelper.token!!) } + + suspend fun getAlarmListData(beginTime: String, endTime: String, offset: Int): String { + return smartTownApi.getAlarmListData( + AuthenticationHelper.token!!, + beginTime, + endTime, + LocaleConstant.PAGE_LIMIT, + offset + ) + } + + suspend fun queryWellInfo(deviceId: String): String { + return smartTownApi.queryWellInfo(AuthenticationHelper.token!!, deviceId) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt new file mode 100644 index 0000000..c31f25d --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt @@ -0,0 +1,117 @@ +package com.casic.smart.town.sanxi.view + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.MarkerOptions +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.util.LoadingDialogHub +import com.casic.smart.town.sanxi.vm.WellViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_device_on_map.* +import kotlinx.android.synthetic.main.include_base_title.* + +class DeviceOnMapActivity : AppCompatActivity() { + + private val kTag = "DeviceOnMapActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var aMap: AMap + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_device_on_map) + + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + titleView.text = "异常报警位置" + leftBackView.setOnClickListener { finish() } + + setMapConfig(savedInstanceState) + + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + wellViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + wellViewModel.queryWellInfo(deviceId) + wellViewModel.wellResultModel.observe(this, { + if (it.code == 200) { + val lat = it.data.latGaode.toString() + val lng = it.data.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + val latLng = LatLng(latitude, longitude) + //移动到指定经纬度 + val cameraPosition = CameraPosition(latLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 2000, null) + + aMap.addMarker( + MarkerOptions() + .position(latLng) + .icon( + BitmapDescriptorFactory.fromBitmap( + BitmapDescriptorFactory.fromResource(R.mipmap.map_pin).bitmap + ) + ) + .title("") + .snippet("") + ) + } + } else { + "经纬度异常".show(this) + } + } + }) + } + + private fun setMapConfig(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5f605ca..1fe841c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt new file mode 100644 index 0000000..9996a4b --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt @@ -0,0 +1,54 @@ +package com.casic.smart.town.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.model.AlarmListModel + +class AlarmAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv_l, parent, false) + ) + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.deviceTypeNameView.text = String.format("设备类型:${rowsBean.deviceTypeName}") + holder.deviceStateView.text = rowsBean.onlineStateName + holder.locationView.text = String.format("异常点位置:${rowsBean.position}") + holder.installDateView.text = String.format("安装时间:${rowsBean.installDate}") + + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceTypeNameView: TextView = view.findViewById(R.id.deviceTypeNameView) + var deviceStateView: TextView = view.findViewById(R.id.deviceStateView) + var locationView: TextView = view.findViewById(R.id.locationView) + var installDateView: TextView = view.findViewById(R.id.installDateView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt index 650e201..84ca796 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt @@ -1,9 +1,27 @@ package com.casic.smart.town.sanxi.fragment +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.adapter.AlarmAdapter +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.view.DeviceOnMapActivity +import com.casic.smart.town.sanxi.vm.AlarmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_alarm.* -class AlarmPageFragment: KotlinBaseFragment() { +class AlarmPageFragment : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var alarmAdapter: AlarmAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initLayoutView(): Int = R.layout.fragment_alarm @@ -16,10 +34,79 @@ } override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + alarmViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022102801) + } + }) } override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListData() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListData() + } + } + override fun onResume() { + super.onResume() + pageIndex = 1 + getAlarmListData() + } + + private fun getAlarmListData() { + alarmViewModel.getAlarmListData("", "", pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022102801) { + if (isRefresh || isLoadMore) { + alarmAdapter.notifyDataSetChanged() + } else { + alarmAdapter = AlarmAdapter(requireContext(), dataBeans) + alarmRecyclerView!!.adapter = alarmAdapter + alarmAdapter.setOnItemClickListener(object : + AlarmAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val deviceId = dataBeans[position].id.toString() + if (deviceId.isBlank()) { + "设备ID异常,无法查看位置".show(requireContext()) + return + } + requireContext().navigatePageTo(deviceId) + } + }) + } + } + true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java new file mode 100644 index 0000000..8c51878 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java @@ -0,0 +1,256 @@ +package com.casic.smart.town.sanxi.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataModel data; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public static class DataModel { + private List rows; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public static class RowsModel { + private String bfzt; + private String bfztName; + private String communication; + private String concenCode; + private String concenId; + private String deptName; + private String deptid; + private String devcode; + private String deviceName; + private String deviceType; + private String deviceTypeName; + private String id; + private String installDate; + private String installHeight; + private String modelId; + private String modelName; + private String onlineState; + private String onlineStateName; + private String position; + private String ts; + private String valid; + private String watchType; + private String wellCode; + private String wellId; + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCommunication() { + return communication; + } + + public void setCommunication(String communication) { + this.communication = communication; + } + + public String getConcenCode() { + return concenCode; + } + + public void setConcenCode(String concenCode) { + this.concenCode = concenCode; + } + + public String getConcenId() { + return concenId; + } + + public void setConcenId(String concenId) { + this.concenId = concenId; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getDeviceTypeName() { + return deviceTypeName; + } + + public void setDeviceTypeName(String deviceTypeName) { + this.deviceTypeName = deviceTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getInstallHeight() { + return installHeight; + } + + public void setInstallHeight(String installHeight) { + this.installHeight = installHeight; + } + + public String getModelId() { + return modelId; + } + + public void setModelId(String modelId) { + this.modelId = modelId; + } + + public String getModelName() { + return modelName; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellId() { + return wellId; + } + + public void setWellId(String wellId) { + this.wellId = wellId; + } + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java new file mode 100644 index 0000000..6632b4a --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java @@ -0,0 +1,305 @@ +package com.casic.smart.town.sanxi.model; + +public class WellInfoModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String area; + private String bfzt; + private String bfztName; + private String coordinateX; + private String coordinateY; + private String deep; + private String deptName; + private String deptid; + private String deviceCount; + private String id; + private String latBaidu; + private String latGaode; + private String lngBaidu; + private String lngGaode; + private String notes; + private String photos; + private String position; + private String qu; + private String responsibleDept; + private String responsibleDeptName; + private String ts; + private String valid; + private String wellCode; + private String wellFlag1; + private String wellFlag2; + private String wellFlag3; + private String wellName; + private String wellType; + private String wellTypeName; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCoordinateX() { + return coordinateX; + } + + public void setCoordinateX(String coordinateX) { + this.coordinateX = coordinateX; + } + + public String getCoordinateY() { + return coordinateY; + } + + public void setCoordinateY(String coordinateY) { + this.coordinateY = coordinateY; + } + + public String getDeep() { + return deep; + } + + public void setDeep(String deep) { + this.deep = deep; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceCount() { + return deviceCount; + } + + public void setDeviceCount(String deviceCount) { + this.deviceCount = deviceCount; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLatBaidu() { + return latBaidu; + } + + public void setLatBaidu(String latBaidu) { + this.latBaidu = latBaidu; + } + + public String getLatGaode() { + return latGaode; + } + + public void setLatGaode(String latGaode) { + this.latGaode = latGaode; + } + + public String getLngBaidu() { + return lngBaidu; + } + + public void setLngBaidu(String lngBaidu) { + this.lngBaidu = lngBaidu; + } + + public String getLngGaode() { + return lngGaode; + } + + public void setLngGaode(String lngGaode) { + this.lngGaode = lngGaode; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } + + public String getPhotos() { + return photos; + } + + public void setPhotos(String photos) { + this.photos = photos; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getQu() { + return qu; + } + + public void setQu(String qu) { + this.qu = qu; + } + + public String getResponsibleDept() { + return responsibleDept; + } + + public void setResponsibleDept(String responsibleDept) { + this.responsibleDept = responsibleDept; + } + + public String getResponsibleDeptName() { + return responsibleDeptName; + } + + public void setResponsibleDeptName(String responsibleDeptName) { + this.responsibleDeptName = responsibleDeptName; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellFlag1() { + return wellFlag1; + } + + public void setWellFlag1(String wellFlag1) { + this.wellFlag1 = wellFlag1; + } + + public String getWellFlag2() { + return wellFlag2; + } + + public void setWellFlag2(String wellFlag2) { + this.wellFlag2 = wellFlag2; + } + + public String getWellFlag3() { + return wellFlag3; + } + + public void setWellFlag3(String wellFlag3) { + this.wellFlag3 = wellFlag3; + } + + public String getWellName() { + return wellName; + } + + public void setWellName(String wellName) { + this.wellName = wellName; + } + + public String getWellType() { + return wellType; + } + + public void setWellType(String wellType) { + this.wellType = wellType; + } + + public String getWellTypeName() { + return wellTypeName; + } + + public void setWellTypeName(String wellTypeName) { + this.wellTypeName = wellTypeName; + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt index 5b814d3..8b286d1 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt @@ -73,4 +73,22 @@ * */ @GET("/statics/deviceStaticsByType") suspend fun countDevice(@Header("token") token: String): String + + /** + * 异常设备状态列表 + * */ + @GET("/statics/deviceListPage") + suspend fun getAlarmListData( + @Header("token") token: String, + @Query("beginTime") beginTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + @GET("/statics/devicePosition") + suspend fun queryWellInfo( + @Header("token") token: String, + @Query("deviceId") deviceId: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt index 0d9cfc7..43c3d7d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt @@ -79,4 +79,18 @@ suspend fun countDevice(): String { return smartTownApi.countDevice(AuthenticationHelper.token!!) } + + suspend fun getAlarmListData(beginTime: String, endTime: String, offset: Int): String { + return smartTownApi.getAlarmListData( + AuthenticationHelper.token!!, + beginTime, + endTime, + LocaleConstant.PAGE_LIMIT, + offset + ) + } + + suspend fun queryWellInfo(deviceId: String): String { + return smartTownApi.queryWellInfo(AuthenticationHelper.token!!, deviceId) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt new file mode 100644 index 0000000..c31f25d --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt @@ -0,0 +1,117 @@ +package com.casic.smart.town.sanxi.view + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.MarkerOptions +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.util.LoadingDialogHub +import com.casic.smart.town.sanxi.vm.WellViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_device_on_map.* +import kotlinx.android.synthetic.main.include_base_title.* + +class DeviceOnMapActivity : AppCompatActivity() { + + private val kTag = "DeviceOnMapActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var aMap: AMap + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_device_on_map) + + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + titleView.text = "异常报警位置" + leftBackView.setOnClickListener { finish() } + + setMapConfig(savedInstanceState) + + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + wellViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + wellViewModel.queryWellInfo(deviceId) + wellViewModel.wellResultModel.observe(this, { + if (it.code == 200) { + val lat = it.data.latGaode.toString() + val lng = it.data.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + val latLng = LatLng(latitude, longitude) + //移动到指定经纬度 + val cameraPosition = CameraPosition(latLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 2000, null) + + aMap.addMarker( + MarkerOptions() + .position(latLng) + .icon( + BitmapDescriptorFactory.fromBitmap( + BitmapDescriptorFactory.fromResource(R.mipmap.map_pin).bitmap + ) + ) + .title("") + .snippet("") + ) + } + } else { + "经纬度异常".show(this) + } + } + }) + } + + private fun setMapConfig(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt new file mode 100644 index 0000000..9716725 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.smart.town.sanxi.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.smart.town.sanxi.base.BaseApplication +import com.casic.smart.town.sanxi.extensions.separateResponseCode +import com.casic.smart.town.sanxi.extensions.toErrorMessage +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel + +class AlarmViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val resultModel = MutableLiveData() + + fun getAlarmListData(beginTime: String, endTime: String, offset: Int) = launch({ + val response = RetrofitServiceManager.getAlarmListData(beginTime, endTime, offset) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5f605ca..1fe841c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt new file mode 100644 index 0000000..9996a4b --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt @@ -0,0 +1,54 @@ +package com.casic.smart.town.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.model.AlarmListModel + +class AlarmAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv_l, parent, false) + ) + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.deviceTypeNameView.text = String.format("设备类型:${rowsBean.deviceTypeName}") + holder.deviceStateView.text = rowsBean.onlineStateName + holder.locationView.text = String.format("异常点位置:${rowsBean.position}") + holder.installDateView.text = String.format("安装时间:${rowsBean.installDate}") + + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceTypeNameView: TextView = view.findViewById(R.id.deviceTypeNameView) + var deviceStateView: TextView = view.findViewById(R.id.deviceStateView) + var locationView: TextView = view.findViewById(R.id.locationView) + var installDateView: TextView = view.findViewById(R.id.installDateView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt index 650e201..84ca796 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt @@ -1,9 +1,27 @@ package com.casic.smart.town.sanxi.fragment +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.adapter.AlarmAdapter +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.view.DeviceOnMapActivity +import com.casic.smart.town.sanxi.vm.AlarmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_alarm.* -class AlarmPageFragment: KotlinBaseFragment() { +class AlarmPageFragment : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var alarmAdapter: AlarmAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initLayoutView(): Int = R.layout.fragment_alarm @@ -16,10 +34,79 @@ } override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + alarmViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022102801) + } + }) } override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListData() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListData() + } + } + override fun onResume() { + super.onResume() + pageIndex = 1 + getAlarmListData() + } + + private fun getAlarmListData() { + alarmViewModel.getAlarmListData("", "", pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022102801) { + if (isRefresh || isLoadMore) { + alarmAdapter.notifyDataSetChanged() + } else { + alarmAdapter = AlarmAdapter(requireContext(), dataBeans) + alarmRecyclerView!!.adapter = alarmAdapter + alarmAdapter.setOnItemClickListener(object : + AlarmAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val deviceId = dataBeans[position].id.toString() + if (deviceId.isBlank()) { + "设备ID异常,无法查看位置".show(requireContext()) + return + } + requireContext().navigatePageTo(deviceId) + } + }) + } + } + true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java new file mode 100644 index 0000000..8c51878 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java @@ -0,0 +1,256 @@ +package com.casic.smart.town.sanxi.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataModel data; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public static class DataModel { + private List rows; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public static class RowsModel { + private String bfzt; + private String bfztName; + private String communication; + private String concenCode; + private String concenId; + private String deptName; + private String deptid; + private String devcode; + private String deviceName; + private String deviceType; + private String deviceTypeName; + private String id; + private String installDate; + private String installHeight; + private String modelId; + private String modelName; + private String onlineState; + private String onlineStateName; + private String position; + private String ts; + private String valid; + private String watchType; + private String wellCode; + private String wellId; + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCommunication() { + return communication; + } + + public void setCommunication(String communication) { + this.communication = communication; + } + + public String getConcenCode() { + return concenCode; + } + + public void setConcenCode(String concenCode) { + this.concenCode = concenCode; + } + + public String getConcenId() { + return concenId; + } + + public void setConcenId(String concenId) { + this.concenId = concenId; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getDeviceTypeName() { + return deviceTypeName; + } + + public void setDeviceTypeName(String deviceTypeName) { + this.deviceTypeName = deviceTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getInstallHeight() { + return installHeight; + } + + public void setInstallHeight(String installHeight) { + this.installHeight = installHeight; + } + + public String getModelId() { + return modelId; + } + + public void setModelId(String modelId) { + this.modelId = modelId; + } + + public String getModelName() { + return modelName; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellId() { + return wellId; + } + + public void setWellId(String wellId) { + this.wellId = wellId; + } + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java new file mode 100644 index 0000000..6632b4a --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java @@ -0,0 +1,305 @@ +package com.casic.smart.town.sanxi.model; + +public class WellInfoModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String area; + private String bfzt; + private String bfztName; + private String coordinateX; + private String coordinateY; + private String deep; + private String deptName; + private String deptid; + private String deviceCount; + private String id; + private String latBaidu; + private String latGaode; + private String lngBaidu; + private String lngGaode; + private String notes; + private String photos; + private String position; + private String qu; + private String responsibleDept; + private String responsibleDeptName; + private String ts; + private String valid; + private String wellCode; + private String wellFlag1; + private String wellFlag2; + private String wellFlag3; + private String wellName; + private String wellType; + private String wellTypeName; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCoordinateX() { + return coordinateX; + } + + public void setCoordinateX(String coordinateX) { + this.coordinateX = coordinateX; + } + + public String getCoordinateY() { + return coordinateY; + } + + public void setCoordinateY(String coordinateY) { + this.coordinateY = coordinateY; + } + + public String getDeep() { + return deep; + } + + public void setDeep(String deep) { + this.deep = deep; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceCount() { + return deviceCount; + } + + public void setDeviceCount(String deviceCount) { + this.deviceCount = deviceCount; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLatBaidu() { + return latBaidu; + } + + public void setLatBaidu(String latBaidu) { + this.latBaidu = latBaidu; + } + + public String getLatGaode() { + return latGaode; + } + + public void setLatGaode(String latGaode) { + this.latGaode = latGaode; + } + + public String getLngBaidu() { + return lngBaidu; + } + + public void setLngBaidu(String lngBaidu) { + this.lngBaidu = lngBaidu; + } + + public String getLngGaode() { + return lngGaode; + } + + public void setLngGaode(String lngGaode) { + this.lngGaode = lngGaode; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } + + public String getPhotos() { + return photos; + } + + public void setPhotos(String photos) { + this.photos = photos; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getQu() { + return qu; + } + + public void setQu(String qu) { + this.qu = qu; + } + + public String getResponsibleDept() { + return responsibleDept; + } + + public void setResponsibleDept(String responsibleDept) { + this.responsibleDept = responsibleDept; + } + + public String getResponsibleDeptName() { + return responsibleDeptName; + } + + public void setResponsibleDeptName(String responsibleDeptName) { + this.responsibleDeptName = responsibleDeptName; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellFlag1() { + return wellFlag1; + } + + public void setWellFlag1(String wellFlag1) { + this.wellFlag1 = wellFlag1; + } + + public String getWellFlag2() { + return wellFlag2; + } + + public void setWellFlag2(String wellFlag2) { + this.wellFlag2 = wellFlag2; + } + + public String getWellFlag3() { + return wellFlag3; + } + + public void setWellFlag3(String wellFlag3) { + this.wellFlag3 = wellFlag3; + } + + public String getWellName() { + return wellName; + } + + public void setWellName(String wellName) { + this.wellName = wellName; + } + + public String getWellType() { + return wellType; + } + + public void setWellType(String wellType) { + this.wellType = wellType; + } + + public String getWellTypeName() { + return wellTypeName; + } + + public void setWellTypeName(String wellTypeName) { + this.wellTypeName = wellTypeName; + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt index 5b814d3..8b286d1 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt @@ -73,4 +73,22 @@ * */ @GET("/statics/deviceStaticsByType") suspend fun countDevice(@Header("token") token: String): String + + /** + * 异常设备状态列表 + * */ + @GET("/statics/deviceListPage") + suspend fun getAlarmListData( + @Header("token") token: String, + @Query("beginTime") beginTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + @GET("/statics/devicePosition") + suspend fun queryWellInfo( + @Header("token") token: String, + @Query("deviceId") deviceId: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt index 0d9cfc7..43c3d7d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt @@ -79,4 +79,18 @@ suspend fun countDevice(): String { return smartTownApi.countDevice(AuthenticationHelper.token!!) } + + suspend fun getAlarmListData(beginTime: String, endTime: String, offset: Int): String { + return smartTownApi.getAlarmListData( + AuthenticationHelper.token!!, + beginTime, + endTime, + LocaleConstant.PAGE_LIMIT, + offset + ) + } + + suspend fun queryWellInfo(deviceId: String): String { + return smartTownApi.queryWellInfo(AuthenticationHelper.token!!, deviceId) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt new file mode 100644 index 0000000..c31f25d --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt @@ -0,0 +1,117 @@ +package com.casic.smart.town.sanxi.view + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.MarkerOptions +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.util.LoadingDialogHub +import com.casic.smart.town.sanxi.vm.WellViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_device_on_map.* +import kotlinx.android.synthetic.main.include_base_title.* + +class DeviceOnMapActivity : AppCompatActivity() { + + private val kTag = "DeviceOnMapActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var aMap: AMap + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_device_on_map) + + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + titleView.text = "异常报警位置" + leftBackView.setOnClickListener { finish() } + + setMapConfig(savedInstanceState) + + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + wellViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + wellViewModel.queryWellInfo(deviceId) + wellViewModel.wellResultModel.observe(this, { + if (it.code == 200) { + val lat = it.data.latGaode.toString() + val lng = it.data.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + val latLng = LatLng(latitude, longitude) + //移动到指定经纬度 + val cameraPosition = CameraPosition(latLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 2000, null) + + aMap.addMarker( + MarkerOptions() + .position(latLng) + .icon( + BitmapDescriptorFactory.fromBitmap( + BitmapDescriptorFactory.fromResource(R.mipmap.map_pin).bitmap + ) + ) + .title("") + .snippet("") + ) + } + } else { + "经纬度异常".show(this) + } + } + }) + } + + private fun setMapConfig(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt new file mode 100644 index 0000000..9716725 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.smart.town.sanxi.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.smart.town.sanxi.base.BaseApplication +import com.casic.smart.town.sanxi.extensions.separateResponseCode +import com.casic.smart.town.sanxi.extensions.toErrorMessage +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel + +class AlarmViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val resultModel = MutableLiveData() + + fun getAlarmListData(beginTime: String, endTime: String, offset: Int) = launch({ + val response = RetrofitServiceManager.getAlarmListData(beginTime, endTime, offset) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index 87ddbf8..f159635 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -15,7 +15,7 @@ class AuthenticateViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5f605ca..1fe841c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt new file mode 100644 index 0000000..9996a4b --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt @@ -0,0 +1,54 @@ +package com.casic.smart.town.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.model.AlarmListModel + +class AlarmAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv_l, parent, false) + ) + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.deviceTypeNameView.text = String.format("设备类型:${rowsBean.deviceTypeName}") + holder.deviceStateView.text = rowsBean.onlineStateName + holder.locationView.text = String.format("异常点位置:${rowsBean.position}") + holder.installDateView.text = String.format("安装时间:${rowsBean.installDate}") + + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceTypeNameView: TextView = view.findViewById(R.id.deviceTypeNameView) + var deviceStateView: TextView = view.findViewById(R.id.deviceStateView) + var locationView: TextView = view.findViewById(R.id.locationView) + var installDateView: TextView = view.findViewById(R.id.installDateView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt index 650e201..84ca796 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt @@ -1,9 +1,27 @@ package com.casic.smart.town.sanxi.fragment +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.adapter.AlarmAdapter +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.view.DeviceOnMapActivity +import com.casic.smart.town.sanxi.vm.AlarmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_alarm.* -class AlarmPageFragment: KotlinBaseFragment() { +class AlarmPageFragment : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var alarmAdapter: AlarmAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initLayoutView(): Int = R.layout.fragment_alarm @@ -16,10 +34,79 @@ } override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + alarmViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022102801) + } + }) } override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListData() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListData() + } + } + override fun onResume() { + super.onResume() + pageIndex = 1 + getAlarmListData() + } + + private fun getAlarmListData() { + alarmViewModel.getAlarmListData("", "", pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022102801) { + if (isRefresh || isLoadMore) { + alarmAdapter.notifyDataSetChanged() + } else { + alarmAdapter = AlarmAdapter(requireContext(), dataBeans) + alarmRecyclerView!!.adapter = alarmAdapter + alarmAdapter.setOnItemClickListener(object : + AlarmAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val deviceId = dataBeans[position].id.toString() + if (deviceId.isBlank()) { + "设备ID异常,无法查看位置".show(requireContext()) + return + } + requireContext().navigatePageTo(deviceId) + } + }) + } + } + true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java new file mode 100644 index 0000000..8c51878 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java @@ -0,0 +1,256 @@ +package com.casic.smart.town.sanxi.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataModel data; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public static class DataModel { + private List rows; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public static class RowsModel { + private String bfzt; + private String bfztName; + private String communication; + private String concenCode; + private String concenId; + private String deptName; + private String deptid; + private String devcode; + private String deviceName; + private String deviceType; + private String deviceTypeName; + private String id; + private String installDate; + private String installHeight; + private String modelId; + private String modelName; + private String onlineState; + private String onlineStateName; + private String position; + private String ts; + private String valid; + private String watchType; + private String wellCode; + private String wellId; + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCommunication() { + return communication; + } + + public void setCommunication(String communication) { + this.communication = communication; + } + + public String getConcenCode() { + return concenCode; + } + + public void setConcenCode(String concenCode) { + this.concenCode = concenCode; + } + + public String getConcenId() { + return concenId; + } + + public void setConcenId(String concenId) { + this.concenId = concenId; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getDeviceTypeName() { + return deviceTypeName; + } + + public void setDeviceTypeName(String deviceTypeName) { + this.deviceTypeName = deviceTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getInstallHeight() { + return installHeight; + } + + public void setInstallHeight(String installHeight) { + this.installHeight = installHeight; + } + + public String getModelId() { + return modelId; + } + + public void setModelId(String modelId) { + this.modelId = modelId; + } + + public String getModelName() { + return modelName; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellId() { + return wellId; + } + + public void setWellId(String wellId) { + this.wellId = wellId; + } + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java new file mode 100644 index 0000000..6632b4a --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java @@ -0,0 +1,305 @@ +package com.casic.smart.town.sanxi.model; + +public class WellInfoModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String area; + private String bfzt; + private String bfztName; + private String coordinateX; + private String coordinateY; + private String deep; + private String deptName; + private String deptid; + private String deviceCount; + private String id; + private String latBaidu; + private String latGaode; + private String lngBaidu; + private String lngGaode; + private String notes; + private String photos; + private String position; + private String qu; + private String responsibleDept; + private String responsibleDeptName; + private String ts; + private String valid; + private String wellCode; + private String wellFlag1; + private String wellFlag2; + private String wellFlag3; + private String wellName; + private String wellType; + private String wellTypeName; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCoordinateX() { + return coordinateX; + } + + public void setCoordinateX(String coordinateX) { + this.coordinateX = coordinateX; + } + + public String getCoordinateY() { + return coordinateY; + } + + public void setCoordinateY(String coordinateY) { + this.coordinateY = coordinateY; + } + + public String getDeep() { + return deep; + } + + public void setDeep(String deep) { + this.deep = deep; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceCount() { + return deviceCount; + } + + public void setDeviceCount(String deviceCount) { + this.deviceCount = deviceCount; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLatBaidu() { + return latBaidu; + } + + public void setLatBaidu(String latBaidu) { + this.latBaidu = latBaidu; + } + + public String getLatGaode() { + return latGaode; + } + + public void setLatGaode(String latGaode) { + this.latGaode = latGaode; + } + + public String getLngBaidu() { + return lngBaidu; + } + + public void setLngBaidu(String lngBaidu) { + this.lngBaidu = lngBaidu; + } + + public String getLngGaode() { + return lngGaode; + } + + public void setLngGaode(String lngGaode) { + this.lngGaode = lngGaode; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } + + public String getPhotos() { + return photos; + } + + public void setPhotos(String photos) { + this.photos = photos; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getQu() { + return qu; + } + + public void setQu(String qu) { + this.qu = qu; + } + + public String getResponsibleDept() { + return responsibleDept; + } + + public void setResponsibleDept(String responsibleDept) { + this.responsibleDept = responsibleDept; + } + + public String getResponsibleDeptName() { + return responsibleDeptName; + } + + public void setResponsibleDeptName(String responsibleDeptName) { + this.responsibleDeptName = responsibleDeptName; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellFlag1() { + return wellFlag1; + } + + public void setWellFlag1(String wellFlag1) { + this.wellFlag1 = wellFlag1; + } + + public String getWellFlag2() { + return wellFlag2; + } + + public void setWellFlag2(String wellFlag2) { + this.wellFlag2 = wellFlag2; + } + + public String getWellFlag3() { + return wellFlag3; + } + + public void setWellFlag3(String wellFlag3) { + this.wellFlag3 = wellFlag3; + } + + public String getWellName() { + return wellName; + } + + public void setWellName(String wellName) { + this.wellName = wellName; + } + + public String getWellType() { + return wellType; + } + + public void setWellType(String wellType) { + this.wellType = wellType; + } + + public String getWellTypeName() { + return wellTypeName; + } + + public void setWellTypeName(String wellTypeName) { + this.wellTypeName = wellTypeName; + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt index 5b814d3..8b286d1 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt @@ -73,4 +73,22 @@ * */ @GET("/statics/deviceStaticsByType") suspend fun countDevice(@Header("token") token: String): String + + /** + * 异常设备状态列表 + * */ + @GET("/statics/deviceListPage") + suspend fun getAlarmListData( + @Header("token") token: String, + @Query("beginTime") beginTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + @GET("/statics/devicePosition") + suspend fun queryWellInfo( + @Header("token") token: String, + @Query("deviceId") deviceId: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt index 0d9cfc7..43c3d7d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt @@ -79,4 +79,18 @@ suspend fun countDevice(): String { return smartTownApi.countDevice(AuthenticationHelper.token!!) } + + suspend fun getAlarmListData(beginTime: String, endTime: String, offset: Int): String { + return smartTownApi.getAlarmListData( + AuthenticationHelper.token!!, + beginTime, + endTime, + LocaleConstant.PAGE_LIMIT, + offset + ) + } + + suspend fun queryWellInfo(deviceId: String): String { + return smartTownApi.queryWellInfo(AuthenticationHelper.token!!, deviceId) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt new file mode 100644 index 0000000..c31f25d --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt @@ -0,0 +1,117 @@ +package com.casic.smart.town.sanxi.view + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.MarkerOptions +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.util.LoadingDialogHub +import com.casic.smart.town.sanxi.vm.WellViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_device_on_map.* +import kotlinx.android.synthetic.main.include_base_title.* + +class DeviceOnMapActivity : AppCompatActivity() { + + private val kTag = "DeviceOnMapActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var aMap: AMap + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_device_on_map) + + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + titleView.text = "异常报警位置" + leftBackView.setOnClickListener { finish() } + + setMapConfig(savedInstanceState) + + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + wellViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + wellViewModel.queryWellInfo(deviceId) + wellViewModel.wellResultModel.observe(this, { + if (it.code == 200) { + val lat = it.data.latGaode.toString() + val lng = it.data.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + val latLng = LatLng(latitude, longitude) + //移动到指定经纬度 + val cameraPosition = CameraPosition(latLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 2000, null) + + aMap.addMarker( + MarkerOptions() + .position(latLng) + .icon( + BitmapDescriptorFactory.fromBitmap( + BitmapDescriptorFactory.fromResource(R.mipmap.map_pin).bitmap + ) + ) + .title("") + .snippet("") + ) + } + } else { + "经纬度异常".show(this) + } + } + }) + } + + private fun setMapConfig(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt new file mode 100644 index 0000000..9716725 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.smart.town.sanxi.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.smart.town.sanxi.base.BaseApplication +import com.casic.smart.town.sanxi.extensions.separateResponseCode +import com.casic.smart.town.sanxi.extensions.toErrorMessage +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel + +class AlarmViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val resultModel = MutableLiveData() + + fun getAlarmListData(beginTime: String, endTime: String, offset: Int) = launch({ + val response = RetrofitServiceManager.getAlarmListData(beginTime, endTime, offset) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index 87ddbf8..f159635 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -15,7 +15,7 @@ class AuthenticateViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt index c377c61..1bff381 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt @@ -16,7 +16,7 @@ class LoginViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val enterResultModel = MutableLiveData() val outResultModel = MutableLiveData() diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5f605ca..1fe841c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt new file mode 100644 index 0000000..9996a4b --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt @@ -0,0 +1,54 @@ +package com.casic.smart.town.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.model.AlarmListModel + +class AlarmAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv_l, parent, false) + ) + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.deviceTypeNameView.text = String.format("设备类型:${rowsBean.deviceTypeName}") + holder.deviceStateView.text = rowsBean.onlineStateName + holder.locationView.text = String.format("异常点位置:${rowsBean.position}") + holder.installDateView.text = String.format("安装时间:${rowsBean.installDate}") + + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceTypeNameView: TextView = view.findViewById(R.id.deviceTypeNameView) + var deviceStateView: TextView = view.findViewById(R.id.deviceStateView) + var locationView: TextView = view.findViewById(R.id.locationView) + var installDateView: TextView = view.findViewById(R.id.installDateView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt index 650e201..84ca796 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt @@ -1,9 +1,27 @@ package com.casic.smart.town.sanxi.fragment +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.adapter.AlarmAdapter +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.view.DeviceOnMapActivity +import com.casic.smart.town.sanxi.vm.AlarmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_alarm.* -class AlarmPageFragment: KotlinBaseFragment() { +class AlarmPageFragment : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var alarmAdapter: AlarmAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initLayoutView(): Int = R.layout.fragment_alarm @@ -16,10 +34,79 @@ } override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + alarmViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022102801) + } + }) } override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListData() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListData() + } + } + override fun onResume() { + super.onResume() + pageIndex = 1 + getAlarmListData() + } + + private fun getAlarmListData() { + alarmViewModel.getAlarmListData("", "", pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022102801) { + if (isRefresh || isLoadMore) { + alarmAdapter.notifyDataSetChanged() + } else { + alarmAdapter = AlarmAdapter(requireContext(), dataBeans) + alarmRecyclerView!!.adapter = alarmAdapter + alarmAdapter.setOnItemClickListener(object : + AlarmAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val deviceId = dataBeans[position].id.toString() + if (deviceId.isBlank()) { + "设备ID异常,无法查看位置".show(requireContext()) + return + } + requireContext().navigatePageTo(deviceId) + } + }) + } + } + true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java new file mode 100644 index 0000000..8c51878 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java @@ -0,0 +1,256 @@ +package com.casic.smart.town.sanxi.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataModel data; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public static class DataModel { + private List rows; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public static class RowsModel { + private String bfzt; + private String bfztName; + private String communication; + private String concenCode; + private String concenId; + private String deptName; + private String deptid; + private String devcode; + private String deviceName; + private String deviceType; + private String deviceTypeName; + private String id; + private String installDate; + private String installHeight; + private String modelId; + private String modelName; + private String onlineState; + private String onlineStateName; + private String position; + private String ts; + private String valid; + private String watchType; + private String wellCode; + private String wellId; + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCommunication() { + return communication; + } + + public void setCommunication(String communication) { + this.communication = communication; + } + + public String getConcenCode() { + return concenCode; + } + + public void setConcenCode(String concenCode) { + this.concenCode = concenCode; + } + + public String getConcenId() { + return concenId; + } + + public void setConcenId(String concenId) { + this.concenId = concenId; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getDeviceTypeName() { + return deviceTypeName; + } + + public void setDeviceTypeName(String deviceTypeName) { + this.deviceTypeName = deviceTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getInstallHeight() { + return installHeight; + } + + public void setInstallHeight(String installHeight) { + this.installHeight = installHeight; + } + + public String getModelId() { + return modelId; + } + + public void setModelId(String modelId) { + this.modelId = modelId; + } + + public String getModelName() { + return modelName; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellId() { + return wellId; + } + + public void setWellId(String wellId) { + this.wellId = wellId; + } + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java new file mode 100644 index 0000000..6632b4a --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java @@ -0,0 +1,305 @@ +package com.casic.smart.town.sanxi.model; + +public class WellInfoModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String area; + private String bfzt; + private String bfztName; + private String coordinateX; + private String coordinateY; + private String deep; + private String deptName; + private String deptid; + private String deviceCount; + private String id; + private String latBaidu; + private String latGaode; + private String lngBaidu; + private String lngGaode; + private String notes; + private String photos; + private String position; + private String qu; + private String responsibleDept; + private String responsibleDeptName; + private String ts; + private String valid; + private String wellCode; + private String wellFlag1; + private String wellFlag2; + private String wellFlag3; + private String wellName; + private String wellType; + private String wellTypeName; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCoordinateX() { + return coordinateX; + } + + public void setCoordinateX(String coordinateX) { + this.coordinateX = coordinateX; + } + + public String getCoordinateY() { + return coordinateY; + } + + public void setCoordinateY(String coordinateY) { + this.coordinateY = coordinateY; + } + + public String getDeep() { + return deep; + } + + public void setDeep(String deep) { + this.deep = deep; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceCount() { + return deviceCount; + } + + public void setDeviceCount(String deviceCount) { + this.deviceCount = deviceCount; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLatBaidu() { + return latBaidu; + } + + public void setLatBaidu(String latBaidu) { + this.latBaidu = latBaidu; + } + + public String getLatGaode() { + return latGaode; + } + + public void setLatGaode(String latGaode) { + this.latGaode = latGaode; + } + + public String getLngBaidu() { + return lngBaidu; + } + + public void setLngBaidu(String lngBaidu) { + this.lngBaidu = lngBaidu; + } + + public String getLngGaode() { + return lngGaode; + } + + public void setLngGaode(String lngGaode) { + this.lngGaode = lngGaode; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } + + public String getPhotos() { + return photos; + } + + public void setPhotos(String photos) { + this.photos = photos; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getQu() { + return qu; + } + + public void setQu(String qu) { + this.qu = qu; + } + + public String getResponsibleDept() { + return responsibleDept; + } + + public void setResponsibleDept(String responsibleDept) { + this.responsibleDept = responsibleDept; + } + + public String getResponsibleDeptName() { + return responsibleDeptName; + } + + public void setResponsibleDeptName(String responsibleDeptName) { + this.responsibleDeptName = responsibleDeptName; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellFlag1() { + return wellFlag1; + } + + public void setWellFlag1(String wellFlag1) { + this.wellFlag1 = wellFlag1; + } + + public String getWellFlag2() { + return wellFlag2; + } + + public void setWellFlag2(String wellFlag2) { + this.wellFlag2 = wellFlag2; + } + + public String getWellFlag3() { + return wellFlag3; + } + + public void setWellFlag3(String wellFlag3) { + this.wellFlag3 = wellFlag3; + } + + public String getWellName() { + return wellName; + } + + public void setWellName(String wellName) { + this.wellName = wellName; + } + + public String getWellType() { + return wellType; + } + + public void setWellType(String wellType) { + this.wellType = wellType; + } + + public String getWellTypeName() { + return wellTypeName; + } + + public void setWellTypeName(String wellTypeName) { + this.wellTypeName = wellTypeName; + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt index 5b814d3..8b286d1 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt @@ -73,4 +73,22 @@ * */ @GET("/statics/deviceStaticsByType") suspend fun countDevice(@Header("token") token: String): String + + /** + * 异常设备状态列表 + * */ + @GET("/statics/deviceListPage") + suspend fun getAlarmListData( + @Header("token") token: String, + @Query("beginTime") beginTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + @GET("/statics/devicePosition") + suspend fun queryWellInfo( + @Header("token") token: String, + @Query("deviceId") deviceId: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt index 0d9cfc7..43c3d7d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt @@ -79,4 +79,18 @@ suspend fun countDevice(): String { return smartTownApi.countDevice(AuthenticationHelper.token!!) } + + suspend fun getAlarmListData(beginTime: String, endTime: String, offset: Int): String { + return smartTownApi.getAlarmListData( + AuthenticationHelper.token!!, + beginTime, + endTime, + LocaleConstant.PAGE_LIMIT, + offset + ) + } + + suspend fun queryWellInfo(deviceId: String): String { + return smartTownApi.queryWellInfo(AuthenticationHelper.token!!, deviceId) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt new file mode 100644 index 0000000..c31f25d --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt @@ -0,0 +1,117 @@ +package com.casic.smart.town.sanxi.view + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.MarkerOptions +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.util.LoadingDialogHub +import com.casic.smart.town.sanxi.vm.WellViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_device_on_map.* +import kotlinx.android.synthetic.main.include_base_title.* + +class DeviceOnMapActivity : AppCompatActivity() { + + private val kTag = "DeviceOnMapActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var aMap: AMap + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_device_on_map) + + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + titleView.text = "异常报警位置" + leftBackView.setOnClickListener { finish() } + + setMapConfig(savedInstanceState) + + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + wellViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + wellViewModel.queryWellInfo(deviceId) + wellViewModel.wellResultModel.observe(this, { + if (it.code == 200) { + val lat = it.data.latGaode.toString() + val lng = it.data.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + val latLng = LatLng(latitude, longitude) + //移动到指定经纬度 + val cameraPosition = CameraPosition(latLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 2000, null) + + aMap.addMarker( + MarkerOptions() + .position(latLng) + .icon( + BitmapDescriptorFactory.fromBitmap( + BitmapDescriptorFactory.fromResource(R.mipmap.map_pin).bitmap + ) + ) + .title("") + .snippet("") + ) + } + } else { + "经纬度异常".show(this) + } + } + }) + } + + private fun setMapConfig(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt new file mode 100644 index 0000000..9716725 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.smart.town.sanxi.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.smart.town.sanxi.base.BaseApplication +import com.casic.smart.town.sanxi.extensions.separateResponseCode +import com.casic.smart.town.sanxi.extensions.toErrorMessage +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel + +class AlarmViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val resultModel = MutableLiveData() + + fun getAlarmListData(beginTime: String, endTime: String, offset: Int) = launch({ + val response = RetrofitServiceManager.getAlarmListData(beginTime, endTime, offset) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index 87ddbf8..f159635 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -15,7 +15,7 @@ class AuthenticateViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt index c377c61..1bff381 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt @@ -16,7 +16,7 @@ class LoginViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val enterResultModel = MutableLiveData() val outResultModel = MutableLiveData() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt index 29a8756..dd1f190 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt @@ -17,7 +17,7 @@ class UserViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val userDetailModel = MutableLiveData() fun obtainUserDetail() = launch({ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5f605ca..1fe841c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt new file mode 100644 index 0000000..9996a4b --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt @@ -0,0 +1,54 @@ +package com.casic.smart.town.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.model.AlarmListModel + +class AlarmAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv_l, parent, false) + ) + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.deviceTypeNameView.text = String.format("设备类型:${rowsBean.deviceTypeName}") + holder.deviceStateView.text = rowsBean.onlineStateName + holder.locationView.text = String.format("异常点位置:${rowsBean.position}") + holder.installDateView.text = String.format("安装时间:${rowsBean.installDate}") + + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceTypeNameView: TextView = view.findViewById(R.id.deviceTypeNameView) + var deviceStateView: TextView = view.findViewById(R.id.deviceStateView) + var locationView: TextView = view.findViewById(R.id.locationView) + var installDateView: TextView = view.findViewById(R.id.installDateView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt index 650e201..84ca796 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt @@ -1,9 +1,27 @@ package com.casic.smart.town.sanxi.fragment +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.adapter.AlarmAdapter +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.view.DeviceOnMapActivity +import com.casic.smart.town.sanxi.vm.AlarmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_alarm.* -class AlarmPageFragment: KotlinBaseFragment() { +class AlarmPageFragment : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var alarmAdapter: AlarmAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initLayoutView(): Int = R.layout.fragment_alarm @@ -16,10 +34,79 @@ } override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + alarmViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022102801) + } + }) } override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListData() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListData() + } + } + override fun onResume() { + super.onResume() + pageIndex = 1 + getAlarmListData() + } + + private fun getAlarmListData() { + alarmViewModel.getAlarmListData("", "", pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022102801) { + if (isRefresh || isLoadMore) { + alarmAdapter.notifyDataSetChanged() + } else { + alarmAdapter = AlarmAdapter(requireContext(), dataBeans) + alarmRecyclerView!!.adapter = alarmAdapter + alarmAdapter.setOnItemClickListener(object : + AlarmAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val deviceId = dataBeans[position].id.toString() + if (deviceId.isBlank()) { + "设备ID异常,无法查看位置".show(requireContext()) + return + } + requireContext().navigatePageTo(deviceId) + } + }) + } + } + true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java new file mode 100644 index 0000000..8c51878 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java @@ -0,0 +1,256 @@ +package com.casic.smart.town.sanxi.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataModel data; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public static class DataModel { + private List rows; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public static class RowsModel { + private String bfzt; + private String bfztName; + private String communication; + private String concenCode; + private String concenId; + private String deptName; + private String deptid; + private String devcode; + private String deviceName; + private String deviceType; + private String deviceTypeName; + private String id; + private String installDate; + private String installHeight; + private String modelId; + private String modelName; + private String onlineState; + private String onlineStateName; + private String position; + private String ts; + private String valid; + private String watchType; + private String wellCode; + private String wellId; + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCommunication() { + return communication; + } + + public void setCommunication(String communication) { + this.communication = communication; + } + + public String getConcenCode() { + return concenCode; + } + + public void setConcenCode(String concenCode) { + this.concenCode = concenCode; + } + + public String getConcenId() { + return concenId; + } + + public void setConcenId(String concenId) { + this.concenId = concenId; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getDeviceTypeName() { + return deviceTypeName; + } + + public void setDeviceTypeName(String deviceTypeName) { + this.deviceTypeName = deviceTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getInstallHeight() { + return installHeight; + } + + public void setInstallHeight(String installHeight) { + this.installHeight = installHeight; + } + + public String getModelId() { + return modelId; + } + + public void setModelId(String modelId) { + this.modelId = modelId; + } + + public String getModelName() { + return modelName; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellId() { + return wellId; + } + + public void setWellId(String wellId) { + this.wellId = wellId; + } + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java new file mode 100644 index 0000000..6632b4a --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java @@ -0,0 +1,305 @@ +package com.casic.smart.town.sanxi.model; + +public class WellInfoModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String area; + private String bfzt; + private String bfztName; + private String coordinateX; + private String coordinateY; + private String deep; + private String deptName; + private String deptid; + private String deviceCount; + private String id; + private String latBaidu; + private String latGaode; + private String lngBaidu; + private String lngGaode; + private String notes; + private String photos; + private String position; + private String qu; + private String responsibleDept; + private String responsibleDeptName; + private String ts; + private String valid; + private String wellCode; + private String wellFlag1; + private String wellFlag2; + private String wellFlag3; + private String wellName; + private String wellType; + private String wellTypeName; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCoordinateX() { + return coordinateX; + } + + public void setCoordinateX(String coordinateX) { + this.coordinateX = coordinateX; + } + + public String getCoordinateY() { + return coordinateY; + } + + public void setCoordinateY(String coordinateY) { + this.coordinateY = coordinateY; + } + + public String getDeep() { + return deep; + } + + public void setDeep(String deep) { + this.deep = deep; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceCount() { + return deviceCount; + } + + public void setDeviceCount(String deviceCount) { + this.deviceCount = deviceCount; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLatBaidu() { + return latBaidu; + } + + public void setLatBaidu(String latBaidu) { + this.latBaidu = latBaidu; + } + + public String getLatGaode() { + return latGaode; + } + + public void setLatGaode(String latGaode) { + this.latGaode = latGaode; + } + + public String getLngBaidu() { + return lngBaidu; + } + + public void setLngBaidu(String lngBaidu) { + this.lngBaidu = lngBaidu; + } + + public String getLngGaode() { + return lngGaode; + } + + public void setLngGaode(String lngGaode) { + this.lngGaode = lngGaode; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } + + public String getPhotos() { + return photos; + } + + public void setPhotos(String photos) { + this.photos = photos; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getQu() { + return qu; + } + + public void setQu(String qu) { + this.qu = qu; + } + + public String getResponsibleDept() { + return responsibleDept; + } + + public void setResponsibleDept(String responsibleDept) { + this.responsibleDept = responsibleDept; + } + + public String getResponsibleDeptName() { + return responsibleDeptName; + } + + public void setResponsibleDeptName(String responsibleDeptName) { + this.responsibleDeptName = responsibleDeptName; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellFlag1() { + return wellFlag1; + } + + public void setWellFlag1(String wellFlag1) { + this.wellFlag1 = wellFlag1; + } + + public String getWellFlag2() { + return wellFlag2; + } + + public void setWellFlag2(String wellFlag2) { + this.wellFlag2 = wellFlag2; + } + + public String getWellFlag3() { + return wellFlag3; + } + + public void setWellFlag3(String wellFlag3) { + this.wellFlag3 = wellFlag3; + } + + public String getWellName() { + return wellName; + } + + public void setWellName(String wellName) { + this.wellName = wellName; + } + + public String getWellType() { + return wellType; + } + + public void setWellType(String wellType) { + this.wellType = wellType; + } + + public String getWellTypeName() { + return wellTypeName; + } + + public void setWellTypeName(String wellTypeName) { + this.wellTypeName = wellTypeName; + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt index 5b814d3..8b286d1 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt @@ -73,4 +73,22 @@ * */ @GET("/statics/deviceStaticsByType") suspend fun countDevice(@Header("token") token: String): String + + /** + * 异常设备状态列表 + * */ + @GET("/statics/deviceListPage") + suspend fun getAlarmListData( + @Header("token") token: String, + @Query("beginTime") beginTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + @GET("/statics/devicePosition") + suspend fun queryWellInfo( + @Header("token") token: String, + @Query("deviceId") deviceId: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt index 0d9cfc7..43c3d7d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt @@ -79,4 +79,18 @@ suspend fun countDevice(): String { return smartTownApi.countDevice(AuthenticationHelper.token!!) } + + suspend fun getAlarmListData(beginTime: String, endTime: String, offset: Int): String { + return smartTownApi.getAlarmListData( + AuthenticationHelper.token!!, + beginTime, + endTime, + LocaleConstant.PAGE_LIMIT, + offset + ) + } + + suspend fun queryWellInfo(deviceId: String): String { + return smartTownApi.queryWellInfo(AuthenticationHelper.token!!, deviceId) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt new file mode 100644 index 0000000..c31f25d --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt @@ -0,0 +1,117 @@ +package com.casic.smart.town.sanxi.view + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.MarkerOptions +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.util.LoadingDialogHub +import com.casic.smart.town.sanxi.vm.WellViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_device_on_map.* +import kotlinx.android.synthetic.main.include_base_title.* + +class DeviceOnMapActivity : AppCompatActivity() { + + private val kTag = "DeviceOnMapActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var aMap: AMap + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_device_on_map) + + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + titleView.text = "异常报警位置" + leftBackView.setOnClickListener { finish() } + + setMapConfig(savedInstanceState) + + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + wellViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + wellViewModel.queryWellInfo(deviceId) + wellViewModel.wellResultModel.observe(this, { + if (it.code == 200) { + val lat = it.data.latGaode.toString() + val lng = it.data.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + val latLng = LatLng(latitude, longitude) + //移动到指定经纬度 + val cameraPosition = CameraPosition(latLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 2000, null) + + aMap.addMarker( + MarkerOptions() + .position(latLng) + .icon( + BitmapDescriptorFactory.fromBitmap( + BitmapDescriptorFactory.fromResource(R.mipmap.map_pin).bitmap + ) + ) + .title("") + .snippet("") + ) + } + } else { + "经纬度异常".show(this) + } + } + }) + } + + private fun setMapConfig(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt new file mode 100644 index 0000000..9716725 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.smart.town.sanxi.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.smart.town.sanxi.base.BaseApplication +import com.casic.smart.town.sanxi.extensions.separateResponseCode +import com.casic.smart.town.sanxi.extensions.toErrorMessage +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel + +class AlarmViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val resultModel = MutableLiveData() + + fun getAlarmListData(beginTime: String, endTime: String, offset: Int) = launch({ + val response = RetrofitServiceManager.getAlarmListData(beginTime, endTime, offset) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index 87ddbf8..f159635 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -15,7 +15,7 @@ class AuthenticateViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt index c377c61..1bff381 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt @@ -16,7 +16,7 @@ class LoginViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val enterResultModel = MutableLiveData() val outResultModel = MutableLiveData() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt index 29a8756..dd1f190 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt @@ -17,7 +17,7 @@ class UserViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val userDetailModel = MutableLiveData() fun obtainUserDetail() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt index 20ea457..4f9e68f 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt @@ -15,7 +15,7 @@ class VersionViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val versionResultModel = MutableLiveData() fun updateVersion() = launch({ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5f605ca..1fe841c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt new file mode 100644 index 0000000..9996a4b --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt @@ -0,0 +1,54 @@ +package com.casic.smart.town.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.model.AlarmListModel + +class AlarmAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv_l, parent, false) + ) + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.deviceTypeNameView.text = String.format("设备类型:${rowsBean.deviceTypeName}") + holder.deviceStateView.text = rowsBean.onlineStateName + holder.locationView.text = String.format("异常点位置:${rowsBean.position}") + holder.installDateView.text = String.format("安装时间:${rowsBean.installDate}") + + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceTypeNameView: TextView = view.findViewById(R.id.deviceTypeNameView) + var deviceStateView: TextView = view.findViewById(R.id.deviceStateView) + var locationView: TextView = view.findViewById(R.id.locationView) + var installDateView: TextView = view.findViewById(R.id.installDateView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt index 650e201..84ca796 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt @@ -1,9 +1,27 @@ package com.casic.smart.town.sanxi.fragment +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.adapter.AlarmAdapter +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.view.DeviceOnMapActivity +import com.casic.smart.town.sanxi.vm.AlarmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_alarm.* -class AlarmPageFragment: KotlinBaseFragment() { +class AlarmPageFragment : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var alarmAdapter: AlarmAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initLayoutView(): Int = R.layout.fragment_alarm @@ -16,10 +34,79 @@ } override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + alarmViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022102801) + } + }) } override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListData() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListData() + } + } + override fun onResume() { + super.onResume() + pageIndex = 1 + getAlarmListData() + } + + private fun getAlarmListData() { + alarmViewModel.getAlarmListData("", "", pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022102801) { + if (isRefresh || isLoadMore) { + alarmAdapter.notifyDataSetChanged() + } else { + alarmAdapter = AlarmAdapter(requireContext(), dataBeans) + alarmRecyclerView!!.adapter = alarmAdapter + alarmAdapter.setOnItemClickListener(object : + AlarmAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val deviceId = dataBeans[position].id.toString() + if (deviceId.isBlank()) { + "设备ID异常,无法查看位置".show(requireContext()) + return + } + requireContext().navigatePageTo(deviceId) + } + }) + } + } + true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java new file mode 100644 index 0000000..8c51878 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java @@ -0,0 +1,256 @@ +package com.casic.smart.town.sanxi.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataModel data; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public static class DataModel { + private List rows; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public static class RowsModel { + private String bfzt; + private String bfztName; + private String communication; + private String concenCode; + private String concenId; + private String deptName; + private String deptid; + private String devcode; + private String deviceName; + private String deviceType; + private String deviceTypeName; + private String id; + private String installDate; + private String installHeight; + private String modelId; + private String modelName; + private String onlineState; + private String onlineStateName; + private String position; + private String ts; + private String valid; + private String watchType; + private String wellCode; + private String wellId; + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCommunication() { + return communication; + } + + public void setCommunication(String communication) { + this.communication = communication; + } + + public String getConcenCode() { + return concenCode; + } + + public void setConcenCode(String concenCode) { + this.concenCode = concenCode; + } + + public String getConcenId() { + return concenId; + } + + public void setConcenId(String concenId) { + this.concenId = concenId; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getDeviceTypeName() { + return deviceTypeName; + } + + public void setDeviceTypeName(String deviceTypeName) { + this.deviceTypeName = deviceTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getInstallHeight() { + return installHeight; + } + + public void setInstallHeight(String installHeight) { + this.installHeight = installHeight; + } + + public String getModelId() { + return modelId; + } + + public void setModelId(String modelId) { + this.modelId = modelId; + } + + public String getModelName() { + return modelName; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellId() { + return wellId; + } + + public void setWellId(String wellId) { + this.wellId = wellId; + } + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java new file mode 100644 index 0000000..6632b4a --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java @@ -0,0 +1,305 @@ +package com.casic.smart.town.sanxi.model; + +public class WellInfoModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String area; + private String bfzt; + private String bfztName; + private String coordinateX; + private String coordinateY; + private String deep; + private String deptName; + private String deptid; + private String deviceCount; + private String id; + private String latBaidu; + private String latGaode; + private String lngBaidu; + private String lngGaode; + private String notes; + private String photos; + private String position; + private String qu; + private String responsibleDept; + private String responsibleDeptName; + private String ts; + private String valid; + private String wellCode; + private String wellFlag1; + private String wellFlag2; + private String wellFlag3; + private String wellName; + private String wellType; + private String wellTypeName; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCoordinateX() { + return coordinateX; + } + + public void setCoordinateX(String coordinateX) { + this.coordinateX = coordinateX; + } + + public String getCoordinateY() { + return coordinateY; + } + + public void setCoordinateY(String coordinateY) { + this.coordinateY = coordinateY; + } + + public String getDeep() { + return deep; + } + + public void setDeep(String deep) { + this.deep = deep; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceCount() { + return deviceCount; + } + + public void setDeviceCount(String deviceCount) { + this.deviceCount = deviceCount; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLatBaidu() { + return latBaidu; + } + + public void setLatBaidu(String latBaidu) { + this.latBaidu = latBaidu; + } + + public String getLatGaode() { + return latGaode; + } + + public void setLatGaode(String latGaode) { + this.latGaode = latGaode; + } + + public String getLngBaidu() { + return lngBaidu; + } + + public void setLngBaidu(String lngBaidu) { + this.lngBaidu = lngBaidu; + } + + public String getLngGaode() { + return lngGaode; + } + + public void setLngGaode(String lngGaode) { + this.lngGaode = lngGaode; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } + + public String getPhotos() { + return photos; + } + + public void setPhotos(String photos) { + this.photos = photos; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getQu() { + return qu; + } + + public void setQu(String qu) { + this.qu = qu; + } + + public String getResponsibleDept() { + return responsibleDept; + } + + public void setResponsibleDept(String responsibleDept) { + this.responsibleDept = responsibleDept; + } + + public String getResponsibleDeptName() { + return responsibleDeptName; + } + + public void setResponsibleDeptName(String responsibleDeptName) { + this.responsibleDeptName = responsibleDeptName; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellFlag1() { + return wellFlag1; + } + + public void setWellFlag1(String wellFlag1) { + this.wellFlag1 = wellFlag1; + } + + public String getWellFlag2() { + return wellFlag2; + } + + public void setWellFlag2(String wellFlag2) { + this.wellFlag2 = wellFlag2; + } + + public String getWellFlag3() { + return wellFlag3; + } + + public void setWellFlag3(String wellFlag3) { + this.wellFlag3 = wellFlag3; + } + + public String getWellName() { + return wellName; + } + + public void setWellName(String wellName) { + this.wellName = wellName; + } + + public String getWellType() { + return wellType; + } + + public void setWellType(String wellType) { + this.wellType = wellType; + } + + public String getWellTypeName() { + return wellTypeName; + } + + public void setWellTypeName(String wellTypeName) { + this.wellTypeName = wellTypeName; + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt index 5b814d3..8b286d1 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt @@ -73,4 +73,22 @@ * */ @GET("/statics/deviceStaticsByType") suspend fun countDevice(@Header("token") token: String): String + + /** + * 异常设备状态列表 + * */ + @GET("/statics/deviceListPage") + suspend fun getAlarmListData( + @Header("token") token: String, + @Query("beginTime") beginTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + @GET("/statics/devicePosition") + suspend fun queryWellInfo( + @Header("token") token: String, + @Query("deviceId") deviceId: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt index 0d9cfc7..43c3d7d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt @@ -79,4 +79,18 @@ suspend fun countDevice(): String { return smartTownApi.countDevice(AuthenticationHelper.token!!) } + + suspend fun getAlarmListData(beginTime: String, endTime: String, offset: Int): String { + return smartTownApi.getAlarmListData( + AuthenticationHelper.token!!, + beginTime, + endTime, + LocaleConstant.PAGE_LIMIT, + offset + ) + } + + suspend fun queryWellInfo(deviceId: String): String { + return smartTownApi.queryWellInfo(AuthenticationHelper.token!!, deviceId) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt new file mode 100644 index 0000000..c31f25d --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt @@ -0,0 +1,117 @@ +package com.casic.smart.town.sanxi.view + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.MarkerOptions +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.util.LoadingDialogHub +import com.casic.smart.town.sanxi.vm.WellViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_device_on_map.* +import kotlinx.android.synthetic.main.include_base_title.* + +class DeviceOnMapActivity : AppCompatActivity() { + + private val kTag = "DeviceOnMapActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var aMap: AMap + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_device_on_map) + + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + titleView.text = "异常报警位置" + leftBackView.setOnClickListener { finish() } + + setMapConfig(savedInstanceState) + + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + wellViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + wellViewModel.queryWellInfo(deviceId) + wellViewModel.wellResultModel.observe(this, { + if (it.code == 200) { + val lat = it.data.latGaode.toString() + val lng = it.data.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + val latLng = LatLng(latitude, longitude) + //移动到指定经纬度 + val cameraPosition = CameraPosition(latLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 2000, null) + + aMap.addMarker( + MarkerOptions() + .position(latLng) + .icon( + BitmapDescriptorFactory.fromBitmap( + BitmapDescriptorFactory.fromResource(R.mipmap.map_pin).bitmap + ) + ) + .title("") + .snippet("") + ) + } + } else { + "经纬度异常".show(this) + } + } + }) + } + + private fun setMapConfig(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt new file mode 100644 index 0000000..9716725 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.smart.town.sanxi.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.smart.town.sanxi.base.BaseApplication +import com.casic.smart.town.sanxi.extensions.separateResponseCode +import com.casic.smart.town.sanxi.extensions.toErrorMessage +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel + +class AlarmViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val resultModel = MutableLiveData() + + fun getAlarmListData(beginTime: String, endTime: String, offset: Int) = launch({ + val response = RetrofitServiceManager.getAlarmListData(beginTime, endTime, offset) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index 87ddbf8..f159635 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -15,7 +15,7 @@ class AuthenticateViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt index c377c61..1bff381 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt @@ -16,7 +16,7 @@ class LoginViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val enterResultModel = MutableLiveData() val outResultModel = MutableLiveData() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt index 29a8756..dd1f190 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt @@ -17,7 +17,7 @@ class UserViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val userDetailModel = MutableLiveData() fun obtainUserDetail() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt index 20ea457..4f9e68f 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt @@ -15,7 +15,7 @@ class VersionViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val versionResultModel = MutableLiveData() fun updateVersion() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt index c7d0219..6ed56a4 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt @@ -4,15 +4,21 @@ import com.casic.smart.town.sanxi.base.BaseApplication import com.casic.smart.town.sanxi.extensions.separateResponseCode import com.casic.smart.town.sanxi.extensions.toErrorMessage +import com.casic.smart.town.sanxi.model.WellInfoModel import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState import org.json.JSONObject class WellViewModel : BaseViewModel() { + private val gson by lazy { Gson() } val countResultModel = MutableLiveData>() + val wellResultModel = MutableLiveData() fun countWellByState() = launch({ val response = RetrofitServiceManager.countWellByState() @@ -40,4 +46,22 @@ value } } + + fun queryWellInfo(deviceId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.queryWellInfo(deviceId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + wellResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5f605ca..1fe841c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt new file mode 100644 index 0000000..9996a4b --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt @@ -0,0 +1,54 @@ +package com.casic.smart.town.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.model.AlarmListModel + +class AlarmAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv_l, parent, false) + ) + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.deviceTypeNameView.text = String.format("设备类型:${rowsBean.deviceTypeName}") + holder.deviceStateView.text = rowsBean.onlineStateName + holder.locationView.text = String.format("异常点位置:${rowsBean.position}") + holder.installDateView.text = String.format("安装时间:${rowsBean.installDate}") + + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceTypeNameView: TextView = view.findViewById(R.id.deviceTypeNameView) + var deviceStateView: TextView = view.findViewById(R.id.deviceStateView) + var locationView: TextView = view.findViewById(R.id.locationView) + var installDateView: TextView = view.findViewById(R.id.installDateView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt index 650e201..84ca796 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt @@ -1,9 +1,27 @@ package com.casic.smart.town.sanxi.fragment +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.adapter.AlarmAdapter +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.view.DeviceOnMapActivity +import com.casic.smart.town.sanxi.vm.AlarmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_alarm.* -class AlarmPageFragment: KotlinBaseFragment() { +class AlarmPageFragment : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var alarmAdapter: AlarmAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initLayoutView(): Int = R.layout.fragment_alarm @@ -16,10 +34,79 @@ } override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + alarmViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022102801) + } + }) } override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListData() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListData() + } + } + override fun onResume() { + super.onResume() + pageIndex = 1 + getAlarmListData() + } + + private fun getAlarmListData() { + alarmViewModel.getAlarmListData("", "", pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022102801) { + if (isRefresh || isLoadMore) { + alarmAdapter.notifyDataSetChanged() + } else { + alarmAdapter = AlarmAdapter(requireContext(), dataBeans) + alarmRecyclerView!!.adapter = alarmAdapter + alarmAdapter.setOnItemClickListener(object : + AlarmAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val deviceId = dataBeans[position].id.toString() + if (deviceId.isBlank()) { + "设备ID异常,无法查看位置".show(requireContext()) + return + } + requireContext().navigatePageTo(deviceId) + } + }) + } + } + true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java new file mode 100644 index 0000000..8c51878 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java @@ -0,0 +1,256 @@ +package com.casic.smart.town.sanxi.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataModel data; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public static class DataModel { + private List rows; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public static class RowsModel { + private String bfzt; + private String bfztName; + private String communication; + private String concenCode; + private String concenId; + private String deptName; + private String deptid; + private String devcode; + private String deviceName; + private String deviceType; + private String deviceTypeName; + private String id; + private String installDate; + private String installHeight; + private String modelId; + private String modelName; + private String onlineState; + private String onlineStateName; + private String position; + private String ts; + private String valid; + private String watchType; + private String wellCode; + private String wellId; + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCommunication() { + return communication; + } + + public void setCommunication(String communication) { + this.communication = communication; + } + + public String getConcenCode() { + return concenCode; + } + + public void setConcenCode(String concenCode) { + this.concenCode = concenCode; + } + + public String getConcenId() { + return concenId; + } + + public void setConcenId(String concenId) { + this.concenId = concenId; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getDeviceTypeName() { + return deviceTypeName; + } + + public void setDeviceTypeName(String deviceTypeName) { + this.deviceTypeName = deviceTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getInstallHeight() { + return installHeight; + } + + public void setInstallHeight(String installHeight) { + this.installHeight = installHeight; + } + + public String getModelId() { + return modelId; + } + + public void setModelId(String modelId) { + this.modelId = modelId; + } + + public String getModelName() { + return modelName; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellId() { + return wellId; + } + + public void setWellId(String wellId) { + this.wellId = wellId; + } + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java new file mode 100644 index 0000000..6632b4a --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java @@ -0,0 +1,305 @@ +package com.casic.smart.town.sanxi.model; + +public class WellInfoModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String area; + private String bfzt; + private String bfztName; + private String coordinateX; + private String coordinateY; + private String deep; + private String deptName; + private String deptid; + private String deviceCount; + private String id; + private String latBaidu; + private String latGaode; + private String lngBaidu; + private String lngGaode; + private String notes; + private String photos; + private String position; + private String qu; + private String responsibleDept; + private String responsibleDeptName; + private String ts; + private String valid; + private String wellCode; + private String wellFlag1; + private String wellFlag2; + private String wellFlag3; + private String wellName; + private String wellType; + private String wellTypeName; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCoordinateX() { + return coordinateX; + } + + public void setCoordinateX(String coordinateX) { + this.coordinateX = coordinateX; + } + + public String getCoordinateY() { + return coordinateY; + } + + public void setCoordinateY(String coordinateY) { + this.coordinateY = coordinateY; + } + + public String getDeep() { + return deep; + } + + public void setDeep(String deep) { + this.deep = deep; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceCount() { + return deviceCount; + } + + public void setDeviceCount(String deviceCount) { + this.deviceCount = deviceCount; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLatBaidu() { + return latBaidu; + } + + public void setLatBaidu(String latBaidu) { + this.latBaidu = latBaidu; + } + + public String getLatGaode() { + return latGaode; + } + + public void setLatGaode(String latGaode) { + this.latGaode = latGaode; + } + + public String getLngBaidu() { + return lngBaidu; + } + + public void setLngBaidu(String lngBaidu) { + this.lngBaidu = lngBaidu; + } + + public String getLngGaode() { + return lngGaode; + } + + public void setLngGaode(String lngGaode) { + this.lngGaode = lngGaode; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } + + public String getPhotos() { + return photos; + } + + public void setPhotos(String photos) { + this.photos = photos; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getQu() { + return qu; + } + + public void setQu(String qu) { + this.qu = qu; + } + + public String getResponsibleDept() { + return responsibleDept; + } + + public void setResponsibleDept(String responsibleDept) { + this.responsibleDept = responsibleDept; + } + + public String getResponsibleDeptName() { + return responsibleDeptName; + } + + public void setResponsibleDeptName(String responsibleDeptName) { + this.responsibleDeptName = responsibleDeptName; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellFlag1() { + return wellFlag1; + } + + public void setWellFlag1(String wellFlag1) { + this.wellFlag1 = wellFlag1; + } + + public String getWellFlag2() { + return wellFlag2; + } + + public void setWellFlag2(String wellFlag2) { + this.wellFlag2 = wellFlag2; + } + + public String getWellFlag3() { + return wellFlag3; + } + + public void setWellFlag3(String wellFlag3) { + this.wellFlag3 = wellFlag3; + } + + public String getWellName() { + return wellName; + } + + public void setWellName(String wellName) { + this.wellName = wellName; + } + + public String getWellType() { + return wellType; + } + + public void setWellType(String wellType) { + this.wellType = wellType; + } + + public String getWellTypeName() { + return wellTypeName; + } + + public void setWellTypeName(String wellTypeName) { + this.wellTypeName = wellTypeName; + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt index 5b814d3..8b286d1 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt @@ -73,4 +73,22 @@ * */ @GET("/statics/deviceStaticsByType") suspend fun countDevice(@Header("token") token: String): String + + /** + * 异常设备状态列表 + * */ + @GET("/statics/deviceListPage") + suspend fun getAlarmListData( + @Header("token") token: String, + @Query("beginTime") beginTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + @GET("/statics/devicePosition") + suspend fun queryWellInfo( + @Header("token") token: String, + @Query("deviceId") deviceId: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt index 0d9cfc7..43c3d7d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt @@ -79,4 +79,18 @@ suspend fun countDevice(): String { return smartTownApi.countDevice(AuthenticationHelper.token!!) } + + suspend fun getAlarmListData(beginTime: String, endTime: String, offset: Int): String { + return smartTownApi.getAlarmListData( + AuthenticationHelper.token!!, + beginTime, + endTime, + LocaleConstant.PAGE_LIMIT, + offset + ) + } + + suspend fun queryWellInfo(deviceId: String): String { + return smartTownApi.queryWellInfo(AuthenticationHelper.token!!, deviceId) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt new file mode 100644 index 0000000..c31f25d --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt @@ -0,0 +1,117 @@ +package com.casic.smart.town.sanxi.view + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.MarkerOptions +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.util.LoadingDialogHub +import com.casic.smart.town.sanxi.vm.WellViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_device_on_map.* +import kotlinx.android.synthetic.main.include_base_title.* + +class DeviceOnMapActivity : AppCompatActivity() { + + private val kTag = "DeviceOnMapActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var aMap: AMap + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_device_on_map) + + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + titleView.text = "异常报警位置" + leftBackView.setOnClickListener { finish() } + + setMapConfig(savedInstanceState) + + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + wellViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + wellViewModel.queryWellInfo(deviceId) + wellViewModel.wellResultModel.observe(this, { + if (it.code == 200) { + val lat = it.data.latGaode.toString() + val lng = it.data.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + val latLng = LatLng(latitude, longitude) + //移动到指定经纬度 + val cameraPosition = CameraPosition(latLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 2000, null) + + aMap.addMarker( + MarkerOptions() + .position(latLng) + .icon( + BitmapDescriptorFactory.fromBitmap( + BitmapDescriptorFactory.fromResource(R.mipmap.map_pin).bitmap + ) + ) + .title("") + .snippet("") + ) + } + } else { + "经纬度异常".show(this) + } + } + }) + } + + private fun setMapConfig(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt new file mode 100644 index 0000000..9716725 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.smart.town.sanxi.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.smart.town.sanxi.base.BaseApplication +import com.casic.smart.town.sanxi.extensions.separateResponseCode +import com.casic.smart.town.sanxi.extensions.toErrorMessage +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel + +class AlarmViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val resultModel = MutableLiveData() + + fun getAlarmListData(beginTime: String, endTime: String, offset: Int) = launch({ + val response = RetrofitServiceManager.getAlarmListData(beginTime, endTime, offset) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index 87ddbf8..f159635 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -15,7 +15,7 @@ class AuthenticateViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt index c377c61..1bff381 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt @@ -16,7 +16,7 @@ class LoginViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val enterResultModel = MutableLiveData() val outResultModel = MutableLiveData() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt index 29a8756..dd1f190 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt @@ -17,7 +17,7 @@ class UserViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val userDetailModel = MutableLiveData() fun obtainUserDetail() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt index 20ea457..4f9e68f 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt @@ -15,7 +15,7 @@ class VersionViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val versionResultModel = MutableLiveData() fun updateVersion() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt index c7d0219..6ed56a4 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt @@ -4,15 +4,21 @@ import com.casic.smart.town.sanxi.base.BaseApplication import com.casic.smart.town.sanxi.extensions.separateResponseCode import com.casic.smart.town.sanxi.extensions.toErrorMessage +import com.casic.smart.town.sanxi.model.WellInfoModel import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState import org.json.JSONObject class WellViewModel : BaseViewModel() { + private val gson by lazy { Gson() } val countResultModel = MutableLiveData>() + val wellResultModel = MutableLiveData() fun countWellByState() = launch({ val response = RetrofitServiceManager.countWellByState() @@ -40,4 +46,22 @@ value } } + + fun queryWellInfo(deviceId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.queryWellInfo(deviceId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + wellResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_device_on_map.xml b/app/src/main/res/layout/activity_device_on_map.xml new file mode 100644 index 0000000..85b3c9a --- /dev/null +++ b/app/src/main/res/layout/activity_device_on_map.xml @@ -0,0 +1,19 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5f605ca..1fe841c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt new file mode 100644 index 0000000..9996a4b --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt @@ -0,0 +1,54 @@ +package com.casic.smart.town.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.model.AlarmListModel + +class AlarmAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv_l, parent, false) + ) + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.deviceTypeNameView.text = String.format("设备类型:${rowsBean.deviceTypeName}") + holder.deviceStateView.text = rowsBean.onlineStateName + holder.locationView.text = String.format("异常点位置:${rowsBean.position}") + holder.installDateView.text = String.format("安装时间:${rowsBean.installDate}") + + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceTypeNameView: TextView = view.findViewById(R.id.deviceTypeNameView) + var deviceStateView: TextView = view.findViewById(R.id.deviceStateView) + var locationView: TextView = view.findViewById(R.id.locationView) + var installDateView: TextView = view.findViewById(R.id.installDateView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt index 650e201..84ca796 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt @@ -1,9 +1,27 @@ package com.casic.smart.town.sanxi.fragment +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.adapter.AlarmAdapter +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.view.DeviceOnMapActivity +import com.casic.smart.town.sanxi.vm.AlarmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_alarm.* -class AlarmPageFragment: KotlinBaseFragment() { +class AlarmPageFragment : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var alarmAdapter: AlarmAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initLayoutView(): Int = R.layout.fragment_alarm @@ -16,10 +34,79 @@ } override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + alarmViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022102801) + } + }) } override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListData() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListData() + } + } + override fun onResume() { + super.onResume() + pageIndex = 1 + getAlarmListData() + } + + private fun getAlarmListData() { + alarmViewModel.getAlarmListData("", "", pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022102801) { + if (isRefresh || isLoadMore) { + alarmAdapter.notifyDataSetChanged() + } else { + alarmAdapter = AlarmAdapter(requireContext(), dataBeans) + alarmRecyclerView!!.adapter = alarmAdapter + alarmAdapter.setOnItemClickListener(object : + AlarmAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val deviceId = dataBeans[position].id.toString() + if (deviceId.isBlank()) { + "设备ID异常,无法查看位置".show(requireContext()) + return + } + requireContext().navigatePageTo(deviceId) + } + }) + } + } + true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java new file mode 100644 index 0000000..8c51878 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java @@ -0,0 +1,256 @@ +package com.casic.smart.town.sanxi.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataModel data; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public static class DataModel { + private List rows; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public static class RowsModel { + private String bfzt; + private String bfztName; + private String communication; + private String concenCode; + private String concenId; + private String deptName; + private String deptid; + private String devcode; + private String deviceName; + private String deviceType; + private String deviceTypeName; + private String id; + private String installDate; + private String installHeight; + private String modelId; + private String modelName; + private String onlineState; + private String onlineStateName; + private String position; + private String ts; + private String valid; + private String watchType; + private String wellCode; + private String wellId; + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCommunication() { + return communication; + } + + public void setCommunication(String communication) { + this.communication = communication; + } + + public String getConcenCode() { + return concenCode; + } + + public void setConcenCode(String concenCode) { + this.concenCode = concenCode; + } + + public String getConcenId() { + return concenId; + } + + public void setConcenId(String concenId) { + this.concenId = concenId; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getDeviceTypeName() { + return deviceTypeName; + } + + public void setDeviceTypeName(String deviceTypeName) { + this.deviceTypeName = deviceTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getInstallHeight() { + return installHeight; + } + + public void setInstallHeight(String installHeight) { + this.installHeight = installHeight; + } + + public String getModelId() { + return modelId; + } + + public void setModelId(String modelId) { + this.modelId = modelId; + } + + public String getModelName() { + return modelName; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellId() { + return wellId; + } + + public void setWellId(String wellId) { + this.wellId = wellId; + } + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java new file mode 100644 index 0000000..6632b4a --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java @@ -0,0 +1,305 @@ +package com.casic.smart.town.sanxi.model; + +public class WellInfoModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String area; + private String bfzt; + private String bfztName; + private String coordinateX; + private String coordinateY; + private String deep; + private String deptName; + private String deptid; + private String deviceCount; + private String id; + private String latBaidu; + private String latGaode; + private String lngBaidu; + private String lngGaode; + private String notes; + private String photos; + private String position; + private String qu; + private String responsibleDept; + private String responsibleDeptName; + private String ts; + private String valid; + private String wellCode; + private String wellFlag1; + private String wellFlag2; + private String wellFlag3; + private String wellName; + private String wellType; + private String wellTypeName; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCoordinateX() { + return coordinateX; + } + + public void setCoordinateX(String coordinateX) { + this.coordinateX = coordinateX; + } + + public String getCoordinateY() { + return coordinateY; + } + + public void setCoordinateY(String coordinateY) { + this.coordinateY = coordinateY; + } + + public String getDeep() { + return deep; + } + + public void setDeep(String deep) { + this.deep = deep; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceCount() { + return deviceCount; + } + + public void setDeviceCount(String deviceCount) { + this.deviceCount = deviceCount; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLatBaidu() { + return latBaidu; + } + + public void setLatBaidu(String latBaidu) { + this.latBaidu = latBaidu; + } + + public String getLatGaode() { + return latGaode; + } + + public void setLatGaode(String latGaode) { + this.latGaode = latGaode; + } + + public String getLngBaidu() { + return lngBaidu; + } + + public void setLngBaidu(String lngBaidu) { + this.lngBaidu = lngBaidu; + } + + public String getLngGaode() { + return lngGaode; + } + + public void setLngGaode(String lngGaode) { + this.lngGaode = lngGaode; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } + + public String getPhotos() { + return photos; + } + + public void setPhotos(String photos) { + this.photos = photos; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getQu() { + return qu; + } + + public void setQu(String qu) { + this.qu = qu; + } + + public String getResponsibleDept() { + return responsibleDept; + } + + public void setResponsibleDept(String responsibleDept) { + this.responsibleDept = responsibleDept; + } + + public String getResponsibleDeptName() { + return responsibleDeptName; + } + + public void setResponsibleDeptName(String responsibleDeptName) { + this.responsibleDeptName = responsibleDeptName; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellFlag1() { + return wellFlag1; + } + + public void setWellFlag1(String wellFlag1) { + this.wellFlag1 = wellFlag1; + } + + public String getWellFlag2() { + return wellFlag2; + } + + public void setWellFlag2(String wellFlag2) { + this.wellFlag2 = wellFlag2; + } + + public String getWellFlag3() { + return wellFlag3; + } + + public void setWellFlag3(String wellFlag3) { + this.wellFlag3 = wellFlag3; + } + + public String getWellName() { + return wellName; + } + + public void setWellName(String wellName) { + this.wellName = wellName; + } + + public String getWellType() { + return wellType; + } + + public void setWellType(String wellType) { + this.wellType = wellType; + } + + public String getWellTypeName() { + return wellTypeName; + } + + public void setWellTypeName(String wellTypeName) { + this.wellTypeName = wellTypeName; + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt index 5b814d3..8b286d1 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt @@ -73,4 +73,22 @@ * */ @GET("/statics/deviceStaticsByType") suspend fun countDevice(@Header("token") token: String): String + + /** + * 异常设备状态列表 + * */ + @GET("/statics/deviceListPage") + suspend fun getAlarmListData( + @Header("token") token: String, + @Query("beginTime") beginTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + @GET("/statics/devicePosition") + suspend fun queryWellInfo( + @Header("token") token: String, + @Query("deviceId") deviceId: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt index 0d9cfc7..43c3d7d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt @@ -79,4 +79,18 @@ suspend fun countDevice(): String { return smartTownApi.countDevice(AuthenticationHelper.token!!) } + + suspend fun getAlarmListData(beginTime: String, endTime: String, offset: Int): String { + return smartTownApi.getAlarmListData( + AuthenticationHelper.token!!, + beginTime, + endTime, + LocaleConstant.PAGE_LIMIT, + offset + ) + } + + suspend fun queryWellInfo(deviceId: String): String { + return smartTownApi.queryWellInfo(AuthenticationHelper.token!!, deviceId) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt new file mode 100644 index 0000000..c31f25d --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt @@ -0,0 +1,117 @@ +package com.casic.smart.town.sanxi.view + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.MarkerOptions +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.util.LoadingDialogHub +import com.casic.smart.town.sanxi.vm.WellViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_device_on_map.* +import kotlinx.android.synthetic.main.include_base_title.* + +class DeviceOnMapActivity : AppCompatActivity() { + + private val kTag = "DeviceOnMapActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var aMap: AMap + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_device_on_map) + + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + titleView.text = "异常报警位置" + leftBackView.setOnClickListener { finish() } + + setMapConfig(savedInstanceState) + + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + wellViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + wellViewModel.queryWellInfo(deviceId) + wellViewModel.wellResultModel.observe(this, { + if (it.code == 200) { + val lat = it.data.latGaode.toString() + val lng = it.data.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + val latLng = LatLng(latitude, longitude) + //移动到指定经纬度 + val cameraPosition = CameraPosition(latLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 2000, null) + + aMap.addMarker( + MarkerOptions() + .position(latLng) + .icon( + BitmapDescriptorFactory.fromBitmap( + BitmapDescriptorFactory.fromResource(R.mipmap.map_pin).bitmap + ) + ) + .title("") + .snippet("") + ) + } + } else { + "经纬度异常".show(this) + } + } + }) + } + + private fun setMapConfig(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt new file mode 100644 index 0000000..9716725 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.smart.town.sanxi.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.smart.town.sanxi.base.BaseApplication +import com.casic.smart.town.sanxi.extensions.separateResponseCode +import com.casic.smart.town.sanxi.extensions.toErrorMessage +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel + +class AlarmViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val resultModel = MutableLiveData() + + fun getAlarmListData(beginTime: String, endTime: String, offset: Int) = launch({ + val response = RetrofitServiceManager.getAlarmListData(beginTime, endTime, offset) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index 87ddbf8..f159635 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -15,7 +15,7 @@ class AuthenticateViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt index c377c61..1bff381 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt @@ -16,7 +16,7 @@ class LoginViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val enterResultModel = MutableLiveData() val outResultModel = MutableLiveData() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt index 29a8756..dd1f190 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt @@ -17,7 +17,7 @@ class UserViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val userDetailModel = MutableLiveData() fun obtainUserDetail() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt index 20ea457..4f9e68f 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt @@ -15,7 +15,7 @@ class VersionViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val versionResultModel = MutableLiveData() fun updateVersion() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt index c7d0219..6ed56a4 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt @@ -4,15 +4,21 @@ import com.casic.smart.town.sanxi.base.BaseApplication import com.casic.smart.town.sanxi.extensions.separateResponseCode import com.casic.smart.town.sanxi.extensions.toErrorMessage +import com.casic.smart.town.sanxi.model.WellInfoModel import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState import org.json.JSONObject class WellViewModel : BaseViewModel() { + private val gson by lazy { Gson() } val countResultModel = MutableLiveData>() + val wellResultModel = MutableLiveData() fun countWellByState() = launch({ val response = RetrofitServiceManager.countWellByState() @@ -40,4 +46,22 @@ value } } + + fun queryWellInfo(deviceId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.queryWellInfo(deviceId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + wellResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_device_on_map.xml b/app/src/main/res/layout/activity_device_on_map.xml new file mode 100644 index 0000000..85b3c9a --- /dev/null +++ b/app/src/main/res/layout/activity_device_on_map.xml @@ -0,0 +1,19 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml index 04881f3..61f890d 100644 --- a/app/src/main/res/layout/fragment_alarm.xml +++ b/app/src/main/res/layout/fragment_alarm.xml @@ -1,5 +1,6 @@ - + android:layout_marginTop="@dimen/dp_10"> + - + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5f605ca..1fe841c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt new file mode 100644 index 0000000..9996a4b --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt @@ -0,0 +1,54 @@ +package com.casic.smart.town.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.model.AlarmListModel + +class AlarmAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv_l, parent, false) + ) + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.deviceTypeNameView.text = String.format("设备类型:${rowsBean.deviceTypeName}") + holder.deviceStateView.text = rowsBean.onlineStateName + holder.locationView.text = String.format("异常点位置:${rowsBean.position}") + holder.installDateView.text = String.format("安装时间:${rowsBean.installDate}") + + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceTypeNameView: TextView = view.findViewById(R.id.deviceTypeNameView) + var deviceStateView: TextView = view.findViewById(R.id.deviceStateView) + var locationView: TextView = view.findViewById(R.id.locationView) + var installDateView: TextView = view.findViewById(R.id.installDateView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt index 650e201..84ca796 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt @@ -1,9 +1,27 @@ package com.casic.smart.town.sanxi.fragment +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.adapter.AlarmAdapter +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.view.DeviceOnMapActivity +import com.casic.smart.town.sanxi.vm.AlarmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_alarm.* -class AlarmPageFragment: KotlinBaseFragment() { +class AlarmPageFragment : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var alarmAdapter: AlarmAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initLayoutView(): Int = R.layout.fragment_alarm @@ -16,10 +34,79 @@ } override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + alarmViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022102801) + } + }) } override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListData() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListData() + } + } + override fun onResume() { + super.onResume() + pageIndex = 1 + getAlarmListData() + } + + private fun getAlarmListData() { + alarmViewModel.getAlarmListData("", "", pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022102801) { + if (isRefresh || isLoadMore) { + alarmAdapter.notifyDataSetChanged() + } else { + alarmAdapter = AlarmAdapter(requireContext(), dataBeans) + alarmRecyclerView!!.adapter = alarmAdapter + alarmAdapter.setOnItemClickListener(object : + AlarmAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val deviceId = dataBeans[position].id.toString() + if (deviceId.isBlank()) { + "设备ID异常,无法查看位置".show(requireContext()) + return + } + requireContext().navigatePageTo(deviceId) + } + }) + } + } + true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java new file mode 100644 index 0000000..8c51878 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java @@ -0,0 +1,256 @@ +package com.casic.smart.town.sanxi.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataModel data; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public static class DataModel { + private List rows; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public static class RowsModel { + private String bfzt; + private String bfztName; + private String communication; + private String concenCode; + private String concenId; + private String deptName; + private String deptid; + private String devcode; + private String deviceName; + private String deviceType; + private String deviceTypeName; + private String id; + private String installDate; + private String installHeight; + private String modelId; + private String modelName; + private String onlineState; + private String onlineStateName; + private String position; + private String ts; + private String valid; + private String watchType; + private String wellCode; + private String wellId; + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCommunication() { + return communication; + } + + public void setCommunication(String communication) { + this.communication = communication; + } + + public String getConcenCode() { + return concenCode; + } + + public void setConcenCode(String concenCode) { + this.concenCode = concenCode; + } + + public String getConcenId() { + return concenId; + } + + public void setConcenId(String concenId) { + this.concenId = concenId; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getDeviceTypeName() { + return deviceTypeName; + } + + public void setDeviceTypeName(String deviceTypeName) { + this.deviceTypeName = deviceTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getInstallHeight() { + return installHeight; + } + + public void setInstallHeight(String installHeight) { + this.installHeight = installHeight; + } + + public String getModelId() { + return modelId; + } + + public void setModelId(String modelId) { + this.modelId = modelId; + } + + public String getModelName() { + return modelName; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellId() { + return wellId; + } + + public void setWellId(String wellId) { + this.wellId = wellId; + } + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java new file mode 100644 index 0000000..6632b4a --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java @@ -0,0 +1,305 @@ +package com.casic.smart.town.sanxi.model; + +public class WellInfoModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String area; + private String bfzt; + private String bfztName; + private String coordinateX; + private String coordinateY; + private String deep; + private String deptName; + private String deptid; + private String deviceCount; + private String id; + private String latBaidu; + private String latGaode; + private String lngBaidu; + private String lngGaode; + private String notes; + private String photos; + private String position; + private String qu; + private String responsibleDept; + private String responsibleDeptName; + private String ts; + private String valid; + private String wellCode; + private String wellFlag1; + private String wellFlag2; + private String wellFlag3; + private String wellName; + private String wellType; + private String wellTypeName; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCoordinateX() { + return coordinateX; + } + + public void setCoordinateX(String coordinateX) { + this.coordinateX = coordinateX; + } + + public String getCoordinateY() { + return coordinateY; + } + + public void setCoordinateY(String coordinateY) { + this.coordinateY = coordinateY; + } + + public String getDeep() { + return deep; + } + + public void setDeep(String deep) { + this.deep = deep; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceCount() { + return deviceCount; + } + + public void setDeviceCount(String deviceCount) { + this.deviceCount = deviceCount; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLatBaidu() { + return latBaidu; + } + + public void setLatBaidu(String latBaidu) { + this.latBaidu = latBaidu; + } + + public String getLatGaode() { + return latGaode; + } + + public void setLatGaode(String latGaode) { + this.latGaode = latGaode; + } + + public String getLngBaidu() { + return lngBaidu; + } + + public void setLngBaidu(String lngBaidu) { + this.lngBaidu = lngBaidu; + } + + public String getLngGaode() { + return lngGaode; + } + + public void setLngGaode(String lngGaode) { + this.lngGaode = lngGaode; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } + + public String getPhotos() { + return photos; + } + + public void setPhotos(String photos) { + this.photos = photos; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getQu() { + return qu; + } + + public void setQu(String qu) { + this.qu = qu; + } + + public String getResponsibleDept() { + return responsibleDept; + } + + public void setResponsibleDept(String responsibleDept) { + this.responsibleDept = responsibleDept; + } + + public String getResponsibleDeptName() { + return responsibleDeptName; + } + + public void setResponsibleDeptName(String responsibleDeptName) { + this.responsibleDeptName = responsibleDeptName; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellFlag1() { + return wellFlag1; + } + + public void setWellFlag1(String wellFlag1) { + this.wellFlag1 = wellFlag1; + } + + public String getWellFlag2() { + return wellFlag2; + } + + public void setWellFlag2(String wellFlag2) { + this.wellFlag2 = wellFlag2; + } + + public String getWellFlag3() { + return wellFlag3; + } + + public void setWellFlag3(String wellFlag3) { + this.wellFlag3 = wellFlag3; + } + + public String getWellName() { + return wellName; + } + + public void setWellName(String wellName) { + this.wellName = wellName; + } + + public String getWellType() { + return wellType; + } + + public void setWellType(String wellType) { + this.wellType = wellType; + } + + public String getWellTypeName() { + return wellTypeName; + } + + public void setWellTypeName(String wellTypeName) { + this.wellTypeName = wellTypeName; + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt index 5b814d3..8b286d1 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt @@ -73,4 +73,22 @@ * */ @GET("/statics/deviceStaticsByType") suspend fun countDevice(@Header("token") token: String): String + + /** + * 异常设备状态列表 + * */ + @GET("/statics/deviceListPage") + suspend fun getAlarmListData( + @Header("token") token: String, + @Query("beginTime") beginTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + @GET("/statics/devicePosition") + suspend fun queryWellInfo( + @Header("token") token: String, + @Query("deviceId") deviceId: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt index 0d9cfc7..43c3d7d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt @@ -79,4 +79,18 @@ suspend fun countDevice(): String { return smartTownApi.countDevice(AuthenticationHelper.token!!) } + + suspend fun getAlarmListData(beginTime: String, endTime: String, offset: Int): String { + return smartTownApi.getAlarmListData( + AuthenticationHelper.token!!, + beginTime, + endTime, + LocaleConstant.PAGE_LIMIT, + offset + ) + } + + suspend fun queryWellInfo(deviceId: String): String { + return smartTownApi.queryWellInfo(AuthenticationHelper.token!!, deviceId) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt new file mode 100644 index 0000000..c31f25d --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt @@ -0,0 +1,117 @@ +package com.casic.smart.town.sanxi.view + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.MarkerOptions +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.util.LoadingDialogHub +import com.casic.smart.town.sanxi.vm.WellViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_device_on_map.* +import kotlinx.android.synthetic.main.include_base_title.* + +class DeviceOnMapActivity : AppCompatActivity() { + + private val kTag = "DeviceOnMapActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var aMap: AMap + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_device_on_map) + + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + titleView.text = "异常报警位置" + leftBackView.setOnClickListener { finish() } + + setMapConfig(savedInstanceState) + + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + wellViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + wellViewModel.queryWellInfo(deviceId) + wellViewModel.wellResultModel.observe(this, { + if (it.code == 200) { + val lat = it.data.latGaode.toString() + val lng = it.data.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + val latLng = LatLng(latitude, longitude) + //移动到指定经纬度 + val cameraPosition = CameraPosition(latLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 2000, null) + + aMap.addMarker( + MarkerOptions() + .position(latLng) + .icon( + BitmapDescriptorFactory.fromBitmap( + BitmapDescriptorFactory.fromResource(R.mipmap.map_pin).bitmap + ) + ) + .title("") + .snippet("") + ) + } + } else { + "经纬度异常".show(this) + } + } + }) + } + + private fun setMapConfig(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt new file mode 100644 index 0000000..9716725 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.smart.town.sanxi.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.smart.town.sanxi.base.BaseApplication +import com.casic.smart.town.sanxi.extensions.separateResponseCode +import com.casic.smart.town.sanxi.extensions.toErrorMessage +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel + +class AlarmViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val resultModel = MutableLiveData() + + fun getAlarmListData(beginTime: String, endTime: String, offset: Int) = launch({ + val response = RetrofitServiceManager.getAlarmListData(beginTime, endTime, offset) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index 87ddbf8..f159635 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -15,7 +15,7 @@ class AuthenticateViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt index c377c61..1bff381 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt @@ -16,7 +16,7 @@ class LoginViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val enterResultModel = MutableLiveData() val outResultModel = MutableLiveData() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt index 29a8756..dd1f190 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt @@ -17,7 +17,7 @@ class UserViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val userDetailModel = MutableLiveData() fun obtainUserDetail() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt index 20ea457..4f9e68f 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt @@ -15,7 +15,7 @@ class VersionViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val versionResultModel = MutableLiveData() fun updateVersion() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt index c7d0219..6ed56a4 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt @@ -4,15 +4,21 @@ import com.casic.smart.town.sanxi.base.BaseApplication import com.casic.smart.town.sanxi.extensions.separateResponseCode import com.casic.smart.town.sanxi.extensions.toErrorMessage +import com.casic.smart.town.sanxi.model.WellInfoModel import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState import org.json.JSONObject class WellViewModel : BaseViewModel() { + private val gson by lazy { Gson() } val countResultModel = MutableLiveData>() + val wellResultModel = MutableLiveData() fun countWellByState() = launch({ val response = RetrofitServiceManager.countWellByState() @@ -40,4 +46,22 @@ value } } + + fun queryWellInfo(deviceId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.queryWellInfo(deviceId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + wellResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_device_on_map.xml b/app/src/main/res/layout/activity_device_on_map.xml new file mode 100644 index 0000000..85b3c9a --- /dev/null +++ b/app/src/main/res/layout/activity_device_on_map.xml @@ -0,0 +1,19 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml index 04881f3..61f890d 100644 --- a/app/src/main/res/layout/fragment_alarm.xml +++ b/app/src/main/res/layout/fragment_alarm.xml @@ -1,5 +1,6 @@ - + android:layout_marginTop="@dimen/dp_10"> + - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_statistics.xml b/app/src/main/res/layout/fragment_statistics.xml index 5a2d4ad..541617c 100644 --- a/app/src/main/res/layout/fragment_statistics.xml +++ b/app/src/main/res/layout/fragment_statistics.xml @@ -24,7 +24,10 @@ + android:layout_height="match_parent" > + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5f605ca..1fe841c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt new file mode 100644 index 0000000..9996a4b --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt @@ -0,0 +1,54 @@ +package com.casic.smart.town.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.model.AlarmListModel + +class AlarmAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv_l, parent, false) + ) + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.deviceTypeNameView.text = String.format("设备类型:${rowsBean.deviceTypeName}") + holder.deviceStateView.text = rowsBean.onlineStateName + holder.locationView.text = String.format("异常点位置:${rowsBean.position}") + holder.installDateView.text = String.format("安装时间:${rowsBean.installDate}") + + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceTypeNameView: TextView = view.findViewById(R.id.deviceTypeNameView) + var deviceStateView: TextView = view.findViewById(R.id.deviceStateView) + var locationView: TextView = view.findViewById(R.id.locationView) + var installDateView: TextView = view.findViewById(R.id.installDateView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt index 650e201..84ca796 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt @@ -1,9 +1,27 @@ package com.casic.smart.town.sanxi.fragment +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.adapter.AlarmAdapter +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.view.DeviceOnMapActivity +import com.casic.smart.town.sanxi.vm.AlarmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_alarm.* -class AlarmPageFragment: KotlinBaseFragment() { +class AlarmPageFragment : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var alarmAdapter: AlarmAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initLayoutView(): Int = R.layout.fragment_alarm @@ -16,10 +34,79 @@ } override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + alarmViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022102801) + } + }) } override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListData() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListData() + } + } + override fun onResume() { + super.onResume() + pageIndex = 1 + getAlarmListData() + } + + private fun getAlarmListData() { + alarmViewModel.getAlarmListData("", "", pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022102801) { + if (isRefresh || isLoadMore) { + alarmAdapter.notifyDataSetChanged() + } else { + alarmAdapter = AlarmAdapter(requireContext(), dataBeans) + alarmRecyclerView!!.adapter = alarmAdapter + alarmAdapter.setOnItemClickListener(object : + AlarmAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val deviceId = dataBeans[position].id.toString() + if (deviceId.isBlank()) { + "设备ID异常,无法查看位置".show(requireContext()) + return + } + requireContext().navigatePageTo(deviceId) + } + }) + } + } + true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java new file mode 100644 index 0000000..8c51878 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java @@ -0,0 +1,256 @@ +package com.casic.smart.town.sanxi.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataModel data; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public static class DataModel { + private List rows; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public static class RowsModel { + private String bfzt; + private String bfztName; + private String communication; + private String concenCode; + private String concenId; + private String deptName; + private String deptid; + private String devcode; + private String deviceName; + private String deviceType; + private String deviceTypeName; + private String id; + private String installDate; + private String installHeight; + private String modelId; + private String modelName; + private String onlineState; + private String onlineStateName; + private String position; + private String ts; + private String valid; + private String watchType; + private String wellCode; + private String wellId; + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCommunication() { + return communication; + } + + public void setCommunication(String communication) { + this.communication = communication; + } + + public String getConcenCode() { + return concenCode; + } + + public void setConcenCode(String concenCode) { + this.concenCode = concenCode; + } + + public String getConcenId() { + return concenId; + } + + public void setConcenId(String concenId) { + this.concenId = concenId; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getDeviceTypeName() { + return deviceTypeName; + } + + public void setDeviceTypeName(String deviceTypeName) { + this.deviceTypeName = deviceTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getInstallHeight() { + return installHeight; + } + + public void setInstallHeight(String installHeight) { + this.installHeight = installHeight; + } + + public String getModelId() { + return modelId; + } + + public void setModelId(String modelId) { + this.modelId = modelId; + } + + public String getModelName() { + return modelName; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellId() { + return wellId; + } + + public void setWellId(String wellId) { + this.wellId = wellId; + } + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java new file mode 100644 index 0000000..6632b4a --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java @@ -0,0 +1,305 @@ +package com.casic.smart.town.sanxi.model; + +public class WellInfoModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String area; + private String bfzt; + private String bfztName; + private String coordinateX; + private String coordinateY; + private String deep; + private String deptName; + private String deptid; + private String deviceCount; + private String id; + private String latBaidu; + private String latGaode; + private String lngBaidu; + private String lngGaode; + private String notes; + private String photos; + private String position; + private String qu; + private String responsibleDept; + private String responsibleDeptName; + private String ts; + private String valid; + private String wellCode; + private String wellFlag1; + private String wellFlag2; + private String wellFlag3; + private String wellName; + private String wellType; + private String wellTypeName; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCoordinateX() { + return coordinateX; + } + + public void setCoordinateX(String coordinateX) { + this.coordinateX = coordinateX; + } + + public String getCoordinateY() { + return coordinateY; + } + + public void setCoordinateY(String coordinateY) { + this.coordinateY = coordinateY; + } + + public String getDeep() { + return deep; + } + + public void setDeep(String deep) { + this.deep = deep; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceCount() { + return deviceCount; + } + + public void setDeviceCount(String deviceCount) { + this.deviceCount = deviceCount; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLatBaidu() { + return latBaidu; + } + + public void setLatBaidu(String latBaidu) { + this.latBaidu = latBaidu; + } + + public String getLatGaode() { + return latGaode; + } + + public void setLatGaode(String latGaode) { + this.latGaode = latGaode; + } + + public String getLngBaidu() { + return lngBaidu; + } + + public void setLngBaidu(String lngBaidu) { + this.lngBaidu = lngBaidu; + } + + public String getLngGaode() { + return lngGaode; + } + + public void setLngGaode(String lngGaode) { + this.lngGaode = lngGaode; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } + + public String getPhotos() { + return photos; + } + + public void setPhotos(String photos) { + this.photos = photos; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getQu() { + return qu; + } + + public void setQu(String qu) { + this.qu = qu; + } + + public String getResponsibleDept() { + return responsibleDept; + } + + public void setResponsibleDept(String responsibleDept) { + this.responsibleDept = responsibleDept; + } + + public String getResponsibleDeptName() { + return responsibleDeptName; + } + + public void setResponsibleDeptName(String responsibleDeptName) { + this.responsibleDeptName = responsibleDeptName; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellFlag1() { + return wellFlag1; + } + + public void setWellFlag1(String wellFlag1) { + this.wellFlag1 = wellFlag1; + } + + public String getWellFlag2() { + return wellFlag2; + } + + public void setWellFlag2(String wellFlag2) { + this.wellFlag2 = wellFlag2; + } + + public String getWellFlag3() { + return wellFlag3; + } + + public void setWellFlag3(String wellFlag3) { + this.wellFlag3 = wellFlag3; + } + + public String getWellName() { + return wellName; + } + + public void setWellName(String wellName) { + this.wellName = wellName; + } + + public String getWellType() { + return wellType; + } + + public void setWellType(String wellType) { + this.wellType = wellType; + } + + public String getWellTypeName() { + return wellTypeName; + } + + public void setWellTypeName(String wellTypeName) { + this.wellTypeName = wellTypeName; + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt index 5b814d3..8b286d1 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt @@ -73,4 +73,22 @@ * */ @GET("/statics/deviceStaticsByType") suspend fun countDevice(@Header("token") token: String): String + + /** + * 异常设备状态列表 + * */ + @GET("/statics/deviceListPage") + suspend fun getAlarmListData( + @Header("token") token: String, + @Query("beginTime") beginTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + @GET("/statics/devicePosition") + suspend fun queryWellInfo( + @Header("token") token: String, + @Query("deviceId") deviceId: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt index 0d9cfc7..43c3d7d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt @@ -79,4 +79,18 @@ suspend fun countDevice(): String { return smartTownApi.countDevice(AuthenticationHelper.token!!) } + + suspend fun getAlarmListData(beginTime: String, endTime: String, offset: Int): String { + return smartTownApi.getAlarmListData( + AuthenticationHelper.token!!, + beginTime, + endTime, + LocaleConstant.PAGE_LIMIT, + offset + ) + } + + suspend fun queryWellInfo(deviceId: String): String { + return smartTownApi.queryWellInfo(AuthenticationHelper.token!!, deviceId) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt new file mode 100644 index 0000000..c31f25d --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt @@ -0,0 +1,117 @@ +package com.casic.smart.town.sanxi.view + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.MarkerOptions +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.util.LoadingDialogHub +import com.casic.smart.town.sanxi.vm.WellViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_device_on_map.* +import kotlinx.android.synthetic.main.include_base_title.* + +class DeviceOnMapActivity : AppCompatActivity() { + + private val kTag = "DeviceOnMapActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var aMap: AMap + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_device_on_map) + + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + titleView.text = "异常报警位置" + leftBackView.setOnClickListener { finish() } + + setMapConfig(savedInstanceState) + + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + wellViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + wellViewModel.queryWellInfo(deviceId) + wellViewModel.wellResultModel.observe(this, { + if (it.code == 200) { + val lat = it.data.latGaode.toString() + val lng = it.data.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + val latLng = LatLng(latitude, longitude) + //移动到指定经纬度 + val cameraPosition = CameraPosition(latLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 2000, null) + + aMap.addMarker( + MarkerOptions() + .position(latLng) + .icon( + BitmapDescriptorFactory.fromBitmap( + BitmapDescriptorFactory.fromResource(R.mipmap.map_pin).bitmap + ) + ) + .title("") + .snippet("") + ) + } + } else { + "经纬度异常".show(this) + } + } + }) + } + + private fun setMapConfig(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt new file mode 100644 index 0000000..9716725 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.smart.town.sanxi.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.smart.town.sanxi.base.BaseApplication +import com.casic.smart.town.sanxi.extensions.separateResponseCode +import com.casic.smart.town.sanxi.extensions.toErrorMessage +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel + +class AlarmViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val resultModel = MutableLiveData() + + fun getAlarmListData(beginTime: String, endTime: String, offset: Int) = launch({ + val response = RetrofitServiceManager.getAlarmListData(beginTime, endTime, offset) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index 87ddbf8..f159635 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -15,7 +15,7 @@ class AuthenticateViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt index c377c61..1bff381 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt @@ -16,7 +16,7 @@ class LoginViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val enterResultModel = MutableLiveData() val outResultModel = MutableLiveData() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt index 29a8756..dd1f190 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt @@ -17,7 +17,7 @@ class UserViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val userDetailModel = MutableLiveData() fun obtainUserDetail() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt index 20ea457..4f9e68f 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt @@ -15,7 +15,7 @@ class VersionViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val versionResultModel = MutableLiveData() fun updateVersion() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt index c7d0219..6ed56a4 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt @@ -4,15 +4,21 @@ import com.casic.smart.town.sanxi.base.BaseApplication import com.casic.smart.town.sanxi.extensions.separateResponseCode import com.casic.smart.town.sanxi.extensions.toErrorMessage +import com.casic.smart.town.sanxi.model.WellInfoModel import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState import org.json.JSONObject class WellViewModel : BaseViewModel() { + private val gson by lazy { Gson() } val countResultModel = MutableLiveData>() + val wellResultModel = MutableLiveData() fun countWellByState() = launch({ val response = RetrofitServiceManager.countWellByState() @@ -40,4 +46,22 @@ value } } + + fun queryWellInfo(deviceId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.queryWellInfo(deviceId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + wellResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_device_on_map.xml b/app/src/main/res/layout/activity_device_on_map.xml new file mode 100644 index 0000000..85b3c9a --- /dev/null +++ b/app/src/main/res/layout/activity_device_on_map.xml @@ -0,0 +1,19 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml index 04881f3..61f890d 100644 --- a/app/src/main/res/layout/fragment_alarm.xml +++ b/app/src/main/res/layout/fragment_alarm.xml @@ -1,5 +1,6 @@ - + android:layout_marginTop="@dimen/dp_10"> + - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_statistics.xml b/app/src/main/res/layout/fragment_statistics.xml index 5a2d4ad..541617c 100644 --- a/app/src/main/res/layout/fragment_statistics.xml +++ b/app/src/main/res/layout/fragment_statistics.xml @@ -24,7 +24,10 @@ + android:layout_height="match_parent" > + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_alarm_rv_l.xml b/app/src/main/res/layout/item_alarm_rv_l.xml new file mode 100644 index 0000000..724d2ba --- /dev/null +++ b/app/src/main/res/layout/item_alarm_rv_l.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5f605ca..1fe841c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt new file mode 100644 index 0000000..9996a4b --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt @@ -0,0 +1,54 @@ +package com.casic.smart.town.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.model.AlarmListModel + +class AlarmAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv_l, parent, false) + ) + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.deviceTypeNameView.text = String.format("设备类型:${rowsBean.deviceTypeName}") + holder.deviceStateView.text = rowsBean.onlineStateName + holder.locationView.text = String.format("异常点位置:${rowsBean.position}") + holder.installDateView.text = String.format("安装时间:${rowsBean.installDate}") + + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceTypeNameView: TextView = view.findViewById(R.id.deviceTypeNameView) + var deviceStateView: TextView = view.findViewById(R.id.deviceStateView) + var locationView: TextView = view.findViewById(R.id.locationView) + var installDateView: TextView = view.findViewById(R.id.installDateView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt index 650e201..84ca796 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt @@ -1,9 +1,27 @@ package com.casic.smart.town.sanxi.fragment +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.adapter.AlarmAdapter +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.view.DeviceOnMapActivity +import com.casic.smart.town.sanxi.vm.AlarmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_alarm.* -class AlarmPageFragment: KotlinBaseFragment() { +class AlarmPageFragment : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var alarmAdapter: AlarmAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initLayoutView(): Int = R.layout.fragment_alarm @@ -16,10 +34,79 @@ } override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + alarmViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022102801) + } + }) } override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListData() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListData() + } + } + override fun onResume() { + super.onResume() + pageIndex = 1 + getAlarmListData() + } + + private fun getAlarmListData() { + alarmViewModel.getAlarmListData("", "", pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022102801) { + if (isRefresh || isLoadMore) { + alarmAdapter.notifyDataSetChanged() + } else { + alarmAdapter = AlarmAdapter(requireContext(), dataBeans) + alarmRecyclerView!!.adapter = alarmAdapter + alarmAdapter.setOnItemClickListener(object : + AlarmAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val deviceId = dataBeans[position].id.toString() + if (deviceId.isBlank()) { + "设备ID异常,无法查看位置".show(requireContext()) + return + } + requireContext().navigatePageTo(deviceId) + } + }) + } + } + true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java new file mode 100644 index 0000000..8c51878 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java @@ -0,0 +1,256 @@ +package com.casic.smart.town.sanxi.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataModel data; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public static class DataModel { + private List rows; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public static class RowsModel { + private String bfzt; + private String bfztName; + private String communication; + private String concenCode; + private String concenId; + private String deptName; + private String deptid; + private String devcode; + private String deviceName; + private String deviceType; + private String deviceTypeName; + private String id; + private String installDate; + private String installHeight; + private String modelId; + private String modelName; + private String onlineState; + private String onlineStateName; + private String position; + private String ts; + private String valid; + private String watchType; + private String wellCode; + private String wellId; + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCommunication() { + return communication; + } + + public void setCommunication(String communication) { + this.communication = communication; + } + + public String getConcenCode() { + return concenCode; + } + + public void setConcenCode(String concenCode) { + this.concenCode = concenCode; + } + + public String getConcenId() { + return concenId; + } + + public void setConcenId(String concenId) { + this.concenId = concenId; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getDeviceTypeName() { + return deviceTypeName; + } + + public void setDeviceTypeName(String deviceTypeName) { + this.deviceTypeName = deviceTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getInstallHeight() { + return installHeight; + } + + public void setInstallHeight(String installHeight) { + this.installHeight = installHeight; + } + + public String getModelId() { + return modelId; + } + + public void setModelId(String modelId) { + this.modelId = modelId; + } + + public String getModelName() { + return modelName; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellId() { + return wellId; + } + + public void setWellId(String wellId) { + this.wellId = wellId; + } + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java new file mode 100644 index 0000000..6632b4a --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java @@ -0,0 +1,305 @@ +package com.casic.smart.town.sanxi.model; + +public class WellInfoModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String area; + private String bfzt; + private String bfztName; + private String coordinateX; + private String coordinateY; + private String deep; + private String deptName; + private String deptid; + private String deviceCount; + private String id; + private String latBaidu; + private String latGaode; + private String lngBaidu; + private String lngGaode; + private String notes; + private String photos; + private String position; + private String qu; + private String responsibleDept; + private String responsibleDeptName; + private String ts; + private String valid; + private String wellCode; + private String wellFlag1; + private String wellFlag2; + private String wellFlag3; + private String wellName; + private String wellType; + private String wellTypeName; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCoordinateX() { + return coordinateX; + } + + public void setCoordinateX(String coordinateX) { + this.coordinateX = coordinateX; + } + + public String getCoordinateY() { + return coordinateY; + } + + public void setCoordinateY(String coordinateY) { + this.coordinateY = coordinateY; + } + + public String getDeep() { + return deep; + } + + public void setDeep(String deep) { + this.deep = deep; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceCount() { + return deviceCount; + } + + public void setDeviceCount(String deviceCount) { + this.deviceCount = deviceCount; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLatBaidu() { + return latBaidu; + } + + public void setLatBaidu(String latBaidu) { + this.latBaidu = latBaidu; + } + + public String getLatGaode() { + return latGaode; + } + + public void setLatGaode(String latGaode) { + this.latGaode = latGaode; + } + + public String getLngBaidu() { + return lngBaidu; + } + + public void setLngBaidu(String lngBaidu) { + this.lngBaidu = lngBaidu; + } + + public String getLngGaode() { + return lngGaode; + } + + public void setLngGaode(String lngGaode) { + this.lngGaode = lngGaode; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } + + public String getPhotos() { + return photos; + } + + public void setPhotos(String photos) { + this.photos = photos; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getQu() { + return qu; + } + + public void setQu(String qu) { + this.qu = qu; + } + + public String getResponsibleDept() { + return responsibleDept; + } + + public void setResponsibleDept(String responsibleDept) { + this.responsibleDept = responsibleDept; + } + + public String getResponsibleDeptName() { + return responsibleDeptName; + } + + public void setResponsibleDeptName(String responsibleDeptName) { + this.responsibleDeptName = responsibleDeptName; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellFlag1() { + return wellFlag1; + } + + public void setWellFlag1(String wellFlag1) { + this.wellFlag1 = wellFlag1; + } + + public String getWellFlag2() { + return wellFlag2; + } + + public void setWellFlag2(String wellFlag2) { + this.wellFlag2 = wellFlag2; + } + + public String getWellFlag3() { + return wellFlag3; + } + + public void setWellFlag3(String wellFlag3) { + this.wellFlag3 = wellFlag3; + } + + public String getWellName() { + return wellName; + } + + public void setWellName(String wellName) { + this.wellName = wellName; + } + + public String getWellType() { + return wellType; + } + + public void setWellType(String wellType) { + this.wellType = wellType; + } + + public String getWellTypeName() { + return wellTypeName; + } + + public void setWellTypeName(String wellTypeName) { + this.wellTypeName = wellTypeName; + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt index 5b814d3..8b286d1 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt @@ -73,4 +73,22 @@ * */ @GET("/statics/deviceStaticsByType") suspend fun countDevice(@Header("token") token: String): String + + /** + * 异常设备状态列表 + * */ + @GET("/statics/deviceListPage") + suspend fun getAlarmListData( + @Header("token") token: String, + @Query("beginTime") beginTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + @GET("/statics/devicePosition") + suspend fun queryWellInfo( + @Header("token") token: String, + @Query("deviceId") deviceId: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt index 0d9cfc7..43c3d7d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt @@ -79,4 +79,18 @@ suspend fun countDevice(): String { return smartTownApi.countDevice(AuthenticationHelper.token!!) } + + suspend fun getAlarmListData(beginTime: String, endTime: String, offset: Int): String { + return smartTownApi.getAlarmListData( + AuthenticationHelper.token!!, + beginTime, + endTime, + LocaleConstant.PAGE_LIMIT, + offset + ) + } + + suspend fun queryWellInfo(deviceId: String): String { + return smartTownApi.queryWellInfo(AuthenticationHelper.token!!, deviceId) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt new file mode 100644 index 0000000..c31f25d --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt @@ -0,0 +1,117 @@ +package com.casic.smart.town.sanxi.view + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.MarkerOptions +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.util.LoadingDialogHub +import com.casic.smart.town.sanxi.vm.WellViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_device_on_map.* +import kotlinx.android.synthetic.main.include_base_title.* + +class DeviceOnMapActivity : AppCompatActivity() { + + private val kTag = "DeviceOnMapActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var aMap: AMap + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_device_on_map) + + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + titleView.text = "异常报警位置" + leftBackView.setOnClickListener { finish() } + + setMapConfig(savedInstanceState) + + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + wellViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + wellViewModel.queryWellInfo(deviceId) + wellViewModel.wellResultModel.observe(this, { + if (it.code == 200) { + val lat = it.data.latGaode.toString() + val lng = it.data.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + val latLng = LatLng(latitude, longitude) + //移动到指定经纬度 + val cameraPosition = CameraPosition(latLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 2000, null) + + aMap.addMarker( + MarkerOptions() + .position(latLng) + .icon( + BitmapDescriptorFactory.fromBitmap( + BitmapDescriptorFactory.fromResource(R.mipmap.map_pin).bitmap + ) + ) + .title("") + .snippet("") + ) + } + } else { + "经纬度异常".show(this) + } + } + }) + } + + private fun setMapConfig(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt new file mode 100644 index 0000000..9716725 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.smart.town.sanxi.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.smart.town.sanxi.base.BaseApplication +import com.casic.smart.town.sanxi.extensions.separateResponseCode +import com.casic.smart.town.sanxi.extensions.toErrorMessage +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel + +class AlarmViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val resultModel = MutableLiveData() + + fun getAlarmListData(beginTime: String, endTime: String, offset: Int) = launch({ + val response = RetrofitServiceManager.getAlarmListData(beginTime, endTime, offset) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index 87ddbf8..f159635 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -15,7 +15,7 @@ class AuthenticateViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt index c377c61..1bff381 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt @@ -16,7 +16,7 @@ class LoginViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val enterResultModel = MutableLiveData() val outResultModel = MutableLiveData() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt index 29a8756..dd1f190 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt @@ -17,7 +17,7 @@ class UserViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val userDetailModel = MutableLiveData() fun obtainUserDetail() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt index 20ea457..4f9e68f 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt @@ -15,7 +15,7 @@ class VersionViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val versionResultModel = MutableLiveData() fun updateVersion() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt index c7d0219..6ed56a4 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt @@ -4,15 +4,21 @@ import com.casic.smart.town.sanxi.base.BaseApplication import com.casic.smart.town.sanxi.extensions.separateResponseCode import com.casic.smart.town.sanxi.extensions.toErrorMessage +import com.casic.smart.town.sanxi.model.WellInfoModel import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState import org.json.JSONObject class WellViewModel : BaseViewModel() { + private val gson by lazy { Gson() } val countResultModel = MutableLiveData>() + val wellResultModel = MutableLiveData() fun countWellByState() = launch({ val response = RetrofitServiceManager.countWellByState() @@ -40,4 +46,22 @@ value } } + + fun queryWellInfo(deviceId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.queryWellInfo(deviceId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + wellResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_device_on_map.xml b/app/src/main/res/layout/activity_device_on_map.xml new file mode 100644 index 0000000..85b3c9a --- /dev/null +++ b/app/src/main/res/layout/activity_device_on_map.xml @@ -0,0 +1,19 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml index 04881f3..61f890d 100644 --- a/app/src/main/res/layout/fragment_alarm.xml +++ b/app/src/main/res/layout/fragment_alarm.xml @@ -1,5 +1,6 @@ - + android:layout_marginTop="@dimen/dp_10"> + - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_statistics.xml b/app/src/main/res/layout/fragment_statistics.xml index 5a2d4ad..541617c 100644 --- a/app/src/main/res/layout/fragment_statistics.xml +++ b/app/src/main/res/layout/fragment_statistics.xml @@ -24,7 +24,10 @@ + android:layout_height="match_parent" > + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_alarm_rv_l.xml b/app/src/main/res/layout/item_alarm_rv_l.xml new file mode 100644 index 0000000..724d2ba --- /dev/null +++ b/app/src/main/res/layout/item_alarm_rv_l.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxxhdpi/map_pin.png b/app/src/main/res/mipmap-xxxhdpi/map_pin.png new file mode 100644 index 0000000..674c628 --- /dev/null +++ b/app/src/main/res/mipmap-xxxhdpi/map_pin.png Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5f605ca..1fe841c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt new file mode 100644 index 0000000..9996a4b --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/AlarmAdapter.kt @@ -0,0 +1,54 @@ +package com.casic.smart.town.sanxi.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.model.AlarmListModel + +class AlarmAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv_l, parent, false) + ) + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.deviceTypeNameView.text = String.format("设备类型:${rowsBean.deviceTypeName}") + holder.deviceStateView.text = rowsBean.onlineStateName + holder.locationView.text = String.format("异常点位置:${rowsBean.position}") + holder.installDateView.text = String.format("安装时间:${rowsBean.installDate}") + + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var deviceTypeNameView: TextView = view.findViewById(R.id.deviceTypeNameView) + var deviceStateView: TextView = view.findViewById(R.id.deviceStateView) + var locationView: TextView = view.findViewById(R.id.locationView) + var installDateView: TextView = view.findViewById(R.id.installDateView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt index 650e201..84ca796 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/AlarmPageFragment.kt @@ -1,9 +1,27 @@ package com.casic.smart.town.sanxi.fragment +import android.os.Handler +import androidx.lifecycle.ViewModelProvider import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.adapter.AlarmAdapter +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.view.DeviceOnMapActivity +import com.casic.smart.town.sanxi.vm.AlarmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.android.synthetic.main.fragment_alarm.* -class AlarmPageFragment: KotlinBaseFragment() { +class AlarmPageFragment : KotlinBaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmViewModel: AlarmViewModel + private lateinit var alarmAdapter: AlarmAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false override fun initLayoutView(): Int = R.layout.fragment_alarm @@ -16,10 +34,79 @@ } override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] + alarmViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022102801) + } + }) } override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getAlarmListData() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getAlarmListData() + } + } + override fun onResume() { + super.onResume() + pageIndex = 1 + getAlarmListData() + } + + private fun getAlarmListData() { + alarmViewModel.getAlarmListData("", "", pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022102801) { + if (isRefresh || isLoadMore) { + alarmAdapter.notifyDataSetChanged() + } else { + alarmAdapter = AlarmAdapter(requireContext(), dataBeans) + alarmRecyclerView!!.adapter = alarmAdapter + alarmAdapter.setOnItemClickListener(object : + AlarmAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val deviceId = dataBeans[position].id.toString() + if (deviceId.isBlank()) { + "设备ID异常,无法查看位置".show(requireContext()) + return + } + requireContext().navigatePageTo(deviceId) + } + }) + } + } + true } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java new file mode 100644 index 0000000..8c51878 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/AlarmListModel.java @@ -0,0 +1,256 @@ +package com.casic.smart.town.sanxi.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataModel data; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public static class DataModel { + private List rows; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public static class RowsModel { + private String bfzt; + private String bfztName; + private String communication; + private String concenCode; + private String concenId; + private String deptName; + private String deptid; + private String devcode; + private String deviceName; + private String deviceType; + private String deviceTypeName; + private String id; + private String installDate; + private String installHeight; + private String modelId; + private String modelName; + private String onlineState; + private String onlineStateName; + private String position; + private String ts; + private String valid; + private String watchType; + private String wellCode; + private String wellId; + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCommunication() { + return communication; + } + + public void setCommunication(String communication) { + this.communication = communication; + } + + public String getConcenCode() { + return concenCode; + } + + public void setConcenCode(String concenCode) { + this.concenCode = concenCode; + } + + public String getConcenId() { + return concenId; + } + + public void setConcenId(String concenId) { + this.concenId = concenId; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDevcode() { + return devcode; + } + + public void setDevcode(String devcode) { + this.devcode = devcode; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getDeviceTypeName() { + return deviceTypeName; + } + + public void setDeviceTypeName(String deviceTypeName) { + this.deviceTypeName = deviceTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getInstallDate() { + return installDate; + } + + public void setInstallDate(String installDate) { + this.installDate = installDate; + } + + public String getInstallHeight() { + return installHeight; + } + + public void setInstallHeight(String installHeight) { + this.installHeight = installHeight; + } + + public String getModelId() { + return modelId; + } + + public void setModelId(String modelId) { + this.modelId = modelId; + } + + public String getModelName() { + return modelName; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public String getOnlineState() { + return onlineState; + } + + public void setOnlineState(String onlineState) { + this.onlineState = onlineState; + } + + public String getOnlineStateName() { + return onlineStateName; + } + + public void setOnlineStateName(String onlineStateName) { + this.onlineStateName = onlineStateName; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWatchType() { + return watchType; + } + + public void setWatchType(String watchType) { + this.watchType = watchType; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellId() { + return wellId; + } + + public void setWellId(String wellId) { + this.wellId = wellId; + } + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java new file mode 100644 index 0000000..6632b4a --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/model/WellInfoModel.java @@ -0,0 +1,305 @@ +package com.casic.smart.town.sanxi.model; + +public class WellInfoModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String area; + private String bfzt; + private String bfztName; + private String coordinateX; + private String coordinateY; + private String deep; + private String deptName; + private String deptid; + private String deviceCount; + private String id; + private String latBaidu; + private String latGaode; + private String lngBaidu; + private String lngGaode; + private String notes; + private String photos; + private String position; + private String qu; + private String responsibleDept; + private String responsibleDeptName; + private String ts; + private String valid; + private String wellCode; + private String wellFlag1; + private String wellFlag2; + private String wellFlag3; + private String wellName; + private String wellType; + private String wellTypeName; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getBfzt() { + return bfzt; + } + + public void setBfzt(String bfzt) { + this.bfzt = bfzt; + } + + public String getBfztName() { + return bfztName; + } + + public void setBfztName(String bfztName) { + this.bfztName = bfztName; + } + + public String getCoordinateX() { + return coordinateX; + } + + public void setCoordinateX(String coordinateX) { + this.coordinateX = coordinateX; + } + + public String getCoordinateY() { + return coordinateY; + } + + public void setCoordinateY(String coordinateY) { + this.coordinateY = coordinateY; + } + + public String getDeep() { + return deep; + } + + public void setDeep(String deep) { + this.deep = deep; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceCount() { + return deviceCount; + } + + public void setDeviceCount(String deviceCount) { + this.deviceCount = deviceCount; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLatBaidu() { + return latBaidu; + } + + public void setLatBaidu(String latBaidu) { + this.latBaidu = latBaidu; + } + + public String getLatGaode() { + return latGaode; + } + + public void setLatGaode(String latGaode) { + this.latGaode = latGaode; + } + + public String getLngBaidu() { + return lngBaidu; + } + + public void setLngBaidu(String lngBaidu) { + this.lngBaidu = lngBaidu; + } + + public String getLngGaode() { + return lngGaode; + } + + public void setLngGaode(String lngGaode) { + this.lngGaode = lngGaode; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } + + public String getPhotos() { + return photos; + } + + public void setPhotos(String photos) { + this.photos = photos; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getQu() { + return qu; + } + + public void setQu(String qu) { + this.qu = qu; + } + + public String getResponsibleDept() { + return responsibleDept; + } + + public void setResponsibleDept(String responsibleDept) { + this.responsibleDept = responsibleDept; + } + + public String getResponsibleDeptName() { + return responsibleDeptName; + } + + public void setResponsibleDeptName(String responsibleDeptName) { + this.responsibleDeptName = responsibleDeptName; + } + + public String getTs() { + return ts; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public String getValid() { + return valid; + } + + public void setValid(String valid) { + this.valid = valid; + } + + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + public String getWellFlag1() { + return wellFlag1; + } + + public void setWellFlag1(String wellFlag1) { + this.wellFlag1 = wellFlag1; + } + + public String getWellFlag2() { + return wellFlag2; + } + + public void setWellFlag2(String wellFlag2) { + this.wellFlag2 = wellFlag2; + } + + public String getWellFlag3() { + return wellFlag3; + } + + public void setWellFlag3(String wellFlag3) { + this.wellFlag3 = wellFlag3; + } + + public String getWellName() { + return wellName; + } + + public void setWellName(String wellName) { + this.wellName = wellName; + } + + public String getWellType() { + return wellType; + } + + public void setWellType(String wellType) { + this.wellType = wellType; + } + + public String getWellTypeName() { + return wellTypeName; + } + + public void setWellTypeName(String wellTypeName) { + this.wellTypeName = wellTypeName; + } + } +} diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt index 5b814d3..8b286d1 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt @@ -73,4 +73,22 @@ * */ @GET("/statics/deviceStaticsByType") suspend fun countDevice(@Header("token") token: String): String + + /** + * 异常设备状态列表 + * */ + @GET("/statics/deviceListPage") + suspend fun getAlarmListData( + @Header("token") token: String, + @Query("beginTime") beginTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + @GET("/statics/devicePosition") + suspend fun queryWellInfo( + @Header("token") token: String, + @Query("deviceId") deviceId: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt index 0d9cfc7..43c3d7d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt @@ -79,4 +79,18 @@ suspend fun countDevice(): String { return smartTownApi.countDevice(AuthenticationHelper.token!!) } + + suspend fun getAlarmListData(beginTime: String, endTime: String, offset: Int): String { + return smartTownApi.getAlarmListData( + AuthenticationHelper.token!!, + beginTime, + endTime, + LocaleConstant.PAGE_LIMIT, + offset + ) + } + + suspend fun queryWellInfo(deviceId: String): String { + return smartTownApi.queryWellInfo(AuthenticationHelper.token!!, deviceId) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt new file mode 100644 index 0000000..c31f25d --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/DeviceOnMapActivity.kt @@ -0,0 +1,117 @@ +package com.casic.smart.town.sanxi.view + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.MarkerOptions +import com.casic.smart.town.sanxi.R +import com.casic.smart.town.sanxi.util.LoadingDialogHub +import com.casic.smart.town.sanxi.vm.WellViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_device_on_map.* +import kotlinx.android.synthetic.main.include_base_title.* + +class DeviceOnMapActivity : AppCompatActivity() { + + private val kTag = "DeviceOnMapActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var aMap: AMap + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_device_on_map) + + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + titleView.text = "异常报警位置" + leftBackView.setOnClickListener { finish() } + + setMapConfig(savedInstanceState) + + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + + wellViewModel = ViewModelProvider(this)[WellViewModel::class.java] + wellViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + wellViewModel.queryWellInfo(deviceId) + wellViewModel.wellResultModel.observe(this, { + if (it.code == 200) { + val lat = it.data.latGaode.toString() + val lng = it.data.lngGaode.toString() + if (lat.isNotBlank() && lng.isNotBlank()) { + //返回true代表当前位置在大陆、港澳地区,反之不在 + val latitude = lat.toDouble() + val longitude = lng.toDouble() + if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) { + val latLng = LatLng(latitude, longitude) + //移动到指定经纬度 + val cameraPosition = CameraPosition(latLng, 16f, 0f, 0f) + val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) + aMap.animateCamera(cameraUpdate, 2000, null) + + aMap.addMarker( + MarkerOptions() + .position(latLng) + .icon( + BitmapDescriptorFactory.fromBitmap( + BitmapDescriptorFactory.fromResource(R.mipmap.map_pin).bitmap + ) + ) + .title("") + .snippet("") + ) + } + } else { + "经纬度异常".show(this) + } + } + }) + } + + private fun setMapConfig(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + } + + /***以下是地图生命周期管理************************************************************************/ + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt new file mode 100644 index 0000000..9716725 --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AlarmViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.smart.town.sanxi.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.smart.town.sanxi.base.BaseApplication +import com.casic.smart.town.sanxi.extensions.separateResponseCode +import com.casic.smart.town.sanxi.extensions.toErrorMessage +import com.casic.smart.town.sanxi.model.AlarmListModel +import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel + +class AlarmViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val resultModel = MutableLiveData() + + fun getAlarmListData(beginTime: String, endTime: String, offset: Int) = launch({ + val response = RetrofitServiceManager.getAlarmListData(beginTime, endTime, offset) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index 87ddbf8..f159635 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -15,7 +15,7 @@ class AuthenticateViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt index c377c61..1bff381 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt @@ -16,7 +16,7 @@ class LoginViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val enterResultModel = MutableLiveData() val outResultModel = MutableLiveData() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt index 29a8756..dd1f190 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt @@ -17,7 +17,7 @@ class UserViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val userDetailModel = MutableLiveData() fun obtainUserDetail() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt index 20ea457..4f9e68f 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt @@ -15,7 +15,7 @@ class VersionViewModel : BaseViewModel() { - private val gson = Gson() + private val gson by lazy { Gson() } val versionResultModel = MutableLiveData() fun updateVersion() = launch({ diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt index c7d0219..6ed56a4 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt @@ -4,15 +4,21 @@ import com.casic.smart.town.sanxi.base.BaseApplication import com.casic.smart.town.sanxi.extensions.separateResponseCode import com.casic.smart.town.sanxi.extensions.toErrorMessage +import com.casic.smart.town.sanxi.model.WellInfoModel import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState import org.json.JSONObject class WellViewModel : BaseViewModel() { + private val gson by lazy { Gson() } val countResultModel = MutableLiveData>() + val wellResultModel = MutableLiveData() fun countWellByState() = launch({ val response = RetrofitServiceManager.countWellByState() @@ -40,4 +46,22 @@ value } } + + fun queryWellInfo(deviceId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.queryWellInfo(deviceId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + wellResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_device_on_map.xml b/app/src/main/res/layout/activity_device_on_map.xml new file mode 100644 index 0000000..85b3c9a --- /dev/null +++ b/app/src/main/res/layout/activity_device_on_map.xml @@ -0,0 +1,19 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml index 04881f3..61f890d 100644 --- a/app/src/main/res/layout/fragment_alarm.xml +++ b/app/src/main/res/layout/fragment_alarm.xml @@ -1,5 +1,6 @@ - + android:layout_marginTop="@dimen/dp_10"> + - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_statistics.xml b/app/src/main/res/layout/fragment_statistics.xml index 5a2d4ad..541617c 100644 --- a/app/src/main/res/layout/fragment_statistics.xml +++ b/app/src/main/res/layout/fragment_statistics.xml @@ -24,7 +24,10 @@ + android:layout_height="match_parent" > + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_alarm_rv_l.xml b/app/src/main/res/layout/item_alarm_rv_l.xml new file mode 100644 index 0000000..724d2ba --- /dev/null +++ b/app/src/main/res/layout/item_alarm_rv_l.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxxhdpi/map_pin.png b/app/src/main/res/mipmap-xxxhdpi/map_pin.png new file mode 100644 index 0000000..674c628 --- /dev/null +++ b/app/src/main/res/mipmap-xxxhdpi/map_pin.png Binary files differ diff --git a/app/src/main/res/mipmap-xxxhdpi/well_location.png b/app/src/main/res/mipmap-xxxhdpi/well_location.png new file mode 100644 index 0000000..b89a974 --- /dev/null +++ b/app/src/main/res/mipmap-xxxhdpi/well_location.png Binary files differ