diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt index cdff470..a22b719 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt @@ -1,7 +1,8 @@ package com.casic.app.smartwell.view.fragment +import android.graphics.Point +import android.location.Location import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,30 +11,46 @@ import androidx.recyclerview.widget.GridLayoutManager import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.* import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.HomeRecycleAdapter import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showRouteOnMap +import com.casic.app.smartwell.utils.Constant import com.casic.app.smartwell.view.OvertimeOrderActivity import com.casic.app.smartwell.view.WellManagementActivity import com.casic.app.smartwell.view.WellOperationActivity import com.casic.app.smartwell.vm.WellCountViewModel import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.google.gson.Gson +import com.casic.app.smartwell.widgets.GaoDeClusterMarkerView +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.include_base_title.view.* -class HomePageFragment : Fragment(), AMap.OnCameraChangeListener, AMap.OnMarkerClickListener { +class HomePageFragment : Fragment(), AMap.OnMyLocationChangeListener, AMap.OnCameraChangeListener, + AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { private lateinit var homeView: View private lateinit var wellCountViewModel: WellCountViewModel private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var wellListViewModel: WellListViewModel private lateinit var aMap: AMap - private val kTag = "HomePageFragment" + + //定位点经纬度 + private var location: LatLng? = null + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -51,8 +68,20 @@ wellListViewModel.obtainAllWell() wellListViewModel.listModel.observe(viewLifecycleOwner, { if (it.code == 200) { - val dataRows = it.data?.rows - Log.d(kTag, "onCreateView: ${Gson().toJson(dataRows)}") + it.data?.rows?.forEach { location -> + if (location.latGaode.toString().isNotBlank() + && location.lngGaode.toString().isNotBlank() + ) { + allMarkerOptions.add( + MarkerOptions().position( + LatLng( + location.latGaode!!.toDouble(), + location.lngGaode!!.toDouble() + ) + ).title(location.wellTypeName).snippet(location.wellName) + ) + } + } } }) @@ -109,27 +138,127 @@ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() + locationStyle.interval(5000) + //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER) locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 - locationStyle.interval(10 * 1000)////设置连续定位模式下的定位间隔,只在连续定位模式下生效。单位为毫秒 aMap.myLocationStyle = locationStyle aMap.isMyLocationEnabled = true - //注册地图缩放监听 + aMap.addOnMyLocationChangeListener(this) + // 地图缩放监听 aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) } - /***地图接口实现*********************************************************************************/ + override fun onMyLocationChange(p0: Location?) { + if (p0 != null) { + this.location = LatLng(p0.latitude, p0.longitude) + } + } + override fun onCameraChange(p0: CameraPosition?) { - Log.d(kTag, "onCameraChange: ") + } + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker override fun onCameraChangeFinish(p0: CameraPosition?) { -// resetMarks() - Log.d(kTag, "onCameraChangeFinish: ") + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + //在当前可观区域内 + markerOptionsInView.add(it) + } + } + // 自定义的聚合类MarkerCluster + val clustersMarkers: MutableList = ArrayList() + markerOptionsInView.forEach { + if (clustersMarkers.size == 0) { + //添加一个新的自定义marker + clustersMarkers.add(GaoDeClusterMarkerView(requireContext(), it, proj, 80))//相距多少才聚合 + } else { + var isInRange = false + //Kotlin foreach不能用break + for (view in clustersMarkers) { + //判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。 + if (view.bounds.contains(it.position)) { + view.addMarker(it) + isInRange = true + break + } + } + //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 + if (!isInRange) { + clustersMarkers.add( + GaoDeClusterMarkerView( + requireContext(), + it, proj, 80 + ) + )//相距多少才聚合 + } + } + } + // 设置聚合点的位置和icon + clustersMarkers.forEach { + it.setPositionAndIcon() + } + aMap.clear() + // 重新添加 marker + clustersMarkers.forEach { + aMap.addMarker(it.options) + } } - override fun onMarkerClick(p0: Marker?): Boolean { + override fun onMarkerClick(marker: Marker?): Boolean { + val clickedLatLng = marker?.position + if (location != null) { + //判断点击点是否是定位点 + val distance = AMapUtils.calculateLineDistance(location, clickedLatLng) + if (distance > Constant.DISTANCE) { + //显示闸井信息 + marker!!.showInfoWindow() + } else { + "该位置是定位点,请选择实际闸井点".show(requireContext()) + } + } + return true + } - return false + override fun onInfoWindowClick(p0: Marker?) { + if (p0 != null) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val latLng = p0.position + val lat = latLng.latitude.toString() + val lng = latLng.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "窨井经纬度异常,无法开启导航".show(requireContext()) + return + } + Poi(p0.snippet, LatLng(lat.toDouble(), lng.toDouble()), "").showRouteOnMap( + requireContext() + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } } /***以下是地图生命周期管理************************************************************************/ diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt index cdff470..a22b719 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt @@ -1,7 +1,8 @@ package com.casic.app.smartwell.view.fragment +import android.graphics.Point +import android.location.Location import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,30 +11,46 @@ import androidx.recyclerview.widget.GridLayoutManager import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.* import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.HomeRecycleAdapter import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showRouteOnMap +import com.casic.app.smartwell.utils.Constant import com.casic.app.smartwell.view.OvertimeOrderActivity import com.casic.app.smartwell.view.WellManagementActivity import com.casic.app.smartwell.view.WellOperationActivity import com.casic.app.smartwell.vm.WellCountViewModel import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.google.gson.Gson +import com.casic.app.smartwell.widgets.GaoDeClusterMarkerView +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.include_base_title.view.* -class HomePageFragment : Fragment(), AMap.OnCameraChangeListener, AMap.OnMarkerClickListener { +class HomePageFragment : Fragment(), AMap.OnMyLocationChangeListener, AMap.OnCameraChangeListener, + AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { private lateinit var homeView: View private lateinit var wellCountViewModel: WellCountViewModel private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var wellListViewModel: WellListViewModel private lateinit var aMap: AMap - private val kTag = "HomePageFragment" + + //定位点经纬度 + private var location: LatLng? = null + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -51,8 +68,20 @@ wellListViewModel.obtainAllWell() wellListViewModel.listModel.observe(viewLifecycleOwner, { if (it.code == 200) { - val dataRows = it.data?.rows - Log.d(kTag, "onCreateView: ${Gson().toJson(dataRows)}") + it.data?.rows?.forEach { location -> + if (location.latGaode.toString().isNotBlank() + && location.lngGaode.toString().isNotBlank() + ) { + allMarkerOptions.add( + MarkerOptions().position( + LatLng( + location.latGaode!!.toDouble(), + location.lngGaode!!.toDouble() + ) + ).title(location.wellTypeName).snippet(location.wellName) + ) + } + } } }) @@ -109,27 +138,127 @@ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() + locationStyle.interval(5000) + //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER) locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 - locationStyle.interval(10 * 1000)////设置连续定位模式下的定位间隔,只在连续定位模式下生效。单位为毫秒 aMap.myLocationStyle = locationStyle aMap.isMyLocationEnabled = true - //注册地图缩放监听 + aMap.addOnMyLocationChangeListener(this) + // 地图缩放监听 aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) } - /***地图接口实现*********************************************************************************/ + override fun onMyLocationChange(p0: Location?) { + if (p0 != null) { + this.location = LatLng(p0.latitude, p0.longitude) + } + } + override fun onCameraChange(p0: CameraPosition?) { - Log.d(kTag, "onCameraChange: ") + } + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker override fun onCameraChangeFinish(p0: CameraPosition?) { -// resetMarks() - Log.d(kTag, "onCameraChangeFinish: ") + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + //在当前可观区域内 + markerOptionsInView.add(it) + } + } + // 自定义的聚合类MarkerCluster + val clustersMarkers: MutableList = ArrayList() + markerOptionsInView.forEach { + if (clustersMarkers.size == 0) { + //添加一个新的自定义marker + clustersMarkers.add(GaoDeClusterMarkerView(requireContext(), it, proj, 80))//相距多少才聚合 + } else { + var isInRange = false + //Kotlin foreach不能用break + for (view in clustersMarkers) { + //判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。 + if (view.bounds.contains(it.position)) { + view.addMarker(it) + isInRange = true + break + } + } + //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 + if (!isInRange) { + clustersMarkers.add( + GaoDeClusterMarkerView( + requireContext(), + it, proj, 80 + ) + )//相距多少才聚合 + } + } + } + // 设置聚合点的位置和icon + clustersMarkers.forEach { + it.setPositionAndIcon() + } + aMap.clear() + // 重新添加 marker + clustersMarkers.forEach { + aMap.addMarker(it.options) + } } - override fun onMarkerClick(p0: Marker?): Boolean { + override fun onMarkerClick(marker: Marker?): Boolean { + val clickedLatLng = marker?.position + if (location != null) { + //判断点击点是否是定位点 + val distance = AMapUtils.calculateLineDistance(location, clickedLatLng) + if (distance > Constant.DISTANCE) { + //显示闸井信息 + marker!!.showInfoWindow() + } else { + "该位置是定位点,请选择实际闸井点".show(requireContext()) + } + } + return true + } - return false + override fun onInfoWindowClick(p0: Marker?) { + if (p0 != null) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val latLng = p0.position + val lat = latLng.latitude.toString() + val lng = latLng.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "窨井经纬度异常,无法开启导航".show(requireContext()) + return + } + Poi(p0.snippet, LatLng(lat.toDouble(), lng.toDouble()), "").showRouteOnMap( + requireContext() + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } } /***以下是地图生命周期管理************************************************************************/ diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt index 7932e6a..3166bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt @@ -90,8 +90,11 @@ is LoadState.Success -> { DialogHelper.dismissLoadingDialog() "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) //通知列表刷行数据 - weakReferenceHandler!!.sendEmptyMessage(Constant.ORDER_TODO_OK) UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) } else -> { diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt index cdff470..a22b719 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt @@ -1,7 +1,8 @@ package com.casic.app.smartwell.view.fragment +import android.graphics.Point +import android.location.Location import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,30 +11,46 @@ import androidx.recyclerview.widget.GridLayoutManager import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.* import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.HomeRecycleAdapter import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showRouteOnMap +import com.casic.app.smartwell.utils.Constant import com.casic.app.smartwell.view.OvertimeOrderActivity import com.casic.app.smartwell.view.WellManagementActivity import com.casic.app.smartwell.view.WellOperationActivity import com.casic.app.smartwell.vm.WellCountViewModel import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.google.gson.Gson +import com.casic.app.smartwell.widgets.GaoDeClusterMarkerView +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.include_base_title.view.* -class HomePageFragment : Fragment(), AMap.OnCameraChangeListener, AMap.OnMarkerClickListener { +class HomePageFragment : Fragment(), AMap.OnMyLocationChangeListener, AMap.OnCameraChangeListener, + AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { private lateinit var homeView: View private lateinit var wellCountViewModel: WellCountViewModel private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var wellListViewModel: WellListViewModel private lateinit var aMap: AMap - private val kTag = "HomePageFragment" + + //定位点经纬度 + private var location: LatLng? = null + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -51,8 +68,20 @@ wellListViewModel.obtainAllWell() wellListViewModel.listModel.observe(viewLifecycleOwner, { if (it.code == 200) { - val dataRows = it.data?.rows - Log.d(kTag, "onCreateView: ${Gson().toJson(dataRows)}") + it.data?.rows?.forEach { location -> + if (location.latGaode.toString().isNotBlank() + && location.lngGaode.toString().isNotBlank() + ) { + allMarkerOptions.add( + MarkerOptions().position( + LatLng( + location.latGaode!!.toDouble(), + location.lngGaode!!.toDouble() + ) + ).title(location.wellTypeName).snippet(location.wellName) + ) + } + } } }) @@ -109,27 +138,127 @@ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() + locationStyle.interval(5000) + //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER) locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 - locationStyle.interval(10 * 1000)////设置连续定位模式下的定位间隔,只在连续定位模式下生效。单位为毫秒 aMap.myLocationStyle = locationStyle aMap.isMyLocationEnabled = true - //注册地图缩放监听 + aMap.addOnMyLocationChangeListener(this) + // 地图缩放监听 aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) } - /***地图接口实现*********************************************************************************/ + override fun onMyLocationChange(p0: Location?) { + if (p0 != null) { + this.location = LatLng(p0.latitude, p0.longitude) + } + } + override fun onCameraChange(p0: CameraPosition?) { - Log.d(kTag, "onCameraChange: ") + } + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker override fun onCameraChangeFinish(p0: CameraPosition?) { -// resetMarks() - Log.d(kTag, "onCameraChangeFinish: ") + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + //在当前可观区域内 + markerOptionsInView.add(it) + } + } + // 自定义的聚合类MarkerCluster + val clustersMarkers: MutableList = ArrayList() + markerOptionsInView.forEach { + if (clustersMarkers.size == 0) { + //添加一个新的自定义marker + clustersMarkers.add(GaoDeClusterMarkerView(requireContext(), it, proj, 80))//相距多少才聚合 + } else { + var isInRange = false + //Kotlin foreach不能用break + for (view in clustersMarkers) { + //判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。 + if (view.bounds.contains(it.position)) { + view.addMarker(it) + isInRange = true + break + } + } + //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 + if (!isInRange) { + clustersMarkers.add( + GaoDeClusterMarkerView( + requireContext(), + it, proj, 80 + ) + )//相距多少才聚合 + } + } + } + // 设置聚合点的位置和icon + clustersMarkers.forEach { + it.setPositionAndIcon() + } + aMap.clear() + // 重新添加 marker + clustersMarkers.forEach { + aMap.addMarker(it.options) + } } - override fun onMarkerClick(p0: Marker?): Boolean { + override fun onMarkerClick(marker: Marker?): Boolean { + val clickedLatLng = marker?.position + if (location != null) { + //判断点击点是否是定位点 + val distance = AMapUtils.calculateLineDistance(location, clickedLatLng) + if (distance > Constant.DISTANCE) { + //显示闸井信息 + marker!!.showInfoWindow() + } else { + "该位置是定位点,请选择实际闸井点".show(requireContext()) + } + } + return true + } - return false + override fun onInfoWindowClick(p0: Marker?) { + if (p0 != null) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val latLng = p0.position + val lat = latLng.latitude.toString() + val lng = latLng.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "窨井经纬度异常,无法开启导航".show(requireContext()) + return + } + Poi(p0.snippet, LatLng(lat.toDouble(), lng.toDouble()), "").showRouteOnMap( + requireContext() + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } } /***以下是地图生命周期管理************************************************************************/ diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt index 7932e6a..3166bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt @@ -90,8 +90,11 @@ is LoadState.Success -> { DialogHelper.dismissLoadingDialog() "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) //通知列表刷行数据 - weakReferenceHandler!!.sendEmptyMessage(Constant.ORDER_TODO_OK) UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) } else -> { diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt deleted file mode 100644 index e7a664a..0000000 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.app.smartwell.view.fragment - -import com.casic.app.smartwell.R -import com.pengxh.app.multilib.base.BaseFragment - -class UnAcceptOrderFragment : BaseFragment() { - override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept - - override fun initData() { - - } - - override fun initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt index cdff470..a22b719 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt @@ -1,7 +1,8 @@ package com.casic.app.smartwell.view.fragment +import android.graphics.Point +import android.location.Location import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,30 +11,46 @@ import androidx.recyclerview.widget.GridLayoutManager import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.* import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.HomeRecycleAdapter import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showRouteOnMap +import com.casic.app.smartwell.utils.Constant import com.casic.app.smartwell.view.OvertimeOrderActivity import com.casic.app.smartwell.view.WellManagementActivity import com.casic.app.smartwell.view.WellOperationActivity import com.casic.app.smartwell.vm.WellCountViewModel import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.google.gson.Gson +import com.casic.app.smartwell.widgets.GaoDeClusterMarkerView +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.include_base_title.view.* -class HomePageFragment : Fragment(), AMap.OnCameraChangeListener, AMap.OnMarkerClickListener { +class HomePageFragment : Fragment(), AMap.OnMyLocationChangeListener, AMap.OnCameraChangeListener, + AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { private lateinit var homeView: View private lateinit var wellCountViewModel: WellCountViewModel private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var wellListViewModel: WellListViewModel private lateinit var aMap: AMap - private val kTag = "HomePageFragment" + + //定位点经纬度 + private var location: LatLng? = null + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -51,8 +68,20 @@ wellListViewModel.obtainAllWell() wellListViewModel.listModel.observe(viewLifecycleOwner, { if (it.code == 200) { - val dataRows = it.data?.rows - Log.d(kTag, "onCreateView: ${Gson().toJson(dataRows)}") + it.data?.rows?.forEach { location -> + if (location.latGaode.toString().isNotBlank() + && location.lngGaode.toString().isNotBlank() + ) { + allMarkerOptions.add( + MarkerOptions().position( + LatLng( + location.latGaode!!.toDouble(), + location.lngGaode!!.toDouble() + ) + ).title(location.wellTypeName).snippet(location.wellName) + ) + } + } } }) @@ -109,27 +138,127 @@ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() + locationStyle.interval(5000) + //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER) locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 - locationStyle.interval(10 * 1000)////设置连续定位模式下的定位间隔,只在连续定位模式下生效。单位为毫秒 aMap.myLocationStyle = locationStyle aMap.isMyLocationEnabled = true - //注册地图缩放监听 + aMap.addOnMyLocationChangeListener(this) + // 地图缩放监听 aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) } - /***地图接口实现*********************************************************************************/ + override fun onMyLocationChange(p0: Location?) { + if (p0 != null) { + this.location = LatLng(p0.latitude, p0.longitude) + } + } + override fun onCameraChange(p0: CameraPosition?) { - Log.d(kTag, "onCameraChange: ") + } + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker override fun onCameraChangeFinish(p0: CameraPosition?) { -// resetMarks() - Log.d(kTag, "onCameraChangeFinish: ") + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + //在当前可观区域内 + markerOptionsInView.add(it) + } + } + // 自定义的聚合类MarkerCluster + val clustersMarkers: MutableList = ArrayList() + markerOptionsInView.forEach { + if (clustersMarkers.size == 0) { + //添加一个新的自定义marker + clustersMarkers.add(GaoDeClusterMarkerView(requireContext(), it, proj, 80))//相距多少才聚合 + } else { + var isInRange = false + //Kotlin foreach不能用break + for (view in clustersMarkers) { + //判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。 + if (view.bounds.contains(it.position)) { + view.addMarker(it) + isInRange = true + break + } + } + //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 + if (!isInRange) { + clustersMarkers.add( + GaoDeClusterMarkerView( + requireContext(), + it, proj, 80 + ) + )//相距多少才聚合 + } + } + } + // 设置聚合点的位置和icon + clustersMarkers.forEach { + it.setPositionAndIcon() + } + aMap.clear() + // 重新添加 marker + clustersMarkers.forEach { + aMap.addMarker(it.options) + } } - override fun onMarkerClick(p0: Marker?): Boolean { + override fun onMarkerClick(marker: Marker?): Boolean { + val clickedLatLng = marker?.position + if (location != null) { + //判断点击点是否是定位点 + val distance = AMapUtils.calculateLineDistance(location, clickedLatLng) + if (distance > Constant.DISTANCE) { + //显示闸井信息 + marker!!.showInfoWindow() + } else { + "该位置是定位点,请选择实际闸井点".show(requireContext()) + } + } + return true + } - return false + override fun onInfoWindowClick(p0: Marker?) { + if (p0 != null) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val latLng = p0.position + val lat = latLng.latitude.toString() + val lng = latLng.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "窨井经纬度异常,无法开启导航".show(requireContext()) + return + } + Poi(p0.snippet, LatLng(lat.toDouble(), lng.toDouble()), "").showRouteOnMap( + requireContext() + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } } /***以下是地图生命周期管理************************************************************************/ diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt index 7932e6a..3166bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt @@ -90,8 +90,11 @@ is LoadState.Success -> { DialogHelper.dismissLoadingDialog() "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) //通知列表刷行数据 - weakReferenceHandler!!.sendEmptyMessage(Constant.ORDER_TODO_OK) UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) } else -> { diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt deleted file mode 100644 index e7a664a..0000000 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.app.smartwell.view.fragment - -import com.casic.app.smartwell.R -import com.pengxh.app.multilib.base.BaseFragment - -class UnAcceptOrderFragment : BaseFragment() { - override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept - - override fun initData() { - - } - - override fun initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt index 8589260..6df8449 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt @@ -1,16 +1,146 @@ package com.casic.app.smartwell.view.fragment +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.WorkOrderListModel +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel import com.pengxh.app.multilib.base.BaseFragment +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference class UnHandleOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_handle override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(this) +// workOrderListViewModel = ViewModelProvider(this).get(WorkOrderListViewModel::class.java) +// workOrderDetailViewModel = ViewModelProvider(this).get(WorkOrderDetailViewModel::class.java) } override fun initEvent() { +// obtainWorkOrderList(pageIndex) +// workOrderListViewModel.resultModel.observe(this, { +// if (it.code == 200) { +// val dataRows = it.data?.rows +// when { +// isRefresh -> { +// dataBeans.clear() +// dataBeans = dataRows!! +// unHandleLayout.finishRefresh() +// isRefresh = false +// } +// isLoadMore -> { +// if (dataRows?.size == 0) { +// "到底了,别拉了".show(requireContext()) +// } +// dataBeans.addAll(dataRows!!) +// unHandleLayout.finishLoadMore() +// isLoadMore = false +// } +// else -> { +// dataBeans = dataRows!! +// } +// } +// weakReferenceHandler!!.sendEmptyMessage(2022040602) +// } +// }) +// +// unHandleLayout.setOnRefreshListener { +// isRefresh = true +// //刷新之后页码重置 +// pageIndex = 1 +// obtainWorkOrderList(pageIndex) +// } +// unHandleLayout.setOnLoadMoreListener { +// isLoadMore = true +// pageIndex++ +// obtainWorkOrderList(pageIndex) +// } +// +// workOrderDetailViewModel.detailModel.observe(this, { +// if (it.code == 200) { +// val orderDetail = it.data!![0] +// val orderFlow = orderDetail.flow!! +// if (orderFlow.size != 0) { +// TimeLineBottomSheet.Builder().setContext(requireContext()) +// .setFlowItems(orderFlow).build().show() +// } else { +// "抱歉,无法查到该工单的流转记录".show(requireContext()) +// } +// } +// }) + } + private fun obtainWorkOrderList(index: Int) { +// workOrderListViewModel.obtainWorkOrderListByState(jobStatus = "2", page = index) + } + + private class WeakReferenceHandler(fragment: UnHandleOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040602) { + if (fragment.isRefresh || fragment.isLoadMore) { +// fragment.inHandleAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() +// fragment.inHandleAdapter = InHandleOrderAdapter( +// fragment.requireContext(), +// fragment.dataBeans +// ) +// fragment.inHandleView!!.layoutManager = +// LinearLayoutManager(fragment.requireContext()) +// fragment.inHandleView!!.adapter = fragment.inHandleAdapter +// fragment.inHandleAdapter.setOnItemClickListener(object : +// InHandleOrderAdapter.OnItemClickListener { +// override fun onClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看详情".show(fragment.requireContext()) +// return +// } +// fragment.requireContext().navigatePageTo( +// InHandleDetailActivity::class.java, jobId +// ) +// } +// +// override fun onTransferViewClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看工单流转记录".show(fragment.requireContext()) +// return +// } +// fragment.workOrderDetailViewModel.obtainWorkOrderDetail(id = jobId) +// } +// }) + } + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt index cdff470..a22b719 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt @@ -1,7 +1,8 @@ package com.casic.app.smartwell.view.fragment +import android.graphics.Point +import android.location.Location import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,30 +11,46 @@ import androidx.recyclerview.widget.GridLayoutManager import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.* import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.HomeRecycleAdapter import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showRouteOnMap +import com.casic.app.smartwell.utils.Constant import com.casic.app.smartwell.view.OvertimeOrderActivity import com.casic.app.smartwell.view.WellManagementActivity import com.casic.app.smartwell.view.WellOperationActivity import com.casic.app.smartwell.vm.WellCountViewModel import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.google.gson.Gson +import com.casic.app.smartwell.widgets.GaoDeClusterMarkerView +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.include_base_title.view.* -class HomePageFragment : Fragment(), AMap.OnCameraChangeListener, AMap.OnMarkerClickListener { +class HomePageFragment : Fragment(), AMap.OnMyLocationChangeListener, AMap.OnCameraChangeListener, + AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { private lateinit var homeView: View private lateinit var wellCountViewModel: WellCountViewModel private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var wellListViewModel: WellListViewModel private lateinit var aMap: AMap - private val kTag = "HomePageFragment" + + //定位点经纬度 + private var location: LatLng? = null + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -51,8 +68,20 @@ wellListViewModel.obtainAllWell() wellListViewModel.listModel.observe(viewLifecycleOwner, { if (it.code == 200) { - val dataRows = it.data?.rows - Log.d(kTag, "onCreateView: ${Gson().toJson(dataRows)}") + it.data?.rows?.forEach { location -> + if (location.latGaode.toString().isNotBlank() + && location.lngGaode.toString().isNotBlank() + ) { + allMarkerOptions.add( + MarkerOptions().position( + LatLng( + location.latGaode!!.toDouble(), + location.lngGaode!!.toDouble() + ) + ).title(location.wellTypeName).snippet(location.wellName) + ) + } + } } }) @@ -109,27 +138,127 @@ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() + locationStyle.interval(5000) + //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER) locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 - locationStyle.interval(10 * 1000)////设置连续定位模式下的定位间隔,只在连续定位模式下生效。单位为毫秒 aMap.myLocationStyle = locationStyle aMap.isMyLocationEnabled = true - //注册地图缩放监听 + aMap.addOnMyLocationChangeListener(this) + // 地图缩放监听 aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) } - /***地图接口实现*********************************************************************************/ + override fun onMyLocationChange(p0: Location?) { + if (p0 != null) { + this.location = LatLng(p0.latitude, p0.longitude) + } + } + override fun onCameraChange(p0: CameraPosition?) { - Log.d(kTag, "onCameraChange: ") + } + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker override fun onCameraChangeFinish(p0: CameraPosition?) { -// resetMarks() - Log.d(kTag, "onCameraChangeFinish: ") + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + //在当前可观区域内 + markerOptionsInView.add(it) + } + } + // 自定义的聚合类MarkerCluster + val clustersMarkers: MutableList = ArrayList() + markerOptionsInView.forEach { + if (clustersMarkers.size == 0) { + //添加一个新的自定义marker + clustersMarkers.add(GaoDeClusterMarkerView(requireContext(), it, proj, 80))//相距多少才聚合 + } else { + var isInRange = false + //Kotlin foreach不能用break + for (view in clustersMarkers) { + //判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。 + if (view.bounds.contains(it.position)) { + view.addMarker(it) + isInRange = true + break + } + } + //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 + if (!isInRange) { + clustersMarkers.add( + GaoDeClusterMarkerView( + requireContext(), + it, proj, 80 + ) + )//相距多少才聚合 + } + } + } + // 设置聚合点的位置和icon + clustersMarkers.forEach { + it.setPositionAndIcon() + } + aMap.clear() + // 重新添加 marker + clustersMarkers.forEach { + aMap.addMarker(it.options) + } } - override fun onMarkerClick(p0: Marker?): Boolean { + override fun onMarkerClick(marker: Marker?): Boolean { + val clickedLatLng = marker?.position + if (location != null) { + //判断点击点是否是定位点 + val distance = AMapUtils.calculateLineDistance(location, clickedLatLng) + if (distance > Constant.DISTANCE) { + //显示闸井信息 + marker!!.showInfoWindow() + } else { + "该位置是定位点,请选择实际闸井点".show(requireContext()) + } + } + return true + } - return false + override fun onInfoWindowClick(p0: Marker?) { + if (p0 != null) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val latLng = p0.position + val lat = latLng.latitude.toString() + val lng = latLng.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "窨井经纬度异常,无法开启导航".show(requireContext()) + return + } + Poi(p0.snippet, LatLng(lat.toDouble(), lng.toDouble()), "").showRouteOnMap( + requireContext() + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } } /***以下是地图生命周期管理************************************************************************/ diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt index 7932e6a..3166bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt @@ -90,8 +90,11 @@ is LoadState.Success -> { DialogHelper.dismissLoadingDialog() "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) //通知列表刷行数据 - weakReferenceHandler!!.sendEmptyMessage(Constant.ORDER_TODO_OK) UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) } else -> { diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt deleted file mode 100644 index e7a664a..0000000 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.app.smartwell.view.fragment - -import com.casic.app.smartwell.R -import com.pengxh.app.multilib.base.BaseFragment - -class UnAcceptOrderFragment : BaseFragment() { - override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept - - override fun initData() { - - } - - override fun initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt index 8589260..6df8449 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt @@ -1,16 +1,146 @@ package com.casic.app.smartwell.view.fragment +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.WorkOrderListModel +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel import com.pengxh.app.multilib.base.BaseFragment +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference class UnHandleOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_handle override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(this) +// workOrderListViewModel = ViewModelProvider(this).get(WorkOrderListViewModel::class.java) +// workOrderDetailViewModel = ViewModelProvider(this).get(WorkOrderDetailViewModel::class.java) } override fun initEvent() { +// obtainWorkOrderList(pageIndex) +// workOrderListViewModel.resultModel.observe(this, { +// if (it.code == 200) { +// val dataRows = it.data?.rows +// when { +// isRefresh -> { +// dataBeans.clear() +// dataBeans = dataRows!! +// unHandleLayout.finishRefresh() +// isRefresh = false +// } +// isLoadMore -> { +// if (dataRows?.size == 0) { +// "到底了,别拉了".show(requireContext()) +// } +// dataBeans.addAll(dataRows!!) +// unHandleLayout.finishLoadMore() +// isLoadMore = false +// } +// else -> { +// dataBeans = dataRows!! +// } +// } +// weakReferenceHandler!!.sendEmptyMessage(2022040602) +// } +// }) +// +// unHandleLayout.setOnRefreshListener { +// isRefresh = true +// //刷新之后页码重置 +// pageIndex = 1 +// obtainWorkOrderList(pageIndex) +// } +// unHandleLayout.setOnLoadMoreListener { +// isLoadMore = true +// pageIndex++ +// obtainWorkOrderList(pageIndex) +// } +// +// workOrderDetailViewModel.detailModel.observe(this, { +// if (it.code == 200) { +// val orderDetail = it.data!![0] +// val orderFlow = orderDetail.flow!! +// if (orderFlow.size != 0) { +// TimeLineBottomSheet.Builder().setContext(requireContext()) +// .setFlowItems(orderFlow).build().show() +// } else { +// "抱歉,无法查到该工单的流转记录".show(requireContext()) +// } +// } +// }) + } + private fun obtainWorkOrderList(index: Int) { +// workOrderListViewModel.obtainWorkOrderListByState(jobStatus = "2", page = index) + } + + private class WeakReferenceHandler(fragment: UnHandleOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040602) { + if (fragment.isRefresh || fragment.isLoadMore) { +// fragment.inHandleAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() +// fragment.inHandleAdapter = InHandleOrderAdapter( +// fragment.requireContext(), +// fragment.dataBeans +// ) +// fragment.inHandleView!!.layoutManager = +// LinearLayoutManager(fragment.requireContext()) +// fragment.inHandleView!!.adapter = fragment.inHandleAdapter +// fragment.inHandleAdapter.setOnItemClickListener(object : +// InHandleOrderAdapter.OnItemClickListener { +// override fun onClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看详情".show(fragment.requireContext()) +// return +// } +// fragment.requireContext().navigatePageTo( +// InHandleDetailActivity::class.java, jobId +// ) +// } +// +// override fun onTransferViewClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看工单流转记录".show(fragment.requireContext()) +// return +// } +// fragment.workOrderDetailViewModel.obtainWorkOrderDetail(id = jobId) +// } +// }) + } + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt new file mode 100644 index 0000000..b7929b5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt @@ -0,0 +1,185 @@ +package com.casic.app.smartwell.view.fragment + +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.Constant +import com.casic.app.smartwell.utils.DialogHelper +import com.casic.app.smartwell.utils.LoadState +import com.casic.app.smartwell.view.TodoDetailActivity +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel +import com.pengxh.app.multilib.base.BaseFragment +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_over_time_un_accept.* +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference + +class UnacceptedOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 + + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this) + overtimeOderViewModel = ViewModelProvider(this).get(OvertimeOderListViewModel::class.java) + acceptOrderViewModel = ViewModelProvider(this).get(AcceptOrderViewModel::class.java) + } + + override fun initEvent() { + obtainWorkOrderList(pageIndex) + overtimeOderViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + unAcceptOrderLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + unAcceptOrderLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler!!.sendEmptyMessage(2022040601) + } + }) + + //接单状态处理 + acceptOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireContext(), "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) + //通知列表刷行数据 + UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) + } + else -> { + DialogHelper.dismissLoadingDialog() + "接单失败".show(requireContext()) + } + } + }) + + unAcceptOrderLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainWorkOrderList(pageIndex) + } + unAcceptOrderLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainWorkOrderList(pageIndex) + } + } + + private fun obtainWorkOrderList(index: Int) { + overtimeOderViewModel.obtainOvertimeOderList(jobStatus = "0", page = index) + } + + private class WeakReferenceHandler(fragment: UnacceptedOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040601) { + if (fragment.isRefresh || fragment.isLoadMore) { + fragment.overtimeOrderAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("您没有超时未处理的工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() + fragment.overtimeOrderAdapter = OvertimeOrderListAdapter( + fragment.requireContext(), + fragment.dataBeans + ) + fragment.unAcceptOrderView!!.layoutManager = + LinearLayoutManager(fragment.requireContext()) + fragment.unAcceptOrderView!!.adapter = fragment.overtimeOrderAdapter + fragment.overtimeOrderAdapter.setOnItemClickListener(object : + OvertimeOrderListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(fragment.requireContext()) + return + } + fragment.requireContext() + .navigatePageTo(TodoDetailActivity::class.java, jobId) + } + + override fun onOperationClicked(position: Int) { + //标记被点击的item位置 + fragment.clickedPosition = position + + AlertControlDialog.Builder() + .setContext(fragment.requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = + fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show(fragment.requireContext()) + return + } + fragment.acceptOrderViewModel.acceptWorkOrder(id = jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt index cdff470..a22b719 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt @@ -1,7 +1,8 @@ package com.casic.app.smartwell.view.fragment +import android.graphics.Point +import android.location.Location import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,30 +11,46 @@ import androidx.recyclerview.widget.GridLayoutManager import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.* import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.HomeRecycleAdapter import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showRouteOnMap +import com.casic.app.smartwell.utils.Constant import com.casic.app.smartwell.view.OvertimeOrderActivity import com.casic.app.smartwell.view.WellManagementActivity import com.casic.app.smartwell.view.WellOperationActivity import com.casic.app.smartwell.vm.WellCountViewModel import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.google.gson.Gson +import com.casic.app.smartwell.widgets.GaoDeClusterMarkerView +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.include_base_title.view.* -class HomePageFragment : Fragment(), AMap.OnCameraChangeListener, AMap.OnMarkerClickListener { +class HomePageFragment : Fragment(), AMap.OnMyLocationChangeListener, AMap.OnCameraChangeListener, + AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { private lateinit var homeView: View private lateinit var wellCountViewModel: WellCountViewModel private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var wellListViewModel: WellListViewModel private lateinit var aMap: AMap - private val kTag = "HomePageFragment" + + //定位点经纬度 + private var location: LatLng? = null + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -51,8 +68,20 @@ wellListViewModel.obtainAllWell() wellListViewModel.listModel.observe(viewLifecycleOwner, { if (it.code == 200) { - val dataRows = it.data?.rows - Log.d(kTag, "onCreateView: ${Gson().toJson(dataRows)}") + it.data?.rows?.forEach { location -> + if (location.latGaode.toString().isNotBlank() + && location.lngGaode.toString().isNotBlank() + ) { + allMarkerOptions.add( + MarkerOptions().position( + LatLng( + location.latGaode!!.toDouble(), + location.lngGaode!!.toDouble() + ) + ).title(location.wellTypeName).snippet(location.wellName) + ) + } + } } }) @@ -109,27 +138,127 @@ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() + locationStyle.interval(5000) + //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER) locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 - locationStyle.interval(10 * 1000)////设置连续定位模式下的定位间隔,只在连续定位模式下生效。单位为毫秒 aMap.myLocationStyle = locationStyle aMap.isMyLocationEnabled = true - //注册地图缩放监听 + aMap.addOnMyLocationChangeListener(this) + // 地图缩放监听 aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) } - /***地图接口实现*********************************************************************************/ + override fun onMyLocationChange(p0: Location?) { + if (p0 != null) { + this.location = LatLng(p0.latitude, p0.longitude) + } + } + override fun onCameraChange(p0: CameraPosition?) { - Log.d(kTag, "onCameraChange: ") + } + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker override fun onCameraChangeFinish(p0: CameraPosition?) { -// resetMarks() - Log.d(kTag, "onCameraChangeFinish: ") + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + //在当前可观区域内 + markerOptionsInView.add(it) + } + } + // 自定义的聚合类MarkerCluster + val clustersMarkers: MutableList = ArrayList() + markerOptionsInView.forEach { + if (clustersMarkers.size == 0) { + //添加一个新的自定义marker + clustersMarkers.add(GaoDeClusterMarkerView(requireContext(), it, proj, 80))//相距多少才聚合 + } else { + var isInRange = false + //Kotlin foreach不能用break + for (view in clustersMarkers) { + //判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。 + if (view.bounds.contains(it.position)) { + view.addMarker(it) + isInRange = true + break + } + } + //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 + if (!isInRange) { + clustersMarkers.add( + GaoDeClusterMarkerView( + requireContext(), + it, proj, 80 + ) + )//相距多少才聚合 + } + } + } + // 设置聚合点的位置和icon + clustersMarkers.forEach { + it.setPositionAndIcon() + } + aMap.clear() + // 重新添加 marker + clustersMarkers.forEach { + aMap.addMarker(it.options) + } } - override fun onMarkerClick(p0: Marker?): Boolean { + override fun onMarkerClick(marker: Marker?): Boolean { + val clickedLatLng = marker?.position + if (location != null) { + //判断点击点是否是定位点 + val distance = AMapUtils.calculateLineDistance(location, clickedLatLng) + if (distance > Constant.DISTANCE) { + //显示闸井信息 + marker!!.showInfoWindow() + } else { + "该位置是定位点,请选择实际闸井点".show(requireContext()) + } + } + return true + } - return false + override fun onInfoWindowClick(p0: Marker?) { + if (p0 != null) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val latLng = p0.position + val lat = latLng.latitude.toString() + val lng = latLng.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "窨井经纬度异常,无法开启导航".show(requireContext()) + return + } + Poi(p0.snippet, LatLng(lat.toDouble(), lng.toDouble()), "").showRouteOnMap( + requireContext() + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } } /***以下是地图生命周期管理************************************************************************/ diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt index 7932e6a..3166bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt @@ -90,8 +90,11 @@ is LoadState.Success -> { DialogHelper.dismissLoadingDialog() "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) //通知列表刷行数据 - weakReferenceHandler!!.sendEmptyMessage(Constant.ORDER_TODO_OK) UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) } else -> { diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt deleted file mode 100644 index e7a664a..0000000 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.app.smartwell.view.fragment - -import com.casic.app.smartwell.R -import com.pengxh.app.multilib.base.BaseFragment - -class UnAcceptOrderFragment : BaseFragment() { - override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept - - override fun initData() { - - } - - override fun initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt index 8589260..6df8449 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt @@ -1,16 +1,146 @@ package com.casic.app.smartwell.view.fragment +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.WorkOrderListModel +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel import com.pengxh.app.multilib.base.BaseFragment +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference class UnHandleOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_handle override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(this) +// workOrderListViewModel = ViewModelProvider(this).get(WorkOrderListViewModel::class.java) +// workOrderDetailViewModel = ViewModelProvider(this).get(WorkOrderDetailViewModel::class.java) } override fun initEvent() { +// obtainWorkOrderList(pageIndex) +// workOrderListViewModel.resultModel.observe(this, { +// if (it.code == 200) { +// val dataRows = it.data?.rows +// when { +// isRefresh -> { +// dataBeans.clear() +// dataBeans = dataRows!! +// unHandleLayout.finishRefresh() +// isRefresh = false +// } +// isLoadMore -> { +// if (dataRows?.size == 0) { +// "到底了,别拉了".show(requireContext()) +// } +// dataBeans.addAll(dataRows!!) +// unHandleLayout.finishLoadMore() +// isLoadMore = false +// } +// else -> { +// dataBeans = dataRows!! +// } +// } +// weakReferenceHandler!!.sendEmptyMessage(2022040602) +// } +// }) +// +// unHandleLayout.setOnRefreshListener { +// isRefresh = true +// //刷新之后页码重置 +// pageIndex = 1 +// obtainWorkOrderList(pageIndex) +// } +// unHandleLayout.setOnLoadMoreListener { +// isLoadMore = true +// pageIndex++ +// obtainWorkOrderList(pageIndex) +// } +// +// workOrderDetailViewModel.detailModel.observe(this, { +// if (it.code == 200) { +// val orderDetail = it.data!![0] +// val orderFlow = orderDetail.flow!! +// if (orderFlow.size != 0) { +// TimeLineBottomSheet.Builder().setContext(requireContext()) +// .setFlowItems(orderFlow).build().show() +// } else { +// "抱歉,无法查到该工单的流转记录".show(requireContext()) +// } +// } +// }) + } + private fun obtainWorkOrderList(index: Int) { +// workOrderListViewModel.obtainWorkOrderListByState(jobStatus = "2", page = index) + } + + private class WeakReferenceHandler(fragment: UnHandleOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040602) { + if (fragment.isRefresh || fragment.isLoadMore) { +// fragment.inHandleAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() +// fragment.inHandleAdapter = InHandleOrderAdapter( +// fragment.requireContext(), +// fragment.dataBeans +// ) +// fragment.inHandleView!!.layoutManager = +// LinearLayoutManager(fragment.requireContext()) +// fragment.inHandleView!!.adapter = fragment.inHandleAdapter +// fragment.inHandleAdapter.setOnItemClickListener(object : +// InHandleOrderAdapter.OnItemClickListener { +// override fun onClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看详情".show(fragment.requireContext()) +// return +// } +// fragment.requireContext().navigatePageTo( +// InHandleDetailActivity::class.java, jobId +// ) +// } +// +// override fun onTransferViewClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看工单流转记录".show(fragment.requireContext()) +// return +// } +// fragment.workOrderDetailViewModel.obtainWorkOrderDetail(id = jobId) +// } +// }) + } + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt new file mode 100644 index 0000000..b7929b5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt @@ -0,0 +1,185 @@ +package com.casic.app.smartwell.view.fragment + +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.Constant +import com.casic.app.smartwell.utils.DialogHelper +import com.casic.app.smartwell.utils.LoadState +import com.casic.app.smartwell.view.TodoDetailActivity +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel +import com.pengxh.app.multilib.base.BaseFragment +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_over_time_un_accept.* +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference + +class UnacceptedOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 + + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this) + overtimeOderViewModel = ViewModelProvider(this).get(OvertimeOderListViewModel::class.java) + acceptOrderViewModel = ViewModelProvider(this).get(AcceptOrderViewModel::class.java) + } + + override fun initEvent() { + obtainWorkOrderList(pageIndex) + overtimeOderViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + unAcceptOrderLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + unAcceptOrderLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler!!.sendEmptyMessage(2022040601) + } + }) + + //接单状态处理 + acceptOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireContext(), "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) + //通知列表刷行数据 + UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) + } + else -> { + DialogHelper.dismissLoadingDialog() + "接单失败".show(requireContext()) + } + } + }) + + unAcceptOrderLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainWorkOrderList(pageIndex) + } + unAcceptOrderLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainWorkOrderList(pageIndex) + } + } + + private fun obtainWorkOrderList(index: Int) { + overtimeOderViewModel.obtainOvertimeOderList(jobStatus = "0", page = index) + } + + private class WeakReferenceHandler(fragment: UnacceptedOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040601) { + if (fragment.isRefresh || fragment.isLoadMore) { + fragment.overtimeOrderAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("您没有超时未处理的工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() + fragment.overtimeOrderAdapter = OvertimeOrderListAdapter( + fragment.requireContext(), + fragment.dataBeans + ) + fragment.unAcceptOrderView!!.layoutManager = + LinearLayoutManager(fragment.requireContext()) + fragment.unAcceptOrderView!!.adapter = fragment.overtimeOrderAdapter + fragment.overtimeOrderAdapter.setOnItemClickListener(object : + OvertimeOrderListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(fragment.requireContext()) + return + } + fragment.requireContext() + .navigatePageTo(TodoDetailActivity::class.java, jobId) + } + + override fun onOperationClicked(position: Int) { + //标记被点击的item位置 + fragment.clickedPosition = position + + AlertControlDialog.Builder() + .setContext(fragment.requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = + fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show(fragment.requireContext()) + return + } + fragment.acceptOrderViewModel.acceptWorkOrder(id = jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt index 9cbd4de..2f25190 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt @@ -18,7 +18,7 @@ import com.casic.app.smartwell.vm.WorkOrderListViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.app.multilib.base.BaseFragment -import kotlinx.android.synthetic.main.fragment_order_undetermined.* +import kotlinx.android.synthetic.main.fragment_order_un_determined.* import kotlinx.android.synthetic.main.include_empty_view.* import java.lang.ref.WeakReference @@ -43,7 +43,7 @@ } } - override fun initLayoutView(): Int = R.layout.fragment_order_undetermined + override fun initLayoutView(): Int = R.layout.fragment_order_un_determined override fun initData() { weakReferenceHandler = WeakReferenceHandler(this) diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt index cdff470..a22b719 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt @@ -1,7 +1,8 @@ package com.casic.app.smartwell.view.fragment +import android.graphics.Point +import android.location.Location import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,30 +11,46 @@ import androidx.recyclerview.widget.GridLayoutManager import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.* import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.HomeRecycleAdapter import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showRouteOnMap +import com.casic.app.smartwell.utils.Constant import com.casic.app.smartwell.view.OvertimeOrderActivity import com.casic.app.smartwell.view.WellManagementActivity import com.casic.app.smartwell.view.WellOperationActivity import com.casic.app.smartwell.vm.WellCountViewModel import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.google.gson.Gson +import com.casic.app.smartwell.widgets.GaoDeClusterMarkerView +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.include_base_title.view.* -class HomePageFragment : Fragment(), AMap.OnCameraChangeListener, AMap.OnMarkerClickListener { +class HomePageFragment : Fragment(), AMap.OnMyLocationChangeListener, AMap.OnCameraChangeListener, + AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { private lateinit var homeView: View private lateinit var wellCountViewModel: WellCountViewModel private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var wellListViewModel: WellListViewModel private lateinit var aMap: AMap - private val kTag = "HomePageFragment" + + //定位点经纬度 + private var location: LatLng? = null + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -51,8 +68,20 @@ wellListViewModel.obtainAllWell() wellListViewModel.listModel.observe(viewLifecycleOwner, { if (it.code == 200) { - val dataRows = it.data?.rows - Log.d(kTag, "onCreateView: ${Gson().toJson(dataRows)}") + it.data?.rows?.forEach { location -> + if (location.latGaode.toString().isNotBlank() + && location.lngGaode.toString().isNotBlank() + ) { + allMarkerOptions.add( + MarkerOptions().position( + LatLng( + location.latGaode!!.toDouble(), + location.lngGaode!!.toDouble() + ) + ).title(location.wellTypeName).snippet(location.wellName) + ) + } + } } }) @@ -109,27 +138,127 @@ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() + locationStyle.interval(5000) + //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER) locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 - locationStyle.interval(10 * 1000)////设置连续定位模式下的定位间隔,只在连续定位模式下生效。单位为毫秒 aMap.myLocationStyle = locationStyle aMap.isMyLocationEnabled = true - //注册地图缩放监听 + aMap.addOnMyLocationChangeListener(this) + // 地图缩放监听 aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) } - /***地图接口实现*********************************************************************************/ + override fun onMyLocationChange(p0: Location?) { + if (p0 != null) { + this.location = LatLng(p0.latitude, p0.longitude) + } + } + override fun onCameraChange(p0: CameraPosition?) { - Log.d(kTag, "onCameraChange: ") + } + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker override fun onCameraChangeFinish(p0: CameraPosition?) { -// resetMarks() - Log.d(kTag, "onCameraChangeFinish: ") + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + //在当前可观区域内 + markerOptionsInView.add(it) + } + } + // 自定义的聚合类MarkerCluster + val clustersMarkers: MutableList = ArrayList() + markerOptionsInView.forEach { + if (clustersMarkers.size == 0) { + //添加一个新的自定义marker + clustersMarkers.add(GaoDeClusterMarkerView(requireContext(), it, proj, 80))//相距多少才聚合 + } else { + var isInRange = false + //Kotlin foreach不能用break + for (view in clustersMarkers) { + //判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。 + if (view.bounds.contains(it.position)) { + view.addMarker(it) + isInRange = true + break + } + } + //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 + if (!isInRange) { + clustersMarkers.add( + GaoDeClusterMarkerView( + requireContext(), + it, proj, 80 + ) + )//相距多少才聚合 + } + } + } + // 设置聚合点的位置和icon + clustersMarkers.forEach { + it.setPositionAndIcon() + } + aMap.clear() + // 重新添加 marker + clustersMarkers.forEach { + aMap.addMarker(it.options) + } } - override fun onMarkerClick(p0: Marker?): Boolean { + override fun onMarkerClick(marker: Marker?): Boolean { + val clickedLatLng = marker?.position + if (location != null) { + //判断点击点是否是定位点 + val distance = AMapUtils.calculateLineDistance(location, clickedLatLng) + if (distance > Constant.DISTANCE) { + //显示闸井信息 + marker!!.showInfoWindow() + } else { + "该位置是定位点,请选择实际闸井点".show(requireContext()) + } + } + return true + } - return false + override fun onInfoWindowClick(p0: Marker?) { + if (p0 != null) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val latLng = p0.position + val lat = latLng.latitude.toString() + val lng = latLng.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "窨井经纬度异常,无法开启导航".show(requireContext()) + return + } + Poi(p0.snippet, LatLng(lat.toDouble(), lng.toDouble()), "").showRouteOnMap( + requireContext() + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } } /***以下是地图生命周期管理************************************************************************/ diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt index 7932e6a..3166bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt @@ -90,8 +90,11 @@ is LoadState.Success -> { DialogHelper.dismissLoadingDialog() "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) //通知列表刷行数据 - weakReferenceHandler!!.sendEmptyMessage(Constant.ORDER_TODO_OK) UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) } else -> { diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt deleted file mode 100644 index e7a664a..0000000 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.app.smartwell.view.fragment - -import com.casic.app.smartwell.R -import com.pengxh.app.multilib.base.BaseFragment - -class UnAcceptOrderFragment : BaseFragment() { - override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept - - override fun initData() { - - } - - override fun initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt index 8589260..6df8449 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt @@ -1,16 +1,146 @@ package com.casic.app.smartwell.view.fragment +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.WorkOrderListModel +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel import com.pengxh.app.multilib.base.BaseFragment +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference class UnHandleOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_handle override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(this) +// workOrderListViewModel = ViewModelProvider(this).get(WorkOrderListViewModel::class.java) +// workOrderDetailViewModel = ViewModelProvider(this).get(WorkOrderDetailViewModel::class.java) } override fun initEvent() { +// obtainWorkOrderList(pageIndex) +// workOrderListViewModel.resultModel.observe(this, { +// if (it.code == 200) { +// val dataRows = it.data?.rows +// when { +// isRefresh -> { +// dataBeans.clear() +// dataBeans = dataRows!! +// unHandleLayout.finishRefresh() +// isRefresh = false +// } +// isLoadMore -> { +// if (dataRows?.size == 0) { +// "到底了,别拉了".show(requireContext()) +// } +// dataBeans.addAll(dataRows!!) +// unHandleLayout.finishLoadMore() +// isLoadMore = false +// } +// else -> { +// dataBeans = dataRows!! +// } +// } +// weakReferenceHandler!!.sendEmptyMessage(2022040602) +// } +// }) +// +// unHandleLayout.setOnRefreshListener { +// isRefresh = true +// //刷新之后页码重置 +// pageIndex = 1 +// obtainWorkOrderList(pageIndex) +// } +// unHandleLayout.setOnLoadMoreListener { +// isLoadMore = true +// pageIndex++ +// obtainWorkOrderList(pageIndex) +// } +// +// workOrderDetailViewModel.detailModel.observe(this, { +// if (it.code == 200) { +// val orderDetail = it.data!![0] +// val orderFlow = orderDetail.flow!! +// if (orderFlow.size != 0) { +// TimeLineBottomSheet.Builder().setContext(requireContext()) +// .setFlowItems(orderFlow).build().show() +// } else { +// "抱歉,无法查到该工单的流转记录".show(requireContext()) +// } +// } +// }) + } + private fun obtainWorkOrderList(index: Int) { +// workOrderListViewModel.obtainWorkOrderListByState(jobStatus = "2", page = index) + } + + private class WeakReferenceHandler(fragment: UnHandleOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040602) { + if (fragment.isRefresh || fragment.isLoadMore) { +// fragment.inHandleAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() +// fragment.inHandleAdapter = InHandleOrderAdapter( +// fragment.requireContext(), +// fragment.dataBeans +// ) +// fragment.inHandleView!!.layoutManager = +// LinearLayoutManager(fragment.requireContext()) +// fragment.inHandleView!!.adapter = fragment.inHandleAdapter +// fragment.inHandleAdapter.setOnItemClickListener(object : +// InHandleOrderAdapter.OnItemClickListener { +// override fun onClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看详情".show(fragment.requireContext()) +// return +// } +// fragment.requireContext().navigatePageTo( +// InHandleDetailActivity::class.java, jobId +// ) +// } +// +// override fun onTransferViewClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看工单流转记录".show(fragment.requireContext()) +// return +// } +// fragment.workOrderDetailViewModel.obtainWorkOrderDetail(id = jobId) +// } +// }) + } + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt new file mode 100644 index 0000000..b7929b5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt @@ -0,0 +1,185 @@ +package com.casic.app.smartwell.view.fragment + +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.Constant +import com.casic.app.smartwell.utils.DialogHelper +import com.casic.app.smartwell.utils.LoadState +import com.casic.app.smartwell.view.TodoDetailActivity +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel +import com.pengxh.app.multilib.base.BaseFragment +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_over_time_un_accept.* +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference + +class UnacceptedOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 + + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this) + overtimeOderViewModel = ViewModelProvider(this).get(OvertimeOderListViewModel::class.java) + acceptOrderViewModel = ViewModelProvider(this).get(AcceptOrderViewModel::class.java) + } + + override fun initEvent() { + obtainWorkOrderList(pageIndex) + overtimeOderViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + unAcceptOrderLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + unAcceptOrderLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler!!.sendEmptyMessage(2022040601) + } + }) + + //接单状态处理 + acceptOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireContext(), "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) + //通知列表刷行数据 + UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) + } + else -> { + DialogHelper.dismissLoadingDialog() + "接单失败".show(requireContext()) + } + } + }) + + unAcceptOrderLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainWorkOrderList(pageIndex) + } + unAcceptOrderLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainWorkOrderList(pageIndex) + } + } + + private fun obtainWorkOrderList(index: Int) { + overtimeOderViewModel.obtainOvertimeOderList(jobStatus = "0", page = index) + } + + private class WeakReferenceHandler(fragment: UnacceptedOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040601) { + if (fragment.isRefresh || fragment.isLoadMore) { + fragment.overtimeOrderAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("您没有超时未处理的工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() + fragment.overtimeOrderAdapter = OvertimeOrderListAdapter( + fragment.requireContext(), + fragment.dataBeans + ) + fragment.unAcceptOrderView!!.layoutManager = + LinearLayoutManager(fragment.requireContext()) + fragment.unAcceptOrderView!!.adapter = fragment.overtimeOrderAdapter + fragment.overtimeOrderAdapter.setOnItemClickListener(object : + OvertimeOrderListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(fragment.requireContext()) + return + } + fragment.requireContext() + .navigatePageTo(TodoDetailActivity::class.java, jobId) + } + + override fun onOperationClicked(position: Int) { + //标记被点击的item位置 + fragment.clickedPosition = position + + AlertControlDialog.Builder() + .setContext(fragment.requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = + fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show(fragment.requireContext()) + return + } + fragment.acceptOrderViewModel.acceptWorkOrder(id = jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt index 9cbd4de..2f25190 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt @@ -18,7 +18,7 @@ import com.casic.app.smartwell.vm.WorkOrderListViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.app.multilib.base.BaseFragment -import kotlinx.android.synthetic.main.fragment_order_undetermined.* +import kotlinx.android.synthetic.main.fragment_order_un_determined.* import kotlinx.android.synthetic.main.include_empty_view.* import java.lang.ref.WeakReference @@ -43,7 +43,7 @@ } } - override fun initLayoutView(): Int = R.layout.fragment_order_undetermined + override fun initLayoutView(): Int = R.layout.fragment_order_un_determined override fun initData() { weakReferenceHandler = WeakReferenceHandler(this) diff --git a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt index 56a7af4..b7c87a1 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -10,13 +9,10 @@ class AuthenticateViewModel : BaseViewModel() { - private val kTag = "AuthenticateViewModel" val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading keyModel.value = RetrofitServiceManager.authenticate() - }, { - Log.d(kTag, "obtainPublicKey: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt index cdff470..a22b719 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt @@ -1,7 +1,8 @@ package com.casic.app.smartwell.view.fragment +import android.graphics.Point +import android.location.Location import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,30 +11,46 @@ import androidx.recyclerview.widget.GridLayoutManager import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.* import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.HomeRecycleAdapter import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showRouteOnMap +import com.casic.app.smartwell.utils.Constant import com.casic.app.smartwell.view.OvertimeOrderActivity import com.casic.app.smartwell.view.WellManagementActivity import com.casic.app.smartwell.view.WellOperationActivity import com.casic.app.smartwell.vm.WellCountViewModel import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.google.gson.Gson +import com.casic.app.smartwell.widgets.GaoDeClusterMarkerView +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.include_base_title.view.* -class HomePageFragment : Fragment(), AMap.OnCameraChangeListener, AMap.OnMarkerClickListener { +class HomePageFragment : Fragment(), AMap.OnMyLocationChangeListener, AMap.OnCameraChangeListener, + AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { private lateinit var homeView: View private lateinit var wellCountViewModel: WellCountViewModel private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var wellListViewModel: WellListViewModel private lateinit var aMap: AMap - private val kTag = "HomePageFragment" + + //定位点经纬度 + private var location: LatLng? = null + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -51,8 +68,20 @@ wellListViewModel.obtainAllWell() wellListViewModel.listModel.observe(viewLifecycleOwner, { if (it.code == 200) { - val dataRows = it.data?.rows - Log.d(kTag, "onCreateView: ${Gson().toJson(dataRows)}") + it.data?.rows?.forEach { location -> + if (location.latGaode.toString().isNotBlank() + && location.lngGaode.toString().isNotBlank() + ) { + allMarkerOptions.add( + MarkerOptions().position( + LatLng( + location.latGaode!!.toDouble(), + location.lngGaode!!.toDouble() + ) + ).title(location.wellTypeName).snippet(location.wellName) + ) + } + } } }) @@ -109,27 +138,127 @@ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() + locationStyle.interval(5000) + //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER) locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 - locationStyle.interval(10 * 1000)////设置连续定位模式下的定位间隔,只在连续定位模式下生效。单位为毫秒 aMap.myLocationStyle = locationStyle aMap.isMyLocationEnabled = true - //注册地图缩放监听 + aMap.addOnMyLocationChangeListener(this) + // 地图缩放监听 aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) } - /***地图接口实现*********************************************************************************/ + override fun onMyLocationChange(p0: Location?) { + if (p0 != null) { + this.location = LatLng(p0.latitude, p0.longitude) + } + } + override fun onCameraChange(p0: CameraPosition?) { - Log.d(kTag, "onCameraChange: ") + } + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker override fun onCameraChangeFinish(p0: CameraPosition?) { -// resetMarks() - Log.d(kTag, "onCameraChangeFinish: ") + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + //在当前可观区域内 + markerOptionsInView.add(it) + } + } + // 自定义的聚合类MarkerCluster + val clustersMarkers: MutableList = ArrayList() + markerOptionsInView.forEach { + if (clustersMarkers.size == 0) { + //添加一个新的自定义marker + clustersMarkers.add(GaoDeClusterMarkerView(requireContext(), it, proj, 80))//相距多少才聚合 + } else { + var isInRange = false + //Kotlin foreach不能用break + for (view in clustersMarkers) { + //判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。 + if (view.bounds.contains(it.position)) { + view.addMarker(it) + isInRange = true + break + } + } + //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 + if (!isInRange) { + clustersMarkers.add( + GaoDeClusterMarkerView( + requireContext(), + it, proj, 80 + ) + )//相距多少才聚合 + } + } + } + // 设置聚合点的位置和icon + clustersMarkers.forEach { + it.setPositionAndIcon() + } + aMap.clear() + // 重新添加 marker + clustersMarkers.forEach { + aMap.addMarker(it.options) + } } - override fun onMarkerClick(p0: Marker?): Boolean { + override fun onMarkerClick(marker: Marker?): Boolean { + val clickedLatLng = marker?.position + if (location != null) { + //判断点击点是否是定位点 + val distance = AMapUtils.calculateLineDistance(location, clickedLatLng) + if (distance > Constant.DISTANCE) { + //显示闸井信息 + marker!!.showInfoWindow() + } else { + "该位置是定位点,请选择实际闸井点".show(requireContext()) + } + } + return true + } - return false + override fun onInfoWindowClick(p0: Marker?) { + if (p0 != null) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val latLng = p0.position + val lat = latLng.latitude.toString() + val lng = latLng.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "窨井经纬度异常,无法开启导航".show(requireContext()) + return + } + Poi(p0.snippet, LatLng(lat.toDouble(), lng.toDouble()), "").showRouteOnMap( + requireContext() + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } } /***以下是地图生命周期管理************************************************************************/ diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt index 7932e6a..3166bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt @@ -90,8 +90,11 @@ is LoadState.Success -> { DialogHelper.dismissLoadingDialog() "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) //通知列表刷行数据 - weakReferenceHandler!!.sendEmptyMessage(Constant.ORDER_TODO_OK) UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) } else -> { diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt deleted file mode 100644 index e7a664a..0000000 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.app.smartwell.view.fragment - -import com.casic.app.smartwell.R -import com.pengxh.app.multilib.base.BaseFragment - -class UnAcceptOrderFragment : BaseFragment() { - override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept - - override fun initData() { - - } - - override fun initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt index 8589260..6df8449 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt @@ -1,16 +1,146 @@ package com.casic.app.smartwell.view.fragment +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.WorkOrderListModel +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel import com.pengxh.app.multilib.base.BaseFragment +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference class UnHandleOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_handle override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(this) +// workOrderListViewModel = ViewModelProvider(this).get(WorkOrderListViewModel::class.java) +// workOrderDetailViewModel = ViewModelProvider(this).get(WorkOrderDetailViewModel::class.java) } override fun initEvent() { +// obtainWorkOrderList(pageIndex) +// workOrderListViewModel.resultModel.observe(this, { +// if (it.code == 200) { +// val dataRows = it.data?.rows +// when { +// isRefresh -> { +// dataBeans.clear() +// dataBeans = dataRows!! +// unHandleLayout.finishRefresh() +// isRefresh = false +// } +// isLoadMore -> { +// if (dataRows?.size == 0) { +// "到底了,别拉了".show(requireContext()) +// } +// dataBeans.addAll(dataRows!!) +// unHandleLayout.finishLoadMore() +// isLoadMore = false +// } +// else -> { +// dataBeans = dataRows!! +// } +// } +// weakReferenceHandler!!.sendEmptyMessage(2022040602) +// } +// }) +// +// unHandleLayout.setOnRefreshListener { +// isRefresh = true +// //刷新之后页码重置 +// pageIndex = 1 +// obtainWorkOrderList(pageIndex) +// } +// unHandleLayout.setOnLoadMoreListener { +// isLoadMore = true +// pageIndex++ +// obtainWorkOrderList(pageIndex) +// } +// +// workOrderDetailViewModel.detailModel.observe(this, { +// if (it.code == 200) { +// val orderDetail = it.data!![0] +// val orderFlow = orderDetail.flow!! +// if (orderFlow.size != 0) { +// TimeLineBottomSheet.Builder().setContext(requireContext()) +// .setFlowItems(orderFlow).build().show() +// } else { +// "抱歉,无法查到该工单的流转记录".show(requireContext()) +// } +// } +// }) + } + private fun obtainWorkOrderList(index: Int) { +// workOrderListViewModel.obtainWorkOrderListByState(jobStatus = "2", page = index) + } + + private class WeakReferenceHandler(fragment: UnHandleOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040602) { + if (fragment.isRefresh || fragment.isLoadMore) { +// fragment.inHandleAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() +// fragment.inHandleAdapter = InHandleOrderAdapter( +// fragment.requireContext(), +// fragment.dataBeans +// ) +// fragment.inHandleView!!.layoutManager = +// LinearLayoutManager(fragment.requireContext()) +// fragment.inHandleView!!.adapter = fragment.inHandleAdapter +// fragment.inHandleAdapter.setOnItemClickListener(object : +// InHandleOrderAdapter.OnItemClickListener { +// override fun onClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看详情".show(fragment.requireContext()) +// return +// } +// fragment.requireContext().navigatePageTo( +// InHandleDetailActivity::class.java, jobId +// ) +// } +// +// override fun onTransferViewClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看工单流转记录".show(fragment.requireContext()) +// return +// } +// fragment.workOrderDetailViewModel.obtainWorkOrderDetail(id = jobId) +// } +// }) + } + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt new file mode 100644 index 0000000..b7929b5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt @@ -0,0 +1,185 @@ +package com.casic.app.smartwell.view.fragment + +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.Constant +import com.casic.app.smartwell.utils.DialogHelper +import com.casic.app.smartwell.utils.LoadState +import com.casic.app.smartwell.view.TodoDetailActivity +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel +import com.pengxh.app.multilib.base.BaseFragment +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_over_time_un_accept.* +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference + +class UnacceptedOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 + + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this) + overtimeOderViewModel = ViewModelProvider(this).get(OvertimeOderListViewModel::class.java) + acceptOrderViewModel = ViewModelProvider(this).get(AcceptOrderViewModel::class.java) + } + + override fun initEvent() { + obtainWorkOrderList(pageIndex) + overtimeOderViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + unAcceptOrderLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + unAcceptOrderLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler!!.sendEmptyMessage(2022040601) + } + }) + + //接单状态处理 + acceptOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireContext(), "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) + //通知列表刷行数据 + UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) + } + else -> { + DialogHelper.dismissLoadingDialog() + "接单失败".show(requireContext()) + } + } + }) + + unAcceptOrderLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainWorkOrderList(pageIndex) + } + unAcceptOrderLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainWorkOrderList(pageIndex) + } + } + + private fun obtainWorkOrderList(index: Int) { + overtimeOderViewModel.obtainOvertimeOderList(jobStatus = "0", page = index) + } + + private class WeakReferenceHandler(fragment: UnacceptedOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040601) { + if (fragment.isRefresh || fragment.isLoadMore) { + fragment.overtimeOrderAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("您没有超时未处理的工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() + fragment.overtimeOrderAdapter = OvertimeOrderListAdapter( + fragment.requireContext(), + fragment.dataBeans + ) + fragment.unAcceptOrderView!!.layoutManager = + LinearLayoutManager(fragment.requireContext()) + fragment.unAcceptOrderView!!.adapter = fragment.overtimeOrderAdapter + fragment.overtimeOrderAdapter.setOnItemClickListener(object : + OvertimeOrderListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(fragment.requireContext()) + return + } + fragment.requireContext() + .navigatePageTo(TodoDetailActivity::class.java, jobId) + } + + override fun onOperationClicked(position: Int) { + //标记被点击的item位置 + fragment.clickedPosition = position + + AlertControlDialog.Builder() + .setContext(fragment.requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = + fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show(fragment.requireContext()) + return + } + fragment.acceptOrderViewModel.acceptWorkOrder(id = jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt index 9cbd4de..2f25190 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt @@ -18,7 +18,7 @@ import com.casic.app.smartwell.vm.WorkOrderListViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.app.multilib.base.BaseFragment -import kotlinx.android.synthetic.main.fragment_order_undetermined.* +import kotlinx.android.synthetic.main.fragment_order_un_determined.* import kotlinx.android.synthetic.main.include_empty_view.* import java.lang.ref.WeakReference @@ -43,7 +43,7 @@ } } - override fun initLayoutView(): Int = R.layout.fragment_order_undetermined + override fun initLayoutView(): Int = R.layout.fragment_order_un_determined override fun initData() { weakReferenceHandler = WeakReferenceHandler(this) diff --git a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt index 56a7af4..b7c87a1 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -10,13 +9,10 @@ class AuthenticateViewModel : BaseViewModel() { - private val kTag = "AuthenticateViewModel" val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading keyModel.value = RetrofitServiceManager.authenticate() - }, { - Log.d(kTag, "obtainPublicKey: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt index 3d2d37b..312d224 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class LoginOutViewModel : BaseViewModel() { - private val kTag = "LoginOutViewModel" val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() - }, { - Log.d(kTag, "loginOut: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt index cdff470..a22b719 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt @@ -1,7 +1,8 @@ package com.casic.app.smartwell.view.fragment +import android.graphics.Point +import android.location.Location import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,30 +11,46 @@ import androidx.recyclerview.widget.GridLayoutManager import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.* import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.HomeRecycleAdapter import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showRouteOnMap +import com.casic.app.smartwell.utils.Constant import com.casic.app.smartwell.view.OvertimeOrderActivity import com.casic.app.smartwell.view.WellManagementActivity import com.casic.app.smartwell.view.WellOperationActivity import com.casic.app.smartwell.vm.WellCountViewModel import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.google.gson.Gson +import com.casic.app.smartwell.widgets.GaoDeClusterMarkerView +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.include_base_title.view.* -class HomePageFragment : Fragment(), AMap.OnCameraChangeListener, AMap.OnMarkerClickListener { +class HomePageFragment : Fragment(), AMap.OnMyLocationChangeListener, AMap.OnCameraChangeListener, + AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { private lateinit var homeView: View private lateinit var wellCountViewModel: WellCountViewModel private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var wellListViewModel: WellListViewModel private lateinit var aMap: AMap - private val kTag = "HomePageFragment" + + //定位点经纬度 + private var location: LatLng? = null + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -51,8 +68,20 @@ wellListViewModel.obtainAllWell() wellListViewModel.listModel.observe(viewLifecycleOwner, { if (it.code == 200) { - val dataRows = it.data?.rows - Log.d(kTag, "onCreateView: ${Gson().toJson(dataRows)}") + it.data?.rows?.forEach { location -> + if (location.latGaode.toString().isNotBlank() + && location.lngGaode.toString().isNotBlank() + ) { + allMarkerOptions.add( + MarkerOptions().position( + LatLng( + location.latGaode!!.toDouble(), + location.lngGaode!!.toDouble() + ) + ).title(location.wellTypeName).snippet(location.wellName) + ) + } + } } }) @@ -109,27 +138,127 @@ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() + locationStyle.interval(5000) + //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER) locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 - locationStyle.interval(10 * 1000)////设置连续定位模式下的定位间隔,只在连续定位模式下生效。单位为毫秒 aMap.myLocationStyle = locationStyle aMap.isMyLocationEnabled = true - //注册地图缩放监听 + aMap.addOnMyLocationChangeListener(this) + // 地图缩放监听 aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) } - /***地图接口实现*********************************************************************************/ + override fun onMyLocationChange(p0: Location?) { + if (p0 != null) { + this.location = LatLng(p0.latitude, p0.longitude) + } + } + override fun onCameraChange(p0: CameraPosition?) { - Log.d(kTag, "onCameraChange: ") + } + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker override fun onCameraChangeFinish(p0: CameraPosition?) { -// resetMarks() - Log.d(kTag, "onCameraChangeFinish: ") + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + //在当前可观区域内 + markerOptionsInView.add(it) + } + } + // 自定义的聚合类MarkerCluster + val clustersMarkers: MutableList = ArrayList() + markerOptionsInView.forEach { + if (clustersMarkers.size == 0) { + //添加一个新的自定义marker + clustersMarkers.add(GaoDeClusterMarkerView(requireContext(), it, proj, 80))//相距多少才聚合 + } else { + var isInRange = false + //Kotlin foreach不能用break + for (view in clustersMarkers) { + //判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。 + if (view.bounds.contains(it.position)) { + view.addMarker(it) + isInRange = true + break + } + } + //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 + if (!isInRange) { + clustersMarkers.add( + GaoDeClusterMarkerView( + requireContext(), + it, proj, 80 + ) + )//相距多少才聚合 + } + } + } + // 设置聚合点的位置和icon + clustersMarkers.forEach { + it.setPositionAndIcon() + } + aMap.clear() + // 重新添加 marker + clustersMarkers.forEach { + aMap.addMarker(it.options) + } } - override fun onMarkerClick(p0: Marker?): Boolean { + override fun onMarkerClick(marker: Marker?): Boolean { + val clickedLatLng = marker?.position + if (location != null) { + //判断点击点是否是定位点 + val distance = AMapUtils.calculateLineDistance(location, clickedLatLng) + if (distance > Constant.DISTANCE) { + //显示闸井信息 + marker!!.showInfoWindow() + } else { + "该位置是定位点,请选择实际闸井点".show(requireContext()) + } + } + return true + } - return false + override fun onInfoWindowClick(p0: Marker?) { + if (p0 != null) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val latLng = p0.position + val lat = latLng.latitude.toString() + val lng = latLng.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "窨井经纬度异常,无法开启导航".show(requireContext()) + return + } + Poi(p0.snippet, LatLng(lat.toDouble(), lng.toDouble()), "").showRouteOnMap( + requireContext() + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } } /***以下是地图生命周期管理************************************************************************/ diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt index 7932e6a..3166bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt @@ -90,8 +90,11 @@ is LoadState.Success -> { DialogHelper.dismissLoadingDialog() "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) //通知列表刷行数据 - weakReferenceHandler!!.sendEmptyMessage(Constant.ORDER_TODO_OK) UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) } else -> { diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt deleted file mode 100644 index e7a664a..0000000 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.app.smartwell.view.fragment - -import com.casic.app.smartwell.R -import com.pengxh.app.multilib.base.BaseFragment - -class UnAcceptOrderFragment : BaseFragment() { - override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept - - override fun initData() { - - } - - override fun initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt index 8589260..6df8449 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt @@ -1,16 +1,146 @@ package com.casic.app.smartwell.view.fragment +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.WorkOrderListModel +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel import com.pengxh.app.multilib.base.BaseFragment +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference class UnHandleOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_handle override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(this) +// workOrderListViewModel = ViewModelProvider(this).get(WorkOrderListViewModel::class.java) +// workOrderDetailViewModel = ViewModelProvider(this).get(WorkOrderDetailViewModel::class.java) } override fun initEvent() { +// obtainWorkOrderList(pageIndex) +// workOrderListViewModel.resultModel.observe(this, { +// if (it.code == 200) { +// val dataRows = it.data?.rows +// when { +// isRefresh -> { +// dataBeans.clear() +// dataBeans = dataRows!! +// unHandleLayout.finishRefresh() +// isRefresh = false +// } +// isLoadMore -> { +// if (dataRows?.size == 0) { +// "到底了,别拉了".show(requireContext()) +// } +// dataBeans.addAll(dataRows!!) +// unHandleLayout.finishLoadMore() +// isLoadMore = false +// } +// else -> { +// dataBeans = dataRows!! +// } +// } +// weakReferenceHandler!!.sendEmptyMessage(2022040602) +// } +// }) +// +// unHandleLayout.setOnRefreshListener { +// isRefresh = true +// //刷新之后页码重置 +// pageIndex = 1 +// obtainWorkOrderList(pageIndex) +// } +// unHandleLayout.setOnLoadMoreListener { +// isLoadMore = true +// pageIndex++ +// obtainWorkOrderList(pageIndex) +// } +// +// workOrderDetailViewModel.detailModel.observe(this, { +// if (it.code == 200) { +// val orderDetail = it.data!![0] +// val orderFlow = orderDetail.flow!! +// if (orderFlow.size != 0) { +// TimeLineBottomSheet.Builder().setContext(requireContext()) +// .setFlowItems(orderFlow).build().show() +// } else { +// "抱歉,无法查到该工单的流转记录".show(requireContext()) +// } +// } +// }) + } + private fun obtainWorkOrderList(index: Int) { +// workOrderListViewModel.obtainWorkOrderListByState(jobStatus = "2", page = index) + } + + private class WeakReferenceHandler(fragment: UnHandleOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040602) { + if (fragment.isRefresh || fragment.isLoadMore) { +// fragment.inHandleAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() +// fragment.inHandleAdapter = InHandleOrderAdapter( +// fragment.requireContext(), +// fragment.dataBeans +// ) +// fragment.inHandleView!!.layoutManager = +// LinearLayoutManager(fragment.requireContext()) +// fragment.inHandleView!!.adapter = fragment.inHandleAdapter +// fragment.inHandleAdapter.setOnItemClickListener(object : +// InHandleOrderAdapter.OnItemClickListener { +// override fun onClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看详情".show(fragment.requireContext()) +// return +// } +// fragment.requireContext().navigatePageTo( +// InHandleDetailActivity::class.java, jobId +// ) +// } +// +// override fun onTransferViewClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看工单流转记录".show(fragment.requireContext()) +// return +// } +// fragment.workOrderDetailViewModel.obtainWorkOrderDetail(id = jobId) +// } +// }) + } + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt new file mode 100644 index 0000000..b7929b5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt @@ -0,0 +1,185 @@ +package com.casic.app.smartwell.view.fragment + +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.Constant +import com.casic.app.smartwell.utils.DialogHelper +import com.casic.app.smartwell.utils.LoadState +import com.casic.app.smartwell.view.TodoDetailActivity +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel +import com.pengxh.app.multilib.base.BaseFragment +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_over_time_un_accept.* +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference + +class UnacceptedOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 + + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this) + overtimeOderViewModel = ViewModelProvider(this).get(OvertimeOderListViewModel::class.java) + acceptOrderViewModel = ViewModelProvider(this).get(AcceptOrderViewModel::class.java) + } + + override fun initEvent() { + obtainWorkOrderList(pageIndex) + overtimeOderViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + unAcceptOrderLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + unAcceptOrderLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler!!.sendEmptyMessage(2022040601) + } + }) + + //接单状态处理 + acceptOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireContext(), "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) + //通知列表刷行数据 + UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) + } + else -> { + DialogHelper.dismissLoadingDialog() + "接单失败".show(requireContext()) + } + } + }) + + unAcceptOrderLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainWorkOrderList(pageIndex) + } + unAcceptOrderLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainWorkOrderList(pageIndex) + } + } + + private fun obtainWorkOrderList(index: Int) { + overtimeOderViewModel.obtainOvertimeOderList(jobStatus = "0", page = index) + } + + private class WeakReferenceHandler(fragment: UnacceptedOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040601) { + if (fragment.isRefresh || fragment.isLoadMore) { + fragment.overtimeOrderAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("您没有超时未处理的工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() + fragment.overtimeOrderAdapter = OvertimeOrderListAdapter( + fragment.requireContext(), + fragment.dataBeans + ) + fragment.unAcceptOrderView!!.layoutManager = + LinearLayoutManager(fragment.requireContext()) + fragment.unAcceptOrderView!!.adapter = fragment.overtimeOrderAdapter + fragment.overtimeOrderAdapter.setOnItemClickListener(object : + OvertimeOrderListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(fragment.requireContext()) + return + } + fragment.requireContext() + .navigatePageTo(TodoDetailActivity::class.java, jobId) + } + + override fun onOperationClicked(position: Int) { + //标记被点击的item位置 + fragment.clickedPosition = position + + AlertControlDialog.Builder() + .setContext(fragment.requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = + fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show(fragment.requireContext()) + return + } + fragment.acceptOrderViewModel.acceptWorkOrder(id = jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt index 9cbd4de..2f25190 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt @@ -18,7 +18,7 @@ import com.casic.app.smartwell.vm.WorkOrderListViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.app.multilib.base.BaseFragment -import kotlinx.android.synthetic.main.fragment_order_undetermined.* +import kotlinx.android.synthetic.main.fragment_order_un_determined.* import kotlinx.android.synthetic.main.include_empty_view.* import java.lang.ref.WeakReference @@ -43,7 +43,7 @@ } } - override fun initLayoutView(): Int = R.layout.fragment_order_undetermined + override fun initLayoutView(): Int = R.layout.fragment_order_un_determined override fun initData() { weakReferenceHandler = WeakReferenceHandler(this) diff --git a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt index 56a7af4..b7c87a1 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -10,13 +9,10 @@ class AuthenticateViewModel : BaseViewModel() { - private val kTag = "AuthenticateViewModel" val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading keyModel.value = RetrofitServiceManager.authenticate() - }, { - Log.d(kTag, "obtainPublicKey: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt index 3d2d37b..312d224 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class LoginOutViewModel : BaseViewModel() { - private val kTag = "LoginOutViewModel" val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() - }, { - Log.d(kTag, "loginOut: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt index 90eb8c9..03fff89 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class OrderStatusViewModel : BaseViewModel() { - private val kTag = "OrderStatusViewModel" val listModel = MutableLiveData() fun obtainOrderStatus() = launch({ listModel.value = RetrofitServiceManager.obtainOrderStatus() - }, { - Log.d(kTag, "obtainOrderStatus: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt index cdff470..a22b719 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt @@ -1,7 +1,8 @@ package com.casic.app.smartwell.view.fragment +import android.graphics.Point +import android.location.Location import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,30 +11,46 @@ import androidx.recyclerview.widget.GridLayoutManager import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.* import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.HomeRecycleAdapter import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showRouteOnMap +import com.casic.app.smartwell.utils.Constant import com.casic.app.smartwell.view.OvertimeOrderActivity import com.casic.app.smartwell.view.WellManagementActivity import com.casic.app.smartwell.view.WellOperationActivity import com.casic.app.smartwell.vm.WellCountViewModel import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.google.gson.Gson +import com.casic.app.smartwell.widgets.GaoDeClusterMarkerView +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.include_base_title.view.* -class HomePageFragment : Fragment(), AMap.OnCameraChangeListener, AMap.OnMarkerClickListener { +class HomePageFragment : Fragment(), AMap.OnMyLocationChangeListener, AMap.OnCameraChangeListener, + AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { private lateinit var homeView: View private lateinit var wellCountViewModel: WellCountViewModel private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var wellListViewModel: WellListViewModel private lateinit var aMap: AMap - private val kTag = "HomePageFragment" + + //定位点经纬度 + private var location: LatLng? = null + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -51,8 +68,20 @@ wellListViewModel.obtainAllWell() wellListViewModel.listModel.observe(viewLifecycleOwner, { if (it.code == 200) { - val dataRows = it.data?.rows - Log.d(kTag, "onCreateView: ${Gson().toJson(dataRows)}") + it.data?.rows?.forEach { location -> + if (location.latGaode.toString().isNotBlank() + && location.lngGaode.toString().isNotBlank() + ) { + allMarkerOptions.add( + MarkerOptions().position( + LatLng( + location.latGaode!!.toDouble(), + location.lngGaode!!.toDouble() + ) + ).title(location.wellTypeName).snippet(location.wellName) + ) + } + } } }) @@ -109,27 +138,127 @@ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() + locationStyle.interval(5000) + //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER) locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 - locationStyle.interval(10 * 1000)////设置连续定位模式下的定位间隔,只在连续定位模式下生效。单位为毫秒 aMap.myLocationStyle = locationStyle aMap.isMyLocationEnabled = true - //注册地图缩放监听 + aMap.addOnMyLocationChangeListener(this) + // 地图缩放监听 aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) } - /***地图接口实现*********************************************************************************/ + override fun onMyLocationChange(p0: Location?) { + if (p0 != null) { + this.location = LatLng(p0.latitude, p0.longitude) + } + } + override fun onCameraChange(p0: CameraPosition?) { - Log.d(kTag, "onCameraChange: ") + } + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker override fun onCameraChangeFinish(p0: CameraPosition?) { -// resetMarks() - Log.d(kTag, "onCameraChangeFinish: ") + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + //在当前可观区域内 + markerOptionsInView.add(it) + } + } + // 自定义的聚合类MarkerCluster + val clustersMarkers: MutableList = ArrayList() + markerOptionsInView.forEach { + if (clustersMarkers.size == 0) { + //添加一个新的自定义marker + clustersMarkers.add(GaoDeClusterMarkerView(requireContext(), it, proj, 80))//相距多少才聚合 + } else { + var isInRange = false + //Kotlin foreach不能用break + for (view in clustersMarkers) { + //判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。 + if (view.bounds.contains(it.position)) { + view.addMarker(it) + isInRange = true + break + } + } + //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 + if (!isInRange) { + clustersMarkers.add( + GaoDeClusterMarkerView( + requireContext(), + it, proj, 80 + ) + )//相距多少才聚合 + } + } + } + // 设置聚合点的位置和icon + clustersMarkers.forEach { + it.setPositionAndIcon() + } + aMap.clear() + // 重新添加 marker + clustersMarkers.forEach { + aMap.addMarker(it.options) + } } - override fun onMarkerClick(p0: Marker?): Boolean { + override fun onMarkerClick(marker: Marker?): Boolean { + val clickedLatLng = marker?.position + if (location != null) { + //判断点击点是否是定位点 + val distance = AMapUtils.calculateLineDistance(location, clickedLatLng) + if (distance > Constant.DISTANCE) { + //显示闸井信息 + marker!!.showInfoWindow() + } else { + "该位置是定位点,请选择实际闸井点".show(requireContext()) + } + } + return true + } - return false + override fun onInfoWindowClick(p0: Marker?) { + if (p0 != null) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val latLng = p0.position + val lat = latLng.latitude.toString() + val lng = latLng.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "窨井经纬度异常,无法开启导航".show(requireContext()) + return + } + Poi(p0.snippet, LatLng(lat.toDouble(), lng.toDouble()), "").showRouteOnMap( + requireContext() + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } } /***以下是地图生命周期管理************************************************************************/ diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt index 7932e6a..3166bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt @@ -90,8 +90,11 @@ is LoadState.Success -> { DialogHelper.dismissLoadingDialog() "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) //通知列表刷行数据 - weakReferenceHandler!!.sendEmptyMessage(Constant.ORDER_TODO_OK) UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) } else -> { diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt deleted file mode 100644 index e7a664a..0000000 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.app.smartwell.view.fragment - -import com.casic.app.smartwell.R -import com.pengxh.app.multilib.base.BaseFragment - -class UnAcceptOrderFragment : BaseFragment() { - override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept - - override fun initData() { - - } - - override fun initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt index 8589260..6df8449 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt @@ -1,16 +1,146 @@ package com.casic.app.smartwell.view.fragment +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.WorkOrderListModel +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel import com.pengxh.app.multilib.base.BaseFragment +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference class UnHandleOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_handle override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(this) +// workOrderListViewModel = ViewModelProvider(this).get(WorkOrderListViewModel::class.java) +// workOrderDetailViewModel = ViewModelProvider(this).get(WorkOrderDetailViewModel::class.java) } override fun initEvent() { +// obtainWorkOrderList(pageIndex) +// workOrderListViewModel.resultModel.observe(this, { +// if (it.code == 200) { +// val dataRows = it.data?.rows +// when { +// isRefresh -> { +// dataBeans.clear() +// dataBeans = dataRows!! +// unHandleLayout.finishRefresh() +// isRefresh = false +// } +// isLoadMore -> { +// if (dataRows?.size == 0) { +// "到底了,别拉了".show(requireContext()) +// } +// dataBeans.addAll(dataRows!!) +// unHandleLayout.finishLoadMore() +// isLoadMore = false +// } +// else -> { +// dataBeans = dataRows!! +// } +// } +// weakReferenceHandler!!.sendEmptyMessage(2022040602) +// } +// }) +// +// unHandleLayout.setOnRefreshListener { +// isRefresh = true +// //刷新之后页码重置 +// pageIndex = 1 +// obtainWorkOrderList(pageIndex) +// } +// unHandleLayout.setOnLoadMoreListener { +// isLoadMore = true +// pageIndex++ +// obtainWorkOrderList(pageIndex) +// } +// +// workOrderDetailViewModel.detailModel.observe(this, { +// if (it.code == 200) { +// val orderDetail = it.data!![0] +// val orderFlow = orderDetail.flow!! +// if (orderFlow.size != 0) { +// TimeLineBottomSheet.Builder().setContext(requireContext()) +// .setFlowItems(orderFlow).build().show() +// } else { +// "抱歉,无法查到该工单的流转记录".show(requireContext()) +// } +// } +// }) + } + private fun obtainWorkOrderList(index: Int) { +// workOrderListViewModel.obtainWorkOrderListByState(jobStatus = "2", page = index) + } + + private class WeakReferenceHandler(fragment: UnHandleOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040602) { + if (fragment.isRefresh || fragment.isLoadMore) { +// fragment.inHandleAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() +// fragment.inHandleAdapter = InHandleOrderAdapter( +// fragment.requireContext(), +// fragment.dataBeans +// ) +// fragment.inHandleView!!.layoutManager = +// LinearLayoutManager(fragment.requireContext()) +// fragment.inHandleView!!.adapter = fragment.inHandleAdapter +// fragment.inHandleAdapter.setOnItemClickListener(object : +// InHandleOrderAdapter.OnItemClickListener { +// override fun onClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看详情".show(fragment.requireContext()) +// return +// } +// fragment.requireContext().navigatePageTo( +// InHandleDetailActivity::class.java, jobId +// ) +// } +// +// override fun onTransferViewClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看工单流转记录".show(fragment.requireContext()) +// return +// } +// fragment.workOrderDetailViewModel.obtainWorkOrderDetail(id = jobId) +// } +// }) + } + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt new file mode 100644 index 0000000..b7929b5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt @@ -0,0 +1,185 @@ +package com.casic.app.smartwell.view.fragment + +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.Constant +import com.casic.app.smartwell.utils.DialogHelper +import com.casic.app.smartwell.utils.LoadState +import com.casic.app.smartwell.view.TodoDetailActivity +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel +import com.pengxh.app.multilib.base.BaseFragment +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_over_time_un_accept.* +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference + +class UnacceptedOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 + + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this) + overtimeOderViewModel = ViewModelProvider(this).get(OvertimeOderListViewModel::class.java) + acceptOrderViewModel = ViewModelProvider(this).get(AcceptOrderViewModel::class.java) + } + + override fun initEvent() { + obtainWorkOrderList(pageIndex) + overtimeOderViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + unAcceptOrderLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + unAcceptOrderLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler!!.sendEmptyMessage(2022040601) + } + }) + + //接单状态处理 + acceptOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireContext(), "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) + //通知列表刷行数据 + UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) + } + else -> { + DialogHelper.dismissLoadingDialog() + "接单失败".show(requireContext()) + } + } + }) + + unAcceptOrderLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainWorkOrderList(pageIndex) + } + unAcceptOrderLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainWorkOrderList(pageIndex) + } + } + + private fun obtainWorkOrderList(index: Int) { + overtimeOderViewModel.obtainOvertimeOderList(jobStatus = "0", page = index) + } + + private class WeakReferenceHandler(fragment: UnacceptedOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040601) { + if (fragment.isRefresh || fragment.isLoadMore) { + fragment.overtimeOrderAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("您没有超时未处理的工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() + fragment.overtimeOrderAdapter = OvertimeOrderListAdapter( + fragment.requireContext(), + fragment.dataBeans + ) + fragment.unAcceptOrderView!!.layoutManager = + LinearLayoutManager(fragment.requireContext()) + fragment.unAcceptOrderView!!.adapter = fragment.overtimeOrderAdapter + fragment.overtimeOrderAdapter.setOnItemClickListener(object : + OvertimeOrderListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(fragment.requireContext()) + return + } + fragment.requireContext() + .navigatePageTo(TodoDetailActivity::class.java, jobId) + } + + override fun onOperationClicked(position: Int) { + //标记被点击的item位置 + fragment.clickedPosition = position + + AlertControlDialog.Builder() + .setContext(fragment.requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = + fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show(fragment.requireContext()) + return + } + fragment.acceptOrderViewModel.acceptWorkOrder(id = jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt index 9cbd4de..2f25190 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt @@ -18,7 +18,7 @@ import com.casic.app.smartwell.vm.WorkOrderListViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.app.multilib.base.BaseFragment -import kotlinx.android.synthetic.main.fragment_order_undetermined.* +import kotlinx.android.synthetic.main.fragment_order_un_determined.* import kotlinx.android.synthetic.main.include_empty_view.* import java.lang.ref.WeakReference @@ -43,7 +43,7 @@ } } - override fun initLayoutView(): Int = R.layout.fragment_order_undetermined + override fun initLayoutView(): Int = R.layout.fragment_order_un_determined override fun initData() { weakReferenceHandler = WeakReferenceHandler(this) diff --git a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt index 56a7af4..b7c87a1 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -10,13 +9,10 @@ class AuthenticateViewModel : BaseViewModel() { - private val kTag = "AuthenticateViewModel" val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading keyModel.value = RetrofitServiceManager.authenticate() - }, { - Log.d(kTag, "obtainPublicKey: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt index 3d2d37b..312d224 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class LoginOutViewModel : BaseViewModel() { - private val kTag = "LoginOutViewModel" val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() - }, { - Log.d(kTag, "loginOut: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt index 90eb8c9..03fff89 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class OrderStatusViewModel : BaseViewModel() { - private val kTag = "OrderStatusViewModel" val listModel = MutableLiveData() fun obtainOrderStatus() = launch({ listModel.value = RetrofitServiceManager.obtainOrderStatus() - }, { - Log.d(kTag, "obtainOrderStatus: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt new file mode 100644 index 0000000..a78cf59 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt @@ -0,0 +1,16 @@ +package com.casic.app.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.base.BaseViewModel +import com.casic.app.smartwell.extensions.launch +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager + +class OvertimeOderListViewModel : BaseViewModel() { + + val resultModel = MutableLiveData() + + fun obtainOvertimeOderList(jobStatus: String, page: Int) = launch({ + resultModel.value = RetrofitServiceManager.obtainOvertimeOderList(jobStatus, page) + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt index cdff470..a22b719 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt @@ -1,7 +1,8 @@ package com.casic.app.smartwell.view.fragment +import android.graphics.Point +import android.location.Location import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,30 +11,46 @@ import androidx.recyclerview.widget.GridLayoutManager import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.* import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.HomeRecycleAdapter import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showRouteOnMap +import com.casic.app.smartwell.utils.Constant import com.casic.app.smartwell.view.OvertimeOrderActivity import com.casic.app.smartwell.view.WellManagementActivity import com.casic.app.smartwell.view.WellOperationActivity import com.casic.app.smartwell.vm.WellCountViewModel import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.google.gson.Gson +import com.casic.app.smartwell.widgets.GaoDeClusterMarkerView +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.include_base_title.view.* -class HomePageFragment : Fragment(), AMap.OnCameraChangeListener, AMap.OnMarkerClickListener { +class HomePageFragment : Fragment(), AMap.OnMyLocationChangeListener, AMap.OnCameraChangeListener, + AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { private lateinit var homeView: View private lateinit var wellCountViewModel: WellCountViewModel private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var wellListViewModel: WellListViewModel private lateinit var aMap: AMap - private val kTag = "HomePageFragment" + + //定位点经纬度 + private var location: LatLng? = null + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -51,8 +68,20 @@ wellListViewModel.obtainAllWell() wellListViewModel.listModel.observe(viewLifecycleOwner, { if (it.code == 200) { - val dataRows = it.data?.rows - Log.d(kTag, "onCreateView: ${Gson().toJson(dataRows)}") + it.data?.rows?.forEach { location -> + if (location.latGaode.toString().isNotBlank() + && location.lngGaode.toString().isNotBlank() + ) { + allMarkerOptions.add( + MarkerOptions().position( + LatLng( + location.latGaode!!.toDouble(), + location.lngGaode!!.toDouble() + ) + ).title(location.wellTypeName).snippet(location.wellName) + ) + } + } } }) @@ -109,27 +138,127 @@ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() + locationStyle.interval(5000) + //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER) locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 - locationStyle.interval(10 * 1000)////设置连续定位模式下的定位间隔,只在连续定位模式下生效。单位为毫秒 aMap.myLocationStyle = locationStyle aMap.isMyLocationEnabled = true - //注册地图缩放监听 + aMap.addOnMyLocationChangeListener(this) + // 地图缩放监听 aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) } - /***地图接口实现*********************************************************************************/ + override fun onMyLocationChange(p0: Location?) { + if (p0 != null) { + this.location = LatLng(p0.latitude, p0.longitude) + } + } + override fun onCameraChange(p0: CameraPosition?) { - Log.d(kTag, "onCameraChange: ") + } + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker override fun onCameraChangeFinish(p0: CameraPosition?) { -// resetMarks() - Log.d(kTag, "onCameraChangeFinish: ") + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + //在当前可观区域内 + markerOptionsInView.add(it) + } + } + // 自定义的聚合类MarkerCluster + val clustersMarkers: MutableList = ArrayList() + markerOptionsInView.forEach { + if (clustersMarkers.size == 0) { + //添加一个新的自定义marker + clustersMarkers.add(GaoDeClusterMarkerView(requireContext(), it, proj, 80))//相距多少才聚合 + } else { + var isInRange = false + //Kotlin foreach不能用break + for (view in clustersMarkers) { + //判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。 + if (view.bounds.contains(it.position)) { + view.addMarker(it) + isInRange = true + break + } + } + //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 + if (!isInRange) { + clustersMarkers.add( + GaoDeClusterMarkerView( + requireContext(), + it, proj, 80 + ) + )//相距多少才聚合 + } + } + } + // 设置聚合点的位置和icon + clustersMarkers.forEach { + it.setPositionAndIcon() + } + aMap.clear() + // 重新添加 marker + clustersMarkers.forEach { + aMap.addMarker(it.options) + } } - override fun onMarkerClick(p0: Marker?): Boolean { + override fun onMarkerClick(marker: Marker?): Boolean { + val clickedLatLng = marker?.position + if (location != null) { + //判断点击点是否是定位点 + val distance = AMapUtils.calculateLineDistance(location, clickedLatLng) + if (distance > Constant.DISTANCE) { + //显示闸井信息 + marker!!.showInfoWindow() + } else { + "该位置是定位点,请选择实际闸井点".show(requireContext()) + } + } + return true + } - return false + override fun onInfoWindowClick(p0: Marker?) { + if (p0 != null) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val latLng = p0.position + val lat = latLng.latitude.toString() + val lng = latLng.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "窨井经纬度异常,无法开启导航".show(requireContext()) + return + } + Poi(p0.snippet, LatLng(lat.toDouble(), lng.toDouble()), "").showRouteOnMap( + requireContext() + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } } /***以下是地图生命周期管理************************************************************************/ diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt index 7932e6a..3166bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt @@ -90,8 +90,11 @@ is LoadState.Success -> { DialogHelper.dismissLoadingDialog() "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) //通知列表刷行数据 - weakReferenceHandler!!.sendEmptyMessage(Constant.ORDER_TODO_OK) UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) } else -> { diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt deleted file mode 100644 index e7a664a..0000000 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.app.smartwell.view.fragment - -import com.casic.app.smartwell.R -import com.pengxh.app.multilib.base.BaseFragment - -class UnAcceptOrderFragment : BaseFragment() { - override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept - - override fun initData() { - - } - - override fun initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt index 8589260..6df8449 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt @@ -1,16 +1,146 @@ package com.casic.app.smartwell.view.fragment +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.WorkOrderListModel +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel import com.pengxh.app.multilib.base.BaseFragment +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference class UnHandleOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_handle override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(this) +// workOrderListViewModel = ViewModelProvider(this).get(WorkOrderListViewModel::class.java) +// workOrderDetailViewModel = ViewModelProvider(this).get(WorkOrderDetailViewModel::class.java) } override fun initEvent() { +// obtainWorkOrderList(pageIndex) +// workOrderListViewModel.resultModel.observe(this, { +// if (it.code == 200) { +// val dataRows = it.data?.rows +// when { +// isRefresh -> { +// dataBeans.clear() +// dataBeans = dataRows!! +// unHandleLayout.finishRefresh() +// isRefresh = false +// } +// isLoadMore -> { +// if (dataRows?.size == 0) { +// "到底了,别拉了".show(requireContext()) +// } +// dataBeans.addAll(dataRows!!) +// unHandleLayout.finishLoadMore() +// isLoadMore = false +// } +// else -> { +// dataBeans = dataRows!! +// } +// } +// weakReferenceHandler!!.sendEmptyMessage(2022040602) +// } +// }) +// +// unHandleLayout.setOnRefreshListener { +// isRefresh = true +// //刷新之后页码重置 +// pageIndex = 1 +// obtainWorkOrderList(pageIndex) +// } +// unHandleLayout.setOnLoadMoreListener { +// isLoadMore = true +// pageIndex++ +// obtainWorkOrderList(pageIndex) +// } +// +// workOrderDetailViewModel.detailModel.observe(this, { +// if (it.code == 200) { +// val orderDetail = it.data!![0] +// val orderFlow = orderDetail.flow!! +// if (orderFlow.size != 0) { +// TimeLineBottomSheet.Builder().setContext(requireContext()) +// .setFlowItems(orderFlow).build().show() +// } else { +// "抱歉,无法查到该工单的流转记录".show(requireContext()) +// } +// } +// }) + } + private fun obtainWorkOrderList(index: Int) { +// workOrderListViewModel.obtainWorkOrderListByState(jobStatus = "2", page = index) + } + + private class WeakReferenceHandler(fragment: UnHandleOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040602) { + if (fragment.isRefresh || fragment.isLoadMore) { +// fragment.inHandleAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() +// fragment.inHandleAdapter = InHandleOrderAdapter( +// fragment.requireContext(), +// fragment.dataBeans +// ) +// fragment.inHandleView!!.layoutManager = +// LinearLayoutManager(fragment.requireContext()) +// fragment.inHandleView!!.adapter = fragment.inHandleAdapter +// fragment.inHandleAdapter.setOnItemClickListener(object : +// InHandleOrderAdapter.OnItemClickListener { +// override fun onClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看详情".show(fragment.requireContext()) +// return +// } +// fragment.requireContext().navigatePageTo( +// InHandleDetailActivity::class.java, jobId +// ) +// } +// +// override fun onTransferViewClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看工单流转记录".show(fragment.requireContext()) +// return +// } +// fragment.workOrderDetailViewModel.obtainWorkOrderDetail(id = jobId) +// } +// }) + } + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt new file mode 100644 index 0000000..b7929b5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt @@ -0,0 +1,185 @@ +package com.casic.app.smartwell.view.fragment + +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.Constant +import com.casic.app.smartwell.utils.DialogHelper +import com.casic.app.smartwell.utils.LoadState +import com.casic.app.smartwell.view.TodoDetailActivity +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel +import com.pengxh.app.multilib.base.BaseFragment +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_over_time_un_accept.* +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference + +class UnacceptedOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 + + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this) + overtimeOderViewModel = ViewModelProvider(this).get(OvertimeOderListViewModel::class.java) + acceptOrderViewModel = ViewModelProvider(this).get(AcceptOrderViewModel::class.java) + } + + override fun initEvent() { + obtainWorkOrderList(pageIndex) + overtimeOderViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + unAcceptOrderLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + unAcceptOrderLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler!!.sendEmptyMessage(2022040601) + } + }) + + //接单状态处理 + acceptOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireContext(), "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) + //通知列表刷行数据 + UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) + } + else -> { + DialogHelper.dismissLoadingDialog() + "接单失败".show(requireContext()) + } + } + }) + + unAcceptOrderLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainWorkOrderList(pageIndex) + } + unAcceptOrderLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainWorkOrderList(pageIndex) + } + } + + private fun obtainWorkOrderList(index: Int) { + overtimeOderViewModel.obtainOvertimeOderList(jobStatus = "0", page = index) + } + + private class WeakReferenceHandler(fragment: UnacceptedOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040601) { + if (fragment.isRefresh || fragment.isLoadMore) { + fragment.overtimeOrderAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("您没有超时未处理的工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() + fragment.overtimeOrderAdapter = OvertimeOrderListAdapter( + fragment.requireContext(), + fragment.dataBeans + ) + fragment.unAcceptOrderView!!.layoutManager = + LinearLayoutManager(fragment.requireContext()) + fragment.unAcceptOrderView!!.adapter = fragment.overtimeOrderAdapter + fragment.overtimeOrderAdapter.setOnItemClickListener(object : + OvertimeOrderListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(fragment.requireContext()) + return + } + fragment.requireContext() + .navigatePageTo(TodoDetailActivity::class.java, jobId) + } + + override fun onOperationClicked(position: Int) { + //标记被点击的item位置 + fragment.clickedPosition = position + + AlertControlDialog.Builder() + .setContext(fragment.requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = + fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show(fragment.requireContext()) + return + } + fragment.acceptOrderViewModel.acceptWorkOrder(id = jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt index 9cbd4de..2f25190 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt @@ -18,7 +18,7 @@ import com.casic.app.smartwell.vm.WorkOrderListViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.app.multilib.base.BaseFragment -import kotlinx.android.synthetic.main.fragment_order_undetermined.* +import kotlinx.android.synthetic.main.fragment_order_un_determined.* import kotlinx.android.synthetic.main.include_empty_view.* import java.lang.ref.WeakReference @@ -43,7 +43,7 @@ } } - override fun initLayoutView(): Int = R.layout.fragment_order_undetermined + override fun initLayoutView(): Int = R.layout.fragment_order_un_determined override fun initData() { weakReferenceHandler = WeakReferenceHandler(this) diff --git a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt index 56a7af4..b7c87a1 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -10,13 +9,10 @@ class AuthenticateViewModel : BaseViewModel() { - private val kTag = "AuthenticateViewModel" val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading keyModel.value = RetrofitServiceManager.authenticate() - }, { - Log.d(kTag, "obtainPublicKey: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt index 3d2d37b..312d224 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class LoginOutViewModel : BaseViewModel() { - private val kTag = "LoginOutViewModel" val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() - }, { - Log.d(kTag, "loginOut: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt index 90eb8c9..03fff89 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class OrderStatusViewModel : BaseViewModel() { - private val kTag = "OrderStatusViewModel" val listModel = MutableLiveData() fun obtainOrderStatus() = launch({ listModel.value = RetrofitServiceManager.obtainOrderStatus() - }, { - Log.d(kTag, "obtainOrderStatus: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt new file mode 100644 index 0000000..a78cf59 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt @@ -0,0 +1,16 @@ +package com.casic.app.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.base.BaseViewModel +import com.casic.app.smartwell.extensions.launch +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager + +class OvertimeOderListViewModel : BaseViewModel() { + + val resultModel = MutableLiveData() + + fun obtainOvertimeOderList(jobStatus: String, page: Int) = launch({ + resultModel.value = RetrofitServiceManager.obtainOvertimeOderList(jobStatus, page) + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt index 9e29a84..18aff97 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -12,12 +11,9 @@ * */ class SubordinateViewModel : BaseViewModel() { - private val kTag = "SubordinateViewModel" val listModel = MutableLiveData() fun obtainSubordinate(hasMine: String?, roleTips: String?) = launch({ listModel.value = RetrofitServiceManager.obtainSubordinate(hasMine, roleTips) - }, { - Log.d(kTag, "obtainSubordinate: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt index cdff470..a22b719 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt @@ -1,7 +1,8 @@ package com.casic.app.smartwell.view.fragment +import android.graphics.Point +import android.location.Location import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,30 +11,46 @@ import androidx.recyclerview.widget.GridLayoutManager import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.* import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.HomeRecycleAdapter import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showRouteOnMap +import com.casic.app.smartwell.utils.Constant import com.casic.app.smartwell.view.OvertimeOrderActivity import com.casic.app.smartwell.view.WellManagementActivity import com.casic.app.smartwell.view.WellOperationActivity import com.casic.app.smartwell.vm.WellCountViewModel import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.google.gson.Gson +import com.casic.app.smartwell.widgets.GaoDeClusterMarkerView +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.include_base_title.view.* -class HomePageFragment : Fragment(), AMap.OnCameraChangeListener, AMap.OnMarkerClickListener { +class HomePageFragment : Fragment(), AMap.OnMyLocationChangeListener, AMap.OnCameraChangeListener, + AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { private lateinit var homeView: View private lateinit var wellCountViewModel: WellCountViewModel private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var wellListViewModel: WellListViewModel private lateinit var aMap: AMap - private val kTag = "HomePageFragment" + + //定位点经纬度 + private var location: LatLng? = null + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -51,8 +68,20 @@ wellListViewModel.obtainAllWell() wellListViewModel.listModel.observe(viewLifecycleOwner, { if (it.code == 200) { - val dataRows = it.data?.rows - Log.d(kTag, "onCreateView: ${Gson().toJson(dataRows)}") + it.data?.rows?.forEach { location -> + if (location.latGaode.toString().isNotBlank() + && location.lngGaode.toString().isNotBlank() + ) { + allMarkerOptions.add( + MarkerOptions().position( + LatLng( + location.latGaode!!.toDouble(), + location.lngGaode!!.toDouble() + ) + ).title(location.wellTypeName).snippet(location.wellName) + ) + } + } } }) @@ -109,27 +138,127 @@ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() + locationStyle.interval(5000) + //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER) locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 - locationStyle.interval(10 * 1000)////设置连续定位模式下的定位间隔,只在连续定位模式下生效。单位为毫秒 aMap.myLocationStyle = locationStyle aMap.isMyLocationEnabled = true - //注册地图缩放监听 + aMap.addOnMyLocationChangeListener(this) + // 地图缩放监听 aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) } - /***地图接口实现*********************************************************************************/ + override fun onMyLocationChange(p0: Location?) { + if (p0 != null) { + this.location = LatLng(p0.latitude, p0.longitude) + } + } + override fun onCameraChange(p0: CameraPosition?) { - Log.d(kTag, "onCameraChange: ") + } + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker override fun onCameraChangeFinish(p0: CameraPosition?) { -// resetMarks() - Log.d(kTag, "onCameraChangeFinish: ") + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + //在当前可观区域内 + markerOptionsInView.add(it) + } + } + // 自定义的聚合类MarkerCluster + val clustersMarkers: MutableList = ArrayList() + markerOptionsInView.forEach { + if (clustersMarkers.size == 0) { + //添加一个新的自定义marker + clustersMarkers.add(GaoDeClusterMarkerView(requireContext(), it, proj, 80))//相距多少才聚合 + } else { + var isInRange = false + //Kotlin foreach不能用break + for (view in clustersMarkers) { + //判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。 + if (view.bounds.contains(it.position)) { + view.addMarker(it) + isInRange = true + break + } + } + //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 + if (!isInRange) { + clustersMarkers.add( + GaoDeClusterMarkerView( + requireContext(), + it, proj, 80 + ) + )//相距多少才聚合 + } + } + } + // 设置聚合点的位置和icon + clustersMarkers.forEach { + it.setPositionAndIcon() + } + aMap.clear() + // 重新添加 marker + clustersMarkers.forEach { + aMap.addMarker(it.options) + } } - override fun onMarkerClick(p0: Marker?): Boolean { + override fun onMarkerClick(marker: Marker?): Boolean { + val clickedLatLng = marker?.position + if (location != null) { + //判断点击点是否是定位点 + val distance = AMapUtils.calculateLineDistance(location, clickedLatLng) + if (distance > Constant.DISTANCE) { + //显示闸井信息 + marker!!.showInfoWindow() + } else { + "该位置是定位点,请选择实际闸井点".show(requireContext()) + } + } + return true + } - return false + override fun onInfoWindowClick(p0: Marker?) { + if (p0 != null) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val latLng = p0.position + val lat = latLng.latitude.toString() + val lng = latLng.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "窨井经纬度异常,无法开启导航".show(requireContext()) + return + } + Poi(p0.snippet, LatLng(lat.toDouble(), lng.toDouble()), "").showRouteOnMap( + requireContext() + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } } /***以下是地图生命周期管理************************************************************************/ diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt index 7932e6a..3166bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt @@ -90,8 +90,11 @@ is LoadState.Success -> { DialogHelper.dismissLoadingDialog() "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) //通知列表刷行数据 - weakReferenceHandler!!.sendEmptyMessage(Constant.ORDER_TODO_OK) UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) } else -> { diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt deleted file mode 100644 index e7a664a..0000000 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.app.smartwell.view.fragment - -import com.casic.app.smartwell.R -import com.pengxh.app.multilib.base.BaseFragment - -class UnAcceptOrderFragment : BaseFragment() { - override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept - - override fun initData() { - - } - - override fun initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt index 8589260..6df8449 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt @@ -1,16 +1,146 @@ package com.casic.app.smartwell.view.fragment +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.WorkOrderListModel +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel import com.pengxh.app.multilib.base.BaseFragment +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference class UnHandleOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_handle override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(this) +// workOrderListViewModel = ViewModelProvider(this).get(WorkOrderListViewModel::class.java) +// workOrderDetailViewModel = ViewModelProvider(this).get(WorkOrderDetailViewModel::class.java) } override fun initEvent() { +// obtainWorkOrderList(pageIndex) +// workOrderListViewModel.resultModel.observe(this, { +// if (it.code == 200) { +// val dataRows = it.data?.rows +// when { +// isRefresh -> { +// dataBeans.clear() +// dataBeans = dataRows!! +// unHandleLayout.finishRefresh() +// isRefresh = false +// } +// isLoadMore -> { +// if (dataRows?.size == 0) { +// "到底了,别拉了".show(requireContext()) +// } +// dataBeans.addAll(dataRows!!) +// unHandleLayout.finishLoadMore() +// isLoadMore = false +// } +// else -> { +// dataBeans = dataRows!! +// } +// } +// weakReferenceHandler!!.sendEmptyMessage(2022040602) +// } +// }) +// +// unHandleLayout.setOnRefreshListener { +// isRefresh = true +// //刷新之后页码重置 +// pageIndex = 1 +// obtainWorkOrderList(pageIndex) +// } +// unHandleLayout.setOnLoadMoreListener { +// isLoadMore = true +// pageIndex++ +// obtainWorkOrderList(pageIndex) +// } +// +// workOrderDetailViewModel.detailModel.observe(this, { +// if (it.code == 200) { +// val orderDetail = it.data!![0] +// val orderFlow = orderDetail.flow!! +// if (orderFlow.size != 0) { +// TimeLineBottomSheet.Builder().setContext(requireContext()) +// .setFlowItems(orderFlow).build().show() +// } else { +// "抱歉,无法查到该工单的流转记录".show(requireContext()) +// } +// } +// }) + } + private fun obtainWorkOrderList(index: Int) { +// workOrderListViewModel.obtainWorkOrderListByState(jobStatus = "2", page = index) + } + + private class WeakReferenceHandler(fragment: UnHandleOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040602) { + if (fragment.isRefresh || fragment.isLoadMore) { +// fragment.inHandleAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() +// fragment.inHandleAdapter = InHandleOrderAdapter( +// fragment.requireContext(), +// fragment.dataBeans +// ) +// fragment.inHandleView!!.layoutManager = +// LinearLayoutManager(fragment.requireContext()) +// fragment.inHandleView!!.adapter = fragment.inHandleAdapter +// fragment.inHandleAdapter.setOnItemClickListener(object : +// InHandleOrderAdapter.OnItemClickListener { +// override fun onClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看详情".show(fragment.requireContext()) +// return +// } +// fragment.requireContext().navigatePageTo( +// InHandleDetailActivity::class.java, jobId +// ) +// } +// +// override fun onTransferViewClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看工单流转记录".show(fragment.requireContext()) +// return +// } +// fragment.workOrderDetailViewModel.obtainWorkOrderDetail(id = jobId) +// } +// }) + } + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt new file mode 100644 index 0000000..b7929b5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt @@ -0,0 +1,185 @@ +package com.casic.app.smartwell.view.fragment + +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.Constant +import com.casic.app.smartwell.utils.DialogHelper +import com.casic.app.smartwell.utils.LoadState +import com.casic.app.smartwell.view.TodoDetailActivity +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel +import com.pengxh.app.multilib.base.BaseFragment +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_over_time_un_accept.* +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference + +class UnacceptedOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 + + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this) + overtimeOderViewModel = ViewModelProvider(this).get(OvertimeOderListViewModel::class.java) + acceptOrderViewModel = ViewModelProvider(this).get(AcceptOrderViewModel::class.java) + } + + override fun initEvent() { + obtainWorkOrderList(pageIndex) + overtimeOderViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + unAcceptOrderLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + unAcceptOrderLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler!!.sendEmptyMessage(2022040601) + } + }) + + //接单状态处理 + acceptOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireContext(), "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) + //通知列表刷行数据 + UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) + } + else -> { + DialogHelper.dismissLoadingDialog() + "接单失败".show(requireContext()) + } + } + }) + + unAcceptOrderLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainWorkOrderList(pageIndex) + } + unAcceptOrderLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainWorkOrderList(pageIndex) + } + } + + private fun obtainWorkOrderList(index: Int) { + overtimeOderViewModel.obtainOvertimeOderList(jobStatus = "0", page = index) + } + + private class WeakReferenceHandler(fragment: UnacceptedOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040601) { + if (fragment.isRefresh || fragment.isLoadMore) { + fragment.overtimeOrderAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("您没有超时未处理的工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() + fragment.overtimeOrderAdapter = OvertimeOrderListAdapter( + fragment.requireContext(), + fragment.dataBeans + ) + fragment.unAcceptOrderView!!.layoutManager = + LinearLayoutManager(fragment.requireContext()) + fragment.unAcceptOrderView!!.adapter = fragment.overtimeOrderAdapter + fragment.overtimeOrderAdapter.setOnItemClickListener(object : + OvertimeOrderListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(fragment.requireContext()) + return + } + fragment.requireContext() + .navigatePageTo(TodoDetailActivity::class.java, jobId) + } + + override fun onOperationClicked(position: Int) { + //标记被点击的item位置 + fragment.clickedPosition = position + + AlertControlDialog.Builder() + .setContext(fragment.requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = + fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show(fragment.requireContext()) + return + } + fragment.acceptOrderViewModel.acceptWorkOrder(id = jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt index 9cbd4de..2f25190 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt @@ -18,7 +18,7 @@ import com.casic.app.smartwell.vm.WorkOrderListViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.app.multilib.base.BaseFragment -import kotlinx.android.synthetic.main.fragment_order_undetermined.* +import kotlinx.android.synthetic.main.fragment_order_un_determined.* import kotlinx.android.synthetic.main.include_empty_view.* import java.lang.ref.WeakReference @@ -43,7 +43,7 @@ } } - override fun initLayoutView(): Int = R.layout.fragment_order_undetermined + override fun initLayoutView(): Int = R.layout.fragment_order_un_determined override fun initData() { weakReferenceHandler = WeakReferenceHandler(this) diff --git a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt index 56a7af4..b7c87a1 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -10,13 +9,10 @@ class AuthenticateViewModel : BaseViewModel() { - private val kTag = "AuthenticateViewModel" val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading keyModel.value = RetrofitServiceManager.authenticate() - }, { - Log.d(kTag, "obtainPublicKey: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt index 3d2d37b..312d224 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class LoginOutViewModel : BaseViewModel() { - private val kTag = "LoginOutViewModel" val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() - }, { - Log.d(kTag, "loginOut: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt index 90eb8c9..03fff89 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class OrderStatusViewModel : BaseViewModel() { - private val kTag = "OrderStatusViewModel" val listModel = MutableLiveData() fun obtainOrderStatus() = launch({ listModel.value = RetrofitServiceManager.obtainOrderStatus() - }, { - Log.d(kTag, "obtainOrderStatus: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt new file mode 100644 index 0000000..a78cf59 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt @@ -0,0 +1,16 @@ +package com.casic.app.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.base.BaseViewModel +import com.casic.app.smartwell.extensions.launch +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager + +class OvertimeOderListViewModel : BaseViewModel() { + + val resultModel = MutableLiveData() + + fun obtainOvertimeOderList(jobStatus: String, page: Int) = launch({ + resultModel.value = RetrofitServiceManager.obtainOvertimeOderList(jobStatus, page) + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt index 9e29a84..18aff97 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -12,12 +11,9 @@ * */ class SubordinateViewModel : BaseViewModel() { - private val kTag = "SubordinateViewModel" val listModel = MutableLiveData() fun obtainSubordinate(hasMine: String?, roleTips: String?) = launch({ listModel.value = RetrofitServiceManager.obtainSubordinate(hasMine, roleTips) - }, { - Log.d(kTag, "obtainSubordinate: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt index 60389fa..c3b6b03 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt @@ -26,7 +26,5 @@ } else { Log.d(kTag, "obtainWellCountByState: 错误码===>${code}") } - }, { - Log.d(kTag, "obtainWellCountByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt index cdff470..a22b719 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt @@ -1,7 +1,8 @@ package com.casic.app.smartwell.view.fragment +import android.graphics.Point +import android.location.Location import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,30 +11,46 @@ import androidx.recyclerview.widget.GridLayoutManager import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.* import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.HomeRecycleAdapter import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showRouteOnMap +import com.casic.app.smartwell.utils.Constant import com.casic.app.smartwell.view.OvertimeOrderActivity import com.casic.app.smartwell.view.WellManagementActivity import com.casic.app.smartwell.view.WellOperationActivity import com.casic.app.smartwell.vm.WellCountViewModel import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.google.gson.Gson +import com.casic.app.smartwell.widgets.GaoDeClusterMarkerView +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.include_base_title.view.* -class HomePageFragment : Fragment(), AMap.OnCameraChangeListener, AMap.OnMarkerClickListener { +class HomePageFragment : Fragment(), AMap.OnMyLocationChangeListener, AMap.OnCameraChangeListener, + AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { private lateinit var homeView: View private lateinit var wellCountViewModel: WellCountViewModel private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var wellListViewModel: WellListViewModel private lateinit var aMap: AMap - private val kTag = "HomePageFragment" + + //定位点经纬度 + private var location: LatLng? = null + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -51,8 +68,20 @@ wellListViewModel.obtainAllWell() wellListViewModel.listModel.observe(viewLifecycleOwner, { if (it.code == 200) { - val dataRows = it.data?.rows - Log.d(kTag, "onCreateView: ${Gson().toJson(dataRows)}") + it.data?.rows?.forEach { location -> + if (location.latGaode.toString().isNotBlank() + && location.lngGaode.toString().isNotBlank() + ) { + allMarkerOptions.add( + MarkerOptions().position( + LatLng( + location.latGaode!!.toDouble(), + location.lngGaode!!.toDouble() + ) + ).title(location.wellTypeName).snippet(location.wellName) + ) + } + } } }) @@ -109,27 +138,127 @@ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() + locationStyle.interval(5000) + //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER) locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 - locationStyle.interval(10 * 1000)////设置连续定位模式下的定位间隔,只在连续定位模式下生效。单位为毫秒 aMap.myLocationStyle = locationStyle aMap.isMyLocationEnabled = true - //注册地图缩放监听 + aMap.addOnMyLocationChangeListener(this) + // 地图缩放监听 aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) } - /***地图接口实现*********************************************************************************/ + override fun onMyLocationChange(p0: Location?) { + if (p0 != null) { + this.location = LatLng(p0.latitude, p0.longitude) + } + } + override fun onCameraChange(p0: CameraPosition?) { - Log.d(kTag, "onCameraChange: ") + } + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker override fun onCameraChangeFinish(p0: CameraPosition?) { -// resetMarks() - Log.d(kTag, "onCameraChangeFinish: ") + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + //在当前可观区域内 + markerOptionsInView.add(it) + } + } + // 自定义的聚合类MarkerCluster + val clustersMarkers: MutableList = ArrayList() + markerOptionsInView.forEach { + if (clustersMarkers.size == 0) { + //添加一个新的自定义marker + clustersMarkers.add(GaoDeClusterMarkerView(requireContext(), it, proj, 80))//相距多少才聚合 + } else { + var isInRange = false + //Kotlin foreach不能用break + for (view in clustersMarkers) { + //判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。 + if (view.bounds.contains(it.position)) { + view.addMarker(it) + isInRange = true + break + } + } + //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 + if (!isInRange) { + clustersMarkers.add( + GaoDeClusterMarkerView( + requireContext(), + it, proj, 80 + ) + )//相距多少才聚合 + } + } + } + // 设置聚合点的位置和icon + clustersMarkers.forEach { + it.setPositionAndIcon() + } + aMap.clear() + // 重新添加 marker + clustersMarkers.forEach { + aMap.addMarker(it.options) + } } - override fun onMarkerClick(p0: Marker?): Boolean { + override fun onMarkerClick(marker: Marker?): Boolean { + val clickedLatLng = marker?.position + if (location != null) { + //判断点击点是否是定位点 + val distance = AMapUtils.calculateLineDistance(location, clickedLatLng) + if (distance > Constant.DISTANCE) { + //显示闸井信息 + marker!!.showInfoWindow() + } else { + "该位置是定位点,请选择实际闸井点".show(requireContext()) + } + } + return true + } - return false + override fun onInfoWindowClick(p0: Marker?) { + if (p0 != null) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val latLng = p0.position + val lat = latLng.latitude.toString() + val lng = latLng.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "窨井经纬度异常,无法开启导航".show(requireContext()) + return + } + Poi(p0.snippet, LatLng(lat.toDouble(), lng.toDouble()), "").showRouteOnMap( + requireContext() + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } } /***以下是地图生命周期管理************************************************************************/ diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt index 7932e6a..3166bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt @@ -90,8 +90,11 @@ is LoadState.Success -> { DialogHelper.dismissLoadingDialog() "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) //通知列表刷行数据 - weakReferenceHandler!!.sendEmptyMessage(Constant.ORDER_TODO_OK) UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) } else -> { diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt deleted file mode 100644 index e7a664a..0000000 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.app.smartwell.view.fragment - -import com.casic.app.smartwell.R -import com.pengxh.app.multilib.base.BaseFragment - -class UnAcceptOrderFragment : BaseFragment() { - override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept - - override fun initData() { - - } - - override fun initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt index 8589260..6df8449 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt @@ -1,16 +1,146 @@ package com.casic.app.smartwell.view.fragment +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.WorkOrderListModel +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel import com.pengxh.app.multilib.base.BaseFragment +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference class UnHandleOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_handle override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(this) +// workOrderListViewModel = ViewModelProvider(this).get(WorkOrderListViewModel::class.java) +// workOrderDetailViewModel = ViewModelProvider(this).get(WorkOrderDetailViewModel::class.java) } override fun initEvent() { +// obtainWorkOrderList(pageIndex) +// workOrderListViewModel.resultModel.observe(this, { +// if (it.code == 200) { +// val dataRows = it.data?.rows +// when { +// isRefresh -> { +// dataBeans.clear() +// dataBeans = dataRows!! +// unHandleLayout.finishRefresh() +// isRefresh = false +// } +// isLoadMore -> { +// if (dataRows?.size == 0) { +// "到底了,别拉了".show(requireContext()) +// } +// dataBeans.addAll(dataRows!!) +// unHandleLayout.finishLoadMore() +// isLoadMore = false +// } +// else -> { +// dataBeans = dataRows!! +// } +// } +// weakReferenceHandler!!.sendEmptyMessage(2022040602) +// } +// }) +// +// unHandleLayout.setOnRefreshListener { +// isRefresh = true +// //刷新之后页码重置 +// pageIndex = 1 +// obtainWorkOrderList(pageIndex) +// } +// unHandleLayout.setOnLoadMoreListener { +// isLoadMore = true +// pageIndex++ +// obtainWorkOrderList(pageIndex) +// } +// +// workOrderDetailViewModel.detailModel.observe(this, { +// if (it.code == 200) { +// val orderDetail = it.data!![0] +// val orderFlow = orderDetail.flow!! +// if (orderFlow.size != 0) { +// TimeLineBottomSheet.Builder().setContext(requireContext()) +// .setFlowItems(orderFlow).build().show() +// } else { +// "抱歉,无法查到该工单的流转记录".show(requireContext()) +// } +// } +// }) + } + private fun obtainWorkOrderList(index: Int) { +// workOrderListViewModel.obtainWorkOrderListByState(jobStatus = "2", page = index) + } + + private class WeakReferenceHandler(fragment: UnHandleOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040602) { + if (fragment.isRefresh || fragment.isLoadMore) { +// fragment.inHandleAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() +// fragment.inHandleAdapter = InHandleOrderAdapter( +// fragment.requireContext(), +// fragment.dataBeans +// ) +// fragment.inHandleView!!.layoutManager = +// LinearLayoutManager(fragment.requireContext()) +// fragment.inHandleView!!.adapter = fragment.inHandleAdapter +// fragment.inHandleAdapter.setOnItemClickListener(object : +// InHandleOrderAdapter.OnItemClickListener { +// override fun onClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看详情".show(fragment.requireContext()) +// return +// } +// fragment.requireContext().navigatePageTo( +// InHandleDetailActivity::class.java, jobId +// ) +// } +// +// override fun onTransferViewClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看工单流转记录".show(fragment.requireContext()) +// return +// } +// fragment.workOrderDetailViewModel.obtainWorkOrderDetail(id = jobId) +// } +// }) + } + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt new file mode 100644 index 0000000..b7929b5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt @@ -0,0 +1,185 @@ +package com.casic.app.smartwell.view.fragment + +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.Constant +import com.casic.app.smartwell.utils.DialogHelper +import com.casic.app.smartwell.utils.LoadState +import com.casic.app.smartwell.view.TodoDetailActivity +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel +import com.pengxh.app.multilib.base.BaseFragment +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_over_time_un_accept.* +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference + +class UnacceptedOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 + + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this) + overtimeOderViewModel = ViewModelProvider(this).get(OvertimeOderListViewModel::class.java) + acceptOrderViewModel = ViewModelProvider(this).get(AcceptOrderViewModel::class.java) + } + + override fun initEvent() { + obtainWorkOrderList(pageIndex) + overtimeOderViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + unAcceptOrderLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + unAcceptOrderLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler!!.sendEmptyMessage(2022040601) + } + }) + + //接单状态处理 + acceptOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireContext(), "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) + //通知列表刷行数据 + UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) + } + else -> { + DialogHelper.dismissLoadingDialog() + "接单失败".show(requireContext()) + } + } + }) + + unAcceptOrderLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainWorkOrderList(pageIndex) + } + unAcceptOrderLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainWorkOrderList(pageIndex) + } + } + + private fun obtainWorkOrderList(index: Int) { + overtimeOderViewModel.obtainOvertimeOderList(jobStatus = "0", page = index) + } + + private class WeakReferenceHandler(fragment: UnacceptedOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040601) { + if (fragment.isRefresh || fragment.isLoadMore) { + fragment.overtimeOrderAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("您没有超时未处理的工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() + fragment.overtimeOrderAdapter = OvertimeOrderListAdapter( + fragment.requireContext(), + fragment.dataBeans + ) + fragment.unAcceptOrderView!!.layoutManager = + LinearLayoutManager(fragment.requireContext()) + fragment.unAcceptOrderView!!.adapter = fragment.overtimeOrderAdapter + fragment.overtimeOrderAdapter.setOnItemClickListener(object : + OvertimeOrderListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(fragment.requireContext()) + return + } + fragment.requireContext() + .navigatePageTo(TodoDetailActivity::class.java, jobId) + } + + override fun onOperationClicked(position: Int) { + //标记被点击的item位置 + fragment.clickedPosition = position + + AlertControlDialog.Builder() + .setContext(fragment.requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = + fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show(fragment.requireContext()) + return + } + fragment.acceptOrderViewModel.acceptWorkOrder(id = jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt index 9cbd4de..2f25190 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt @@ -18,7 +18,7 @@ import com.casic.app.smartwell.vm.WorkOrderListViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.app.multilib.base.BaseFragment -import kotlinx.android.synthetic.main.fragment_order_undetermined.* +import kotlinx.android.synthetic.main.fragment_order_un_determined.* import kotlinx.android.synthetic.main.include_empty_view.* import java.lang.ref.WeakReference @@ -43,7 +43,7 @@ } } - override fun initLayoutView(): Int = R.layout.fragment_order_undetermined + override fun initLayoutView(): Int = R.layout.fragment_order_un_determined override fun initData() { weakReferenceHandler = WeakReferenceHandler(this) diff --git a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt index 56a7af4..b7c87a1 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -10,13 +9,10 @@ class AuthenticateViewModel : BaseViewModel() { - private val kTag = "AuthenticateViewModel" val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading keyModel.value = RetrofitServiceManager.authenticate() - }, { - Log.d(kTag, "obtainPublicKey: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt index 3d2d37b..312d224 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class LoginOutViewModel : BaseViewModel() { - private val kTag = "LoginOutViewModel" val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() - }, { - Log.d(kTag, "loginOut: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt index 90eb8c9..03fff89 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class OrderStatusViewModel : BaseViewModel() { - private val kTag = "OrderStatusViewModel" val listModel = MutableLiveData() fun obtainOrderStatus() = launch({ listModel.value = RetrofitServiceManager.obtainOrderStatus() - }, { - Log.d(kTag, "obtainOrderStatus: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt new file mode 100644 index 0000000..a78cf59 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt @@ -0,0 +1,16 @@ +package com.casic.app.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.base.BaseViewModel +import com.casic.app.smartwell.extensions.launch +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager + +class OvertimeOderListViewModel : BaseViewModel() { + + val resultModel = MutableLiveData() + + fun obtainOvertimeOderList(jobStatus: String, page: Int) = launch({ + resultModel.value = RetrofitServiceManager.obtainOvertimeOderList(jobStatus, page) + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt index 9e29a84..18aff97 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -12,12 +11,9 @@ * */ class SubordinateViewModel : BaseViewModel() { - private val kTag = "SubordinateViewModel" val listModel = MutableLiveData() fun obtainSubordinate(hasMine: String?, roleTips: String?) = launch({ listModel.value = RetrofitServiceManager.obtainSubordinate(hasMine, roleTips) - }, { - Log.d(kTag, "obtainSubordinate: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt index 60389fa..c3b6b03 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt @@ -26,7 +26,5 @@ } else { Log.d(kTag, "obtainWellCountByState: 错误码===>${code}") } - }, { - Log.d(kTag, "obtainWellCountByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt index f86d7d5..494e5b5 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class WellTypeViewModel : BaseViewModel() { - private val kTag = "WellTypeViewModel" val wellTypeModel = MutableLiveData() fun obtainWellType() = launch({ wellTypeModel.value = RetrofitServiceManager.obtainWellType() - }, { - Log.d(kTag, "obtainWellType: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt index cdff470..a22b719 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt @@ -1,7 +1,8 @@ package com.casic.app.smartwell.view.fragment +import android.graphics.Point +import android.location.Location import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,30 +11,46 @@ import androidx.recyclerview.widget.GridLayoutManager import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.* import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.HomeRecycleAdapter import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showRouteOnMap +import com.casic.app.smartwell.utils.Constant import com.casic.app.smartwell.view.OvertimeOrderActivity import com.casic.app.smartwell.view.WellManagementActivity import com.casic.app.smartwell.view.WellOperationActivity import com.casic.app.smartwell.vm.WellCountViewModel import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.google.gson.Gson +import com.casic.app.smartwell.widgets.GaoDeClusterMarkerView +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.include_base_title.view.* -class HomePageFragment : Fragment(), AMap.OnCameraChangeListener, AMap.OnMarkerClickListener { +class HomePageFragment : Fragment(), AMap.OnMyLocationChangeListener, AMap.OnCameraChangeListener, + AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { private lateinit var homeView: View private lateinit var wellCountViewModel: WellCountViewModel private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var wellListViewModel: WellListViewModel private lateinit var aMap: AMap - private val kTag = "HomePageFragment" + + //定位点经纬度 + private var location: LatLng? = null + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -51,8 +68,20 @@ wellListViewModel.obtainAllWell() wellListViewModel.listModel.observe(viewLifecycleOwner, { if (it.code == 200) { - val dataRows = it.data?.rows - Log.d(kTag, "onCreateView: ${Gson().toJson(dataRows)}") + it.data?.rows?.forEach { location -> + if (location.latGaode.toString().isNotBlank() + && location.lngGaode.toString().isNotBlank() + ) { + allMarkerOptions.add( + MarkerOptions().position( + LatLng( + location.latGaode!!.toDouble(), + location.lngGaode!!.toDouble() + ) + ).title(location.wellTypeName).snippet(location.wellName) + ) + } + } } }) @@ -109,27 +138,127 @@ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() + locationStyle.interval(5000) + //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER) locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 - locationStyle.interval(10 * 1000)////设置连续定位模式下的定位间隔,只在连续定位模式下生效。单位为毫秒 aMap.myLocationStyle = locationStyle aMap.isMyLocationEnabled = true - //注册地图缩放监听 + aMap.addOnMyLocationChangeListener(this) + // 地图缩放监听 aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) } - /***地图接口实现*********************************************************************************/ + override fun onMyLocationChange(p0: Location?) { + if (p0 != null) { + this.location = LatLng(p0.latitude, p0.longitude) + } + } + override fun onCameraChange(p0: CameraPosition?) { - Log.d(kTag, "onCameraChange: ") + } + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker override fun onCameraChangeFinish(p0: CameraPosition?) { -// resetMarks() - Log.d(kTag, "onCameraChangeFinish: ") + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + //在当前可观区域内 + markerOptionsInView.add(it) + } + } + // 自定义的聚合类MarkerCluster + val clustersMarkers: MutableList = ArrayList() + markerOptionsInView.forEach { + if (clustersMarkers.size == 0) { + //添加一个新的自定义marker + clustersMarkers.add(GaoDeClusterMarkerView(requireContext(), it, proj, 80))//相距多少才聚合 + } else { + var isInRange = false + //Kotlin foreach不能用break + for (view in clustersMarkers) { + //判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。 + if (view.bounds.contains(it.position)) { + view.addMarker(it) + isInRange = true + break + } + } + //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 + if (!isInRange) { + clustersMarkers.add( + GaoDeClusterMarkerView( + requireContext(), + it, proj, 80 + ) + )//相距多少才聚合 + } + } + } + // 设置聚合点的位置和icon + clustersMarkers.forEach { + it.setPositionAndIcon() + } + aMap.clear() + // 重新添加 marker + clustersMarkers.forEach { + aMap.addMarker(it.options) + } } - override fun onMarkerClick(p0: Marker?): Boolean { + override fun onMarkerClick(marker: Marker?): Boolean { + val clickedLatLng = marker?.position + if (location != null) { + //判断点击点是否是定位点 + val distance = AMapUtils.calculateLineDistance(location, clickedLatLng) + if (distance > Constant.DISTANCE) { + //显示闸井信息 + marker!!.showInfoWindow() + } else { + "该位置是定位点,请选择实际闸井点".show(requireContext()) + } + } + return true + } - return false + override fun onInfoWindowClick(p0: Marker?) { + if (p0 != null) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val latLng = p0.position + val lat = latLng.latitude.toString() + val lng = latLng.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "窨井经纬度异常,无法开启导航".show(requireContext()) + return + } + Poi(p0.snippet, LatLng(lat.toDouble(), lng.toDouble()), "").showRouteOnMap( + requireContext() + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } } /***以下是地图生命周期管理************************************************************************/ diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt index 7932e6a..3166bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt @@ -90,8 +90,11 @@ is LoadState.Success -> { DialogHelper.dismissLoadingDialog() "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) //通知列表刷行数据 - weakReferenceHandler!!.sendEmptyMessage(Constant.ORDER_TODO_OK) UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) } else -> { diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt deleted file mode 100644 index e7a664a..0000000 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.app.smartwell.view.fragment - -import com.casic.app.smartwell.R -import com.pengxh.app.multilib.base.BaseFragment - -class UnAcceptOrderFragment : BaseFragment() { - override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept - - override fun initData() { - - } - - override fun initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt index 8589260..6df8449 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt @@ -1,16 +1,146 @@ package com.casic.app.smartwell.view.fragment +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.WorkOrderListModel +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel import com.pengxh.app.multilib.base.BaseFragment +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference class UnHandleOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_handle override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(this) +// workOrderListViewModel = ViewModelProvider(this).get(WorkOrderListViewModel::class.java) +// workOrderDetailViewModel = ViewModelProvider(this).get(WorkOrderDetailViewModel::class.java) } override fun initEvent() { +// obtainWorkOrderList(pageIndex) +// workOrderListViewModel.resultModel.observe(this, { +// if (it.code == 200) { +// val dataRows = it.data?.rows +// when { +// isRefresh -> { +// dataBeans.clear() +// dataBeans = dataRows!! +// unHandleLayout.finishRefresh() +// isRefresh = false +// } +// isLoadMore -> { +// if (dataRows?.size == 0) { +// "到底了,别拉了".show(requireContext()) +// } +// dataBeans.addAll(dataRows!!) +// unHandleLayout.finishLoadMore() +// isLoadMore = false +// } +// else -> { +// dataBeans = dataRows!! +// } +// } +// weakReferenceHandler!!.sendEmptyMessage(2022040602) +// } +// }) +// +// unHandleLayout.setOnRefreshListener { +// isRefresh = true +// //刷新之后页码重置 +// pageIndex = 1 +// obtainWorkOrderList(pageIndex) +// } +// unHandleLayout.setOnLoadMoreListener { +// isLoadMore = true +// pageIndex++ +// obtainWorkOrderList(pageIndex) +// } +// +// workOrderDetailViewModel.detailModel.observe(this, { +// if (it.code == 200) { +// val orderDetail = it.data!![0] +// val orderFlow = orderDetail.flow!! +// if (orderFlow.size != 0) { +// TimeLineBottomSheet.Builder().setContext(requireContext()) +// .setFlowItems(orderFlow).build().show() +// } else { +// "抱歉,无法查到该工单的流转记录".show(requireContext()) +// } +// } +// }) + } + private fun obtainWorkOrderList(index: Int) { +// workOrderListViewModel.obtainWorkOrderListByState(jobStatus = "2", page = index) + } + + private class WeakReferenceHandler(fragment: UnHandleOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040602) { + if (fragment.isRefresh || fragment.isLoadMore) { +// fragment.inHandleAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() +// fragment.inHandleAdapter = InHandleOrderAdapter( +// fragment.requireContext(), +// fragment.dataBeans +// ) +// fragment.inHandleView!!.layoutManager = +// LinearLayoutManager(fragment.requireContext()) +// fragment.inHandleView!!.adapter = fragment.inHandleAdapter +// fragment.inHandleAdapter.setOnItemClickListener(object : +// InHandleOrderAdapter.OnItemClickListener { +// override fun onClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看详情".show(fragment.requireContext()) +// return +// } +// fragment.requireContext().navigatePageTo( +// InHandleDetailActivity::class.java, jobId +// ) +// } +// +// override fun onTransferViewClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看工单流转记录".show(fragment.requireContext()) +// return +// } +// fragment.workOrderDetailViewModel.obtainWorkOrderDetail(id = jobId) +// } +// }) + } + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt new file mode 100644 index 0000000..b7929b5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt @@ -0,0 +1,185 @@ +package com.casic.app.smartwell.view.fragment + +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.Constant +import com.casic.app.smartwell.utils.DialogHelper +import com.casic.app.smartwell.utils.LoadState +import com.casic.app.smartwell.view.TodoDetailActivity +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel +import com.pengxh.app.multilib.base.BaseFragment +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_over_time_un_accept.* +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference + +class UnacceptedOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 + + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this) + overtimeOderViewModel = ViewModelProvider(this).get(OvertimeOderListViewModel::class.java) + acceptOrderViewModel = ViewModelProvider(this).get(AcceptOrderViewModel::class.java) + } + + override fun initEvent() { + obtainWorkOrderList(pageIndex) + overtimeOderViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + unAcceptOrderLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + unAcceptOrderLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler!!.sendEmptyMessage(2022040601) + } + }) + + //接单状态处理 + acceptOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireContext(), "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) + //通知列表刷行数据 + UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) + } + else -> { + DialogHelper.dismissLoadingDialog() + "接单失败".show(requireContext()) + } + } + }) + + unAcceptOrderLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainWorkOrderList(pageIndex) + } + unAcceptOrderLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainWorkOrderList(pageIndex) + } + } + + private fun obtainWorkOrderList(index: Int) { + overtimeOderViewModel.obtainOvertimeOderList(jobStatus = "0", page = index) + } + + private class WeakReferenceHandler(fragment: UnacceptedOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040601) { + if (fragment.isRefresh || fragment.isLoadMore) { + fragment.overtimeOrderAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("您没有超时未处理的工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() + fragment.overtimeOrderAdapter = OvertimeOrderListAdapter( + fragment.requireContext(), + fragment.dataBeans + ) + fragment.unAcceptOrderView!!.layoutManager = + LinearLayoutManager(fragment.requireContext()) + fragment.unAcceptOrderView!!.adapter = fragment.overtimeOrderAdapter + fragment.overtimeOrderAdapter.setOnItemClickListener(object : + OvertimeOrderListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(fragment.requireContext()) + return + } + fragment.requireContext() + .navigatePageTo(TodoDetailActivity::class.java, jobId) + } + + override fun onOperationClicked(position: Int) { + //标记被点击的item位置 + fragment.clickedPosition = position + + AlertControlDialog.Builder() + .setContext(fragment.requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = + fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show(fragment.requireContext()) + return + } + fragment.acceptOrderViewModel.acceptWorkOrder(id = jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt index 9cbd4de..2f25190 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt @@ -18,7 +18,7 @@ import com.casic.app.smartwell.vm.WorkOrderListViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.app.multilib.base.BaseFragment -import kotlinx.android.synthetic.main.fragment_order_undetermined.* +import kotlinx.android.synthetic.main.fragment_order_un_determined.* import kotlinx.android.synthetic.main.include_empty_view.* import java.lang.ref.WeakReference @@ -43,7 +43,7 @@ } } - override fun initLayoutView(): Int = R.layout.fragment_order_undetermined + override fun initLayoutView(): Int = R.layout.fragment_order_un_determined override fun initData() { weakReferenceHandler = WeakReferenceHandler(this) diff --git a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt index 56a7af4..b7c87a1 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -10,13 +9,10 @@ class AuthenticateViewModel : BaseViewModel() { - private val kTag = "AuthenticateViewModel" val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading keyModel.value = RetrofitServiceManager.authenticate() - }, { - Log.d(kTag, "obtainPublicKey: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt index 3d2d37b..312d224 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class LoginOutViewModel : BaseViewModel() { - private val kTag = "LoginOutViewModel" val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() - }, { - Log.d(kTag, "loginOut: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt index 90eb8c9..03fff89 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class OrderStatusViewModel : BaseViewModel() { - private val kTag = "OrderStatusViewModel" val listModel = MutableLiveData() fun obtainOrderStatus() = launch({ listModel.value = RetrofitServiceManager.obtainOrderStatus() - }, { - Log.d(kTag, "obtainOrderStatus: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt new file mode 100644 index 0000000..a78cf59 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt @@ -0,0 +1,16 @@ +package com.casic.app.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.base.BaseViewModel +import com.casic.app.smartwell.extensions.launch +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager + +class OvertimeOderListViewModel : BaseViewModel() { + + val resultModel = MutableLiveData() + + fun obtainOvertimeOderList(jobStatus: String, page: Int) = launch({ + resultModel.value = RetrofitServiceManager.obtainOvertimeOderList(jobStatus, page) + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt index 9e29a84..18aff97 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -12,12 +11,9 @@ * */ class SubordinateViewModel : BaseViewModel() { - private val kTag = "SubordinateViewModel" val listModel = MutableLiveData() fun obtainSubordinate(hasMine: String?, roleTips: String?) = launch({ listModel.value = RetrofitServiceManager.obtainSubordinate(hasMine, roleTips) - }, { - Log.d(kTag, "obtainSubordinate: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt index 60389fa..c3b6b03 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt @@ -26,7 +26,5 @@ } else { Log.d(kTag, "obtainWellCountByState: 错误码===>${code}") } - }, { - Log.d(kTag, "obtainWellCountByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt index f86d7d5..494e5b5 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class WellTypeViewModel : BaseViewModel() { - private val kTag = "WellTypeViewModel" val wellTypeModel = MutableLiveData() fun obtainWellType() = launch({ wellTypeModel.value = RetrofitServiceManager.obtainWellType() - }, { - Log.d(kTag, "obtainWellType: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt index aa1df2c..2d8cbb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class WorkOrderListViewModel : BaseViewModel() { - private val kTag = "WorkOrderListViewModel" val resultModel = MutableLiveData() fun obtainWorkOrderListByState(jobStatus: String, page: Int) = launch({ resultModel.value = RetrofitServiceManager.obtainWorkOrderList(jobStatus, page) - }, { - Log.d(kTag, "obtainWorkOrderListByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt index cdff470..a22b719 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt @@ -1,7 +1,8 @@ package com.casic.app.smartwell.view.fragment +import android.graphics.Point +import android.location.Location import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,30 +11,46 @@ import androidx.recyclerview.widget.GridLayoutManager import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.* import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.HomeRecycleAdapter import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showRouteOnMap +import com.casic.app.smartwell.utils.Constant import com.casic.app.smartwell.view.OvertimeOrderActivity import com.casic.app.smartwell.view.WellManagementActivity import com.casic.app.smartwell.view.WellOperationActivity import com.casic.app.smartwell.vm.WellCountViewModel import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.google.gson.Gson +import com.casic.app.smartwell.widgets.GaoDeClusterMarkerView +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.include_base_title.view.* -class HomePageFragment : Fragment(), AMap.OnCameraChangeListener, AMap.OnMarkerClickListener { +class HomePageFragment : Fragment(), AMap.OnMyLocationChangeListener, AMap.OnCameraChangeListener, + AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { private lateinit var homeView: View private lateinit var wellCountViewModel: WellCountViewModel private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var wellListViewModel: WellListViewModel private lateinit var aMap: AMap - private val kTag = "HomePageFragment" + + //定位点经纬度 + private var location: LatLng? = null + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -51,8 +68,20 @@ wellListViewModel.obtainAllWell() wellListViewModel.listModel.observe(viewLifecycleOwner, { if (it.code == 200) { - val dataRows = it.data?.rows - Log.d(kTag, "onCreateView: ${Gson().toJson(dataRows)}") + it.data?.rows?.forEach { location -> + if (location.latGaode.toString().isNotBlank() + && location.lngGaode.toString().isNotBlank() + ) { + allMarkerOptions.add( + MarkerOptions().position( + LatLng( + location.latGaode!!.toDouble(), + location.lngGaode!!.toDouble() + ) + ).title(location.wellTypeName).snippet(location.wellName) + ) + } + } } }) @@ -109,27 +138,127 @@ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() + locationStyle.interval(5000) + //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER) locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 - locationStyle.interval(10 * 1000)////设置连续定位模式下的定位间隔,只在连续定位模式下生效。单位为毫秒 aMap.myLocationStyle = locationStyle aMap.isMyLocationEnabled = true - //注册地图缩放监听 + aMap.addOnMyLocationChangeListener(this) + // 地图缩放监听 aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) } - /***地图接口实现*********************************************************************************/ + override fun onMyLocationChange(p0: Location?) { + if (p0 != null) { + this.location = LatLng(p0.latitude, p0.longitude) + } + } + override fun onCameraChange(p0: CameraPosition?) { - Log.d(kTag, "onCameraChange: ") + } + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker override fun onCameraChangeFinish(p0: CameraPosition?) { -// resetMarks() - Log.d(kTag, "onCameraChangeFinish: ") + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + //在当前可观区域内 + markerOptionsInView.add(it) + } + } + // 自定义的聚合类MarkerCluster + val clustersMarkers: MutableList = ArrayList() + markerOptionsInView.forEach { + if (clustersMarkers.size == 0) { + //添加一个新的自定义marker + clustersMarkers.add(GaoDeClusterMarkerView(requireContext(), it, proj, 80))//相距多少才聚合 + } else { + var isInRange = false + //Kotlin foreach不能用break + for (view in clustersMarkers) { + //判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。 + if (view.bounds.contains(it.position)) { + view.addMarker(it) + isInRange = true + break + } + } + //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 + if (!isInRange) { + clustersMarkers.add( + GaoDeClusterMarkerView( + requireContext(), + it, proj, 80 + ) + )//相距多少才聚合 + } + } + } + // 设置聚合点的位置和icon + clustersMarkers.forEach { + it.setPositionAndIcon() + } + aMap.clear() + // 重新添加 marker + clustersMarkers.forEach { + aMap.addMarker(it.options) + } } - override fun onMarkerClick(p0: Marker?): Boolean { + override fun onMarkerClick(marker: Marker?): Boolean { + val clickedLatLng = marker?.position + if (location != null) { + //判断点击点是否是定位点 + val distance = AMapUtils.calculateLineDistance(location, clickedLatLng) + if (distance > Constant.DISTANCE) { + //显示闸井信息 + marker!!.showInfoWindow() + } else { + "该位置是定位点,请选择实际闸井点".show(requireContext()) + } + } + return true + } - return false + override fun onInfoWindowClick(p0: Marker?) { + if (p0 != null) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val latLng = p0.position + val lat = latLng.latitude.toString() + val lng = latLng.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "窨井经纬度异常,无法开启导航".show(requireContext()) + return + } + Poi(p0.snippet, LatLng(lat.toDouble(), lng.toDouble()), "").showRouteOnMap( + requireContext() + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } } /***以下是地图生命周期管理************************************************************************/ diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt index 7932e6a..3166bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt @@ -90,8 +90,11 @@ is LoadState.Success -> { DialogHelper.dismissLoadingDialog() "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) //通知列表刷行数据 - weakReferenceHandler!!.sendEmptyMessage(Constant.ORDER_TODO_OK) UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) } else -> { diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt deleted file mode 100644 index e7a664a..0000000 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.app.smartwell.view.fragment - -import com.casic.app.smartwell.R -import com.pengxh.app.multilib.base.BaseFragment - -class UnAcceptOrderFragment : BaseFragment() { - override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept - - override fun initData() { - - } - - override fun initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt index 8589260..6df8449 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt @@ -1,16 +1,146 @@ package com.casic.app.smartwell.view.fragment +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.WorkOrderListModel +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel import com.pengxh.app.multilib.base.BaseFragment +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference class UnHandleOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_handle override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(this) +// workOrderListViewModel = ViewModelProvider(this).get(WorkOrderListViewModel::class.java) +// workOrderDetailViewModel = ViewModelProvider(this).get(WorkOrderDetailViewModel::class.java) } override fun initEvent() { +// obtainWorkOrderList(pageIndex) +// workOrderListViewModel.resultModel.observe(this, { +// if (it.code == 200) { +// val dataRows = it.data?.rows +// when { +// isRefresh -> { +// dataBeans.clear() +// dataBeans = dataRows!! +// unHandleLayout.finishRefresh() +// isRefresh = false +// } +// isLoadMore -> { +// if (dataRows?.size == 0) { +// "到底了,别拉了".show(requireContext()) +// } +// dataBeans.addAll(dataRows!!) +// unHandleLayout.finishLoadMore() +// isLoadMore = false +// } +// else -> { +// dataBeans = dataRows!! +// } +// } +// weakReferenceHandler!!.sendEmptyMessage(2022040602) +// } +// }) +// +// unHandleLayout.setOnRefreshListener { +// isRefresh = true +// //刷新之后页码重置 +// pageIndex = 1 +// obtainWorkOrderList(pageIndex) +// } +// unHandleLayout.setOnLoadMoreListener { +// isLoadMore = true +// pageIndex++ +// obtainWorkOrderList(pageIndex) +// } +// +// workOrderDetailViewModel.detailModel.observe(this, { +// if (it.code == 200) { +// val orderDetail = it.data!![0] +// val orderFlow = orderDetail.flow!! +// if (orderFlow.size != 0) { +// TimeLineBottomSheet.Builder().setContext(requireContext()) +// .setFlowItems(orderFlow).build().show() +// } else { +// "抱歉,无法查到该工单的流转记录".show(requireContext()) +// } +// } +// }) + } + private fun obtainWorkOrderList(index: Int) { +// workOrderListViewModel.obtainWorkOrderListByState(jobStatus = "2", page = index) + } + + private class WeakReferenceHandler(fragment: UnHandleOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040602) { + if (fragment.isRefresh || fragment.isLoadMore) { +// fragment.inHandleAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() +// fragment.inHandleAdapter = InHandleOrderAdapter( +// fragment.requireContext(), +// fragment.dataBeans +// ) +// fragment.inHandleView!!.layoutManager = +// LinearLayoutManager(fragment.requireContext()) +// fragment.inHandleView!!.adapter = fragment.inHandleAdapter +// fragment.inHandleAdapter.setOnItemClickListener(object : +// InHandleOrderAdapter.OnItemClickListener { +// override fun onClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看详情".show(fragment.requireContext()) +// return +// } +// fragment.requireContext().navigatePageTo( +// InHandleDetailActivity::class.java, jobId +// ) +// } +// +// override fun onTransferViewClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看工单流转记录".show(fragment.requireContext()) +// return +// } +// fragment.workOrderDetailViewModel.obtainWorkOrderDetail(id = jobId) +// } +// }) + } + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt new file mode 100644 index 0000000..b7929b5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt @@ -0,0 +1,185 @@ +package com.casic.app.smartwell.view.fragment + +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.Constant +import com.casic.app.smartwell.utils.DialogHelper +import com.casic.app.smartwell.utils.LoadState +import com.casic.app.smartwell.view.TodoDetailActivity +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel +import com.pengxh.app.multilib.base.BaseFragment +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_over_time_un_accept.* +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference + +class UnacceptedOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 + + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this) + overtimeOderViewModel = ViewModelProvider(this).get(OvertimeOderListViewModel::class.java) + acceptOrderViewModel = ViewModelProvider(this).get(AcceptOrderViewModel::class.java) + } + + override fun initEvent() { + obtainWorkOrderList(pageIndex) + overtimeOderViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + unAcceptOrderLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + unAcceptOrderLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler!!.sendEmptyMessage(2022040601) + } + }) + + //接单状态处理 + acceptOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireContext(), "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) + //通知列表刷行数据 + UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) + } + else -> { + DialogHelper.dismissLoadingDialog() + "接单失败".show(requireContext()) + } + } + }) + + unAcceptOrderLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainWorkOrderList(pageIndex) + } + unAcceptOrderLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainWorkOrderList(pageIndex) + } + } + + private fun obtainWorkOrderList(index: Int) { + overtimeOderViewModel.obtainOvertimeOderList(jobStatus = "0", page = index) + } + + private class WeakReferenceHandler(fragment: UnacceptedOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040601) { + if (fragment.isRefresh || fragment.isLoadMore) { + fragment.overtimeOrderAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("您没有超时未处理的工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() + fragment.overtimeOrderAdapter = OvertimeOrderListAdapter( + fragment.requireContext(), + fragment.dataBeans + ) + fragment.unAcceptOrderView!!.layoutManager = + LinearLayoutManager(fragment.requireContext()) + fragment.unAcceptOrderView!!.adapter = fragment.overtimeOrderAdapter + fragment.overtimeOrderAdapter.setOnItemClickListener(object : + OvertimeOrderListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(fragment.requireContext()) + return + } + fragment.requireContext() + .navigatePageTo(TodoDetailActivity::class.java, jobId) + } + + override fun onOperationClicked(position: Int) { + //标记被点击的item位置 + fragment.clickedPosition = position + + AlertControlDialog.Builder() + .setContext(fragment.requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = + fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show(fragment.requireContext()) + return + } + fragment.acceptOrderViewModel.acceptWorkOrder(id = jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt index 9cbd4de..2f25190 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt @@ -18,7 +18,7 @@ import com.casic.app.smartwell.vm.WorkOrderListViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.app.multilib.base.BaseFragment -import kotlinx.android.synthetic.main.fragment_order_undetermined.* +import kotlinx.android.synthetic.main.fragment_order_un_determined.* import kotlinx.android.synthetic.main.include_empty_view.* import java.lang.ref.WeakReference @@ -43,7 +43,7 @@ } } - override fun initLayoutView(): Int = R.layout.fragment_order_undetermined + override fun initLayoutView(): Int = R.layout.fragment_order_un_determined override fun initData() { weakReferenceHandler = WeakReferenceHandler(this) diff --git a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt index 56a7af4..b7c87a1 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -10,13 +9,10 @@ class AuthenticateViewModel : BaseViewModel() { - private val kTag = "AuthenticateViewModel" val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading keyModel.value = RetrofitServiceManager.authenticate() - }, { - Log.d(kTag, "obtainPublicKey: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt index 3d2d37b..312d224 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class LoginOutViewModel : BaseViewModel() { - private val kTag = "LoginOutViewModel" val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() - }, { - Log.d(kTag, "loginOut: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt index 90eb8c9..03fff89 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class OrderStatusViewModel : BaseViewModel() { - private val kTag = "OrderStatusViewModel" val listModel = MutableLiveData() fun obtainOrderStatus() = launch({ listModel.value = RetrofitServiceManager.obtainOrderStatus() - }, { - Log.d(kTag, "obtainOrderStatus: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt new file mode 100644 index 0000000..a78cf59 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt @@ -0,0 +1,16 @@ +package com.casic.app.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.base.BaseViewModel +import com.casic.app.smartwell.extensions.launch +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager + +class OvertimeOderListViewModel : BaseViewModel() { + + val resultModel = MutableLiveData() + + fun obtainOvertimeOderList(jobStatus: String, page: Int) = launch({ + resultModel.value = RetrofitServiceManager.obtainOvertimeOderList(jobStatus, page) + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt index 9e29a84..18aff97 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -12,12 +11,9 @@ * */ class SubordinateViewModel : BaseViewModel() { - private val kTag = "SubordinateViewModel" val listModel = MutableLiveData() fun obtainSubordinate(hasMine: String?, roleTips: String?) = launch({ listModel.value = RetrofitServiceManager.obtainSubordinate(hasMine, roleTips) - }, { - Log.d(kTag, "obtainSubordinate: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt index 60389fa..c3b6b03 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt @@ -26,7 +26,5 @@ } else { Log.d(kTag, "obtainWellCountByState: 错误码===>${code}") } - }, { - Log.d(kTag, "obtainWellCountByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt index f86d7d5..494e5b5 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class WellTypeViewModel : BaseViewModel() { - private val kTag = "WellTypeViewModel" val wellTypeModel = MutableLiveData() fun obtainWellType() = launch({ wellTypeModel.value = RetrofitServiceManager.obtainWellType() - }, { - Log.d(kTag, "obtainWellType: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt index aa1df2c..2d8cbb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class WorkOrderListViewModel : BaseViewModel() { - private val kTag = "WorkOrderListViewModel" val resultModel = MutableLiveData() fun obtainWorkOrderListByState(jobStatus: String, page: Int) = launch({ resultModel.value = RetrofitServiceManager.obtainWorkOrderList(jobStatus, page) - }, { - Log.d(kTag, "obtainWorkOrderListByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt index a9ea8d3..7f0f016 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt @@ -27,7 +27,5 @@ } else { Log.d(kTag, "obtainWorkOrderCountByState: 错误码===>${code}") } - }, { - Log.d(kTag, "obtainWorkOrderCountByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt index cdff470..a22b719 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt @@ -1,7 +1,8 @@ package com.casic.app.smartwell.view.fragment +import android.graphics.Point +import android.location.Location import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,30 +11,46 @@ import androidx.recyclerview.widget.GridLayoutManager import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.* import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.HomeRecycleAdapter import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showRouteOnMap +import com.casic.app.smartwell.utils.Constant import com.casic.app.smartwell.view.OvertimeOrderActivity import com.casic.app.smartwell.view.WellManagementActivity import com.casic.app.smartwell.view.WellOperationActivity import com.casic.app.smartwell.vm.WellCountViewModel import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.google.gson.Gson +import com.casic.app.smartwell.widgets.GaoDeClusterMarkerView +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.include_base_title.view.* -class HomePageFragment : Fragment(), AMap.OnCameraChangeListener, AMap.OnMarkerClickListener { +class HomePageFragment : Fragment(), AMap.OnMyLocationChangeListener, AMap.OnCameraChangeListener, + AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { private lateinit var homeView: View private lateinit var wellCountViewModel: WellCountViewModel private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var wellListViewModel: WellListViewModel private lateinit var aMap: AMap - private val kTag = "HomePageFragment" + + //定位点经纬度 + private var location: LatLng? = null + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -51,8 +68,20 @@ wellListViewModel.obtainAllWell() wellListViewModel.listModel.observe(viewLifecycleOwner, { if (it.code == 200) { - val dataRows = it.data?.rows - Log.d(kTag, "onCreateView: ${Gson().toJson(dataRows)}") + it.data?.rows?.forEach { location -> + if (location.latGaode.toString().isNotBlank() + && location.lngGaode.toString().isNotBlank() + ) { + allMarkerOptions.add( + MarkerOptions().position( + LatLng( + location.latGaode!!.toDouble(), + location.lngGaode!!.toDouble() + ) + ).title(location.wellTypeName).snippet(location.wellName) + ) + } + } } }) @@ -109,27 +138,127 @@ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() + locationStyle.interval(5000) + //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER) locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 - locationStyle.interval(10 * 1000)////设置连续定位模式下的定位间隔,只在连续定位模式下生效。单位为毫秒 aMap.myLocationStyle = locationStyle aMap.isMyLocationEnabled = true - //注册地图缩放监听 + aMap.addOnMyLocationChangeListener(this) + // 地图缩放监听 aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) } - /***地图接口实现*********************************************************************************/ + override fun onMyLocationChange(p0: Location?) { + if (p0 != null) { + this.location = LatLng(p0.latitude, p0.longitude) + } + } + override fun onCameraChange(p0: CameraPosition?) { - Log.d(kTag, "onCameraChange: ") + } + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker override fun onCameraChangeFinish(p0: CameraPosition?) { -// resetMarks() - Log.d(kTag, "onCameraChangeFinish: ") + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + //在当前可观区域内 + markerOptionsInView.add(it) + } + } + // 自定义的聚合类MarkerCluster + val clustersMarkers: MutableList = ArrayList() + markerOptionsInView.forEach { + if (clustersMarkers.size == 0) { + //添加一个新的自定义marker + clustersMarkers.add(GaoDeClusterMarkerView(requireContext(), it, proj, 80))//相距多少才聚合 + } else { + var isInRange = false + //Kotlin foreach不能用break + for (view in clustersMarkers) { + //判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。 + if (view.bounds.contains(it.position)) { + view.addMarker(it) + isInRange = true + break + } + } + //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 + if (!isInRange) { + clustersMarkers.add( + GaoDeClusterMarkerView( + requireContext(), + it, proj, 80 + ) + )//相距多少才聚合 + } + } + } + // 设置聚合点的位置和icon + clustersMarkers.forEach { + it.setPositionAndIcon() + } + aMap.clear() + // 重新添加 marker + clustersMarkers.forEach { + aMap.addMarker(it.options) + } } - override fun onMarkerClick(p0: Marker?): Boolean { + override fun onMarkerClick(marker: Marker?): Boolean { + val clickedLatLng = marker?.position + if (location != null) { + //判断点击点是否是定位点 + val distance = AMapUtils.calculateLineDistance(location, clickedLatLng) + if (distance > Constant.DISTANCE) { + //显示闸井信息 + marker!!.showInfoWindow() + } else { + "该位置是定位点,请选择实际闸井点".show(requireContext()) + } + } + return true + } - return false + override fun onInfoWindowClick(p0: Marker?) { + if (p0 != null) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val latLng = p0.position + val lat = latLng.latitude.toString() + val lng = latLng.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "窨井经纬度异常,无法开启导航".show(requireContext()) + return + } + Poi(p0.snippet, LatLng(lat.toDouble(), lng.toDouble()), "").showRouteOnMap( + requireContext() + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } } /***以下是地图生命周期管理************************************************************************/ diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt index 7932e6a..3166bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt @@ -90,8 +90,11 @@ is LoadState.Success -> { DialogHelper.dismissLoadingDialog() "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) //通知列表刷行数据 - weakReferenceHandler!!.sendEmptyMessage(Constant.ORDER_TODO_OK) UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) } else -> { diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt deleted file mode 100644 index e7a664a..0000000 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.app.smartwell.view.fragment - -import com.casic.app.smartwell.R -import com.pengxh.app.multilib.base.BaseFragment - -class UnAcceptOrderFragment : BaseFragment() { - override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept - - override fun initData() { - - } - - override fun initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt index 8589260..6df8449 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt @@ -1,16 +1,146 @@ package com.casic.app.smartwell.view.fragment +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.WorkOrderListModel +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel import com.pengxh.app.multilib.base.BaseFragment +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference class UnHandleOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_handle override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(this) +// workOrderListViewModel = ViewModelProvider(this).get(WorkOrderListViewModel::class.java) +// workOrderDetailViewModel = ViewModelProvider(this).get(WorkOrderDetailViewModel::class.java) } override fun initEvent() { +// obtainWorkOrderList(pageIndex) +// workOrderListViewModel.resultModel.observe(this, { +// if (it.code == 200) { +// val dataRows = it.data?.rows +// when { +// isRefresh -> { +// dataBeans.clear() +// dataBeans = dataRows!! +// unHandleLayout.finishRefresh() +// isRefresh = false +// } +// isLoadMore -> { +// if (dataRows?.size == 0) { +// "到底了,别拉了".show(requireContext()) +// } +// dataBeans.addAll(dataRows!!) +// unHandleLayout.finishLoadMore() +// isLoadMore = false +// } +// else -> { +// dataBeans = dataRows!! +// } +// } +// weakReferenceHandler!!.sendEmptyMessage(2022040602) +// } +// }) +// +// unHandleLayout.setOnRefreshListener { +// isRefresh = true +// //刷新之后页码重置 +// pageIndex = 1 +// obtainWorkOrderList(pageIndex) +// } +// unHandleLayout.setOnLoadMoreListener { +// isLoadMore = true +// pageIndex++ +// obtainWorkOrderList(pageIndex) +// } +// +// workOrderDetailViewModel.detailModel.observe(this, { +// if (it.code == 200) { +// val orderDetail = it.data!![0] +// val orderFlow = orderDetail.flow!! +// if (orderFlow.size != 0) { +// TimeLineBottomSheet.Builder().setContext(requireContext()) +// .setFlowItems(orderFlow).build().show() +// } else { +// "抱歉,无法查到该工单的流转记录".show(requireContext()) +// } +// } +// }) + } + private fun obtainWorkOrderList(index: Int) { +// workOrderListViewModel.obtainWorkOrderListByState(jobStatus = "2", page = index) + } + + private class WeakReferenceHandler(fragment: UnHandleOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040602) { + if (fragment.isRefresh || fragment.isLoadMore) { +// fragment.inHandleAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() +// fragment.inHandleAdapter = InHandleOrderAdapter( +// fragment.requireContext(), +// fragment.dataBeans +// ) +// fragment.inHandleView!!.layoutManager = +// LinearLayoutManager(fragment.requireContext()) +// fragment.inHandleView!!.adapter = fragment.inHandleAdapter +// fragment.inHandleAdapter.setOnItemClickListener(object : +// InHandleOrderAdapter.OnItemClickListener { +// override fun onClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看详情".show(fragment.requireContext()) +// return +// } +// fragment.requireContext().navigatePageTo( +// InHandleDetailActivity::class.java, jobId +// ) +// } +// +// override fun onTransferViewClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看工单流转记录".show(fragment.requireContext()) +// return +// } +// fragment.workOrderDetailViewModel.obtainWorkOrderDetail(id = jobId) +// } +// }) + } + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt new file mode 100644 index 0000000..b7929b5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt @@ -0,0 +1,185 @@ +package com.casic.app.smartwell.view.fragment + +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.Constant +import com.casic.app.smartwell.utils.DialogHelper +import com.casic.app.smartwell.utils.LoadState +import com.casic.app.smartwell.view.TodoDetailActivity +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel +import com.pengxh.app.multilib.base.BaseFragment +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_over_time_un_accept.* +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference + +class UnacceptedOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 + + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this) + overtimeOderViewModel = ViewModelProvider(this).get(OvertimeOderListViewModel::class.java) + acceptOrderViewModel = ViewModelProvider(this).get(AcceptOrderViewModel::class.java) + } + + override fun initEvent() { + obtainWorkOrderList(pageIndex) + overtimeOderViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + unAcceptOrderLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + unAcceptOrderLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler!!.sendEmptyMessage(2022040601) + } + }) + + //接单状态处理 + acceptOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireContext(), "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) + //通知列表刷行数据 + UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) + } + else -> { + DialogHelper.dismissLoadingDialog() + "接单失败".show(requireContext()) + } + } + }) + + unAcceptOrderLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainWorkOrderList(pageIndex) + } + unAcceptOrderLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainWorkOrderList(pageIndex) + } + } + + private fun obtainWorkOrderList(index: Int) { + overtimeOderViewModel.obtainOvertimeOderList(jobStatus = "0", page = index) + } + + private class WeakReferenceHandler(fragment: UnacceptedOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040601) { + if (fragment.isRefresh || fragment.isLoadMore) { + fragment.overtimeOrderAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("您没有超时未处理的工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() + fragment.overtimeOrderAdapter = OvertimeOrderListAdapter( + fragment.requireContext(), + fragment.dataBeans + ) + fragment.unAcceptOrderView!!.layoutManager = + LinearLayoutManager(fragment.requireContext()) + fragment.unAcceptOrderView!!.adapter = fragment.overtimeOrderAdapter + fragment.overtimeOrderAdapter.setOnItemClickListener(object : + OvertimeOrderListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(fragment.requireContext()) + return + } + fragment.requireContext() + .navigatePageTo(TodoDetailActivity::class.java, jobId) + } + + override fun onOperationClicked(position: Int) { + //标记被点击的item位置 + fragment.clickedPosition = position + + AlertControlDialog.Builder() + .setContext(fragment.requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = + fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show(fragment.requireContext()) + return + } + fragment.acceptOrderViewModel.acceptWorkOrder(id = jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt index 9cbd4de..2f25190 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt @@ -18,7 +18,7 @@ import com.casic.app.smartwell.vm.WorkOrderListViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.app.multilib.base.BaseFragment -import kotlinx.android.synthetic.main.fragment_order_undetermined.* +import kotlinx.android.synthetic.main.fragment_order_un_determined.* import kotlinx.android.synthetic.main.include_empty_view.* import java.lang.ref.WeakReference @@ -43,7 +43,7 @@ } } - override fun initLayoutView(): Int = R.layout.fragment_order_undetermined + override fun initLayoutView(): Int = R.layout.fragment_order_un_determined override fun initData() { weakReferenceHandler = WeakReferenceHandler(this) diff --git a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt index 56a7af4..b7c87a1 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -10,13 +9,10 @@ class AuthenticateViewModel : BaseViewModel() { - private val kTag = "AuthenticateViewModel" val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading keyModel.value = RetrofitServiceManager.authenticate() - }, { - Log.d(kTag, "obtainPublicKey: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt index 3d2d37b..312d224 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class LoginOutViewModel : BaseViewModel() { - private val kTag = "LoginOutViewModel" val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() - }, { - Log.d(kTag, "loginOut: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt index 90eb8c9..03fff89 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class OrderStatusViewModel : BaseViewModel() { - private val kTag = "OrderStatusViewModel" val listModel = MutableLiveData() fun obtainOrderStatus() = launch({ listModel.value = RetrofitServiceManager.obtainOrderStatus() - }, { - Log.d(kTag, "obtainOrderStatus: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt new file mode 100644 index 0000000..a78cf59 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt @@ -0,0 +1,16 @@ +package com.casic.app.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.base.BaseViewModel +import com.casic.app.smartwell.extensions.launch +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager + +class OvertimeOderListViewModel : BaseViewModel() { + + val resultModel = MutableLiveData() + + fun obtainOvertimeOderList(jobStatus: String, page: Int) = launch({ + resultModel.value = RetrofitServiceManager.obtainOvertimeOderList(jobStatus, page) + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt index 9e29a84..18aff97 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -12,12 +11,9 @@ * */ class SubordinateViewModel : BaseViewModel() { - private val kTag = "SubordinateViewModel" val listModel = MutableLiveData() fun obtainSubordinate(hasMine: String?, roleTips: String?) = launch({ listModel.value = RetrofitServiceManager.obtainSubordinate(hasMine, roleTips) - }, { - Log.d(kTag, "obtainSubordinate: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt index 60389fa..c3b6b03 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt @@ -26,7 +26,5 @@ } else { Log.d(kTag, "obtainWellCountByState: 错误码===>${code}") } - }, { - Log.d(kTag, "obtainWellCountByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt index f86d7d5..494e5b5 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class WellTypeViewModel : BaseViewModel() { - private val kTag = "WellTypeViewModel" val wellTypeModel = MutableLiveData() fun obtainWellType() = launch({ wellTypeModel.value = RetrofitServiceManager.obtainWellType() - }, { - Log.d(kTag, "obtainWellType: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt index aa1df2c..2d8cbb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class WorkOrderListViewModel : BaseViewModel() { - private val kTag = "WorkOrderListViewModel" val resultModel = MutableLiveData() fun obtainWorkOrderListByState(jobStatus: String, page: Int) = launch({ resultModel.value = RetrofitServiceManager.obtainWorkOrderList(jobStatus, page) - }, { - Log.d(kTag, "obtainWorkOrderListByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt index a9ea8d3..7f0f016 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt @@ -27,7 +27,5 @@ } else { Log.d(kTag, "obtainWorkOrderCountByState: 错误码===>${code}") } - }, { - Log.d(kTag, "obtainWorkOrderCountByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt b/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt new file mode 100644 index 0000000..94980f1 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt @@ -0,0 +1,104 @@ +package com.casic.app.smartwell.widgets + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Point +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import com.amap.api.maps.Projection +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.LatLngBounds +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.extensions.toBitmap +import java.util.* + +class GaoDeClusterMarkerView( + private val context: Context, firstMarkers: MarkerOptions, + projection: Projection, gridSize: Int +) { + //当前可观区域里的 聚合过之后的集合 + private val includeMarkers: ArrayList + + // 创建区域 + val bounds: LatLngBounds + var options: MarkerOptions = MarkerOptions() + + init { + val screenLocation = projection.toScreenLocation(firstMarkers.position) + //范围类 + val southwestPoint = Point(screenLocation.x - gridSize, screenLocation.y + gridSize) + //范围类 + val northeastPoint = Point(screenLocation.x + gridSize, screenLocation.y - gridSize) + bounds = LatLngBounds( + projection.fromScreenLocation(southwestPoint), + projection.fromScreenLocation(northeastPoint) + ) + //设置初始化marker属性 + options.anchor(0.5f, 0.5f) + .title(firstMarkers.title) + .position(firstMarkers.position) + .icon(firstMarkers.icon) + .snippet(firstMarkers.snippet) + .draggable(false) + includeMarkers = ArrayList() + includeMarkers.add(firstMarkers) + } + + /** + * 添加marker + */ + fun addMarker(markerOptions: MarkerOptions) { + includeMarkers.add(markerOptions) // 添加到列表中 + } + + /** + * 设置聚合点的中心位置以及图标 + */ + fun setPositionAndIcon() { + val size = includeMarkers.size + var lat = 0.0 + var lng = 0.0 + // 一个的时候 + if (size == 1) { //设置marker单个属性 + // 设置marker位置 + options.position( + LatLng( + includeMarkers[0].position.latitude, + includeMarkers[0].position.longitude + ) + ) + } else { // 聚合的时候 + //设置marker聚合属性 + for (op in includeMarkers) { + lat += op.position.latitude + lng += op.position.longitude + } + // 设置marker的位置为中心位置为聚集点的平均位置 + options.position(LatLng(lat / size, lng / size)) + } + options.icon(BitmapDescriptorFactory.fromBitmap(getBitmap(size))) + } + + /** + * marker视图 + */ + @SuppressLint("SetTextI18n") + private fun getBitmap(num: Int): Bitmap? { + val view = LayoutInflater.from(context).inflate(R.layout.marker_gaode, null) + val wellCountView = view.findViewById(R.id.wellCountView) + return if (num > 1) { + wellCountView.visibility = View.VISIBLE + wellCountView.text = "${num}个" + wellCountView.gravity = Gravity.CENTER + view.toBitmap() + } else { + wellCountView.visibility = View.GONE + BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt index cdff470..a22b719 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt @@ -1,7 +1,8 @@ package com.casic.app.smartwell.view.fragment +import android.graphics.Point +import android.location.Location import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,30 +11,46 @@ import androidx.recyclerview.widget.GridLayoutManager import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.* import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.HomeRecycleAdapter import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showRouteOnMap +import com.casic.app.smartwell.utils.Constant import com.casic.app.smartwell.view.OvertimeOrderActivity import com.casic.app.smartwell.view.WellManagementActivity import com.casic.app.smartwell.view.WellOperationActivity import com.casic.app.smartwell.vm.WellCountViewModel import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.google.gson.Gson +import com.casic.app.smartwell.widgets.GaoDeClusterMarkerView +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.include_base_title.view.* -class HomePageFragment : Fragment(), AMap.OnCameraChangeListener, AMap.OnMarkerClickListener { +class HomePageFragment : Fragment(), AMap.OnMyLocationChangeListener, AMap.OnCameraChangeListener, + AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { private lateinit var homeView: View private lateinit var wellCountViewModel: WellCountViewModel private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var wellListViewModel: WellListViewModel private lateinit var aMap: AMap - private val kTag = "HomePageFragment" + + //定位点经纬度 + private var location: LatLng? = null + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -51,8 +68,20 @@ wellListViewModel.obtainAllWell() wellListViewModel.listModel.observe(viewLifecycleOwner, { if (it.code == 200) { - val dataRows = it.data?.rows - Log.d(kTag, "onCreateView: ${Gson().toJson(dataRows)}") + it.data?.rows?.forEach { location -> + if (location.latGaode.toString().isNotBlank() + && location.lngGaode.toString().isNotBlank() + ) { + allMarkerOptions.add( + MarkerOptions().position( + LatLng( + location.latGaode!!.toDouble(), + location.lngGaode!!.toDouble() + ) + ).title(location.wellTypeName).snippet(location.wellName) + ) + } + } } }) @@ -109,27 +138,127 @@ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() + locationStyle.interval(5000) + //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER) locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 - locationStyle.interval(10 * 1000)////设置连续定位模式下的定位间隔,只在连续定位模式下生效。单位为毫秒 aMap.myLocationStyle = locationStyle aMap.isMyLocationEnabled = true - //注册地图缩放监听 + aMap.addOnMyLocationChangeListener(this) + // 地图缩放监听 aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) } - /***地图接口实现*********************************************************************************/ + override fun onMyLocationChange(p0: Location?) { + if (p0 != null) { + this.location = LatLng(p0.latitude, p0.longitude) + } + } + override fun onCameraChange(p0: CameraPosition?) { - Log.d(kTag, "onCameraChange: ") + } + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker override fun onCameraChangeFinish(p0: CameraPosition?) { -// resetMarks() - Log.d(kTag, "onCameraChangeFinish: ") + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + //在当前可观区域内 + markerOptionsInView.add(it) + } + } + // 自定义的聚合类MarkerCluster + val clustersMarkers: MutableList = ArrayList() + markerOptionsInView.forEach { + if (clustersMarkers.size == 0) { + //添加一个新的自定义marker + clustersMarkers.add(GaoDeClusterMarkerView(requireContext(), it, proj, 80))//相距多少才聚合 + } else { + var isInRange = false + //Kotlin foreach不能用break + for (view in clustersMarkers) { + //判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。 + if (view.bounds.contains(it.position)) { + view.addMarker(it) + isInRange = true + break + } + } + //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 + if (!isInRange) { + clustersMarkers.add( + GaoDeClusterMarkerView( + requireContext(), + it, proj, 80 + ) + )//相距多少才聚合 + } + } + } + // 设置聚合点的位置和icon + clustersMarkers.forEach { + it.setPositionAndIcon() + } + aMap.clear() + // 重新添加 marker + clustersMarkers.forEach { + aMap.addMarker(it.options) + } } - override fun onMarkerClick(p0: Marker?): Boolean { + override fun onMarkerClick(marker: Marker?): Boolean { + val clickedLatLng = marker?.position + if (location != null) { + //判断点击点是否是定位点 + val distance = AMapUtils.calculateLineDistance(location, clickedLatLng) + if (distance > Constant.DISTANCE) { + //显示闸井信息 + marker!!.showInfoWindow() + } else { + "该位置是定位点,请选择实际闸井点".show(requireContext()) + } + } + return true + } - return false + override fun onInfoWindowClick(p0: Marker?) { + if (p0 != null) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val latLng = p0.position + val lat = latLng.latitude.toString() + val lng = latLng.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "窨井经纬度异常,无法开启导航".show(requireContext()) + return + } + Poi(p0.snippet, LatLng(lat.toDouble(), lng.toDouble()), "").showRouteOnMap( + requireContext() + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } } /***以下是地图生命周期管理************************************************************************/ diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt index 7932e6a..3166bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt @@ -90,8 +90,11 @@ is LoadState.Success -> { DialogHelper.dismissLoadingDialog() "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) //通知列表刷行数据 - weakReferenceHandler!!.sendEmptyMessage(Constant.ORDER_TODO_OK) UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) } else -> { diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt deleted file mode 100644 index e7a664a..0000000 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.app.smartwell.view.fragment - -import com.casic.app.smartwell.R -import com.pengxh.app.multilib.base.BaseFragment - -class UnAcceptOrderFragment : BaseFragment() { - override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept - - override fun initData() { - - } - - override fun initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt index 8589260..6df8449 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt @@ -1,16 +1,146 @@ package com.casic.app.smartwell.view.fragment +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.WorkOrderListModel +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel import com.pengxh.app.multilib.base.BaseFragment +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference class UnHandleOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_handle override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(this) +// workOrderListViewModel = ViewModelProvider(this).get(WorkOrderListViewModel::class.java) +// workOrderDetailViewModel = ViewModelProvider(this).get(WorkOrderDetailViewModel::class.java) } override fun initEvent() { +// obtainWorkOrderList(pageIndex) +// workOrderListViewModel.resultModel.observe(this, { +// if (it.code == 200) { +// val dataRows = it.data?.rows +// when { +// isRefresh -> { +// dataBeans.clear() +// dataBeans = dataRows!! +// unHandleLayout.finishRefresh() +// isRefresh = false +// } +// isLoadMore -> { +// if (dataRows?.size == 0) { +// "到底了,别拉了".show(requireContext()) +// } +// dataBeans.addAll(dataRows!!) +// unHandleLayout.finishLoadMore() +// isLoadMore = false +// } +// else -> { +// dataBeans = dataRows!! +// } +// } +// weakReferenceHandler!!.sendEmptyMessage(2022040602) +// } +// }) +// +// unHandleLayout.setOnRefreshListener { +// isRefresh = true +// //刷新之后页码重置 +// pageIndex = 1 +// obtainWorkOrderList(pageIndex) +// } +// unHandleLayout.setOnLoadMoreListener { +// isLoadMore = true +// pageIndex++ +// obtainWorkOrderList(pageIndex) +// } +// +// workOrderDetailViewModel.detailModel.observe(this, { +// if (it.code == 200) { +// val orderDetail = it.data!![0] +// val orderFlow = orderDetail.flow!! +// if (orderFlow.size != 0) { +// TimeLineBottomSheet.Builder().setContext(requireContext()) +// .setFlowItems(orderFlow).build().show() +// } else { +// "抱歉,无法查到该工单的流转记录".show(requireContext()) +// } +// } +// }) + } + private fun obtainWorkOrderList(index: Int) { +// workOrderListViewModel.obtainWorkOrderListByState(jobStatus = "2", page = index) + } + + private class WeakReferenceHandler(fragment: UnHandleOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040602) { + if (fragment.isRefresh || fragment.isLoadMore) { +// fragment.inHandleAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() +// fragment.inHandleAdapter = InHandleOrderAdapter( +// fragment.requireContext(), +// fragment.dataBeans +// ) +// fragment.inHandleView!!.layoutManager = +// LinearLayoutManager(fragment.requireContext()) +// fragment.inHandleView!!.adapter = fragment.inHandleAdapter +// fragment.inHandleAdapter.setOnItemClickListener(object : +// InHandleOrderAdapter.OnItemClickListener { +// override fun onClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看详情".show(fragment.requireContext()) +// return +// } +// fragment.requireContext().navigatePageTo( +// InHandleDetailActivity::class.java, jobId +// ) +// } +// +// override fun onTransferViewClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看工单流转记录".show(fragment.requireContext()) +// return +// } +// fragment.workOrderDetailViewModel.obtainWorkOrderDetail(id = jobId) +// } +// }) + } + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt new file mode 100644 index 0000000..b7929b5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt @@ -0,0 +1,185 @@ +package com.casic.app.smartwell.view.fragment + +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.Constant +import com.casic.app.smartwell.utils.DialogHelper +import com.casic.app.smartwell.utils.LoadState +import com.casic.app.smartwell.view.TodoDetailActivity +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel +import com.pengxh.app.multilib.base.BaseFragment +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_over_time_un_accept.* +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference + +class UnacceptedOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 + + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this) + overtimeOderViewModel = ViewModelProvider(this).get(OvertimeOderListViewModel::class.java) + acceptOrderViewModel = ViewModelProvider(this).get(AcceptOrderViewModel::class.java) + } + + override fun initEvent() { + obtainWorkOrderList(pageIndex) + overtimeOderViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + unAcceptOrderLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + unAcceptOrderLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler!!.sendEmptyMessage(2022040601) + } + }) + + //接单状态处理 + acceptOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireContext(), "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) + //通知列表刷行数据 + UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) + } + else -> { + DialogHelper.dismissLoadingDialog() + "接单失败".show(requireContext()) + } + } + }) + + unAcceptOrderLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainWorkOrderList(pageIndex) + } + unAcceptOrderLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainWorkOrderList(pageIndex) + } + } + + private fun obtainWorkOrderList(index: Int) { + overtimeOderViewModel.obtainOvertimeOderList(jobStatus = "0", page = index) + } + + private class WeakReferenceHandler(fragment: UnacceptedOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040601) { + if (fragment.isRefresh || fragment.isLoadMore) { + fragment.overtimeOrderAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("您没有超时未处理的工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() + fragment.overtimeOrderAdapter = OvertimeOrderListAdapter( + fragment.requireContext(), + fragment.dataBeans + ) + fragment.unAcceptOrderView!!.layoutManager = + LinearLayoutManager(fragment.requireContext()) + fragment.unAcceptOrderView!!.adapter = fragment.overtimeOrderAdapter + fragment.overtimeOrderAdapter.setOnItemClickListener(object : + OvertimeOrderListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(fragment.requireContext()) + return + } + fragment.requireContext() + .navigatePageTo(TodoDetailActivity::class.java, jobId) + } + + override fun onOperationClicked(position: Int) { + //标记被点击的item位置 + fragment.clickedPosition = position + + AlertControlDialog.Builder() + .setContext(fragment.requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = + fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show(fragment.requireContext()) + return + } + fragment.acceptOrderViewModel.acceptWorkOrder(id = jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt index 9cbd4de..2f25190 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt @@ -18,7 +18,7 @@ import com.casic.app.smartwell.vm.WorkOrderListViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.app.multilib.base.BaseFragment -import kotlinx.android.synthetic.main.fragment_order_undetermined.* +import kotlinx.android.synthetic.main.fragment_order_un_determined.* import kotlinx.android.synthetic.main.include_empty_view.* import java.lang.ref.WeakReference @@ -43,7 +43,7 @@ } } - override fun initLayoutView(): Int = R.layout.fragment_order_undetermined + override fun initLayoutView(): Int = R.layout.fragment_order_un_determined override fun initData() { weakReferenceHandler = WeakReferenceHandler(this) diff --git a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt index 56a7af4..b7c87a1 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -10,13 +9,10 @@ class AuthenticateViewModel : BaseViewModel() { - private val kTag = "AuthenticateViewModel" val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading keyModel.value = RetrofitServiceManager.authenticate() - }, { - Log.d(kTag, "obtainPublicKey: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt index 3d2d37b..312d224 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class LoginOutViewModel : BaseViewModel() { - private val kTag = "LoginOutViewModel" val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() - }, { - Log.d(kTag, "loginOut: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt index 90eb8c9..03fff89 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class OrderStatusViewModel : BaseViewModel() { - private val kTag = "OrderStatusViewModel" val listModel = MutableLiveData() fun obtainOrderStatus() = launch({ listModel.value = RetrofitServiceManager.obtainOrderStatus() - }, { - Log.d(kTag, "obtainOrderStatus: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt new file mode 100644 index 0000000..a78cf59 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt @@ -0,0 +1,16 @@ +package com.casic.app.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.base.BaseViewModel +import com.casic.app.smartwell.extensions.launch +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager + +class OvertimeOderListViewModel : BaseViewModel() { + + val resultModel = MutableLiveData() + + fun obtainOvertimeOderList(jobStatus: String, page: Int) = launch({ + resultModel.value = RetrofitServiceManager.obtainOvertimeOderList(jobStatus, page) + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt index 9e29a84..18aff97 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -12,12 +11,9 @@ * */ class SubordinateViewModel : BaseViewModel() { - private val kTag = "SubordinateViewModel" val listModel = MutableLiveData() fun obtainSubordinate(hasMine: String?, roleTips: String?) = launch({ listModel.value = RetrofitServiceManager.obtainSubordinate(hasMine, roleTips) - }, { - Log.d(kTag, "obtainSubordinate: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt index 60389fa..c3b6b03 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt @@ -26,7 +26,5 @@ } else { Log.d(kTag, "obtainWellCountByState: 错误码===>${code}") } - }, { - Log.d(kTag, "obtainWellCountByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt index f86d7d5..494e5b5 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class WellTypeViewModel : BaseViewModel() { - private val kTag = "WellTypeViewModel" val wellTypeModel = MutableLiveData() fun obtainWellType() = launch({ wellTypeModel.value = RetrofitServiceManager.obtainWellType() - }, { - Log.d(kTag, "obtainWellType: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt index aa1df2c..2d8cbb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class WorkOrderListViewModel : BaseViewModel() { - private val kTag = "WorkOrderListViewModel" val resultModel = MutableLiveData() fun obtainWorkOrderListByState(jobStatus: String, page: Int) = launch({ resultModel.value = RetrofitServiceManager.obtainWorkOrderList(jobStatus, page) - }, { - Log.d(kTag, "obtainWorkOrderListByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt index a9ea8d3..7f0f016 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt @@ -27,7 +27,5 @@ } else { Log.d(kTag, "obtainWorkOrderCountByState: 错误码===>${code}") } - }, { - Log.d(kTag, "obtainWorkOrderCountByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt b/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt new file mode 100644 index 0000000..94980f1 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt @@ -0,0 +1,104 @@ +package com.casic.app.smartwell.widgets + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Point +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import com.amap.api.maps.Projection +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.LatLngBounds +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.extensions.toBitmap +import java.util.* + +class GaoDeClusterMarkerView( + private val context: Context, firstMarkers: MarkerOptions, + projection: Projection, gridSize: Int +) { + //当前可观区域里的 聚合过之后的集合 + private val includeMarkers: ArrayList + + // 创建区域 + val bounds: LatLngBounds + var options: MarkerOptions = MarkerOptions() + + init { + val screenLocation = projection.toScreenLocation(firstMarkers.position) + //范围类 + val southwestPoint = Point(screenLocation.x - gridSize, screenLocation.y + gridSize) + //范围类 + val northeastPoint = Point(screenLocation.x + gridSize, screenLocation.y - gridSize) + bounds = LatLngBounds( + projection.fromScreenLocation(southwestPoint), + projection.fromScreenLocation(northeastPoint) + ) + //设置初始化marker属性 + options.anchor(0.5f, 0.5f) + .title(firstMarkers.title) + .position(firstMarkers.position) + .icon(firstMarkers.icon) + .snippet(firstMarkers.snippet) + .draggable(false) + includeMarkers = ArrayList() + includeMarkers.add(firstMarkers) + } + + /** + * 添加marker + */ + fun addMarker(markerOptions: MarkerOptions) { + includeMarkers.add(markerOptions) // 添加到列表中 + } + + /** + * 设置聚合点的中心位置以及图标 + */ + fun setPositionAndIcon() { + val size = includeMarkers.size + var lat = 0.0 + var lng = 0.0 + // 一个的时候 + if (size == 1) { //设置marker单个属性 + // 设置marker位置 + options.position( + LatLng( + includeMarkers[0].position.latitude, + includeMarkers[0].position.longitude + ) + ) + } else { // 聚合的时候 + //设置marker聚合属性 + for (op in includeMarkers) { + lat += op.position.latitude + lng += op.position.longitude + } + // 设置marker的位置为中心位置为聚集点的平均位置 + options.position(LatLng(lat / size, lng / size)) + } + options.icon(BitmapDescriptorFactory.fromBitmap(getBitmap(size))) + } + + /** + * marker视图 + */ + @SuppressLint("SetTextI18n") + private fun getBitmap(num: Int): Bitmap? { + val view = LayoutInflater.from(context).inflate(R.layout.marker_gaode, null) + val wellCountView = view.findViewById(R.id.wellCountView) + return if (num > 1) { + wellCountView.visibility = View.VISIBLE + wellCountView.text = "${num}个" + wellCountView.gravity = Gravity.CENTER + view.toBitmap() + } else { + wellCountView.visibility = View.GONE + BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_order_un_determined.xml b/app/src/main/res/layout/fragment_order_un_determined.xml new file mode 100644 index 0000000..03ca071 --- /dev/null +++ b/app/src/main/res/layout/fragment_order_un_determined.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt index cdff470..a22b719 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt @@ -1,7 +1,8 @@ package com.casic.app.smartwell.view.fragment +import android.graphics.Point +import android.location.Location import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,30 +11,46 @@ import androidx.recyclerview.widget.GridLayoutManager import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.* import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.HomeRecycleAdapter import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showRouteOnMap +import com.casic.app.smartwell.utils.Constant import com.casic.app.smartwell.view.OvertimeOrderActivity import com.casic.app.smartwell.view.WellManagementActivity import com.casic.app.smartwell.view.WellOperationActivity import com.casic.app.smartwell.vm.WellCountViewModel import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.google.gson.Gson +import com.casic.app.smartwell.widgets.GaoDeClusterMarkerView +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.include_base_title.view.* -class HomePageFragment : Fragment(), AMap.OnCameraChangeListener, AMap.OnMarkerClickListener { +class HomePageFragment : Fragment(), AMap.OnMyLocationChangeListener, AMap.OnCameraChangeListener, + AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { private lateinit var homeView: View private lateinit var wellCountViewModel: WellCountViewModel private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var wellListViewModel: WellListViewModel private lateinit var aMap: AMap - private val kTag = "HomePageFragment" + + //定位点经纬度 + private var location: LatLng? = null + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -51,8 +68,20 @@ wellListViewModel.obtainAllWell() wellListViewModel.listModel.observe(viewLifecycleOwner, { if (it.code == 200) { - val dataRows = it.data?.rows - Log.d(kTag, "onCreateView: ${Gson().toJson(dataRows)}") + it.data?.rows?.forEach { location -> + if (location.latGaode.toString().isNotBlank() + && location.lngGaode.toString().isNotBlank() + ) { + allMarkerOptions.add( + MarkerOptions().position( + LatLng( + location.latGaode!!.toDouble(), + location.lngGaode!!.toDouble() + ) + ).title(location.wellTypeName).snippet(location.wellName) + ) + } + } } }) @@ -109,27 +138,127 @@ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() + locationStyle.interval(5000) + //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER) locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 - locationStyle.interval(10 * 1000)////设置连续定位模式下的定位间隔,只在连续定位模式下生效。单位为毫秒 aMap.myLocationStyle = locationStyle aMap.isMyLocationEnabled = true - //注册地图缩放监听 + aMap.addOnMyLocationChangeListener(this) + // 地图缩放监听 aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) } - /***地图接口实现*********************************************************************************/ + override fun onMyLocationChange(p0: Location?) { + if (p0 != null) { + this.location = LatLng(p0.latitude, p0.longitude) + } + } + override fun onCameraChange(p0: CameraPosition?) { - Log.d(kTag, "onCameraChange: ") + } + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker override fun onCameraChangeFinish(p0: CameraPosition?) { -// resetMarks() - Log.d(kTag, "onCameraChangeFinish: ") + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + //在当前可观区域内 + markerOptionsInView.add(it) + } + } + // 自定义的聚合类MarkerCluster + val clustersMarkers: MutableList = ArrayList() + markerOptionsInView.forEach { + if (clustersMarkers.size == 0) { + //添加一个新的自定义marker + clustersMarkers.add(GaoDeClusterMarkerView(requireContext(), it, proj, 80))//相距多少才聚合 + } else { + var isInRange = false + //Kotlin foreach不能用break + for (view in clustersMarkers) { + //判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。 + if (view.bounds.contains(it.position)) { + view.addMarker(it) + isInRange = true + break + } + } + //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 + if (!isInRange) { + clustersMarkers.add( + GaoDeClusterMarkerView( + requireContext(), + it, proj, 80 + ) + )//相距多少才聚合 + } + } + } + // 设置聚合点的位置和icon + clustersMarkers.forEach { + it.setPositionAndIcon() + } + aMap.clear() + // 重新添加 marker + clustersMarkers.forEach { + aMap.addMarker(it.options) + } } - override fun onMarkerClick(p0: Marker?): Boolean { + override fun onMarkerClick(marker: Marker?): Boolean { + val clickedLatLng = marker?.position + if (location != null) { + //判断点击点是否是定位点 + val distance = AMapUtils.calculateLineDistance(location, clickedLatLng) + if (distance > Constant.DISTANCE) { + //显示闸井信息 + marker!!.showInfoWindow() + } else { + "该位置是定位点,请选择实际闸井点".show(requireContext()) + } + } + return true + } - return false + override fun onInfoWindowClick(p0: Marker?) { + if (p0 != null) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val latLng = p0.position + val lat = latLng.latitude.toString() + val lng = latLng.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "窨井经纬度异常,无法开启导航".show(requireContext()) + return + } + Poi(p0.snippet, LatLng(lat.toDouble(), lng.toDouble()), "").showRouteOnMap( + requireContext() + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } } /***以下是地图生命周期管理************************************************************************/ diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt index 7932e6a..3166bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt @@ -90,8 +90,11 @@ is LoadState.Success -> { DialogHelper.dismissLoadingDialog() "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) //通知列表刷行数据 - weakReferenceHandler!!.sendEmptyMessage(Constant.ORDER_TODO_OK) UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) } else -> { diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt deleted file mode 100644 index e7a664a..0000000 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.app.smartwell.view.fragment - -import com.casic.app.smartwell.R -import com.pengxh.app.multilib.base.BaseFragment - -class UnAcceptOrderFragment : BaseFragment() { - override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept - - override fun initData() { - - } - - override fun initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt index 8589260..6df8449 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt @@ -1,16 +1,146 @@ package com.casic.app.smartwell.view.fragment +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.WorkOrderListModel +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel import com.pengxh.app.multilib.base.BaseFragment +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference class UnHandleOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_handle override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(this) +// workOrderListViewModel = ViewModelProvider(this).get(WorkOrderListViewModel::class.java) +// workOrderDetailViewModel = ViewModelProvider(this).get(WorkOrderDetailViewModel::class.java) } override fun initEvent() { +// obtainWorkOrderList(pageIndex) +// workOrderListViewModel.resultModel.observe(this, { +// if (it.code == 200) { +// val dataRows = it.data?.rows +// when { +// isRefresh -> { +// dataBeans.clear() +// dataBeans = dataRows!! +// unHandleLayout.finishRefresh() +// isRefresh = false +// } +// isLoadMore -> { +// if (dataRows?.size == 0) { +// "到底了,别拉了".show(requireContext()) +// } +// dataBeans.addAll(dataRows!!) +// unHandleLayout.finishLoadMore() +// isLoadMore = false +// } +// else -> { +// dataBeans = dataRows!! +// } +// } +// weakReferenceHandler!!.sendEmptyMessage(2022040602) +// } +// }) +// +// unHandleLayout.setOnRefreshListener { +// isRefresh = true +// //刷新之后页码重置 +// pageIndex = 1 +// obtainWorkOrderList(pageIndex) +// } +// unHandleLayout.setOnLoadMoreListener { +// isLoadMore = true +// pageIndex++ +// obtainWorkOrderList(pageIndex) +// } +// +// workOrderDetailViewModel.detailModel.observe(this, { +// if (it.code == 200) { +// val orderDetail = it.data!![0] +// val orderFlow = orderDetail.flow!! +// if (orderFlow.size != 0) { +// TimeLineBottomSheet.Builder().setContext(requireContext()) +// .setFlowItems(orderFlow).build().show() +// } else { +// "抱歉,无法查到该工单的流转记录".show(requireContext()) +// } +// } +// }) + } + private fun obtainWorkOrderList(index: Int) { +// workOrderListViewModel.obtainWorkOrderListByState(jobStatus = "2", page = index) + } + + private class WeakReferenceHandler(fragment: UnHandleOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040602) { + if (fragment.isRefresh || fragment.isLoadMore) { +// fragment.inHandleAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() +// fragment.inHandleAdapter = InHandleOrderAdapter( +// fragment.requireContext(), +// fragment.dataBeans +// ) +// fragment.inHandleView!!.layoutManager = +// LinearLayoutManager(fragment.requireContext()) +// fragment.inHandleView!!.adapter = fragment.inHandleAdapter +// fragment.inHandleAdapter.setOnItemClickListener(object : +// InHandleOrderAdapter.OnItemClickListener { +// override fun onClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看详情".show(fragment.requireContext()) +// return +// } +// fragment.requireContext().navigatePageTo( +// InHandleDetailActivity::class.java, jobId +// ) +// } +// +// override fun onTransferViewClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看工单流转记录".show(fragment.requireContext()) +// return +// } +// fragment.workOrderDetailViewModel.obtainWorkOrderDetail(id = jobId) +// } +// }) + } + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt new file mode 100644 index 0000000..b7929b5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt @@ -0,0 +1,185 @@ +package com.casic.app.smartwell.view.fragment + +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.Constant +import com.casic.app.smartwell.utils.DialogHelper +import com.casic.app.smartwell.utils.LoadState +import com.casic.app.smartwell.view.TodoDetailActivity +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel +import com.pengxh.app.multilib.base.BaseFragment +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_over_time_un_accept.* +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference + +class UnacceptedOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 + + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this) + overtimeOderViewModel = ViewModelProvider(this).get(OvertimeOderListViewModel::class.java) + acceptOrderViewModel = ViewModelProvider(this).get(AcceptOrderViewModel::class.java) + } + + override fun initEvent() { + obtainWorkOrderList(pageIndex) + overtimeOderViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + unAcceptOrderLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + unAcceptOrderLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler!!.sendEmptyMessage(2022040601) + } + }) + + //接单状态处理 + acceptOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireContext(), "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) + //通知列表刷行数据 + UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) + } + else -> { + DialogHelper.dismissLoadingDialog() + "接单失败".show(requireContext()) + } + } + }) + + unAcceptOrderLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainWorkOrderList(pageIndex) + } + unAcceptOrderLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainWorkOrderList(pageIndex) + } + } + + private fun obtainWorkOrderList(index: Int) { + overtimeOderViewModel.obtainOvertimeOderList(jobStatus = "0", page = index) + } + + private class WeakReferenceHandler(fragment: UnacceptedOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040601) { + if (fragment.isRefresh || fragment.isLoadMore) { + fragment.overtimeOrderAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("您没有超时未处理的工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() + fragment.overtimeOrderAdapter = OvertimeOrderListAdapter( + fragment.requireContext(), + fragment.dataBeans + ) + fragment.unAcceptOrderView!!.layoutManager = + LinearLayoutManager(fragment.requireContext()) + fragment.unAcceptOrderView!!.adapter = fragment.overtimeOrderAdapter + fragment.overtimeOrderAdapter.setOnItemClickListener(object : + OvertimeOrderListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(fragment.requireContext()) + return + } + fragment.requireContext() + .navigatePageTo(TodoDetailActivity::class.java, jobId) + } + + override fun onOperationClicked(position: Int) { + //标记被点击的item位置 + fragment.clickedPosition = position + + AlertControlDialog.Builder() + .setContext(fragment.requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = + fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show(fragment.requireContext()) + return + } + fragment.acceptOrderViewModel.acceptWorkOrder(id = jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt index 9cbd4de..2f25190 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt @@ -18,7 +18,7 @@ import com.casic.app.smartwell.vm.WorkOrderListViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.app.multilib.base.BaseFragment -import kotlinx.android.synthetic.main.fragment_order_undetermined.* +import kotlinx.android.synthetic.main.fragment_order_un_determined.* import kotlinx.android.synthetic.main.include_empty_view.* import java.lang.ref.WeakReference @@ -43,7 +43,7 @@ } } - override fun initLayoutView(): Int = R.layout.fragment_order_undetermined + override fun initLayoutView(): Int = R.layout.fragment_order_un_determined override fun initData() { weakReferenceHandler = WeakReferenceHandler(this) diff --git a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt index 56a7af4..b7c87a1 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -10,13 +9,10 @@ class AuthenticateViewModel : BaseViewModel() { - private val kTag = "AuthenticateViewModel" val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading keyModel.value = RetrofitServiceManager.authenticate() - }, { - Log.d(kTag, "obtainPublicKey: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt index 3d2d37b..312d224 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class LoginOutViewModel : BaseViewModel() { - private val kTag = "LoginOutViewModel" val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() - }, { - Log.d(kTag, "loginOut: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt index 90eb8c9..03fff89 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class OrderStatusViewModel : BaseViewModel() { - private val kTag = "OrderStatusViewModel" val listModel = MutableLiveData() fun obtainOrderStatus() = launch({ listModel.value = RetrofitServiceManager.obtainOrderStatus() - }, { - Log.d(kTag, "obtainOrderStatus: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt new file mode 100644 index 0000000..a78cf59 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt @@ -0,0 +1,16 @@ +package com.casic.app.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.base.BaseViewModel +import com.casic.app.smartwell.extensions.launch +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager + +class OvertimeOderListViewModel : BaseViewModel() { + + val resultModel = MutableLiveData() + + fun obtainOvertimeOderList(jobStatus: String, page: Int) = launch({ + resultModel.value = RetrofitServiceManager.obtainOvertimeOderList(jobStatus, page) + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt index 9e29a84..18aff97 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -12,12 +11,9 @@ * */ class SubordinateViewModel : BaseViewModel() { - private val kTag = "SubordinateViewModel" val listModel = MutableLiveData() fun obtainSubordinate(hasMine: String?, roleTips: String?) = launch({ listModel.value = RetrofitServiceManager.obtainSubordinate(hasMine, roleTips) - }, { - Log.d(kTag, "obtainSubordinate: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt index 60389fa..c3b6b03 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt @@ -26,7 +26,5 @@ } else { Log.d(kTag, "obtainWellCountByState: 错误码===>${code}") } - }, { - Log.d(kTag, "obtainWellCountByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt index f86d7d5..494e5b5 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class WellTypeViewModel : BaseViewModel() { - private val kTag = "WellTypeViewModel" val wellTypeModel = MutableLiveData() fun obtainWellType() = launch({ wellTypeModel.value = RetrofitServiceManager.obtainWellType() - }, { - Log.d(kTag, "obtainWellType: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt index aa1df2c..2d8cbb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class WorkOrderListViewModel : BaseViewModel() { - private val kTag = "WorkOrderListViewModel" val resultModel = MutableLiveData() fun obtainWorkOrderListByState(jobStatus: String, page: Int) = launch({ resultModel.value = RetrofitServiceManager.obtainWorkOrderList(jobStatus, page) - }, { - Log.d(kTag, "obtainWorkOrderListByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt index a9ea8d3..7f0f016 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt @@ -27,7 +27,5 @@ } else { Log.d(kTag, "obtainWorkOrderCountByState: 错误码===>${code}") } - }, { - Log.d(kTag, "obtainWorkOrderCountByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt b/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt new file mode 100644 index 0000000..94980f1 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt @@ -0,0 +1,104 @@ +package com.casic.app.smartwell.widgets + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Point +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import com.amap.api.maps.Projection +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.LatLngBounds +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.extensions.toBitmap +import java.util.* + +class GaoDeClusterMarkerView( + private val context: Context, firstMarkers: MarkerOptions, + projection: Projection, gridSize: Int +) { + //当前可观区域里的 聚合过之后的集合 + private val includeMarkers: ArrayList + + // 创建区域 + val bounds: LatLngBounds + var options: MarkerOptions = MarkerOptions() + + init { + val screenLocation = projection.toScreenLocation(firstMarkers.position) + //范围类 + val southwestPoint = Point(screenLocation.x - gridSize, screenLocation.y + gridSize) + //范围类 + val northeastPoint = Point(screenLocation.x + gridSize, screenLocation.y - gridSize) + bounds = LatLngBounds( + projection.fromScreenLocation(southwestPoint), + projection.fromScreenLocation(northeastPoint) + ) + //设置初始化marker属性 + options.anchor(0.5f, 0.5f) + .title(firstMarkers.title) + .position(firstMarkers.position) + .icon(firstMarkers.icon) + .snippet(firstMarkers.snippet) + .draggable(false) + includeMarkers = ArrayList() + includeMarkers.add(firstMarkers) + } + + /** + * 添加marker + */ + fun addMarker(markerOptions: MarkerOptions) { + includeMarkers.add(markerOptions) // 添加到列表中 + } + + /** + * 设置聚合点的中心位置以及图标 + */ + fun setPositionAndIcon() { + val size = includeMarkers.size + var lat = 0.0 + var lng = 0.0 + // 一个的时候 + if (size == 1) { //设置marker单个属性 + // 设置marker位置 + options.position( + LatLng( + includeMarkers[0].position.latitude, + includeMarkers[0].position.longitude + ) + ) + } else { // 聚合的时候 + //设置marker聚合属性 + for (op in includeMarkers) { + lat += op.position.latitude + lng += op.position.longitude + } + // 设置marker的位置为中心位置为聚集点的平均位置 + options.position(LatLng(lat / size, lng / size)) + } + options.icon(BitmapDescriptorFactory.fromBitmap(getBitmap(size))) + } + + /** + * marker视图 + */ + @SuppressLint("SetTextI18n") + private fun getBitmap(num: Int): Bitmap? { + val view = LayoutInflater.from(context).inflate(R.layout.marker_gaode, null) + val wellCountView = view.findViewById(R.id.wellCountView) + return if (num > 1) { + wellCountView.visibility = View.VISIBLE + wellCountView.text = "${num}个" + wellCountView.gravity = Gravity.CENTER + view.toBitmap() + } else { + wellCountView.visibility = View.GONE + BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_order_un_determined.xml b/app/src/main/res/layout/fragment_order_un_determined.xml new file mode 100644 index 0000000..03ca071 --- /dev/null +++ b/app/src/main/res/layout/fragment_order_un_determined.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_order_undetermined.xml b/app/src/main/res/layout/fragment_order_undetermined.xml deleted file mode 100644 index 03ca071..0000000 --- a/app/src/main/res/layout/fragment_order_undetermined.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt index cdff470..a22b719 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt @@ -1,7 +1,8 @@ package com.casic.app.smartwell.view.fragment +import android.graphics.Point +import android.location.Location import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,30 +11,46 @@ import androidx.recyclerview.widget.GridLayoutManager import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.* import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.HomeRecycleAdapter import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showRouteOnMap +import com.casic.app.smartwell.utils.Constant import com.casic.app.smartwell.view.OvertimeOrderActivity import com.casic.app.smartwell.view.WellManagementActivity import com.casic.app.smartwell.view.WellOperationActivity import com.casic.app.smartwell.vm.WellCountViewModel import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.google.gson.Gson +import com.casic.app.smartwell.widgets.GaoDeClusterMarkerView +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.include_base_title.view.* -class HomePageFragment : Fragment(), AMap.OnCameraChangeListener, AMap.OnMarkerClickListener { +class HomePageFragment : Fragment(), AMap.OnMyLocationChangeListener, AMap.OnCameraChangeListener, + AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { private lateinit var homeView: View private lateinit var wellCountViewModel: WellCountViewModel private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var wellListViewModel: WellListViewModel private lateinit var aMap: AMap - private val kTag = "HomePageFragment" + + //定位点经纬度 + private var location: LatLng? = null + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -51,8 +68,20 @@ wellListViewModel.obtainAllWell() wellListViewModel.listModel.observe(viewLifecycleOwner, { if (it.code == 200) { - val dataRows = it.data?.rows - Log.d(kTag, "onCreateView: ${Gson().toJson(dataRows)}") + it.data?.rows?.forEach { location -> + if (location.latGaode.toString().isNotBlank() + && location.lngGaode.toString().isNotBlank() + ) { + allMarkerOptions.add( + MarkerOptions().position( + LatLng( + location.latGaode!!.toDouble(), + location.lngGaode!!.toDouble() + ) + ).title(location.wellTypeName).snippet(location.wellName) + ) + } + } } }) @@ -109,27 +138,127 @@ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() + locationStyle.interval(5000) + //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER) locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 - locationStyle.interval(10 * 1000)////设置连续定位模式下的定位间隔,只在连续定位模式下生效。单位为毫秒 aMap.myLocationStyle = locationStyle aMap.isMyLocationEnabled = true - //注册地图缩放监听 + aMap.addOnMyLocationChangeListener(this) + // 地图缩放监听 aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) } - /***地图接口实现*********************************************************************************/ + override fun onMyLocationChange(p0: Location?) { + if (p0 != null) { + this.location = LatLng(p0.latitude, p0.longitude) + } + } + override fun onCameraChange(p0: CameraPosition?) { - Log.d(kTag, "onCameraChange: ") + } + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker override fun onCameraChangeFinish(p0: CameraPosition?) { -// resetMarks() - Log.d(kTag, "onCameraChangeFinish: ") + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + //在当前可观区域内 + markerOptionsInView.add(it) + } + } + // 自定义的聚合类MarkerCluster + val clustersMarkers: MutableList = ArrayList() + markerOptionsInView.forEach { + if (clustersMarkers.size == 0) { + //添加一个新的自定义marker + clustersMarkers.add(GaoDeClusterMarkerView(requireContext(), it, proj, 80))//相距多少才聚合 + } else { + var isInRange = false + //Kotlin foreach不能用break + for (view in clustersMarkers) { + //判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。 + if (view.bounds.contains(it.position)) { + view.addMarker(it) + isInRange = true + break + } + } + //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 + if (!isInRange) { + clustersMarkers.add( + GaoDeClusterMarkerView( + requireContext(), + it, proj, 80 + ) + )//相距多少才聚合 + } + } + } + // 设置聚合点的位置和icon + clustersMarkers.forEach { + it.setPositionAndIcon() + } + aMap.clear() + // 重新添加 marker + clustersMarkers.forEach { + aMap.addMarker(it.options) + } } - override fun onMarkerClick(p0: Marker?): Boolean { + override fun onMarkerClick(marker: Marker?): Boolean { + val clickedLatLng = marker?.position + if (location != null) { + //判断点击点是否是定位点 + val distance = AMapUtils.calculateLineDistance(location, clickedLatLng) + if (distance > Constant.DISTANCE) { + //显示闸井信息 + marker!!.showInfoWindow() + } else { + "该位置是定位点,请选择实际闸井点".show(requireContext()) + } + } + return true + } - return false + override fun onInfoWindowClick(p0: Marker?) { + if (p0 != null) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val latLng = p0.position + val lat = latLng.latitude.toString() + val lng = latLng.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "窨井经纬度异常,无法开启导航".show(requireContext()) + return + } + Poi(p0.snippet, LatLng(lat.toDouble(), lng.toDouble()), "").showRouteOnMap( + requireContext() + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } } /***以下是地图生命周期管理************************************************************************/ diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt index 7932e6a..3166bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt @@ -90,8 +90,11 @@ is LoadState.Success -> { DialogHelper.dismissLoadingDialog() "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) //通知列表刷行数据 - weakReferenceHandler!!.sendEmptyMessage(Constant.ORDER_TODO_OK) UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) } else -> { diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt deleted file mode 100644 index e7a664a..0000000 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.app.smartwell.view.fragment - -import com.casic.app.smartwell.R -import com.pengxh.app.multilib.base.BaseFragment - -class UnAcceptOrderFragment : BaseFragment() { - override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept - - override fun initData() { - - } - - override fun initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt index 8589260..6df8449 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt @@ -1,16 +1,146 @@ package com.casic.app.smartwell.view.fragment +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.WorkOrderListModel +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel import com.pengxh.app.multilib.base.BaseFragment +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference class UnHandleOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_handle override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(this) +// workOrderListViewModel = ViewModelProvider(this).get(WorkOrderListViewModel::class.java) +// workOrderDetailViewModel = ViewModelProvider(this).get(WorkOrderDetailViewModel::class.java) } override fun initEvent() { +// obtainWorkOrderList(pageIndex) +// workOrderListViewModel.resultModel.observe(this, { +// if (it.code == 200) { +// val dataRows = it.data?.rows +// when { +// isRefresh -> { +// dataBeans.clear() +// dataBeans = dataRows!! +// unHandleLayout.finishRefresh() +// isRefresh = false +// } +// isLoadMore -> { +// if (dataRows?.size == 0) { +// "到底了,别拉了".show(requireContext()) +// } +// dataBeans.addAll(dataRows!!) +// unHandleLayout.finishLoadMore() +// isLoadMore = false +// } +// else -> { +// dataBeans = dataRows!! +// } +// } +// weakReferenceHandler!!.sendEmptyMessage(2022040602) +// } +// }) +// +// unHandleLayout.setOnRefreshListener { +// isRefresh = true +// //刷新之后页码重置 +// pageIndex = 1 +// obtainWorkOrderList(pageIndex) +// } +// unHandleLayout.setOnLoadMoreListener { +// isLoadMore = true +// pageIndex++ +// obtainWorkOrderList(pageIndex) +// } +// +// workOrderDetailViewModel.detailModel.observe(this, { +// if (it.code == 200) { +// val orderDetail = it.data!![0] +// val orderFlow = orderDetail.flow!! +// if (orderFlow.size != 0) { +// TimeLineBottomSheet.Builder().setContext(requireContext()) +// .setFlowItems(orderFlow).build().show() +// } else { +// "抱歉,无法查到该工单的流转记录".show(requireContext()) +// } +// } +// }) + } + private fun obtainWorkOrderList(index: Int) { +// workOrderListViewModel.obtainWorkOrderListByState(jobStatus = "2", page = index) + } + + private class WeakReferenceHandler(fragment: UnHandleOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040602) { + if (fragment.isRefresh || fragment.isLoadMore) { +// fragment.inHandleAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() +// fragment.inHandleAdapter = InHandleOrderAdapter( +// fragment.requireContext(), +// fragment.dataBeans +// ) +// fragment.inHandleView!!.layoutManager = +// LinearLayoutManager(fragment.requireContext()) +// fragment.inHandleView!!.adapter = fragment.inHandleAdapter +// fragment.inHandleAdapter.setOnItemClickListener(object : +// InHandleOrderAdapter.OnItemClickListener { +// override fun onClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看详情".show(fragment.requireContext()) +// return +// } +// fragment.requireContext().navigatePageTo( +// InHandleDetailActivity::class.java, jobId +// ) +// } +// +// override fun onTransferViewClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看工单流转记录".show(fragment.requireContext()) +// return +// } +// fragment.workOrderDetailViewModel.obtainWorkOrderDetail(id = jobId) +// } +// }) + } + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt new file mode 100644 index 0000000..b7929b5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt @@ -0,0 +1,185 @@ +package com.casic.app.smartwell.view.fragment + +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.Constant +import com.casic.app.smartwell.utils.DialogHelper +import com.casic.app.smartwell.utils.LoadState +import com.casic.app.smartwell.view.TodoDetailActivity +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel +import com.pengxh.app.multilib.base.BaseFragment +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_over_time_un_accept.* +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference + +class UnacceptedOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 + + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this) + overtimeOderViewModel = ViewModelProvider(this).get(OvertimeOderListViewModel::class.java) + acceptOrderViewModel = ViewModelProvider(this).get(AcceptOrderViewModel::class.java) + } + + override fun initEvent() { + obtainWorkOrderList(pageIndex) + overtimeOderViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + unAcceptOrderLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + unAcceptOrderLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler!!.sendEmptyMessage(2022040601) + } + }) + + //接单状态处理 + acceptOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireContext(), "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) + //通知列表刷行数据 + UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) + } + else -> { + DialogHelper.dismissLoadingDialog() + "接单失败".show(requireContext()) + } + } + }) + + unAcceptOrderLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainWorkOrderList(pageIndex) + } + unAcceptOrderLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainWorkOrderList(pageIndex) + } + } + + private fun obtainWorkOrderList(index: Int) { + overtimeOderViewModel.obtainOvertimeOderList(jobStatus = "0", page = index) + } + + private class WeakReferenceHandler(fragment: UnacceptedOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040601) { + if (fragment.isRefresh || fragment.isLoadMore) { + fragment.overtimeOrderAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("您没有超时未处理的工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() + fragment.overtimeOrderAdapter = OvertimeOrderListAdapter( + fragment.requireContext(), + fragment.dataBeans + ) + fragment.unAcceptOrderView!!.layoutManager = + LinearLayoutManager(fragment.requireContext()) + fragment.unAcceptOrderView!!.adapter = fragment.overtimeOrderAdapter + fragment.overtimeOrderAdapter.setOnItemClickListener(object : + OvertimeOrderListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(fragment.requireContext()) + return + } + fragment.requireContext() + .navigatePageTo(TodoDetailActivity::class.java, jobId) + } + + override fun onOperationClicked(position: Int) { + //标记被点击的item位置 + fragment.clickedPosition = position + + AlertControlDialog.Builder() + .setContext(fragment.requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = + fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show(fragment.requireContext()) + return + } + fragment.acceptOrderViewModel.acceptWorkOrder(id = jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt index 9cbd4de..2f25190 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt @@ -18,7 +18,7 @@ import com.casic.app.smartwell.vm.WorkOrderListViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.app.multilib.base.BaseFragment -import kotlinx.android.synthetic.main.fragment_order_undetermined.* +import kotlinx.android.synthetic.main.fragment_order_un_determined.* import kotlinx.android.synthetic.main.include_empty_view.* import java.lang.ref.WeakReference @@ -43,7 +43,7 @@ } } - override fun initLayoutView(): Int = R.layout.fragment_order_undetermined + override fun initLayoutView(): Int = R.layout.fragment_order_un_determined override fun initData() { weakReferenceHandler = WeakReferenceHandler(this) diff --git a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt index 56a7af4..b7c87a1 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -10,13 +9,10 @@ class AuthenticateViewModel : BaseViewModel() { - private val kTag = "AuthenticateViewModel" val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading keyModel.value = RetrofitServiceManager.authenticate() - }, { - Log.d(kTag, "obtainPublicKey: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt index 3d2d37b..312d224 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class LoginOutViewModel : BaseViewModel() { - private val kTag = "LoginOutViewModel" val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() - }, { - Log.d(kTag, "loginOut: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt index 90eb8c9..03fff89 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class OrderStatusViewModel : BaseViewModel() { - private val kTag = "OrderStatusViewModel" val listModel = MutableLiveData() fun obtainOrderStatus() = launch({ listModel.value = RetrofitServiceManager.obtainOrderStatus() - }, { - Log.d(kTag, "obtainOrderStatus: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt new file mode 100644 index 0000000..a78cf59 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt @@ -0,0 +1,16 @@ +package com.casic.app.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.base.BaseViewModel +import com.casic.app.smartwell.extensions.launch +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager + +class OvertimeOderListViewModel : BaseViewModel() { + + val resultModel = MutableLiveData() + + fun obtainOvertimeOderList(jobStatus: String, page: Int) = launch({ + resultModel.value = RetrofitServiceManager.obtainOvertimeOderList(jobStatus, page) + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt index 9e29a84..18aff97 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -12,12 +11,9 @@ * */ class SubordinateViewModel : BaseViewModel() { - private val kTag = "SubordinateViewModel" val listModel = MutableLiveData() fun obtainSubordinate(hasMine: String?, roleTips: String?) = launch({ listModel.value = RetrofitServiceManager.obtainSubordinate(hasMine, roleTips) - }, { - Log.d(kTag, "obtainSubordinate: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt index 60389fa..c3b6b03 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt @@ -26,7 +26,5 @@ } else { Log.d(kTag, "obtainWellCountByState: 错误码===>${code}") } - }, { - Log.d(kTag, "obtainWellCountByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt index f86d7d5..494e5b5 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class WellTypeViewModel : BaseViewModel() { - private val kTag = "WellTypeViewModel" val wellTypeModel = MutableLiveData() fun obtainWellType() = launch({ wellTypeModel.value = RetrofitServiceManager.obtainWellType() - }, { - Log.d(kTag, "obtainWellType: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt index aa1df2c..2d8cbb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class WorkOrderListViewModel : BaseViewModel() { - private val kTag = "WorkOrderListViewModel" val resultModel = MutableLiveData() fun obtainWorkOrderListByState(jobStatus: String, page: Int) = launch({ resultModel.value = RetrofitServiceManager.obtainWorkOrderList(jobStatus, page) - }, { - Log.d(kTag, "obtainWorkOrderListByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt index a9ea8d3..7f0f016 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt @@ -27,7 +27,5 @@ } else { Log.d(kTag, "obtainWorkOrderCountByState: 错误码===>${code}") } - }, { - Log.d(kTag, "obtainWorkOrderCountByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt b/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt new file mode 100644 index 0000000..94980f1 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt @@ -0,0 +1,104 @@ +package com.casic.app.smartwell.widgets + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Point +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import com.amap.api.maps.Projection +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.LatLngBounds +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.extensions.toBitmap +import java.util.* + +class GaoDeClusterMarkerView( + private val context: Context, firstMarkers: MarkerOptions, + projection: Projection, gridSize: Int +) { + //当前可观区域里的 聚合过之后的集合 + private val includeMarkers: ArrayList + + // 创建区域 + val bounds: LatLngBounds + var options: MarkerOptions = MarkerOptions() + + init { + val screenLocation = projection.toScreenLocation(firstMarkers.position) + //范围类 + val southwestPoint = Point(screenLocation.x - gridSize, screenLocation.y + gridSize) + //范围类 + val northeastPoint = Point(screenLocation.x + gridSize, screenLocation.y - gridSize) + bounds = LatLngBounds( + projection.fromScreenLocation(southwestPoint), + projection.fromScreenLocation(northeastPoint) + ) + //设置初始化marker属性 + options.anchor(0.5f, 0.5f) + .title(firstMarkers.title) + .position(firstMarkers.position) + .icon(firstMarkers.icon) + .snippet(firstMarkers.snippet) + .draggable(false) + includeMarkers = ArrayList() + includeMarkers.add(firstMarkers) + } + + /** + * 添加marker + */ + fun addMarker(markerOptions: MarkerOptions) { + includeMarkers.add(markerOptions) // 添加到列表中 + } + + /** + * 设置聚合点的中心位置以及图标 + */ + fun setPositionAndIcon() { + val size = includeMarkers.size + var lat = 0.0 + var lng = 0.0 + // 一个的时候 + if (size == 1) { //设置marker单个属性 + // 设置marker位置 + options.position( + LatLng( + includeMarkers[0].position.latitude, + includeMarkers[0].position.longitude + ) + ) + } else { // 聚合的时候 + //设置marker聚合属性 + for (op in includeMarkers) { + lat += op.position.latitude + lng += op.position.longitude + } + // 设置marker的位置为中心位置为聚集点的平均位置 + options.position(LatLng(lat / size, lng / size)) + } + options.icon(BitmapDescriptorFactory.fromBitmap(getBitmap(size))) + } + + /** + * marker视图 + */ + @SuppressLint("SetTextI18n") + private fun getBitmap(num: Int): Bitmap? { + val view = LayoutInflater.from(context).inflate(R.layout.marker_gaode, null) + val wellCountView = view.findViewById(R.id.wellCountView) + return if (num > 1) { + wellCountView.visibility = View.VISIBLE + wellCountView.text = "${num}个" + wellCountView.gravity = Gravity.CENTER + view.toBitmap() + } else { + wellCountView.visibility = View.GONE + BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_order_un_determined.xml b/app/src/main/res/layout/fragment_order_un_determined.xml new file mode 100644 index 0000000..03ca071 --- /dev/null +++ b/app/src/main/res/layout/fragment_order_un_determined.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_order_undetermined.xml b/app/src/main/res/layout/fragment_order_undetermined.xml deleted file mode 100644 index 03ca071..0000000 --- a/app/src/main/res/layout/fragment_order_undetermined.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_over_time_un_accept.xml b/app/src/main/res/layout/fragment_over_time_un_accept.xml index 77d9ef6..c8454fb 100644 --- a/app/src/main/res/layout/fragment_over_time_un_accept.xml +++ b/app/src/main/res/layout/fragment_over_time_un_accept.xml @@ -1,6 +1,36 @@ - + android:layout_height="match_parent" + android:background="@color/mainBackColor" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt index cdff470..a22b719 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt @@ -1,7 +1,8 @@ package com.casic.app.smartwell.view.fragment +import android.graphics.Point +import android.location.Location import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,30 +11,46 @@ import androidx.recyclerview.widget.GridLayoutManager import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.* import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.HomeRecycleAdapter import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showRouteOnMap +import com.casic.app.smartwell.utils.Constant import com.casic.app.smartwell.view.OvertimeOrderActivity import com.casic.app.smartwell.view.WellManagementActivity import com.casic.app.smartwell.view.WellOperationActivity import com.casic.app.smartwell.vm.WellCountViewModel import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.google.gson.Gson +import com.casic.app.smartwell.widgets.GaoDeClusterMarkerView +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.include_base_title.view.* -class HomePageFragment : Fragment(), AMap.OnCameraChangeListener, AMap.OnMarkerClickListener { +class HomePageFragment : Fragment(), AMap.OnMyLocationChangeListener, AMap.OnCameraChangeListener, + AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { private lateinit var homeView: View private lateinit var wellCountViewModel: WellCountViewModel private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var wellListViewModel: WellListViewModel private lateinit var aMap: AMap - private val kTag = "HomePageFragment" + + //定位点经纬度 + private var location: LatLng? = null + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -51,8 +68,20 @@ wellListViewModel.obtainAllWell() wellListViewModel.listModel.observe(viewLifecycleOwner, { if (it.code == 200) { - val dataRows = it.data?.rows - Log.d(kTag, "onCreateView: ${Gson().toJson(dataRows)}") + it.data?.rows?.forEach { location -> + if (location.latGaode.toString().isNotBlank() + && location.lngGaode.toString().isNotBlank() + ) { + allMarkerOptions.add( + MarkerOptions().position( + LatLng( + location.latGaode!!.toDouble(), + location.lngGaode!!.toDouble() + ) + ).title(location.wellTypeName).snippet(location.wellName) + ) + } + } } }) @@ -109,27 +138,127 @@ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() + locationStyle.interval(5000) + //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER) locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 - locationStyle.interval(10 * 1000)////设置连续定位模式下的定位间隔,只在连续定位模式下生效。单位为毫秒 aMap.myLocationStyle = locationStyle aMap.isMyLocationEnabled = true - //注册地图缩放监听 + aMap.addOnMyLocationChangeListener(this) + // 地图缩放监听 aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) } - /***地图接口实现*********************************************************************************/ + override fun onMyLocationChange(p0: Location?) { + if (p0 != null) { + this.location = LatLng(p0.latitude, p0.longitude) + } + } + override fun onCameraChange(p0: CameraPosition?) { - Log.d(kTag, "onCameraChange: ") + } + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker override fun onCameraChangeFinish(p0: CameraPosition?) { -// resetMarks() - Log.d(kTag, "onCameraChangeFinish: ") + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + //在当前可观区域内 + markerOptionsInView.add(it) + } + } + // 自定义的聚合类MarkerCluster + val clustersMarkers: MutableList = ArrayList() + markerOptionsInView.forEach { + if (clustersMarkers.size == 0) { + //添加一个新的自定义marker + clustersMarkers.add(GaoDeClusterMarkerView(requireContext(), it, proj, 80))//相距多少才聚合 + } else { + var isInRange = false + //Kotlin foreach不能用break + for (view in clustersMarkers) { + //判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。 + if (view.bounds.contains(it.position)) { + view.addMarker(it) + isInRange = true + break + } + } + //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 + if (!isInRange) { + clustersMarkers.add( + GaoDeClusterMarkerView( + requireContext(), + it, proj, 80 + ) + )//相距多少才聚合 + } + } + } + // 设置聚合点的位置和icon + clustersMarkers.forEach { + it.setPositionAndIcon() + } + aMap.clear() + // 重新添加 marker + clustersMarkers.forEach { + aMap.addMarker(it.options) + } } - override fun onMarkerClick(p0: Marker?): Boolean { + override fun onMarkerClick(marker: Marker?): Boolean { + val clickedLatLng = marker?.position + if (location != null) { + //判断点击点是否是定位点 + val distance = AMapUtils.calculateLineDistance(location, clickedLatLng) + if (distance > Constant.DISTANCE) { + //显示闸井信息 + marker!!.showInfoWindow() + } else { + "该位置是定位点,请选择实际闸井点".show(requireContext()) + } + } + return true + } - return false + override fun onInfoWindowClick(p0: Marker?) { + if (p0 != null) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val latLng = p0.position + val lat = latLng.latitude.toString() + val lng = latLng.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "窨井经纬度异常,无法开启导航".show(requireContext()) + return + } + Poi(p0.snippet, LatLng(lat.toDouble(), lng.toDouble()), "").showRouteOnMap( + requireContext() + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } } /***以下是地图生命周期管理************************************************************************/ diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt index 7932e6a..3166bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt @@ -90,8 +90,11 @@ is LoadState.Success -> { DialogHelper.dismissLoadingDialog() "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) //通知列表刷行数据 - weakReferenceHandler!!.sendEmptyMessage(Constant.ORDER_TODO_OK) UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) } else -> { diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt deleted file mode 100644 index e7a664a..0000000 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.app.smartwell.view.fragment - -import com.casic.app.smartwell.R -import com.pengxh.app.multilib.base.BaseFragment - -class UnAcceptOrderFragment : BaseFragment() { - override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept - - override fun initData() { - - } - - override fun initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt index 8589260..6df8449 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt @@ -1,16 +1,146 @@ package com.casic.app.smartwell.view.fragment +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.WorkOrderListModel +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel import com.pengxh.app.multilib.base.BaseFragment +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference class UnHandleOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_handle override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(this) +// workOrderListViewModel = ViewModelProvider(this).get(WorkOrderListViewModel::class.java) +// workOrderDetailViewModel = ViewModelProvider(this).get(WorkOrderDetailViewModel::class.java) } override fun initEvent() { +// obtainWorkOrderList(pageIndex) +// workOrderListViewModel.resultModel.observe(this, { +// if (it.code == 200) { +// val dataRows = it.data?.rows +// when { +// isRefresh -> { +// dataBeans.clear() +// dataBeans = dataRows!! +// unHandleLayout.finishRefresh() +// isRefresh = false +// } +// isLoadMore -> { +// if (dataRows?.size == 0) { +// "到底了,别拉了".show(requireContext()) +// } +// dataBeans.addAll(dataRows!!) +// unHandleLayout.finishLoadMore() +// isLoadMore = false +// } +// else -> { +// dataBeans = dataRows!! +// } +// } +// weakReferenceHandler!!.sendEmptyMessage(2022040602) +// } +// }) +// +// unHandleLayout.setOnRefreshListener { +// isRefresh = true +// //刷新之后页码重置 +// pageIndex = 1 +// obtainWorkOrderList(pageIndex) +// } +// unHandleLayout.setOnLoadMoreListener { +// isLoadMore = true +// pageIndex++ +// obtainWorkOrderList(pageIndex) +// } +// +// workOrderDetailViewModel.detailModel.observe(this, { +// if (it.code == 200) { +// val orderDetail = it.data!![0] +// val orderFlow = orderDetail.flow!! +// if (orderFlow.size != 0) { +// TimeLineBottomSheet.Builder().setContext(requireContext()) +// .setFlowItems(orderFlow).build().show() +// } else { +// "抱歉,无法查到该工单的流转记录".show(requireContext()) +// } +// } +// }) + } + private fun obtainWorkOrderList(index: Int) { +// workOrderListViewModel.obtainWorkOrderListByState(jobStatus = "2", page = index) + } + + private class WeakReferenceHandler(fragment: UnHandleOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040602) { + if (fragment.isRefresh || fragment.isLoadMore) { +// fragment.inHandleAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() +// fragment.inHandleAdapter = InHandleOrderAdapter( +// fragment.requireContext(), +// fragment.dataBeans +// ) +// fragment.inHandleView!!.layoutManager = +// LinearLayoutManager(fragment.requireContext()) +// fragment.inHandleView!!.adapter = fragment.inHandleAdapter +// fragment.inHandleAdapter.setOnItemClickListener(object : +// InHandleOrderAdapter.OnItemClickListener { +// override fun onClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看详情".show(fragment.requireContext()) +// return +// } +// fragment.requireContext().navigatePageTo( +// InHandleDetailActivity::class.java, jobId +// ) +// } +// +// override fun onTransferViewClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看工单流转记录".show(fragment.requireContext()) +// return +// } +// fragment.workOrderDetailViewModel.obtainWorkOrderDetail(id = jobId) +// } +// }) + } + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt new file mode 100644 index 0000000..b7929b5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt @@ -0,0 +1,185 @@ +package com.casic.app.smartwell.view.fragment + +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.Constant +import com.casic.app.smartwell.utils.DialogHelper +import com.casic.app.smartwell.utils.LoadState +import com.casic.app.smartwell.view.TodoDetailActivity +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel +import com.pengxh.app.multilib.base.BaseFragment +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_over_time_un_accept.* +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference + +class UnacceptedOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 + + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this) + overtimeOderViewModel = ViewModelProvider(this).get(OvertimeOderListViewModel::class.java) + acceptOrderViewModel = ViewModelProvider(this).get(AcceptOrderViewModel::class.java) + } + + override fun initEvent() { + obtainWorkOrderList(pageIndex) + overtimeOderViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + unAcceptOrderLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + unAcceptOrderLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler!!.sendEmptyMessage(2022040601) + } + }) + + //接单状态处理 + acceptOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireContext(), "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) + //通知列表刷行数据 + UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) + } + else -> { + DialogHelper.dismissLoadingDialog() + "接单失败".show(requireContext()) + } + } + }) + + unAcceptOrderLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainWorkOrderList(pageIndex) + } + unAcceptOrderLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainWorkOrderList(pageIndex) + } + } + + private fun obtainWorkOrderList(index: Int) { + overtimeOderViewModel.obtainOvertimeOderList(jobStatus = "0", page = index) + } + + private class WeakReferenceHandler(fragment: UnacceptedOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040601) { + if (fragment.isRefresh || fragment.isLoadMore) { + fragment.overtimeOrderAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("您没有超时未处理的工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() + fragment.overtimeOrderAdapter = OvertimeOrderListAdapter( + fragment.requireContext(), + fragment.dataBeans + ) + fragment.unAcceptOrderView!!.layoutManager = + LinearLayoutManager(fragment.requireContext()) + fragment.unAcceptOrderView!!.adapter = fragment.overtimeOrderAdapter + fragment.overtimeOrderAdapter.setOnItemClickListener(object : + OvertimeOrderListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(fragment.requireContext()) + return + } + fragment.requireContext() + .navigatePageTo(TodoDetailActivity::class.java, jobId) + } + + override fun onOperationClicked(position: Int) { + //标记被点击的item位置 + fragment.clickedPosition = position + + AlertControlDialog.Builder() + .setContext(fragment.requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = + fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show(fragment.requireContext()) + return + } + fragment.acceptOrderViewModel.acceptWorkOrder(id = jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt index 9cbd4de..2f25190 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt @@ -18,7 +18,7 @@ import com.casic.app.smartwell.vm.WorkOrderListViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.app.multilib.base.BaseFragment -import kotlinx.android.synthetic.main.fragment_order_undetermined.* +import kotlinx.android.synthetic.main.fragment_order_un_determined.* import kotlinx.android.synthetic.main.include_empty_view.* import java.lang.ref.WeakReference @@ -43,7 +43,7 @@ } } - override fun initLayoutView(): Int = R.layout.fragment_order_undetermined + override fun initLayoutView(): Int = R.layout.fragment_order_un_determined override fun initData() { weakReferenceHandler = WeakReferenceHandler(this) diff --git a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt index 56a7af4..b7c87a1 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -10,13 +9,10 @@ class AuthenticateViewModel : BaseViewModel() { - private val kTag = "AuthenticateViewModel" val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading keyModel.value = RetrofitServiceManager.authenticate() - }, { - Log.d(kTag, "obtainPublicKey: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt index 3d2d37b..312d224 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class LoginOutViewModel : BaseViewModel() { - private val kTag = "LoginOutViewModel" val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() - }, { - Log.d(kTag, "loginOut: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt index 90eb8c9..03fff89 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class OrderStatusViewModel : BaseViewModel() { - private val kTag = "OrderStatusViewModel" val listModel = MutableLiveData() fun obtainOrderStatus() = launch({ listModel.value = RetrofitServiceManager.obtainOrderStatus() - }, { - Log.d(kTag, "obtainOrderStatus: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt new file mode 100644 index 0000000..a78cf59 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt @@ -0,0 +1,16 @@ +package com.casic.app.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.base.BaseViewModel +import com.casic.app.smartwell.extensions.launch +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager + +class OvertimeOderListViewModel : BaseViewModel() { + + val resultModel = MutableLiveData() + + fun obtainOvertimeOderList(jobStatus: String, page: Int) = launch({ + resultModel.value = RetrofitServiceManager.obtainOvertimeOderList(jobStatus, page) + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt index 9e29a84..18aff97 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -12,12 +11,9 @@ * */ class SubordinateViewModel : BaseViewModel() { - private val kTag = "SubordinateViewModel" val listModel = MutableLiveData() fun obtainSubordinate(hasMine: String?, roleTips: String?) = launch({ listModel.value = RetrofitServiceManager.obtainSubordinate(hasMine, roleTips) - }, { - Log.d(kTag, "obtainSubordinate: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt index 60389fa..c3b6b03 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt @@ -26,7 +26,5 @@ } else { Log.d(kTag, "obtainWellCountByState: 错误码===>${code}") } - }, { - Log.d(kTag, "obtainWellCountByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt index f86d7d5..494e5b5 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class WellTypeViewModel : BaseViewModel() { - private val kTag = "WellTypeViewModel" val wellTypeModel = MutableLiveData() fun obtainWellType() = launch({ wellTypeModel.value = RetrofitServiceManager.obtainWellType() - }, { - Log.d(kTag, "obtainWellType: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt index aa1df2c..2d8cbb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class WorkOrderListViewModel : BaseViewModel() { - private val kTag = "WorkOrderListViewModel" val resultModel = MutableLiveData() fun obtainWorkOrderListByState(jobStatus: String, page: Int) = launch({ resultModel.value = RetrofitServiceManager.obtainWorkOrderList(jobStatus, page) - }, { - Log.d(kTag, "obtainWorkOrderListByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt index a9ea8d3..7f0f016 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt @@ -27,7 +27,5 @@ } else { Log.d(kTag, "obtainWorkOrderCountByState: 错误码===>${code}") } - }, { - Log.d(kTag, "obtainWorkOrderCountByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt b/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt new file mode 100644 index 0000000..94980f1 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt @@ -0,0 +1,104 @@ +package com.casic.app.smartwell.widgets + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Point +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import com.amap.api.maps.Projection +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.LatLngBounds +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.extensions.toBitmap +import java.util.* + +class GaoDeClusterMarkerView( + private val context: Context, firstMarkers: MarkerOptions, + projection: Projection, gridSize: Int +) { + //当前可观区域里的 聚合过之后的集合 + private val includeMarkers: ArrayList + + // 创建区域 + val bounds: LatLngBounds + var options: MarkerOptions = MarkerOptions() + + init { + val screenLocation = projection.toScreenLocation(firstMarkers.position) + //范围类 + val southwestPoint = Point(screenLocation.x - gridSize, screenLocation.y + gridSize) + //范围类 + val northeastPoint = Point(screenLocation.x + gridSize, screenLocation.y - gridSize) + bounds = LatLngBounds( + projection.fromScreenLocation(southwestPoint), + projection.fromScreenLocation(northeastPoint) + ) + //设置初始化marker属性 + options.anchor(0.5f, 0.5f) + .title(firstMarkers.title) + .position(firstMarkers.position) + .icon(firstMarkers.icon) + .snippet(firstMarkers.snippet) + .draggable(false) + includeMarkers = ArrayList() + includeMarkers.add(firstMarkers) + } + + /** + * 添加marker + */ + fun addMarker(markerOptions: MarkerOptions) { + includeMarkers.add(markerOptions) // 添加到列表中 + } + + /** + * 设置聚合点的中心位置以及图标 + */ + fun setPositionAndIcon() { + val size = includeMarkers.size + var lat = 0.0 + var lng = 0.0 + // 一个的时候 + if (size == 1) { //设置marker单个属性 + // 设置marker位置 + options.position( + LatLng( + includeMarkers[0].position.latitude, + includeMarkers[0].position.longitude + ) + ) + } else { // 聚合的时候 + //设置marker聚合属性 + for (op in includeMarkers) { + lat += op.position.latitude + lng += op.position.longitude + } + // 设置marker的位置为中心位置为聚集点的平均位置 + options.position(LatLng(lat / size, lng / size)) + } + options.icon(BitmapDescriptorFactory.fromBitmap(getBitmap(size))) + } + + /** + * marker视图 + */ + @SuppressLint("SetTextI18n") + private fun getBitmap(num: Int): Bitmap? { + val view = LayoutInflater.from(context).inflate(R.layout.marker_gaode, null) + val wellCountView = view.findViewById(R.id.wellCountView) + return if (num > 1) { + wellCountView.visibility = View.VISIBLE + wellCountView.text = "${num}个" + wellCountView.gravity = Gravity.CENTER + view.toBitmap() + } else { + wellCountView.visibility = View.GONE + BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_order_un_determined.xml b/app/src/main/res/layout/fragment_order_un_determined.xml new file mode 100644 index 0000000..03ca071 --- /dev/null +++ b/app/src/main/res/layout/fragment_order_un_determined.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_order_undetermined.xml b/app/src/main/res/layout/fragment_order_undetermined.xml deleted file mode 100644 index 03ca071..0000000 --- a/app/src/main/res/layout/fragment_order_undetermined.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_over_time_un_accept.xml b/app/src/main/res/layout/fragment_over_time_un_accept.xml index 77d9ef6..c8454fb 100644 --- a/app/src/main/res/layout/fragment_over_time_un_accept.xml +++ b/app/src/main/res/layout/fragment_over_time_un_accept.xml @@ -1,6 +1,36 @@ - + android:layout_height="match_parent" + android:background="@color/mainBackColor" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_over_time_un_handle.xml b/app/src/main/res/layout/fragment_over_time_un_handle.xml index 77d9ef6..8b6527f 100644 --- a/app/src/main/res/layout/fragment_over_time_un_handle.xml +++ b/app/src/main/res/layout/fragment_over_time_un_handle.xml @@ -1,6 +1,36 @@ - + android:layout_height="match_parent" + android:background="@color/mainBackColor" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt index cdff470..a22b719 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt @@ -1,7 +1,8 @@ package com.casic.app.smartwell.view.fragment +import android.graphics.Point +import android.location.Location import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,30 +11,46 @@ import androidx.recyclerview.widget.GridLayoutManager import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.* import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.HomeRecycleAdapter import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showRouteOnMap +import com.casic.app.smartwell.utils.Constant import com.casic.app.smartwell.view.OvertimeOrderActivity import com.casic.app.smartwell.view.WellManagementActivity import com.casic.app.smartwell.view.WellOperationActivity import com.casic.app.smartwell.vm.WellCountViewModel import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.google.gson.Gson +import com.casic.app.smartwell.widgets.GaoDeClusterMarkerView +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.include_base_title.view.* -class HomePageFragment : Fragment(), AMap.OnCameraChangeListener, AMap.OnMarkerClickListener { +class HomePageFragment : Fragment(), AMap.OnMyLocationChangeListener, AMap.OnCameraChangeListener, + AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { private lateinit var homeView: View private lateinit var wellCountViewModel: WellCountViewModel private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var wellListViewModel: WellListViewModel private lateinit var aMap: AMap - private val kTag = "HomePageFragment" + + //定位点经纬度 + private var location: LatLng? = null + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -51,8 +68,20 @@ wellListViewModel.obtainAllWell() wellListViewModel.listModel.observe(viewLifecycleOwner, { if (it.code == 200) { - val dataRows = it.data?.rows - Log.d(kTag, "onCreateView: ${Gson().toJson(dataRows)}") + it.data?.rows?.forEach { location -> + if (location.latGaode.toString().isNotBlank() + && location.lngGaode.toString().isNotBlank() + ) { + allMarkerOptions.add( + MarkerOptions().position( + LatLng( + location.latGaode!!.toDouble(), + location.lngGaode!!.toDouble() + ) + ).title(location.wellTypeName).snippet(location.wellName) + ) + } + } } }) @@ -109,27 +138,127 @@ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() + locationStyle.interval(5000) + //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER) locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 - locationStyle.interval(10 * 1000)////设置连续定位模式下的定位间隔,只在连续定位模式下生效。单位为毫秒 aMap.myLocationStyle = locationStyle aMap.isMyLocationEnabled = true - //注册地图缩放监听 + aMap.addOnMyLocationChangeListener(this) + // 地图缩放监听 aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) } - /***地图接口实现*********************************************************************************/ + override fun onMyLocationChange(p0: Location?) { + if (p0 != null) { + this.location = LatLng(p0.latitude, p0.longitude) + } + } + override fun onCameraChange(p0: CameraPosition?) { - Log.d(kTag, "onCameraChange: ") + } + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker override fun onCameraChangeFinish(p0: CameraPosition?) { -// resetMarks() - Log.d(kTag, "onCameraChangeFinish: ") + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + //在当前可观区域内 + markerOptionsInView.add(it) + } + } + // 自定义的聚合类MarkerCluster + val clustersMarkers: MutableList = ArrayList() + markerOptionsInView.forEach { + if (clustersMarkers.size == 0) { + //添加一个新的自定义marker + clustersMarkers.add(GaoDeClusterMarkerView(requireContext(), it, proj, 80))//相距多少才聚合 + } else { + var isInRange = false + //Kotlin foreach不能用break + for (view in clustersMarkers) { + //判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。 + if (view.bounds.contains(it.position)) { + view.addMarker(it) + isInRange = true + break + } + } + //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 + if (!isInRange) { + clustersMarkers.add( + GaoDeClusterMarkerView( + requireContext(), + it, proj, 80 + ) + )//相距多少才聚合 + } + } + } + // 设置聚合点的位置和icon + clustersMarkers.forEach { + it.setPositionAndIcon() + } + aMap.clear() + // 重新添加 marker + clustersMarkers.forEach { + aMap.addMarker(it.options) + } } - override fun onMarkerClick(p0: Marker?): Boolean { + override fun onMarkerClick(marker: Marker?): Boolean { + val clickedLatLng = marker?.position + if (location != null) { + //判断点击点是否是定位点 + val distance = AMapUtils.calculateLineDistance(location, clickedLatLng) + if (distance > Constant.DISTANCE) { + //显示闸井信息 + marker!!.showInfoWindow() + } else { + "该位置是定位点,请选择实际闸井点".show(requireContext()) + } + } + return true + } - return false + override fun onInfoWindowClick(p0: Marker?) { + if (p0 != null) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val latLng = p0.position + val lat = latLng.latitude.toString() + val lng = latLng.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "窨井经纬度异常,无法开启导航".show(requireContext()) + return + } + Poi(p0.snippet, LatLng(lat.toDouble(), lng.toDouble()), "").showRouteOnMap( + requireContext() + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } } /***以下是地图生命周期管理************************************************************************/ diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt index 7932e6a..3166bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt @@ -90,8 +90,11 @@ is LoadState.Success -> { DialogHelper.dismissLoadingDialog() "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) //通知列表刷行数据 - weakReferenceHandler!!.sendEmptyMessage(Constant.ORDER_TODO_OK) UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) } else -> { diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt deleted file mode 100644 index e7a664a..0000000 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.app.smartwell.view.fragment - -import com.casic.app.smartwell.R -import com.pengxh.app.multilib.base.BaseFragment - -class UnAcceptOrderFragment : BaseFragment() { - override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept - - override fun initData() { - - } - - override fun initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt index 8589260..6df8449 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt @@ -1,16 +1,146 @@ package com.casic.app.smartwell.view.fragment +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.WorkOrderListModel +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel import com.pengxh.app.multilib.base.BaseFragment +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference class UnHandleOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_handle override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(this) +// workOrderListViewModel = ViewModelProvider(this).get(WorkOrderListViewModel::class.java) +// workOrderDetailViewModel = ViewModelProvider(this).get(WorkOrderDetailViewModel::class.java) } override fun initEvent() { +// obtainWorkOrderList(pageIndex) +// workOrderListViewModel.resultModel.observe(this, { +// if (it.code == 200) { +// val dataRows = it.data?.rows +// when { +// isRefresh -> { +// dataBeans.clear() +// dataBeans = dataRows!! +// unHandleLayout.finishRefresh() +// isRefresh = false +// } +// isLoadMore -> { +// if (dataRows?.size == 0) { +// "到底了,别拉了".show(requireContext()) +// } +// dataBeans.addAll(dataRows!!) +// unHandleLayout.finishLoadMore() +// isLoadMore = false +// } +// else -> { +// dataBeans = dataRows!! +// } +// } +// weakReferenceHandler!!.sendEmptyMessage(2022040602) +// } +// }) +// +// unHandleLayout.setOnRefreshListener { +// isRefresh = true +// //刷新之后页码重置 +// pageIndex = 1 +// obtainWorkOrderList(pageIndex) +// } +// unHandleLayout.setOnLoadMoreListener { +// isLoadMore = true +// pageIndex++ +// obtainWorkOrderList(pageIndex) +// } +// +// workOrderDetailViewModel.detailModel.observe(this, { +// if (it.code == 200) { +// val orderDetail = it.data!![0] +// val orderFlow = orderDetail.flow!! +// if (orderFlow.size != 0) { +// TimeLineBottomSheet.Builder().setContext(requireContext()) +// .setFlowItems(orderFlow).build().show() +// } else { +// "抱歉,无法查到该工单的流转记录".show(requireContext()) +// } +// } +// }) + } + private fun obtainWorkOrderList(index: Int) { +// workOrderListViewModel.obtainWorkOrderListByState(jobStatus = "2", page = index) + } + + private class WeakReferenceHandler(fragment: UnHandleOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040602) { + if (fragment.isRefresh || fragment.isLoadMore) { +// fragment.inHandleAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() +// fragment.inHandleAdapter = InHandleOrderAdapter( +// fragment.requireContext(), +// fragment.dataBeans +// ) +// fragment.inHandleView!!.layoutManager = +// LinearLayoutManager(fragment.requireContext()) +// fragment.inHandleView!!.adapter = fragment.inHandleAdapter +// fragment.inHandleAdapter.setOnItemClickListener(object : +// InHandleOrderAdapter.OnItemClickListener { +// override fun onClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看详情".show(fragment.requireContext()) +// return +// } +// fragment.requireContext().navigatePageTo( +// InHandleDetailActivity::class.java, jobId +// ) +// } +// +// override fun onTransferViewClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看工单流转记录".show(fragment.requireContext()) +// return +// } +// fragment.workOrderDetailViewModel.obtainWorkOrderDetail(id = jobId) +// } +// }) + } + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt new file mode 100644 index 0000000..b7929b5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt @@ -0,0 +1,185 @@ +package com.casic.app.smartwell.view.fragment + +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.Constant +import com.casic.app.smartwell.utils.DialogHelper +import com.casic.app.smartwell.utils.LoadState +import com.casic.app.smartwell.view.TodoDetailActivity +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel +import com.pengxh.app.multilib.base.BaseFragment +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_over_time_un_accept.* +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference + +class UnacceptedOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 + + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this) + overtimeOderViewModel = ViewModelProvider(this).get(OvertimeOderListViewModel::class.java) + acceptOrderViewModel = ViewModelProvider(this).get(AcceptOrderViewModel::class.java) + } + + override fun initEvent() { + obtainWorkOrderList(pageIndex) + overtimeOderViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + unAcceptOrderLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + unAcceptOrderLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler!!.sendEmptyMessage(2022040601) + } + }) + + //接单状态处理 + acceptOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireContext(), "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) + //通知列表刷行数据 + UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) + } + else -> { + DialogHelper.dismissLoadingDialog() + "接单失败".show(requireContext()) + } + } + }) + + unAcceptOrderLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainWorkOrderList(pageIndex) + } + unAcceptOrderLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainWorkOrderList(pageIndex) + } + } + + private fun obtainWorkOrderList(index: Int) { + overtimeOderViewModel.obtainOvertimeOderList(jobStatus = "0", page = index) + } + + private class WeakReferenceHandler(fragment: UnacceptedOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040601) { + if (fragment.isRefresh || fragment.isLoadMore) { + fragment.overtimeOrderAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("您没有超时未处理的工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() + fragment.overtimeOrderAdapter = OvertimeOrderListAdapter( + fragment.requireContext(), + fragment.dataBeans + ) + fragment.unAcceptOrderView!!.layoutManager = + LinearLayoutManager(fragment.requireContext()) + fragment.unAcceptOrderView!!.adapter = fragment.overtimeOrderAdapter + fragment.overtimeOrderAdapter.setOnItemClickListener(object : + OvertimeOrderListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(fragment.requireContext()) + return + } + fragment.requireContext() + .navigatePageTo(TodoDetailActivity::class.java, jobId) + } + + override fun onOperationClicked(position: Int) { + //标记被点击的item位置 + fragment.clickedPosition = position + + AlertControlDialog.Builder() + .setContext(fragment.requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = + fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show(fragment.requireContext()) + return + } + fragment.acceptOrderViewModel.acceptWorkOrder(id = jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt index 9cbd4de..2f25190 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt @@ -18,7 +18,7 @@ import com.casic.app.smartwell.vm.WorkOrderListViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.app.multilib.base.BaseFragment -import kotlinx.android.synthetic.main.fragment_order_undetermined.* +import kotlinx.android.synthetic.main.fragment_order_un_determined.* import kotlinx.android.synthetic.main.include_empty_view.* import java.lang.ref.WeakReference @@ -43,7 +43,7 @@ } } - override fun initLayoutView(): Int = R.layout.fragment_order_undetermined + override fun initLayoutView(): Int = R.layout.fragment_order_un_determined override fun initData() { weakReferenceHandler = WeakReferenceHandler(this) diff --git a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt index 56a7af4..b7c87a1 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -10,13 +9,10 @@ class AuthenticateViewModel : BaseViewModel() { - private val kTag = "AuthenticateViewModel" val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading keyModel.value = RetrofitServiceManager.authenticate() - }, { - Log.d(kTag, "obtainPublicKey: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt index 3d2d37b..312d224 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class LoginOutViewModel : BaseViewModel() { - private val kTag = "LoginOutViewModel" val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() - }, { - Log.d(kTag, "loginOut: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt index 90eb8c9..03fff89 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class OrderStatusViewModel : BaseViewModel() { - private val kTag = "OrderStatusViewModel" val listModel = MutableLiveData() fun obtainOrderStatus() = launch({ listModel.value = RetrofitServiceManager.obtainOrderStatus() - }, { - Log.d(kTag, "obtainOrderStatus: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt new file mode 100644 index 0000000..a78cf59 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt @@ -0,0 +1,16 @@ +package com.casic.app.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.base.BaseViewModel +import com.casic.app.smartwell.extensions.launch +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager + +class OvertimeOderListViewModel : BaseViewModel() { + + val resultModel = MutableLiveData() + + fun obtainOvertimeOderList(jobStatus: String, page: Int) = launch({ + resultModel.value = RetrofitServiceManager.obtainOvertimeOderList(jobStatus, page) + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt index 9e29a84..18aff97 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -12,12 +11,9 @@ * */ class SubordinateViewModel : BaseViewModel() { - private val kTag = "SubordinateViewModel" val listModel = MutableLiveData() fun obtainSubordinate(hasMine: String?, roleTips: String?) = launch({ listModel.value = RetrofitServiceManager.obtainSubordinate(hasMine, roleTips) - }, { - Log.d(kTag, "obtainSubordinate: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt index 60389fa..c3b6b03 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt @@ -26,7 +26,5 @@ } else { Log.d(kTag, "obtainWellCountByState: 错误码===>${code}") } - }, { - Log.d(kTag, "obtainWellCountByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt index f86d7d5..494e5b5 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class WellTypeViewModel : BaseViewModel() { - private val kTag = "WellTypeViewModel" val wellTypeModel = MutableLiveData() fun obtainWellType() = launch({ wellTypeModel.value = RetrofitServiceManager.obtainWellType() - }, { - Log.d(kTag, "obtainWellType: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt index aa1df2c..2d8cbb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class WorkOrderListViewModel : BaseViewModel() { - private val kTag = "WorkOrderListViewModel" val resultModel = MutableLiveData() fun obtainWorkOrderListByState(jobStatus: String, page: Int) = launch({ resultModel.value = RetrofitServiceManager.obtainWorkOrderList(jobStatus, page) - }, { - Log.d(kTag, "obtainWorkOrderListByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt index a9ea8d3..7f0f016 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt @@ -27,7 +27,5 @@ } else { Log.d(kTag, "obtainWorkOrderCountByState: 错误码===>${code}") } - }, { - Log.d(kTag, "obtainWorkOrderCountByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt b/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt new file mode 100644 index 0000000..94980f1 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt @@ -0,0 +1,104 @@ +package com.casic.app.smartwell.widgets + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Point +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import com.amap.api.maps.Projection +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.LatLngBounds +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.extensions.toBitmap +import java.util.* + +class GaoDeClusterMarkerView( + private val context: Context, firstMarkers: MarkerOptions, + projection: Projection, gridSize: Int +) { + //当前可观区域里的 聚合过之后的集合 + private val includeMarkers: ArrayList + + // 创建区域 + val bounds: LatLngBounds + var options: MarkerOptions = MarkerOptions() + + init { + val screenLocation = projection.toScreenLocation(firstMarkers.position) + //范围类 + val southwestPoint = Point(screenLocation.x - gridSize, screenLocation.y + gridSize) + //范围类 + val northeastPoint = Point(screenLocation.x + gridSize, screenLocation.y - gridSize) + bounds = LatLngBounds( + projection.fromScreenLocation(southwestPoint), + projection.fromScreenLocation(northeastPoint) + ) + //设置初始化marker属性 + options.anchor(0.5f, 0.5f) + .title(firstMarkers.title) + .position(firstMarkers.position) + .icon(firstMarkers.icon) + .snippet(firstMarkers.snippet) + .draggable(false) + includeMarkers = ArrayList() + includeMarkers.add(firstMarkers) + } + + /** + * 添加marker + */ + fun addMarker(markerOptions: MarkerOptions) { + includeMarkers.add(markerOptions) // 添加到列表中 + } + + /** + * 设置聚合点的中心位置以及图标 + */ + fun setPositionAndIcon() { + val size = includeMarkers.size + var lat = 0.0 + var lng = 0.0 + // 一个的时候 + if (size == 1) { //设置marker单个属性 + // 设置marker位置 + options.position( + LatLng( + includeMarkers[0].position.latitude, + includeMarkers[0].position.longitude + ) + ) + } else { // 聚合的时候 + //设置marker聚合属性 + for (op in includeMarkers) { + lat += op.position.latitude + lng += op.position.longitude + } + // 设置marker的位置为中心位置为聚集点的平均位置 + options.position(LatLng(lat / size, lng / size)) + } + options.icon(BitmapDescriptorFactory.fromBitmap(getBitmap(size))) + } + + /** + * marker视图 + */ + @SuppressLint("SetTextI18n") + private fun getBitmap(num: Int): Bitmap? { + val view = LayoutInflater.from(context).inflate(R.layout.marker_gaode, null) + val wellCountView = view.findViewById(R.id.wellCountView) + return if (num > 1) { + wellCountView.visibility = View.VISIBLE + wellCountView.text = "${num}个" + wellCountView.gravity = Gravity.CENTER + view.toBitmap() + } else { + wellCountView.visibility = View.GONE + BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_order_un_determined.xml b/app/src/main/res/layout/fragment_order_un_determined.xml new file mode 100644 index 0000000..03ca071 --- /dev/null +++ b/app/src/main/res/layout/fragment_order_un_determined.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_order_undetermined.xml b/app/src/main/res/layout/fragment_order_undetermined.xml deleted file mode 100644 index 03ca071..0000000 --- a/app/src/main/res/layout/fragment_order_undetermined.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_over_time_un_accept.xml b/app/src/main/res/layout/fragment_over_time_un_accept.xml index 77d9ef6..c8454fb 100644 --- a/app/src/main/res/layout/fragment_over_time_un_accept.xml +++ b/app/src/main/res/layout/fragment_over_time_un_accept.xml @@ -1,6 +1,36 @@ - + android:layout_height="match_parent" + android:background="@color/mainBackColor" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_over_time_un_handle.xml b/app/src/main/res/layout/fragment_over_time_un_handle.xml index 77d9ef6..8b6527f 100644 --- a/app/src/main/res/layout/fragment_over_time_un_handle.xml +++ b/app/src/main/res/layout/fragment_over_time_un_handle.xml @@ -1,6 +1,36 @@ - + android:layout_height="match_parent" + android:background="@color/mainBackColor" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_order_unaccept_recycleview.xml b/app/src/main/res/layout/item_order_unaccept_recycleview.xml new file mode 100644 index 0000000..cef7f1c --- /dev/null +++ b/app/src/main/res/layout/item_order_unaccept_recycleview.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt index cdff470..a22b719 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt @@ -1,7 +1,8 @@ package com.casic.app.smartwell.view.fragment +import android.graphics.Point +import android.location.Location import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,30 +11,46 @@ import androidx.recyclerview.widget.GridLayoutManager import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.* import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.HomeRecycleAdapter import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showRouteOnMap +import com.casic.app.smartwell.utils.Constant import com.casic.app.smartwell.view.OvertimeOrderActivity import com.casic.app.smartwell.view.WellManagementActivity import com.casic.app.smartwell.view.WellOperationActivity import com.casic.app.smartwell.vm.WellCountViewModel import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.google.gson.Gson +import com.casic.app.smartwell.widgets.GaoDeClusterMarkerView +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.include_base_title.view.* -class HomePageFragment : Fragment(), AMap.OnCameraChangeListener, AMap.OnMarkerClickListener { +class HomePageFragment : Fragment(), AMap.OnMyLocationChangeListener, AMap.OnCameraChangeListener, + AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { private lateinit var homeView: View private lateinit var wellCountViewModel: WellCountViewModel private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var wellListViewModel: WellListViewModel private lateinit var aMap: AMap - private val kTag = "HomePageFragment" + + //定位点经纬度 + private var location: LatLng? = null + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -51,8 +68,20 @@ wellListViewModel.obtainAllWell() wellListViewModel.listModel.observe(viewLifecycleOwner, { if (it.code == 200) { - val dataRows = it.data?.rows - Log.d(kTag, "onCreateView: ${Gson().toJson(dataRows)}") + it.data?.rows?.forEach { location -> + if (location.latGaode.toString().isNotBlank() + && location.lngGaode.toString().isNotBlank() + ) { + allMarkerOptions.add( + MarkerOptions().position( + LatLng( + location.latGaode!!.toDouble(), + location.lngGaode!!.toDouble() + ) + ).title(location.wellTypeName).snippet(location.wellName) + ) + } + } } }) @@ -109,27 +138,127 @@ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() + locationStyle.interval(5000) + //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER) locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 - locationStyle.interval(10 * 1000)////设置连续定位模式下的定位间隔,只在连续定位模式下生效。单位为毫秒 aMap.myLocationStyle = locationStyle aMap.isMyLocationEnabled = true - //注册地图缩放监听 + aMap.addOnMyLocationChangeListener(this) + // 地图缩放监听 aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) } - /***地图接口实现*********************************************************************************/ + override fun onMyLocationChange(p0: Location?) { + if (p0 != null) { + this.location = LatLng(p0.latitude, p0.longitude) + } + } + override fun onCameraChange(p0: CameraPosition?) { - Log.d(kTag, "onCameraChange: ") + } + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker override fun onCameraChangeFinish(p0: CameraPosition?) { -// resetMarks() - Log.d(kTag, "onCameraChangeFinish: ") + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + //在当前可观区域内 + markerOptionsInView.add(it) + } + } + // 自定义的聚合类MarkerCluster + val clustersMarkers: MutableList = ArrayList() + markerOptionsInView.forEach { + if (clustersMarkers.size == 0) { + //添加一个新的自定义marker + clustersMarkers.add(GaoDeClusterMarkerView(requireContext(), it, proj, 80))//相距多少才聚合 + } else { + var isInRange = false + //Kotlin foreach不能用break + for (view in clustersMarkers) { + //判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。 + if (view.bounds.contains(it.position)) { + view.addMarker(it) + isInRange = true + break + } + } + //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 + if (!isInRange) { + clustersMarkers.add( + GaoDeClusterMarkerView( + requireContext(), + it, proj, 80 + ) + )//相距多少才聚合 + } + } + } + // 设置聚合点的位置和icon + clustersMarkers.forEach { + it.setPositionAndIcon() + } + aMap.clear() + // 重新添加 marker + clustersMarkers.forEach { + aMap.addMarker(it.options) + } } - override fun onMarkerClick(p0: Marker?): Boolean { + override fun onMarkerClick(marker: Marker?): Boolean { + val clickedLatLng = marker?.position + if (location != null) { + //判断点击点是否是定位点 + val distance = AMapUtils.calculateLineDistance(location, clickedLatLng) + if (distance > Constant.DISTANCE) { + //显示闸井信息 + marker!!.showInfoWindow() + } else { + "该位置是定位点,请选择实际闸井点".show(requireContext()) + } + } + return true + } - return false + override fun onInfoWindowClick(p0: Marker?) { + if (p0 != null) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val latLng = p0.position + val lat = latLng.latitude.toString() + val lng = latLng.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "窨井经纬度异常,无法开启导航".show(requireContext()) + return + } + Poi(p0.snippet, LatLng(lat.toDouble(), lng.toDouble()), "").showRouteOnMap( + requireContext() + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } } /***以下是地图生命周期管理************************************************************************/ diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt index 7932e6a..3166bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt @@ -90,8 +90,11 @@ is LoadState.Success -> { DialogHelper.dismissLoadingDialog() "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) //通知列表刷行数据 - weakReferenceHandler!!.sendEmptyMessage(Constant.ORDER_TODO_OK) UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) } else -> { diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt deleted file mode 100644 index e7a664a..0000000 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.app.smartwell.view.fragment - -import com.casic.app.smartwell.R -import com.pengxh.app.multilib.base.BaseFragment - -class UnAcceptOrderFragment : BaseFragment() { - override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept - - override fun initData() { - - } - - override fun initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt index 8589260..6df8449 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt @@ -1,16 +1,146 @@ package com.casic.app.smartwell.view.fragment +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.WorkOrderListModel +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel import com.pengxh.app.multilib.base.BaseFragment +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference class UnHandleOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_handle override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(this) +// workOrderListViewModel = ViewModelProvider(this).get(WorkOrderListViewModel::class.java) +// workOrderDetailViewModel = ViewModelProvider(this).get(WorkOrderDetailViewModel::class.java) } override fun initEvent() { +// obtainWorkOrderList(pageIndex) +// workOrderListViewModel.resultModel.observe(this, { +// if (it.code == 200) { +// val dataRows = it.data?.rows +// when { +// isRefresh -> { +// dataBeans.clear() +// dataBeans = dataRows!! +// unHandleLayout.finishRefresh() +// isRefresh = false +// } +// isLoadMore -> { +// if (dataRows?.size == 0) { +// "到底了,别拉了".show(requireContext()) +// } +// dataBeans.addAll(dataRows!!) +// unHandleLayout.finishLoadMore() +// isLoadMore = false +// } +// else -> { +// dataBeans = dataRows!! +// } +// } +// weakReferenceHandler!!.sendEmptyMessage(2022040602) +// } +// }) +// +// unHandleLayout.setOnRefreshListener { +// isRefresh = true +// //刷新之后页码重置 +// pageIndex = 1 +// obtainWorkOrderList(pageIndex) +// } +// unHandleLayout.setOnLoadMoreListener { +// isLoadMore = true +// pageIndex++ +// obtainWorkOrderList(pageIndex) +// } +// +// workOrderDetailViewModel.detailModel.observe(this, { +// if (it.code == 200) { +// val orderDetail = it.data!![0] +// val orderFlow = orderDetail.flow!! +// if (orderFlow.size != 0) { +// TimeLineBottomSheet.Builder().setContext(requireContext()) +// .setFlowItems(orderFlow).build().show() +// } else { +// "抱歉,无法查到该工单的流转记录".show(requireContext()) +// } +// } +// }) + } + private fun obtainWorkOrderList(index: Int) { +// workOrderListViewModel.obtainWorkOrderListByState(jobStatus = "2", page = index) + } + + private class WeakReferenceHandler(fragment: UnHandleOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040602) { + if (fragment.isRefresh || fragment.isLoadMore) { +// fragment.inHandleAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() +// fragment.inHandleAdapter = InHandleOrderAdapter( +// fragment.requireContext(), +// fragment.dataBeans +// ) +// fragment.inHandleView!!.layoutManager = +// LinearLayoutManager(fragment.requireContext()) +// fragment.inHandleView!!.adapter = fragment.inHandleAdapter +// fragment.inHandleAdapter.setOnItemClickListener(object : +// InHandleOrderAdapter.OnItemClickListener { +// override fun onClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看详情".show(fragment.requireContext()) +// return +// } +// fragment.requireContext().navigatePageTo( +// InHandleDetailActivity::class.java, jobId +// ) +// } +// +// override fun onTransferViewClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看工单流转记录".show(fragment.requireContext()) +// return +// } +// fragment.workOrderDetailViewModel.obtainWorkOrderDetail(id = jobId) +// } +// }) + } + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt new file mode 100644 index 0000000..b7929b5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt @@ -0,0 +1,185 @@ +package com.casic.app.smartwell.view.fragment + +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.Constant +import com.casic.app.smartwell.utils.DialogHelper +import com.casic.app.smartwell.utils.LoadState +import com.casic.app.smartwell.view.TodoDetailActivity +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel +import com.pengxh.app.multilib.base.BaseFragment +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_over_time_un_accept.* +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference + +class UnacceptedOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 + + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this) + overtimeOderViewModel = ViewModelProvider(this).get(OvertimeOderListViewModel::class.java) + acceptOrderViewModel = ViewModelProvider(this).get(AcceptOrderViewModel::class.java) + } + + override fun initEvent() { + obtainWorkOrderList(pageIndex) + overtimeOderViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + unAcceptOrderLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + unAcceptOrderLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler!!.sendEmptyMessage(2022040601) + } + }) + + //接单状态处理 + acceptOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireContext(), "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) + //通知列表刷行数据 + UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) + } + else -> { + DialogHelper.dismissLoadingDialog() + "接单失败".show(requireContext()) + } + } + }) + + unAcceptOrderLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainWorkOrderList(pageIndex) + } + unAcceptOrderLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainWorkOrderList(pageIndex) + } + } + + private fun obtainWorkOrderList(index: Int) { + overtimeOderViewModel.obtainOvertimeOderList(jobStatus = "0", page = index) + } + + private class WeakReferenceHandler(fragment: UnacceptedOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040601) { + if (fragment.isRefresh || fragment.isLoadMore) { + fragment.overtimeOrderAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("您没有超时未处理的工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() + fragment.overtimeOrderAdapter = OvertimeOrderListAdapter( + fragment.requireContext(), + fragment.dataBeans + ) + fragment.unAcceptOrderView!!.layoutManager = + LinearLayoutManager(fragment.requireContext()) + fragment.unAcceptOrderView!!.adapter = fragment.overtimeOrderAdapter + fragment.overtimeOrderAdapter.setOnItemClickListener(object : + OvertimeOrderListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(fragment.requireContext()) + return + } + fragment.requireContext() + .navigatePageTo(TodoDetailActivity::class.java, jobId) + } + + override fun onOperationClicked(position: Int) { + //标记被点击的item位置 + fragment.clickedPosition = position + + AlertControlDialog.Builder() + .setContext(fragment.requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = + fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show(fragment.requireContext()) + return + } + fragment.acceptOrderViewModel.acceptWorkOrder(id = jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt index 9cbd4de..2f25190 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt @@ -18,7 +18,7 @@ import com.casic.app.smartwell.vm.WorkOrderListViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.app.multilib.base.BaseFragment -import kotlinx.android.synthetic.main.fragment_order_undetermined.* +import kotlinx.android.synthetic.main.fragment_order_un_determined.* import kotlinx.android.synthetic.main.include_empty_view.* import java.lang.ref.WeakReference @@ -43,7 +43,7 @@ } } - override fun initLayoutView(): Int = R.layout.fragment_order_undetermined + override fun initLayoutView(): Int = R.layout.fragment_order_un_determined override fun initData() { weakReferenceHandler = WeakReferenceHandler(this) diff --git a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt index 56a7af4..b7c87a1 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -10,13 +9,10 @@ class AuthenticateViewModel : BaseViewModel() { - private val kTag = "AuthenticateViewModel" val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading keyModel.value = RetrofitServiceManager.authenticate() - }, { - Log.d(kTag, "obtainPublicKey: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt index 3d2d37b..312d224 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class LoginOutViewModel : BaseViewModel() { - private val kTag = "LoginOutViewModel" val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() - }, { - Log.d(kTag, "loginOut: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt index 90eb8c9..03fff89 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class OrderStatusViewModel : BaseViewModel() { - private val kTag = "OrderStatusViewModel" val listModel = MutableLiveData() fun obtainOrderStatus() = launch({ listModel.value = RetrofitServiceManager.obtainOrderStatus() - }, { - Log.d(kTag, "obtainOrderStatus: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt new file mode 100644 index 0000000..a78cf59 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt @@ -0,0 +1,16 @@ +package com.casic.app.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.base.BaseViewModel +import com.casic.app.smartwell.extensions.launch +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager + +class OvertimeOderListViewModel : BaseViewModel() { + + val resultModel = MutableLiveData() + + fun obtainOvertimeOderList(jobStatus: String, page: Int) = launch({ + resultModel.value = RetrofitServiceManager.obtainOvertimeOderList(jobStatus, page) + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt index 9e29a84..18aff97 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -12,12 +11,9 @@ * */ class SubordinateViewModel : BaseViewModel() { - private val kTag = "SubordinateViewModel" val listModel = MutableLiveData() fun obtainSubordinate(hasMine: String?, roleTips: String?) = launch({ listModel.value = RetrofitServiceManager.obtainSubordinate(hasMine, roleTips) - }, { - Log.d(kTag, "obtainSubordinate: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt index 60389fa..c3b6b03 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt @@ -26,7 +26,5 @@ } else { Log.d(kTag, "obtainWellCountByState: 错误码===>${code}") } - }, { - Log.d(kTag, "obtainWellCountByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt index f86d7d5..494e5b5 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class WellTypeViewModel : BaseViewModel() { - private val kTag = "WellTypeViewModel" val wellTypeModel = MutableLiveData() fun obtainWellType() = launch({ wellTypeModel.value = RetrofitServiceManager.obtainWellType() - }, { - Log.d(kTag, "obtainWellType: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt index aa1df2c..2d8cbb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class WorkOrderListViewModel : BaseViewModel() { - private val kTag = "WorkOrderListViewModel" val resultModel = MutableLiveData() fun obtainWorkOrderListByState(jobStatus: String, page: Int) = launch({ resultModel.value = RetrofitServiceManager.obtainWorkOrderList(jobStatus, page) - }, { - Log.d(kTag, "obtainWorkOrderListByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt index a9ea8d3..7f0f016 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt @@ -27,7 +27,5 @@ } else { Log.d(kTag, "obtainWorkOrderCountByState: 错误码===>${code}") } - }, { - Log.d(kTag, "obtainWorkOrderCountByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt b/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt new file mode 100644 index 0000000..94980f1 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt @@ -0,0 +1,104 @@ +package com.casic.app.smartwell.widgets + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Point +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import com.amap.api.maps.Projection +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.LatLngBounds +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.extensions.toBitmap +import java.util.* + +class GaoDeClusterMarkerView( + private val context: Context, firstMarkers: MarkerOptions, + projection: Projection, gridSize: Int +) { + //当前可观区域里的 聚合过之后的集合 + private val includeMarkers: ArrayList + + // 创建区域 + val bounds: LatLngBounds + var options: MarkerOptions = MarkerOptions() + + init { + val screenLocation = projection.toScreenLocation(firstMarkers.position) + //范围类 + val southwestPoint = Point(screenLocation.x - gridSize, screenLocation.y + gridSize) + //范围类 + val northeastPoint = Point(screenLocation.x + gridSize, screenLocation.y - gridSize) + bounds = LatLngBounds( + projection.fromScreenLocation(southwestPoint), + projection.fromScreenLocation(northeastPoint) + ) + //设置初始化marker属性 + options.anchor(0.5f, 0.5f) + .title(firstMarkers.title) + .position(firstMarkers.position) + .icon(firstMarkers.icon) + .snippet(firstMarkers.snippet) + .draggable(false) + includeMarkers = ArrayList() + includeMarkers.add(firstMarkers) + } + + /** + * 添加marker + */ + fun addMarker(markerOptions: MarkerOptions) { + includeMarkers.add(markerOptions) // 添加到列表中 + } + + /** + * 设置聚合点的中心位置以及图标 + */ + fun setPositionAndIcon() { + val size = includeMarkers.size + var lat = 0.0 + var lng = 0.0 + // 一个的时候 + if (size == 1) { //设置marker单个属性 + // 设置marker位置 + options.position( + LatLng( + includeMarkers[0].position.latitude, + includeMarkers[0].position.longitude + ) + ) + } else { // 聚合的时候 + //设置marker聚合属性 + for (op in includeMarkers) { + lat += op.position.latitude + lng += op.position.longitude + } + // 设置marker的位置为中心位置为聚集点的平均位置 + options.position(LatLng(lat / size, lng / size)) + } + options.icon(BitmapDescriptorFactory.fromBitmap(getBitmap(size))) + } + + /** + * marker视图 + */ + @SuppressLint("SetTextI18n") + private fun getBitmap(num: Int): Bitmap? { + val view = LayoutInflater.from(context).inflate(R.layout.marker_gaode, null) + val wellCountView = view.findViewById(R.id.wellCountView) + return if (num > 1) { + wellCountView.visibility = View.VISIBLE + wellCountView.text = "${num}个" + wellCountView.gravity = Gravity.CENTER + view.toBitmap() + } else { + wellCountView.visibility = View.GONE + BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_order_un_determined.xml b/app/src/main/res/layout/fragment_order_un_determined.xml new file mode 100644 index 0000000..03ca071 --- /dev/null +++ b/app/src/main/res/layout/fragment_order_un_determined.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_order_undetermined.xml b/app/src/main/res/layout/fragment_order_undetermined.xml deleted file mode 100644 index 03ca071..0000000 --- a/app/src/main/res/layout/fragment_order_undetermined.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_over_time_un_accept.xml b/app/src/main/res/layout/fragment_over_time_un_accept.xml index 77d9ef6..c8454fb 100644 --- a/app/src/main/res/layout/fragment_over_time_un_accept.xml +++ b/app/src/main/res/layout/fragment_over_time_un_accept.xml @@ -1,6 +1,36 @@ - + android:layout_height="match_parent" + android:background="@color/mainBackColor" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_over_time_un_handle.xml b/app/src/main/res/layout/fragment_over_time_un_handle.xml index 77d9ef6..8b6527f 100644 --- a/app/src/main/res/layout/fragment_over_time_un_handle.xml +++ b/app/src/main/res/layout/fragment_over_time_un_handle.xml @@ -1,6 +1,36 @@ - + android:layout_height="match_parent" + android:background="@color/mainBackColor" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_order_unaccept_recycleview.xml b/app/src/main/res/layout/item_order_unaccept_recycleview.xml new file mode 100644 index 0000000..cef7f1c --- /dev/null +++ b/app/src/main/res/layout/item_order_unaccept_recycleview.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/marker_gaode.xml b/app/src/main/res/layout/marker_gaode.xml new file mode 100644 index 0000000..6dafa1b --- /dev/null +++ b/app/src/main/res/layout/marker_gaode.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt index cdff470..a22b719 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt @@ -1,7 +1,8 @@ package com.casic.app.smartwell.view.fragment +import android.graphics.Point +import android.location.Location import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,30 +11,46 @@ import androidx.recyclerview.widget.GridLayoutManager import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.* import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.HomeRecycleAdapter import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showRouteOnMap +import com.casic.app.smartwell.utils.Constant import com.casic.app.smartwell.view.OvertimeOrderActivity import com.casic.app.smartwell.view.WellManagementActivity import com.casic.app.smartwell.view.WellOperationActivity import com.casic.app.smartwell.vm.WellCountViewModel import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.google.gson.Gson +import com.casic.app.smartwell.widgets.GaoDeClusterMarkerView +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.include_base_title.view.* -class HomePageFragment : Fragment(), AMap.OnCameraChangeListener, AMap.OnMarkerClickListener { +class HomePageFragment : Fragment(), AMap.OnMyLocationChangeListener, AMap.OnCameraChangeListener, + AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { private lateinit var homeView: View private lateinit var wellCountViewModel: WellCountViewModel private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var wellListViewModel: WellListViewModel private lateinit var aMap: AMap - private val kTag = "HomePageFragment" + + //定位点经纬度 + private var location: LatLng? = null + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -51,8 +68,20 @@ wellListViewModel.obtainAllWell() wellListViewModel.listModel.observe(viewLifecycleOwner, { if (it.code == 200) { - val dataRows = it.data?.rows - Log.d(kTag, "onCreateView: ${Gson().toJson(dataRows)}") + it.data?.rows?.forEach { location -> + if (location.latGaode.toString().isNotBlank() + && location.lngGaode.toString().isNotBlank() + ) { + allMarkerOptions.add( + MarkerOptions().position( + LatLng( + location.latGaode!!.toDouble(), + location.lngGaode!!.toDouble() + ) + ).title(location.wellTypeName).snippet(location.wellName) + ) + } + } } }) @@ -109,27 +138,127 @@ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() + locationStyle.interval(5000) + //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER) locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 - locationStyle.interval(10 * 1000)////设置连续定位模式下的定位间隔,只在连续定位模式下生效。单位为毫秒 aMap.myLocationStyle = locationStyle aMap.isMyLocationEnabled = true - //注册地图缩放监听 + aMap.addOnMyLocationChangeListener(this) + // 地图缩放监听 aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) } - /***地图接口实现*********************************************************************************/ + override fun onMyLocationChange(p0: Location?) { + if (p0 != null) { + this.location = LatLng(p0.latitude, p0.longitude) + } + } + override fun onCameraChange(p0: CameraPosition?) { - Log.d(kTag, "onCameraChange: ") + } + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker override fun onCameraChangeFinish(p0: CameraPosition?) { -// resetMarks() - Log.d(kTag, "onCameraChangeFinish: ") + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + //在当前可观区域内 + markerOptionsInView.add(it) + } + } + // 自定义的聚合类MarkerCluster + val clustersMarkers: MutableList = ArrayList() + markerOptionsInView.forEach { + if (clustersMarkers.size == 0) { + //添加一个新的自定义marker + clustersMarkers.add(GaoDeClusterMarkerView(requireContext(), it, proj, 80))//相距多少才聚合 + } else { + var isInRange = false + //Kotlin foreach不能用break + for (view in clustersMarkers) { + //判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。 + if (view.bounds.contains(it.position)) { + view.addMarker(it) + isInRange = true + break + } + } + //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 + if (!isInRange) { + clustersMarkers.add( + GaoDeClusterMarkerView( + requireContext(), + it, proj, 80 + ) + )//相距多少才聚合 + } + } + } + // 设置聚合点的位置和icon + clustersMarkers.forEach { + it.setPositionAndIcon() + } + aMap.clear() + // 重新添加 marker + clustersMarkers.forEach { + aMap.addMarker(it.options) + } } - override fun onMarkerClick(p0: Marker?): Boolean { + override fun onMarkerClick(marker: Marker?): Boolean { + val clickedLatLng = marker?.position + if (location != null) { + //判断点击点是否是定位点 + val distance = AMapUtils.calculateLineDistance(location, clickedLatLng) + if (distance > Constant.DISTANCE) { + //显示闸井信息 + marker!!.showInfoWindow() + } else { + "该位置是定位点,请选择实际闸井点".show(requireContext()) + } + } + return true + } - return false + override fun onInfoWindowClick(p0: Marker?) { + if (p0 != null) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val latLng = p0.position + val lat = latLng.latitude.toString() + val lng = latLng.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "窨井经纬度异常,无法开启导航".show(requireContext()) + return + } + Poi(p0.snippet, LatLng(lat.toDouble(), lng.toDouble()), "").showRouteOnMap( + requireContext() + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } } /***以下是地图生命周期管理************************************************************************/ diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt index 7932e6a..3166bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt @@ -90,8 +90,11 @@ is LoadState.Success -> { DialogHelper.dismissLoadingDialog() "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) //通知列表刷行数据 - weakReferenceHandler!!.sendEmptyMessage(Constant.ORDER_TODO_OK) UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) } else -> { diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt deleted file mode 100644 index e7a664a..0000000 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.app.smartwell.view.fragment - -import com.casic.app.smartwell.R -import com.pengxh.app.multilib.base.BaseFragment - -class UnAcceptOrderFragment : BaseFragment() { - override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept - - override fun initData() { - - } - - override fun initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt index 8589260..6df8449 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt @@ -1,16 +1,146 @@ package com.casic.app.smartwell.view.fragment +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.WorkOrderListModel +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel import com.pengxh.app.multilib.base.BaseFragment +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference class UnHandleOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_handle override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(this) +// workOrderListViewModel = ViewModelProvider(this).get(WorkOrderListViewModel::class.java) +// workOrderDetailViewModel = ViewModelProvider(this).get(WorkOrderDetailViewModel::class.java) } override fun initEvent() { +// obtainWorkOrderList(pageIndex) +// workOrderListViewModel.resultModel.observe(this, { +// if (it.code == 200) { +// val dataRows = it.data?.rows +// when { +// isRefresh -> { +// dataBeans.clear() +// dataBeans = dataRows!! +// unHandleLayout.finishRefresh() +// isRefresh = false +// } +// isLoadMore -> { +// if (dataRows?.size == 0) { +// "到底了,别拉了".show(requireContext()) +// } +// dataBeans.addAll(dataRows!!) +// unHandleLayout.finishLoadMore() +// isLoadMore = false +// } +// else -> { +// dataBeans = dataRows!! +// } +// } +// weakReferenceHandler!!.sendEmptyMessage(2022040602) +// } +// }) +// +// unHandleLayout.setOnRefreshListener { +// isRefresh = true +// //刷新之后页码重置 +// pageIndex = 1 +// obtainWorkOrderList(pageIndex) +// } +// unHandleLayout.setOnLoadMoreListener { +// isLoadMore = true +// pageIndex++ +// obtainWorkOrderList(pageIndex) +// } +// +// workOrderDetailViewModel.detailModel.observe(this, { +// if (it.code == 200) { +// val orderDetail = it.data!![0] +// val orderFlow = orderDetail.flow!! +// if (orderFlow.size != 0) { +// TimeLineBottomSheet.Builder().setContext(requireContext()) +// .setFlowItems(orderFlow).build().show() +// } else { +// "抱歉,无法查到该工单的流转记录".show(requireContext()) +// } +// } +// }) + } + private fun obtainWorkOrderList(index: Int) { +// workOrderListViewModel.obtainWorkOrderListByState(jobStatus = "2", page = index) + } + + private class WeakReferenceHandler(fragment: UnHandleOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040602) { + if (fragment.isRefresh || fragment.isLoadMore) { +// fragment.inHandleAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() +// fragment.inHandleAdapter = InHandleOrderAdapter( +// fragment.requireContext(), +// fragment.dataBeans +// ) +// fragment.inHandleView!!.layoutManager = +// LinearLayoutManager(fragment.requireContext()) +// fragment.inHandleView!!.adapter = fragment.inHandleAdapter +// fragment.inHandleAdapter.setOnItemClickListener(object : +// InHandleOrderAdapter.OnItemClickListener { +// override fun onClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看详情".show(fragment.requireContext()) +// return +// } +// fragment.requireContext().navigatePageTo( +// InHandleDetailActivity::class.java, jobId +// ) +// } +// +// override fun onTransferViewClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看工单流转记录".show(fragment.requireContext()) +// return +// } +// fragment.workOrderDetailViewModel.obtainWorkOrderDetail(id = jobId) +// } +// }) + } + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt new file mode 100644 index 0000000..b7929b5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt @@ -0,0 +1,185 @@ +package com.casic.app.smartwell.view.fragment + +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.Constant +import com.casic.app.smartwell.utils.DialogHelper +import com.casic.app.smartwell.utils.LoadState +import com.casic.app.smartwell.view.TodoDetailActivity +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel +import com.pengxh.app.multilib.base.BaseFragment +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_over_time_un_accept.* +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference + +class UnacceptedOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 + + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this) + overtimeOderViewModel = ViewModelProvider(this).get(OvertimeOderListViewModel::class.java) + acceptOrderViewModel = ViewModelProvider(this).get(AcceptOrderViewModel::class.java) + } + + override fun initEvent() { + obtainWorkOrderList(pageIndex) + overtimeOderViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + unAcceptOrderLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + unAcceptOrderLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler!!.sendEmptyMessage(2022040601) + } + }) + + //接单状态处理 + acceptOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireContext(), "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) + //通知列表刷行数据 + UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) + } + else -> { + DialogHelper.dismissLoadingDialog() + "接单失败".show(requireContext()) + } + } + }) + + unAcceptOrderLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainWorkOrderList(pageIndex) + } + unAcceptOrderLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainWorkOrderList(pageIndex) + } + } + + private fun obtainWorkOrderList(index: Int) { + overtimeOderViewModel.obtainOvertimeOderList(jobStatus = "0", page = index) + } + + private class WeakReferenceHandler(fragment: UnacceptedOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040601) { + if (fragment.isRefresh || fragment.isLoadMore) { + fragment.overtimeOrderAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("您没有超时未处理的工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() + fragment.overtimeOrderAdapter = OvertimeOrderListAdapter( + fragment.requireContext(), + fragment.dataBeans + ) + fragment.unAcceptOrderView!!.layoutManager = + LinearLayoutManager(fragment.requireContext()) + fragment.unAcceptOrderView!!.adapter = fragment.overtimeOrderAdapter + fragment.overtimeOrderAdapter.setOnItemClickListener(object : + OvertimeOrderListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(fragment.requireContext()) + return + } + fragment.requireContext() + .navigatePageTo(TodoDetailActivity::class.java, jobId) + } + + override fun onOperationClicked(position: Int) { + //标记被点击的item位置 + fragment.clickedPosition = position + + AlertControlDialog.Builder() + .setContext(fragment.requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = + fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show(fragment.requireContext()) + return + } + fragment.acceptOrderViewModel.acceptWorkOrder(id = jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt index 9cbd4de..2f25190 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt @@ -18,7 +18,7 @@ import com.casic.app.smartwell.vm.WorkOrderListViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.app.multilib.base.BaseFragment -import kotlinx.android.synthetic.main.fragment_order_undetermined.* +import kotlinx.android.synthetic.main.fragment_order_un_determined.* import kotlinx.android.synthetic.main.include_empty_view.* import java.lang.ref.WeakReference @@ -43,7 +43,7 @@ } } - override fun initLayoutView(): Int = R.layout.fragment_order_undetermined + override fun initLayoutView(): Int = R.layout.fragment_order_un_determined override fun initData() { weakReferenceHandler = WeakReferenceHandler(this) diff --git a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt index 56a7af4..b7c87a1 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -10,13 +9,10 @@ class AuthenticateViewModel : BaseViewModel() { - private val kTag = "AuthenticateViewModel" val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading keyModel.value = RetrofitServiceManager.authenticate() - }, { - Log.d(kTag, "obtainPublicKey: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt index 3d2d37b..312d224 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class LoginOutViewModel : BaseViewModel() { - private val kTag = "LoginOutViewModel" val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() - }, { - Log.d(kTag, "loginOut: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt index 90eb8c9..03fff89 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class OrderStatusViewModel : BaseViewModel() { - private val kTag = "OrderStatusViewModel" val listModel = MutableLiveData() fun obtainOrderStatus() = launch({ listModel.value = RetrofitServiceManager.obtainOrderStatus() - }, { - Log.d(kTag, "obtainOrderStatus: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt new file mode 100644 index 0000000..a78cf59 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt @@ -0,0 +1,16 @@ +package com.casic.app.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.base.BaseViewModel +import com.casic.app.smartwell.extensions.launch +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager + +class OvertimeOderListViewModel : BaseViewModel() { + + val resultModel = MutableLiveData() + + fun obtainOvertimeOderList(jobStatus: String, page: Int) = launch({ + resultModel.value = RetrofitServiceManager.obtainOvertimeOderList(jobStatus, page) + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt index 9e29a84..18aff97 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -12,12 +11,9 @@ * */ class SubordinateViewModel : BaseViewModel() { - private val kTag = "SubordinateViewModel" val listModel = MutableLiveData() fun obtainSubordinate(hasMine: String?, roleTips: String?) = launch({ listModel.value = RetrofitServiceManager.obtainSubordinate(hasMine, roleTips) - }, { - Log.d(kTag, "obtainSubordinate: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt index 60389fa..c3b6b03 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt @@ -26,7 +26,5 @@ } else { Log.d(kTag, "obtainWellCountByState: 错误码===>${code}") } - }, { - Log.d(kTag, "obtainWellCountByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt index f86d7d5..494e5b5 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class WellTypeViewModel : BaseViewModel() { - private val kTag = "WellTypeViewModel" val wellTypeModel = MutableLiveData() fun obtainWellType() = launch({ wellTypeModel.value = RetrofitServiceManager.obtainWellType() - }, { - Log.d(kTag, "obtainWellType: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt index aa1df2c..2d8cbb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class WorkOrderListViewModel : BaseViewModel() { - private val kTag = "WorkOrderListViewModel" val resultModel = MutableLiveData() fun obtainWorkOrderListByState(jobStatus: String, page: Int) = launch({ resultModel.value = RetrofitServiceManager.obtainWorkOrderList(jobStatus, page) - }, { - Log.d(kTag, "obtainWorkOrderListByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt index a9ea8d3..7f0f016 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt @@ -27,7 +27,5 @@ } else { Log.d(kTag, "obtainWorkOrderCountByState: 错误码===>${code}") } - }, { - Log.d(kTag, "obtainWorkOrderCountByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt b/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt new file mode 100644 index 0000000..94980f1 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt @@ -0,0 +1,104 @@ +package com.casic.app.smartwell.widgets + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Point +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import com.amap.api.maps.Projection +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.LatLngBounds +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.extensions.toBitmap +import java.util.* + +class GaoDeClusterMarkerView( + private val context: Context, firstMarkers: MarkerOptions, + projection: Projection, gridSize: Int +) { + //当前可观区域里的 聚合过之后的集合 + private val includeMarkers: ArrayList + + // 创建区域 + val bounds: LatLngBounds + var options: MarkerOptions = MarkerOptions() + + init { + val screenLocation = projection.toScreenLocation(firstMarkers.position) + //范围类 + val southwestPoint = Point(screenLocation.x - gridSize, screenLocation.y + gridSize) + //范围类 + val northeastPoint = Point(screenLocation.x + gridSize, screenLocation.y - gridSize) + bounds = LatLngBounds( + projection.fromScreenLocation(southwestPoint), + projection.fromScreenLocation(northeastPoint) + ) + //设置初始化marker属性 + options.anchor(0.5f, 0.5f) + .title(firstMarkers.title) + .position(firstMarkers.position) + .icon(firstMarkers.icon) + .snippet(firstMarkers.snippet) + .draggable(false) + includeMarkers = ArrayList() + includeMarkers.add(firstMarkers) + } + + /** + * 添加marker + */ + fun addMarker(markerOptions: MarkerOptions) { + includeMarkers.add(markerOptions) // 添加到列表中 + } + + /** + * 设置聚合点的中心位置以及图标 + */ + fun setPositionAndIcon() { + val size = includeMarkers.size + var lat = 0.0 + var lng = 0.0 + // 一个的时候 + if (size == 1) { //设置marker单个属性 + // 设置marker位置 + options.position( + LatLng( + includeMarkers[0].position.latitude, + includeMarkers[0].position.longitude + ) + ) + } else { // 聚合的时候 + //设置marker聚合属性 + for (op in includeMarkers) { + lat += op.position.latitude + lng += op.position.longitude + } + // 设置marker的位置为中心位置为聚集点的平均位置 + options.position(LatLng(lat / size, lng / size)) + } + options.icon(BitmapDescriptorFactory.fromBitmap(getBitmap(size))) + } + + /** + * marker视图 + */ + @SuppressLint("SetTextI18n") + private fun getBitmap(num: Int): Bitmap? { + val view = LayoutInflater.from(context).inflate(R.layout.marker_gaode, null) + val wellCountView = view.findViewById(R.id.wellCountView) + return if (num > 1) { + wellCountView.visibility = View.VISIBLE + wellCountView.text = "${num}个" + wellCountView.gravity = Gravity.CENTER + view.toBitmap() + } else { + wellCountView.visibility = View.GONE + BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_order_un_determined.xml b/app/src/main/res/layout/fragment_order_un_determined.xml new file mode 100644 index 0000000..03ca071 --- /dev/null +++ b/app/src/main/res/layout/fragment_order_un_determined.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_order_undetermined.xml b/app/src/main/res/layout/fragment_order_undetermined.xml deleted file mode 100644 index 03ca071..0000000 --- a/app/src/main/res/layout/fragment_order_undetermined.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_over_time_un_accept.xml b/app/src/main/res/layout/fragment_over_time_un_accept.xml index 77d9ef6..c8454fb 100644 --- a/app/src/main/res/layout/fragment_over_time_un_accept.xml +++ b/app/src/main/res/layout/fragment_over_time_un_accept.xml @@ -1,6 +1,36 @@ - + android:layout_height="match_parent" + android:background="@color/mainBackColor" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_over_time_un_handle.xml b/app/src/main/res/layout/fragment_over_time_un_handle.xml index 77d9ef6..8b6527f 100644 --- a/app/src/main/res/layout/fragment_over_time_un_handle.xml +++ b/app/src/main/res/layout/fragment_over_time_un_handle.xml @@ -1,6 +1,36 @@ - + android:layout_height="match_parent" + android:background="@color/mainBackColor" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_order_unaccept_recycleview.xml b/app/src/main/res/layout/item_order_unaccept_recycleview.xml new file mode 100644 index 0000000..cef7f1c --- /dev/null +++ b/app/src/main/res/layout/item_order_unaccept_recycleview.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/marker_gaode.xml b/app/src/main/res/layout/marker_gaode.xml new file mode 100644 index 0000000..6dafa1b --- /dev/null +++ b/app/src/main/res/layout/marker_gaode.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/popup.png b/app/src/main/res/mipmap-xxhdpi/popup.png new file mode 100644 index 0000000..8700aef --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/popup.png Binary files differ diff --git a/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt new file mode 100644 index 0000000..aeb806b --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/adapter/OvertimeOrderListAdapter.kt @@ -0,0 +1,75 @@ +package com.casic.app.smartwell.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.app.smartwell.R +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class OvertimeOrderListAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OvertimeOrderListAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_unaccept_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.alarmContentView.text = rowsBean.alarmContentName + holder.createTimeView.text = rowsBean.createTime + holder.wellCodeView.text = rowsBean.wellCode + val alarmValue = rowsBean.alarmValue.toString() + if (alarmValue == "") { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) + var createTimeView: TextView = view.findViewById(R.id.createTimeView) + var wellCodeView: TextView = view.findViewById(R.id.wellCodeView) + var alarmValueView: TextView = view.findViewById(R.id.alarmValueView) + var wellLocationView: TextView = view.findViewById(R.id.wellLocationView) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/extensions/View.kt b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt new file mode 100644 index 0000000..0b1ea77 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/extensions/View.kt @@ -0,0 +1,23 @@ +package com.casic.app.smartwell.extensions + +import android.graphics.Bitmap +import android.view.View + +/** + * 把一个view转化成bitmap对象 + */ +fun View.toBitmap(): Bitmap? { + var bitmap: Bitmap? = null + try { + this.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + this.layout(0, 0, this.measuredWidth, this.measuredHeight) + this.buildDrawingCache() + bitmap = this.drawingCache + } catch (e: Exception) { + e.printStackTrace() + } + return bitmap +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt new file mode 100644 index 0000000..9e9e1f2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/model/UnacceptedOrderModel.kt @@ -0,0 +1,52 @@ +package com.casic.app.smartwell.model + +class UnacceptedOrderModel { + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var rows: MutableList? = null + var total = 0 + + class RowsBean { + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var wellCode: String? = null + var deptid: String? = null + var alarmTypeName: String? = null + var jobCode: String? = null + var jobBelongTo: String? = null + var jobFlag: String? = null + var confirmJobPerson: String? = null + var confirmJobTime: String? = null + var jobStatusName: String? = null + var alarmValue: String? = null + var alarmId: String? = null + var alarmLevel: String? = null + var handleJobTime: String? = null + var tel: String? = null + var id: String? = null + var wellId: String? = null + var jobType: String? = null + var editable = 0 + var alarmTime: String? = null + var alarmMessage: String? = null + var staff: String? = null + var getJobTime: String? = null + var getJobPerson: String? = null + var shouldHandleTime: String? = null + var jobId: String? = null + var alarmType: String? = null + var alarmStatus: String? = null + var devcode: String? = null + var createTime: String? = null + var position: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt index 537cb90..50a3215 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/Constant.kt @@ -28,6 +28,7 @@ } const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L + const val DISTANCE = 3 const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val ORDER_TODO_OK = 21 diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt index 2521d54..92bbcb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitService.kt @@ -256,6 +256,17 @@ ): SearchResultModel /** + * 获取超时工单列表 + */ + @GET("/job/overtimeGetList") + suspend fun obtainOvertimeOderList( + @Header("token") token: String, + @Query("jobStatus") jobStatus: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): UnacceptedOrderModel + + /** * 获取用户信息 */ @GET("/user/info") diff --git a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt index 7fdc9f9..c9368ef 100644 --- a/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -207,6 +207,18 @@ } /** + * 获取超时工单列表 + */ + suspend fun obtainOvertimeOderList(jobStatus: String, page: Int): UnacceptedOrderModel { + return api.obtainOvertimeOderList( + AuthenticationHelper.token!!, + jobStatus, + Constant.PAGE_LIMIT, + page + ) + } + + /** * 获取用户信息 */ suspend fun obtainUserDetail(): String { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt index d3d1890..a62a520 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OvertimeOrderActivity.kt @@ -6,8 +6,8 @@ import com.casic.app.smartwell.adapter.TopViewPagerAdapter import com.casic.app.smartwell.base.BaseActivity import com.casic.app.smartwell.utils.Constant -import com.casic.app.smartwell.view.fragment.UnAcceptOrderFragment import com.casic.app.smartwell.view.fragment.UnHandleOrderFragment +import com.casic.app.smartwell.view.fragment.UnacceptedOrderFragment import kotlinx.android.synthetic.main.activity_order_overtime.* import kotlinx.android.synthetic.main.include_base_title.* import java.util.* @@ -17,14 +17,14 @@ private var fragmentList: ArrayList = ArrayList() init { - fragmentList.add(UnAcceptOrderFragment()) + fragmentList.add(UnacceptedOrderFragment()) fragmentList.add(UnHandleOrderFragment()) } override fun initLayoutView(): Int = R.layout.activity_order_overtime override fun setupTopBarLayout() { - titleView.text = "工单管理" + titleView.text = "超时工单" leftBackView.visibility = View.VISIBLE leftBackView.setOnClickListener { finish() } } diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt index cdff470..a22b719 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/HomePageFragment.kt @@ -1,7 +1,8 @@ package com.casic.app.smartwell.view.fragment +import android.graphics.Point +import android.location.Location import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,30 +11,46 @@ import androidx.recyclerview.widget.GridLayoutManager import com.amap.api.maps.AMap import com.amap.api.maps.AMapOptions -import com.amap.api.maps.model.CameraPosition -import com.amap.api.maps.model.Marker -import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.AMapUtils +import com.amap.api.maps.model.* import com.casic.app.smartwell.R import com.casic.app.smartwell.adapter.HomeRecycleAdapter import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showRouteOnMap +import com.casic.app.smartwell.utils.Constant import com.casic.app.smartwell.view.OvertimeOrderActivity import com.casic.app.smartwell.view.WellManagementActivity import com.casic.app.smartwell.view.WellOperationActivity import com.casic.app.smartwell.vm.WellCountViewModel import com.casic.app.smartwell.vm.WellListViewModel import com.casic.app.smartwell.vm.WorkOrderViewModel -import com.google.gson.Gson +import com.casic.app.smartwell.widgets.GaoDeClusterMarkerView +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.fragment_home.view.* import kotlinx.android.synthetic.main.include_base_title.view.* -class HomePageFragment : Fragment(), AMap.OnCameraChangeListener, AMap.OnMarkerClickListener { +class HomePageFragment : Fragment(), AMap.OnMyLocationChangeListener, AMap.OnCameraChangeListener, + AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener { private lateinit var homeView: View private lateinit var wellCountViewModel: WellCountViewModel private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var wellListViewModel: WellListViewModel private lateinit var aMap: AMap - private val kTag = "HomePageFragment" + + //定位点经纬度 + private var location: LatLng? = null + + /** + * 所有的marker + */ + private var allMarkerOptions: MutableList = ArrayList() + + /** + * 视野内的marker + */ + private var markerOptionsInView: MutableList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -51,8 +68,20 @@ wellListViewModel.obtainAllWell() wellListViewModel.listModel.observe(viewLifecycleOwner, { if (it.code == 200) { - val dataRows = it.data?.rows - Log.d(kTag, "onCreateView: ${Gson().toJson(dataRows)}") + it.data?.rows?.forEach { location -> + if (location.latGaode.toString().isNotBlank() + && location.lngGaode.toString().isNotBlank() + ) { + allMarkerOptions.add( + MarkerOptions().position( + LatLng( + location.latGaode!!.toDouble(), + location.lngGaode!!.toDouble() + ) + ).title(location.wellTypeName).snippet(location.wellName) + ) + } + } } }) @@ -109,27 +138,127 @@ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //显示定位小蓝点 val locationStyle = MyLocationStyle() + locationStyle.interval(5000) + //连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER) locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 - locationStyle.interval(10 * 1000)////设置连续定位模式下的定位间隔,只在连续定位模式下生效。单位为毫秒 aMap.myLocationStyle = locationStyle aMap.isMyLocationEnabled = true - //注册地图缩放监听 + aMap.addOnMyLocationChangeListener(this) + // 地图缩放监听 aMap.addOnCameraChangeListener(this) + // marker 点击事件监听 + aMap.addOnMarkerClickListener(this) + //信息窗点击事件 + aMap.addOnInfoWindowClickListener(this) } - /***地图接口实现*********************************************************************************/ + override fun onMyLocationChange(p0: Location?) { + if (p0 != null) { + this.location = LatLng(p0.latitude, p0.longitude) + } + } + override fun onCameraChange(p0: CameraPosition?) { - Log.d(kTag, "onCameraChange: ") + } + //获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker override fun onCameraChangeFinish(p0: CameraPosition?) { -// resetMarks() - Log.d(kTag, "onCameraChangeFinish: ") + val proj = aMap.projection + val dm = resources.displayMetrics + var screenLocation: Point + markerOptionsInView.clear() + // 获取在当前视野内的marker + allMarkerOptions.forEach { + screenLocation = proj.toScreenLocation(it.position) + if (screenLocation.x >= 0 && screenLocation.y >= 0 && screenLocation.x <= dm.widthPixels && screenLocation.y <= dm.heightPixels) { + //在当前可观区域内 + markerOptionsInView.add(it) + } + } + // 自定义的聚合类MarkerCluster + val clustersMarkers: MutableList = ArrayList() + markerOptionsInView.forEach { + if (clustersMarkers.size == 0) { + //添加一个新的自定义marker + clustersMarkers.add(GaoDeClusterMarkerView(requireContext(), it, proj, 80))//相距多少才聚合 + } else { + var isInRange = false + //Kotlin foreach不能用break + for (view in clustersMarkers) { + //判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。 + if (view.bounds.contains(it.position)) { + view.addMarker(it) + isInRange = true + break + } + } + //如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较 + if (!isInRange) { + clustersMarkers.add( + GaoDeClusterMarkerView( + requireContext(), + it, proj, 80 + ) + )//相距多少才聚合 + } + } + } + // 设置聚合点的位置和icon + clustersMarkers.forEach { + it.setPositionAndIcon() + } + aMap.clear() + // 重新添加 marker + clustersMarkers.forEach { + aMap.addMarker(it.options) + } } - override fun onMarkerClick(p0: Marker?): Boolean { + override fun onMarkerClick(marker: Marker?): Boolean { + val clickedLatLng = marker?.position + if (location != null) { + //判断点击点是否是定位点 + val distance = AMapUtils.calculateLineDistance(location, clickedLatLng) + if (distance > Constant.DISTANCE) { + //显示闸井信息 + marker!!.showInfoWindow() + } else { + "该位置是定位点,请选择实际闸井点".show(requireContext()) + } + } + return true + } - return false + override fun onInfoWindowClick(p0: Marker?) { + if (p0 != null) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要前往吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val latLng = p0.position + val lat = latLng.latitude.toString() + val lng = latLng.longitude.toString() + if (lat.isBlank() || lng.isBlank()) { + "窨井经纬度异常,无法开启导航".show(requireContext()) + return + } + Poi(p0.snippet, LatLng(lat.toDouble(), lng.toDouble()), "").showRouteOnMap( + requireContext() + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } } /***以下是地图生命周期管理************************************************************************/ diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt index 7932e6a..3166bd0 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/TodoOrderFragment.kt @@ -90,8 +90,11 @@ is LoadState.Success -> { DialogHelper.dismissLoadingDialog() "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) //通知列表刷行数据 - weakReferenceHandler!!.sendEmptyMessage(Constant.ORDER_TODO_OK) UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) } else -> { diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt deleted file mode 100644 index e7a664a..0000000 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnAcceptOrderFragment.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.casic.app.smartwell.view.fragment - -import com.casic.app.smartwell.R -import com.pengxh.app.multilib.base.BaseFragment - -class UnAcceptOrderFragment : BaseFragment() { - override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept - - override fun initData() { - - } - - override fun initEvent() { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt index 8589260..6df8449 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnHandleOrderFragment.kt @@ -1,16 +1,146 @@ package com.casic.app.smartwell.view.fragment +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.WorkOrderListModel +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel import com.pengxh.app.multilib.base.BaseFragment +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference class UnHandleOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_handle override fun initData() { - + weakReferenceHandler = WeakReferenceHandler(this) +// workOrderListViewModel = ViewModelProvider(this).get(WorkOrderListViewModel::class.java) +// workOrderDetailViewModel = ViewModelProvider(this).get(WorkOrderDetailViewModel::class.java) } override fun initEvent() { +// obtainWorkOrderList(pageIndex) +// workOrderListViewModel.resultModel.observe(this, { +// if (it.code == 200) { +// val dataRows = it.data?.rows +// when { +// isRefresh -> { +// dataBeans.clear() +// dataBeans = dataRows!! +// unHandleLayout.finishRefresh() +// isRefresh = false +// } +// isLoadMore -> { +// if (dataRows?.size == 0) { +// "到底了,别拉了".show(requireContext()) +// } +// dataBeans.addAll(dataRows!!) +// unHandleLayout.finishLoadMore() +// isLoadMore = false +// } +// else -> { +// dataBeans = dataRows!! +// } +// } +// weakReferenceHandler!!.sendEmptyMessage(2022040602) +// } +// }) +// +// unHandleLayout.setOnRefreshListener { +// isRefresh = true +// //刷新之后页码重置 +// pageIndex = 1 +// obtainWorkOrderList(pageIndex) +// } +// unHandleLayout.setOnLoadMoreListener { +// isLoadMore = true +// pageIndex++ +// obtainWorkOrderList(pageIndex) +// } +// +// workOrderDetailViewModel.detailModel.observe(this, { +// if (it.code == 200) { +// val orderDetail = it.data!![0] +// val orderFlow = orderDetail.flow!! +// if (orderFlow.size != 0) { +// TimeLineBottomSheet.Builder().setContext(requireContext()) +// .setFlowItems(orderFlow).build().show() +// } else { +// "抱歉,无法查到该工单的流转记录".show(requireContext()) +// } +// } +// }) + } + private fun obtainWorkOrderList(index: Int) { +// workOrderListViewModel.obtainWorkOrderListByState(jobStatus = "2", page = index) + } + + private class WeakReferenceHandler(fragment: UnHandleOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040602) { + if (fragment.isRefresh || fragment.isLoadMore) { +// fragment.inHandleAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() +// fragment.inHandleAdapter = InHandleOrderAdapter( +// fragment.requireContext(), +// fragment.dataBeans +// ) +// fragment.inHandleView!!.layoutManager = +// LinearLayoutManager(fragment.requireContext()) +// fragment.inHandleView!!.adapter = fragment.inHandleAdapter +// fragment.inHandleAdapter.setOnItemClickListener(object : +// InHandleOrderAdapter.OnItemClickListener { +// override fun onClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看详情".show(fragment.requireContext()) +// return +// } +// fragment.requireContext().navigatePageTo( +// InHandleDetailActivity::class.java, jobId +// ) +// } +// +// override fun onTransferViewClicked(position: Int) { +// val jobId = fragment.dataBeans[position].jobId.toString() +// if (jobId.isBlank()) { +// "工单编号异常,无法查看工单流转记录".show(fragment.requireContext()) +// return +// } +// fragment.workOrderDetailViewModel.obtainWorkOrderDetail(id = jobId) +// } +// }) + } + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt new file mode 100644 index 0000000..b7929b5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UnacceptedOrderFragment.kt @@ -0,0 +1,185 @@ +package com.casic.app.smartwell.view.fragment + +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.app.smartwell.R +import com.casic.app.smartwell.adapter.OvertimeOrderListAdapter +import com.casic.app.smartwell.extensions.navigatePageTo +import com.casic.app.smartwell.extensions.show +import com.casic.app.smartwell.extensions.showEmptyPage +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.Constant +import com.casic.app.smartwell.utils.DialogHelper +import com.casic.app.smartwell.utils.LoadState +import com.casic.app.smartwell.view.TodoDetailActivity +import com.casic.app.smartwell.vm.AcceptOrderViewModel +import com.casic.app.smartwell.vm.OvertimeOderListViewModel +import com.pengxh.app.multilib.base.BaseFragment +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_over_time_un_accept.* +import kotlinx.android.synthetic.main.include_empty_view.* +import java.lang.ref.WeakReference + +class UnacceptedOrderFragment : BaseFragment() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var overtimeOderViewModel: OvertimeOderListViewModel + private lateinit var acceptOrderViewModel: AcceptOrderViewModel + private lateinit var overtimeOrderAdapter: OvertimeOrderListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var clickedPosition = 0 + + override fun initLayoutView(): Int = R.layout.fragment_over_time_un_accept + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this) + overtimeOderViewModel = ViewModelProvider(this).get(OvertimeOderListViewModel::class.java) + acceptOrderViewModel = ViewModelProvider(this).get(AcceptOrderViewModel::class.java) + } + + override fun initEvent() { + obtainWorkOrderList(pageIndex) + overtimeOderViewModel.resultModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + unAcceptOrderLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows!!) + unAcceptOrderLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler!!.sendEmptyMessage(2022040601) + } + }) + + //接单状态处理 + acceptOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireContext(), "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + "接单成功".show(requireContext()) + //接单成功之后刷新数据 + isRefresh = true + pageIndex = 1 + obtainWorkOrderList(pageIndex) + //通知列表刷行数据 + UndeterminedOrderFragment.sendEmptyMessage(Constant.ORDER_DETERMINED_OK) + } + else -> { + DialogHelper.dismissLoadingDialog() + "接单失败".show(requireContext()) + } + } + }) + + unAcceptOrderLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainWorkOrderList(pageIndex) + } + unAcceptOrderLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainWorkOrderList(pageIndex) + } + } + + private fun obtainWorkOrderList(index: Int) { + overtimeOderViewModel.obtainOvertimeOderList(jobStatus = "0", page = index) + } + + private class WeakReferenceHandler(fragment: UnacceptedOrderFragment) : + Handler(Looper.getMainLooper()) { + private val reference: WeakReference = WeakReference(fragment) + + @SuppressLint("NotifyDataSetChanged") + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val fragment = reference.get()!! + if (msg.what == 2022040601) { + if (fragment.isRefresh || fragment.isLoadMore) { + fragment.overtimeOrderAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (fragment.dataBeans.size == 0) { + fragment.emptyView!!.showEmptyPage("您没有超时未处理的工单") { + fragment.obtainWorkOrderList(fragment.pageIndex) + } + } else { + fragment.emptyView!!.hide() + fragment.overtimeOrderAdapter = OvertimeOrderListAdapter( + fragment.requireContext(), + fragment.dataBeans + ) + fragment.unAcceptOrderView!!.layoutManager = + LinearLayoutManager(fragment.requireContext()) + fragment.unAcceptOrderView!!.adapter = fragment.overtimeOrderAdapter + fragment.overtimeOrderAdapter.setOnItemClickListener(object : + OvertimeOrderListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(fragment.requireContext()) + return + } + fragment.requireContext() + .navigatePageTo(TodoDetailActivity::class.java, jobId) + } + + override fun onOperationClicked(position: Int) { + //标记被点击的item位置 + fragment.clickedPosition = position + + AlertControlDialog.Builder() + .setContext(fragment.requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = + fragment.dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show(fragment.requireContext()) + return + } + fragment.acceptOrderViewModel.acceptWorkOrder(id = jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt index 9cbd4de..2f25190 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/fragment/UndeterminedOrderFragment.kt @@ -18,7 +18,7 @@ import com.casic.app.smartwell.vm.WorkOrderListViewModel import com.casic.app.smartwell.widgets.TimeLineBottomSheet import com.pengxh.app.multilib.base.BaseFragment -import kotlinx.android.synthetic.main.fragment_order_undetermined.* +import kotlinx.android.synthetic.main.fragment_order_un_determined.* import kotlinx.android.synthetic.main.include_empty_view.* import java.lang.ref.WeakReference @@ -43,7 +43,7 @@ } } - override fun initLayoutView(): Int = R.layout.fragment_order_undetermined + override fun initLayoutView(): Int = R.layout.fragment_order_un_determined override fun initData() { weakReferenceHandler = WeakReferenceHandler(this) diff --git a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt index 56a7af4..b7c87a1 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/AuthenticateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -10,13 +9,10 @@ class AuthenticateViewModel : BaseViewModel() { - private val kTag = "AuthenticateViewModel" val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading keyModel.value = RetrofitServiceManager.authenticate() - }, { - Log.d(kTag, "obtainPublicKey: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt index 3d2d37b..312d224 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/LoginOutViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class LoginOutViewModel : BaseViewModel() { - private val kTag = "LoginOutViewModel" val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() - }, { - Log.d(kTag, "loginOut: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt index 90eb8c9..03fff89 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/OrderStatusViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class OrderStatusViewModel : BaseViewModel() { - private val kTag = "OrderStatusViewModel" val listModel = MutableLiveData() fun obtainOrderStatus() = launch({ listModel.value = RetrofitServiceManager.obtainOrderStatus() - }, { - Log.d(kTag, "obtainOrderStatus: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt new file mode 100644 index 0000000..a78cf59 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/vm/OvertimeOderListViewModel.kt @@ -0,0 +1,16 @@ +package com.casic.app.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.base.BaseViewModel +import com.casic.app.smartwell.extensions.launch +import com.casic.app.smartwell.model.UnacceptedOrderModel +import com.casic.app.smartwell.utils.retrofit.RetrofitServiceManager + +class OvertimeOderListViewModel : BaseViewModel() { + + val resultModel = MutableLiveData() + + fun obtainOvertimeOderList(jobStatus: String, page: Int) = launch({ + resultModel.value = RetrofitServiceManager.obtainOvertimeOderList(jobStatus, page) + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt index 9e29a84..18aff97 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/SubordinateViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -12,12 +11,9 @@ * */ class SubordinateViewModel : BaseViewModel() { - private val kTag = "SubordinateViewModel" val listModel = MutableLiveData() fun obtainSubordinate(hasMine: String?, roleTips: String?) = launch({ listModel.value = RetrofitServiceManager.obtainSubordinate(hasMine, roleTips) - }, { - Log.d(kTag, "obtainSubordinate: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt index 60389fa..c3b6b03 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellCountViewModel.kt @@ -26,7 +26,5 @@ } else { Log.d(kTag, "obtainWellCountByState: 错误码===>${code}") } - }, { - Log.d(kTag, "obtainWellCountByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt index f86d7d5..494e5b5 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WellTypeViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class WellTypeViewModel : BaseViewModel() { - private val kTag = "WellTypeViewModel" val wellTypeModel = MutableLiveData() fun obtainWellType() = launch({ wellTypeModel.value = RetrofitServiceManager.obtainWellType() - }, { - Log.d(kTag, "obtainWellType: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt index aa1df2c..2d8cbb6 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderListViewModel.kt @@ -1,6 +1,5 @@ package com.casic.app.smartwell.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.base.BaseViewModel import com.casic.app.smartwell.extensions.launch @@ -9,12 +8,9 @@ class WorkOrderListViewModel : BaseViewModel() { - private val kTag = "WorkOrderListViewModel" val resultModel = MutableLiveData() fun obtainWorkOrderListByState(jobStatus: String, page: Int) = launch({ resultModel.value = RetrofitServiceManager.obtainWorkOrderList(jobStatus, page) - }, { - Log.d(kTag, "obtainWorkOrderListByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt index a9ea8d3..7f0f016 100644 --- a/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/vm/WorkOrderViewModel.kt @@ -27,7 +27,5 @@ } else { Log.d(kTag, "obtainWorkOrderCountByState: 错误码===>${code}") } - }, { - Log.d(kTag, "obtainWorkOrderCountByState: ${it.printStackTrace()}") }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt b/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt new file mode 100644 index 0000000..94980f1 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/widgets/GaoDeClusterMarkerView.kt @@ -0,0 +1,104 @@ +package com.casic.app.smartwell.widgets + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Point +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import com.amap.api.maps.Projection +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.LatLngBounds +import com.amap.api.maps.model.MarkerOptions +import com.casic.app.smartwell.R +import com.casic.app.smartwell.extensions.toBitmap +import java.util.* + +class GaoDeClusterMarkerView( + private val context: Context, firstMarkers: MarkerOptions, + projection: Projection, gridSize: Int +) { + //当前可观区域里的 聚合过之后的集合 + private val includeMarkers: ArrayList + + // 创建区域 + val bounds: LatLngBounds + var options: MarkerOptions = MarkerOptions() + + init { + val screenLocation = projection.toScreenLocation(firstMarkers.position) + //范围类 + val southwestPoint = Point(screenLocation.x - gridSize, screenLocation.y + gridSize) + //范围类 + val northeastPoint = Point(screenLocation.x + gridSize, screenLocation.y - gridSize) + bounds = LatLngBounds( + projection.fromScreenLocation(southwestPoint), + projection.fromScreenLocation(northeastPoint) + ) + //设置初始化marker属性 + options.anchor(0.5f, 0.5f) + .title(firstMarkers.title) + .position(firstMarkers.position) + .icon(firstMarkers.icon) + .snippet(firstMarkers.snippet) + .draggable(false) + includeMarkers = ArrayList() + includeMarkers.add(firstMarkers) + } + + /** + * 添加marker + */ + fun addMarker(markerOptions: MarkerOptions) { + includeMarkers.add(markerOptions) // 添加到列表中 + } + + /** + * 设置聚合点的中心位置以及图标 + */ + fun setPositionAndIcon() { + val size = includeMarkers.size + var lat = 0.0 + var lng = 0.0 + // 一个的时候 + if (size == 1) { //设置marker单个属性 + // 设置marker位置 + options.position( + LatLng( + includeMarkers[0].position.latitude, + includeMarkers[0].position.longitude + ) + ) + } else { // 聚合的时候 + //设置marker聚合属性 + for (op in includeMarkers) { + lat += op.position.latitude + lng += op.position.longitude + } + // 设置marker的位置为中心位置为聚集点的平均位置 + options.position(LatLng(lat / size, lng / size)) + } + options.icon(BitmapDescriptorFactory.fromBitmap(getBitmap(size))) + } + + /** + * marker视图 + */ + @SuppressLint("SetTextI18n") + private fun getBitmap(num: Int): Bitmap? { + val view = LayoutInflater.from(context).inflate(R.layout.marker_gaode, null) + val wellCountView = view.findViewById(R.id.wellCountView) + return if (num > 1) { + wellCountView.visibility = View.VISIBLE + wellCountView.text = "${num}个" + wellCountView.gravity = Gravity.CENTER + view.toBitmap() + } else { + wellCountView.visibility = View.GONE + BitmapDescriptorFactory.fromResource(R.mipmap.well_location).bitmap + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_order_un_determined.xml b/app/src/main/res/layout/fragment_order_un_determined.xml new file mode 100644 index 0000000..03ca071 --- /dev/null +++ b/app/src/main/res/layout/fragment_order_un_determined.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_order_undetermined.xml b/app/src/main/res/layout/fragment_order_undetermined.xml deleted file mode 100644 index 03ca071..0000000 --- a/app/src/main/res/layout/fragment_order_undetermined.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_over_time_un_accept.xml b/app/src/main/res/layout/fragment_over_time_un_accept.xml index 77d9ef6..c8454fb 100644 --- a/app/src/main/res/layout/fragment_over_time_un_accept.xml +++ b/app/src/main/res/layout/fragment_over_time_un_accept.xml @@ -1,6 +1,36 @@ - + android:layout_height="match_parent" + android:background="@color/mainBackColor" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_over_time_un_handle.xml b/app/src/main/res/layout/fragment_over_time_un_handle.xml index 77d9ef6..8b6527f 100644 --- a/app/src/main/res/layout/fragment_over_time_un_handle.xml +++ b/app/src/main/res/layout/fragment_over_time_un_handle.xml @@ -1,6 +1,36 @@ - + android:layout_height="match_parent" + android:background="@color/mainBackColor" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_order_unaccept_recycleview.xml b/app/src/main/res/layout/item_order_unaccept_recycleview.xml new file mode 100644 index 0000000..cef7f1c --- /dev/null +++ b/app/src/main/res/layout/item_order_unaccept_recycleview.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/marker_gaode.xml b/app/src/main/res/layout/marker_gaode.xml new file mode 100644 index 0000000..6dafa1b --- /dev/null +++ b/app/src/main/res/layout/marker_gaode.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/popup.png b/app/src/main/res/mipmap-xxhdpi/popup.png new file mode 100644 index 0000000..8700aef --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/popup.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/well_location.png b/app/src/main/res/mipmap-xxhdpi/well_location.png new file mode 100644 index 0000000..483687f --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/well_location.png Binary files differ