diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt new file mode 100644 index 0000000..1f1b5de --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt @@ -0,0 +1,47 @@ +package com.casic.qd.smartwell.view + +import androidx.fragment.app.Fragment +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.TopViewPagerAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.navigatePageTo +import com.casic.qd.smartwell.fragment.OrderCompletedFragment +import com.casic.qd.smartwell.fragment.OrderInHandleFragment +import com.casic.qd.smartwell.fragment.OrderNotConfirmedFragment +import com.casic.qd.smartwell.fragment.OrderNotProcessedFragment +import com.casic.qd.smartwell.utils.Constant +import kotlinx.android.synthetic.main.activity_order_management.* +import java.util.* + +class OrderManagementActivity : BaseActivity() { + + private var fragmentList: ArrayList = ArrayList() + + init { + fragmentList.add(OrderNotProcessedFragment())//待处理 + fragmentList.add(OrderNotConfirmedFragment())//待确认 + fragmentList.add(OrderInHandleFragment())//处理中 + fragmentList.add(OrderCompletedFragment())//已完成 + } + + override fun initLayoutView(): Int = R.layout.activity_order_management + + override fun setupTopBarLayout() { + titleView.text = "工单管理" + } + + override fun initData() { + val topViewPagerAdapter = TopViewPagerAdapter( + supportFragmentManager, Constant.SUB_PAGE_TITLES, fragmentList + ) + orderViewPager.offscreenPageLimit = fragmentList.size + orderViewPager.adapter = topViewPagerAdapter + orderTabLayout.setupWithViewPager(orderViewPager) + } + + override fun initEvent() { + rightOptionView.setOnClickListener { + navigatePageTo() + } + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt new file mode 100644 index 0000000..1f1b5de --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt @@ -0,0 +1,47 @@ +package com.casic.qd.smartwell.view + +import androidx.fragment.app.Fragment +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.TopViewPagerAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.navigatePageTo +import com.casic.qd.smartwell.fragment.OrderCompletedFragment +import com.casic.qd.smartwell.fragment.OrderInHandleFragment +import com.casic.qd.smartwell.fragment.OrderNotConfirmedFragment +import com.casic.qd.smartwell.fragment.OrderNotProcessedFragment +import com.casic.qd.smartwell.utils.Constant +import kotlinx.android.synthetic.main.activity_order_management.* +import java.util.* + +class OrderManagementActivity : BaseActivity() { + + private var fragmentList: ArrayList = ArrayList() + + init { + fragmentList.add(OrderNotProcessedFragment())//待处理 + fragmentList.add(OrderNotConfirmedFragment())//待确认 + fragmentList.add(OrderInHandleFragment())//处理中 + fragmentList.add(OrderCompletedFragment())//已完成 + } + + override fun initLayoutView(): Int = R.layout.activity_order_management + + override fun setupTopBarLayout() { + titleView.text = "工单管理" + } + + override fun initData() { + val topViewPagerAdapter = TopViewPagerAdapter( + supportFragmentManager, Constant.SUB_PAGE_TITLES, fragmentList + ) + orderViewPager.offscreenPageLimit = fragmentList.size + orderViewPager.adapter = topViewPagerAdapter + orderTabLayout.setupWithViewPager(orderViewPager) + } + + override fun initEvent() { + rightOptionView.setOnClickListener { + navigatePageTo() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt new file mode 100644 index 0000000..6e7e65e --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -0,0 +1,217 @@ +package com.casic.qd.smartwell.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.SearchResultAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.showEmptyPage +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.WeakReferenceHandler +import com.casic.qd.smartwell.vm.OperationViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.TimeLineBottomSheet +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_order_search_result.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_empty_view.* + +class OrderSearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var operationViewModel: OperationViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var args: ArrayList + private lateinit var searchResultAdapter: SearchResultAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_order_search_result + + override fun setupTopBarLayout() { + titleView.text = "查询结果" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + weakReferenceHandler = WeakReferenceHandler(callback) + operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + obtainSearchResult(args, pageIndex) + workOrderViewModel.listModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + resultRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show() + } + dataBeans.addAll(dataRows!!) + resultRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022040101) + } + }) + workOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + resultRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + resultRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainSearchResult(args, pageIndex) + } + + //接单状态处理 + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + //通知列表刷行数据 + weakReferenceHandler.sendEmptyMessage(2022040102) + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + workOrderViewModel.detailModel.observe(this, { + if (it.code == 200) { + val orderDetail = it.data!![0] + val orderFlow = orderDetail.flow!! + if (orderFlow.size != 0) { + TimeLineBottomSheet.Builder().setContext(this) + .setFlowItems(orderFlow).build().show() + } else { + "抱歉,无法查到该工单的流转记录".show() + } + } + }) + } + + private fun obtainSearchResult(args: ArrayList, pageIndex: Int) { + workOrderViewModel.obtainSearchResult( + keywords = args[0], + alarmContent = args[1], + alarmLevel = args[2], + jobStatus = args[3], + beginTime = args[4], + endTime = args[5], + page = pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2022040102 -> { + isRefresh = true + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + 2022040101 -> { + if (isRefresh || isLoadMore) { + searchResultAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + obtainSearchResult(args, pageIndex) + } + } else { + emptyView!!.hide() + searchResultAdapter = SearchResultAdapter(this, dataBeans) + resultRecyclerView!!.layoutManager = LinearLayoutManager(this) + resultRecyclerView!!.adapter = searchResultAdapter + searchResultAdapter.setOnItemClickListener(object : + SearchResultAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } + if (dataBeans[position].jobStatus == "0") { +// navigatePageTo(jobId) + } else { +// navigatePageTo(jobId) + } + } + + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(this@OrderSearchResultActivity) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptWorkOrder(jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + + override fun onTransferViewClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看工单流转记录".show() + return + } + workOrderViewModel.obtainWorkOrderDetail(jobId) + } + }) + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt new file mode 100644 index 0000000..1f1b5de --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt @@ -0,0 +1,47 @@ +package com.casic.qd.smartwell.view + +import androidx.fragment.app.Fragment +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.TopViewPagerAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.navigatePageTo +import com.casic.qd.smartwell.fragment.OrderCompletedFragment +import com.casic.qd.smartwell.fragment.OrderInHandleFragment +import com.casic.qd.smartwell.fragment.OrderNotConfirmedFragment +import com.casic.qd.smartwell.fragment.OrderNotProcessedFragment +import com.casic.qd.smartwell.utils.Constant +import kotlinx.android.synthetic.main.activity_order_management.* +import java.util.* + +class OrderManagementActivity : BaseActivity() { + + private var fragmentList: ArrayList = ArrayList() + + init { + fragmentList.add(OrderNotProcessedFragment())//待处理 + fragmentList.add(OrderNotConfirmedFragment())//待确认 + fragmentList.add(OrderInHandleFragment())//处理中 + fragmentList.add(OrderCompletedFragment())//已完成 + } + + override fun initLayoutView(): Int = R.layout.activity_order_management + + override fun setupTopBarLayout() { + titleView.text = "工单管理" + } + + override fun initData() { + val topViewPagerAdapter = TopViewPagerAdapter( + supportFragmentManager, Constant.SUB_PAGE_TITLES, fragmentList + ) + orderViewPager.offscreenPageLimit = fragmentList.size + orderViewPager.adapter = topViewPagerAdapter + orderTabLayout.setupWithViewPager(orderViewPager) + } + + override fun initEvent() { + rightOptionView.setOnClickListener { + navigatePageTo() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt new file mode 100644 index 0000000..6e7e65e --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -0,0 +1,217 @@ +package com.casic.qd.smartwell.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.SearchResultAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.showEmptyPage +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.WeakReferenceHandler +import com.casic.qd.smartwell.vm.OperationViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.TimeLineBottomSheet +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_order_search_result.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_empty_view.* + +class OrderSearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var operationViewModel: OperationViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var args: ArrayList + private lateinit var searchResultAdapter: SearchResultAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_order_search_result + + override fun setupTopBarLayout() { + titleView.text = "查询结果" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + weakReferenceHandler = WeakReferenceHandler(callback) + operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + obtainSearchResult(args, pageIndex) + workOrderViewModel.listModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + resultRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show() + } + dataBeans.addAll(dataRows!!) + resultRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022040101) + } + }) + workOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + resultRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + resultRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainSearchResult(args, pageIndex) + } + + //接单状态处理 + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + //通知列表刷行数据 + weakReferenceHandler.sendEmptyMessage(2022040102) + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + workOrderViewModel.detailModel.observe(this, { + if (it.code == 200) { + val orderDetail = it.data!![0] + val orderFlow = orderDetail.flow!! + if (orderFlow.size != 0) { + TimeLineBottomSheet.Builder().setContext(this) + .setFlowItems(orderFlow).build().show() + } else { + "抱歉,无法查到该工单的流转记录".show() + } + } + }) + } + + private fun obtainSearchResult(args: ArrayList, pageIndex: Int) { + workOrderViewModel.obtainSearchResult( + keywords = args[0], + alarmContent = args[1], + alarmLevel = args[2], + jobStatus = args[3], + beginTime = args[4], + endTime = args[5], + page = pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2022040102 -> { + isRefresh = true + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + 2022040101 -> { + if (isRefresh || isLoadMore) { + searchResultAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + obtainSearchResult(args, pageIndex) + } + } else { + emptyView!!.hide() + searchResultAdapter = SearchResultAdapter(this, dataBeans) + resultRecyclerView!!.layoutManager = LinearLayoutManager(this) + resultRecyclerView!!.adapter = searchResultAdapter + searchResultAdapter.setOnItemClickListener(object : + SearchResultAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } + if (dataBeans[position].jobStatus == "0") { +// navigatePageTo(jobId) + } else { +// navigatePageTo(jobId) + } + } + + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(this@OrderSearchResultActivity) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptWorkOrder(jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + + override fun onTransferViewClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看工单流转记录".show() + return + } + workOrderViewModel.obtainWorkOrderDetail(jobId) + } + }) + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index 2b92d86..fccff95 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -145,7 +145,6 @@ }.build().show(supportFragmentManager, "all") } - searchButton.setChangeAlphaWhenPress(true) searchButton.setOnClickListener { //页面跳转,将查询参数传过去 navigatePageTo( @@ -160,7 +159,6 @@ ) } - clearButton.setChangeAlphaWhenPress(true) clearButton.setOnClickListener { wellCodeView.setText("") alarmTypeView.text = "" diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt new file mode 100644 index 0000000..1f1b5de --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt @@ -0,0 +1,47 @@ +package com.casic.qd.smartwell.view + +import androidx.fragment.app.Fragment +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.TopViewPagerAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.navigatePageTo +import com.casic.qd.smartwell.fragment.OrderCompletedFragment +import com.casic.qd.smartwell.fragment.OrderInHandleFragment +import com.casic.qd.smartwell.fragment.OrderNotConfirmedFragment +import com.casic.qd.smartwell.fragment.OrderNotProcessedFragment +import com.casic.qd.smartwell.utils.Constant +import kotlinx.android.synthetic.main.activity_order_management.* +import java.util.* + +class OrderManagementActivity : BaseActivity() { + + private var fragmentList: ArrayList = ArrayList() + + init { + fragmentList.add(OrderNotProcessedFragment())//待处理 + fragmentList.add(OrderNotConfirmedFragment())//待确认 + fragmentList.add(OrderInHandleFragment())//处理中 + fragmentList.add(OrderCompletedFragment())//已完成 + } + + override fun initLayoutView(): Int = R.layout.activity_order_management + + override fun setupTopBarLayout() { + titleView.text = "工单管理" + } + + override fun initData() { + val topViewPagerAdapter = TopViewPagerAdapter( + supportFragmentManager, Constant.SUB_PAGE_TITLES, fragmentList + ) + orderViewPager.offscreenPageLimit = fragmentList.size + orderViewPager.adapter = topViewPagerAdapter + orderTabLayout.setupWithViewPager(orderViewPager) + } + + override fun initEvent() { + rightOptionView.setOnClickListener { + navigatePageTo() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt new file mode 100644 index 0000000..6e7e65e --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -0,0 +1,217 @@ +package com.casic.qd.smartwell.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.SearchResultAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.showEmptyPage +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.WeakReferenceHandler +import com.casic.qd.smartwell.vm.OperationViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.TimeLineBottomSheet +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_order_search_result.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_empty_view.* + +class OrderSearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var operationViewModel: OperationViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var args: ArrayList + private lateinit var searchResultAdapter: SearchResultAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_order_search_result + + override fun setupTopBarLayout() { + titleView.text = "查询结果" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + weakReferenceHandler = WeakReferenceHandler(callback) + operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + obtainSearchResult(args, pageIndex) + workOrderViewModel.listModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + resultRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show() + } + dataBeans.addAll(dataRows!!) + resultRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022040101) + } + }) + workOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + resultRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + resultRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainSearchResult(args, pageIndex) + } + + //接单状态处理 + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + //通知列表刷行数据 + weakReferenceHandler.sendEmptyMessage(2022040102) + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + workOrderViewModel.detailModel.observe(this, { + if (it.code == 200) { + val orderDetail = it.data!![0] + val orderFlow = orderDetail.flow!! + if (orderFlow.size != 0) { + TimeLineBottomSheet.Builder().setContext(this) + .setFlowItems(orderFlow).build().show() + } else { + "抱歉,无法查到该工单的流转记录".show() + } + } + }) + } + + private fun obtainSearchResult(args: ArrayList, pageIndex: Int) { + workOrderViewModel.obtainSearchResult( + keywords = args[0], + alarmContent = args[1], + alarmLevel = args[2], + jobStatus = args[3], + beginTime = args[4], + endTime = args[5], + page = pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2022040102 -> { + isRefresh = true + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + 2022040101 -> { + if (isRefresh || isLoadMore) { + searchResultAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + obtainSearchResult(args, pageIndex) + } + } else { + emptyView!!.hide() + searchResultAdapter = SearchResultAdapter(this, dataBeans) + resultRecyclerView!!.layoutManager = LinearLayoutManager(this) + resultRecyclerView!!.adapter = searchResultAdapter + searchResultAdapter.setOnItemClickListener(object : + SearchResultAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } + if (dataBeans[position].jobStatus == "0") { +// navigatePageTo(jobId) + } else { +// navigatePageTo(jobId) + } + } + + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(this@OrderSearchResultActivity) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptWorkOrder(jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + + override fun onTransferViewClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看工单流转记录".show() + return + } + workOrderViewModel.obtainWorkOrderDetail(jobId) + } + }) + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index 2b92d86..fccff95 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -145,7 +145,6 @@ }.build().show(supportFragmentManager, "all") } - searchButton.setChangeAlphaWhenPress(true) searchButton.setOnClickListener { //页面跳转,将查询参数传过去 navigatePageTo( @@ -160,7 +159,6 @@ ) } - clearButton.setChangeAlphaWhenPress(true) clearButton.setOnClickListener { wellCodeView.setText("") alarmTypeView.text = "" diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt new file mode 100644 index 0000000..a4b66b9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt @@ -0,0 +1,207 @@ +package com.casic.qd.smartwell.view + +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.AlarmContentModel +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.AlarmViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import com.zhy.view.flowlayout.FlowLayout +import com.zhy.view.flowlayout.TagAdapter +import kotlinx.android.synthetic.main.activity_order_search.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class SearchOrderActivity : BaseActivity() { + + private lateinit var contentTypeViewModel: AlarmViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var inflater: LayoutInflater + private lateinit var contentTypeAdapter: TagAdapter + private lateinit var orderStatusAdapter: TagAdapter + private var contentModels: MutableList = ArrayList() + private var orderStatusModels: MutableList = ArrayList() + private var alarmContentType = "" + private var alarmLevel = "" + private var orderState = "" + + override fun initLayoutView(): Int = R.layout.activity_order_search + + override fun setupTopBarLayout() { + titleView.text = "工单查询" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + inflater = LayoutInflater.from(this) + //告警内容 + contentTypeViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + //工单状态 + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + contentTypeViewModel.obtainAlarmContent("1") + contentTypeViewModel.contentModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = AlarmContentModel.DataBean.ListBean() + bean.value = "" + bean.name = "全部" + bean.alarmType = "" + bean.deviceType = "" + contentModels.add(bean) + + it.data!!.list?.forEach { contentTypeBean -> + contentModels.add(contentTypeBean) + } + contentTypeAdapter = + object : TagAdapter(contentModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: AlarmContentModel.DataBean.ListBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmContentLayout, false + ) as TextView + tagView.text = contentModels[position].name + return tagView + } + } + alarmContentLayout.adapter = contentTypeAdapter + contentTypeAdapter.setSelectedList(0) + alarmContentLayout.setOnTagClickListener { _, position, _ -> + this.alarmContentType = contentModels[position].value.toString() + true + } + } + }) + + val levelMaps: MutableList> = ArrayList() + for (i in 0..3) { + val map = HashMap() + map["name"] = i.toString().toChinese() + map["value"] = i.toLevel() + levelMaps.add(map) + } + val levelAdapter = object : TagAdapter>(levelMaps) { + override fun getView( + parent: FlowLayout?, + position: Int, map: Map? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmLevelLayout, false + ) as TextView + tagView.text = levelMaps[position]["name"] + return tagView + } + } + alarmLevelLayout.adapter = levelAdapter + levelAdapter.setSelectedList(0) + alarmLevelLayout.setOnTagClickListener { _, position, _ -> + this.alarmLevel = levelMaps[position]["value"].toString() + true + } + + workOrderViewModel.obtainOrderStatus() + workOrderViewModel.orderStatusModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = OrderStatusModel.DataBean() + bean.name = "全部" + bean.id = "" + bean.value = "" + orderStatusModels.add(bean) + it.data!!.forEach { statusBean -> + orderStatusModels.add(statusBean) + } + orderStatusAdapter = + object : TagAdapter(orderStatusModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: OrderStatusModel.DataBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + orderStatusLayout, false + ) as TextView + tagView.text = orderStatusModels[position].name + return tagView + } + } + orderStatusLayout.adapter = orderStatusAdapter + orderStatusAdapter.setSelectedList(0) + orderStatusLayout.setOnTagClickListener { _, position, _ -> + this.orderState = orderStatusModels[position].value.toString() + true + } + } + }) + + startTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择开始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + startTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + endTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) { + "结束时间不合法,不能早于开始时间".show() + return@setCallBack + } + endTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + searchButton.setOnClickListener { + //页面跳转,将查询参数传过去 + navigatePageTo( + addAll( + wellCodeView.text.toString().trim(), + alarmContentType, + alarmLevel, + orderState, + startTimeView.text.toString(), + endTimeView.text.toString() + ) + ) + } + + clearButton.setOnClickListener { + wellCodeView.text.clear() + contentTypeAdapter.setSelectedList(0) + levelAdapter.setSelectedList(0) + orderStatusAdapter.setSelectedList(0) + startTimeView.text = "" + endTimeView.text = "" + } + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt new file mode 100644 index 0000000..1f1b5de --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt @@ -0,0 +1,47 @@ +package com.casic.qd.smartwell.view + +import androidx.fragment.app.Fragment +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.TopViewPagerAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.navigatePageTo +import com.casic.qd.smartwell.fragment.OrderCompletedFragment +import com.casic.qd.smartwell.fragment.OrderInHandleFragment +import com.casic.qd.smartwell.fragment.OrderNotConfirmedFragment +import com.casic.qd.smartwell.fragment.OrderNotProcessedFragment +import com.casic.qd.smartwell.utils.Constant +import kotlinx.android.synthetic.main.activity_order_management.* +import java.util.* + +class OrderManagementActivity : BaseActivity() { + + private var fragmentList: ArrayList = ArrayList() + + init { + fragmentList.add(OrderNotProcessedFragment())//待处理 + fragmentList.add(OrderNotConfirmedFragment())//待确认 + fragmentList.add(OrderInHandleFragment())//处理中 + fragmentList.add(OrderCompletedFragment())//已完成 + } + + override fun initLayoutView(): Int = R.layout.activity_order_management + + override fun setupTopBarLayout() { + titleView.text = "工单管理" + } + + override fun initData() { + val topViewPagerAdapter = TopViewPagerAdapter( + supportFragmentManager, Constant.SUB_PAGE_TITLES, fragmentList + ) + orderViewPager.offscreenPageLimit = fragmentList.size + orderViewPager.adapter = topViewPagerAdapter + orderTabLayout.setupWithViewPager(orderViewPager) + } + + override fun initEvent() { + rightOptionView.setOnClickListener { + navigatePageTo() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt new file mode 100644 index 0000000..6e7e65e --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -0,0 +1,217 @@ +package com.casic.qd.smartwell.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.SearchResultAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.showEmptyPage +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.WeakReferenceHandler +import com.casic.qd.smartwell.vm.OperationViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.TimeLineBottomSheet +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_order_search_result.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_empty_view.* + +class OrderSearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var operationViewModel: OperationViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var args: ArrayList + private lateinit var searchResultAdapter: SearchResultAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_order_search_result + + override fun setupTopBarLayout() { + titleView.text = "查询结果" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + weakReferenceHandler = WeakReferenceHandler(callback) + operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + obtainSearchResult(args, pageIndex) + workOrderViewModel.listModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + resultRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show() + } + dataBeans.addAll(dataRows!!) + resultRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022040101) + } + }) + workOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + resultRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + resultRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainSearchResult(args, pageIndex) + } + + //接单状态处理 + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + //通知列表刷行数据 + weakReferenceHandler.sendEmptyMessage(2022040102) + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + workOrderViewModel.detailModel.observe(this, { + if (it.code == 200) { + val orderDetail = it.data!![0] + val orderFlow = orderDetail.flow!! + if (orderFlow.size != 0) { + TimeLineBottomSheet.Builder().setContext(this) + .setFlowItems(orderFlow).build().show() + } else { + "抱歉,无法查到该工单的流转记录".show() + } + } + }) + } + + private fun obtainSearchResult(args: ArrayList, pageIndex: Int) { + workOrderViewModel.obtainSearchResult( + keywords = args[0], + alarmContent = args[1], + alarmLevel = args[2], + jobStatus = args[3], + beginTime = args[4], + endTime = args[5], + page = pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2022040102 -> { + isRefresh = true + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + 2022040101 -> { + if (isRefresh || isLoadMore) { + searchResultAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + obtainSearchResult(args, pageIndex) + } + } else { + emptyView!!.hide() + searchResultAdapter = SearchResultAdapter(this, dataBeans) + resultRecyclerView!!.layoutManager = LinearLayoutManager(this) + resultRecyclerView!!.adapter = searchResultAdapter + searchResultAdapter.setOnItemClickListener(object : + SearchResultAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } + if (dataBeans[position].jobStatus == "0") { +// navigatePageTo(jobId) + } else { +// navigatePageTo(jobId) + } + } + + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(this@OrderSearchResultActivity) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptWorkOrder(jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + + override fun onTransferViewClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看工单流转记录".show() + return + } + workOrderViewModel.obtainWorkOrderDetail(jobId) + } + }) + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index 2b92d86..fccff95 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -145,7 +145,6 @@ }.build().show(supportFragmentManager, "all") } - searchButton.setChangeAlphaWhenPress(true) searchButton.setOnClickListener { //页面跳转,将查询参数传过去 navigatePageTo( @@ -160,7 +159,6 @@ ) } - clearButton.setChangeAlphaWhenPress(true) clearButton.setOnClickListener { wellCodeView.setText("") alarmTypeView.text = "" diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt new file mode 100644 index 0000000..a4b66b9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt @@ -0,0 +1,207 @@ +package com.casic.qd.smartwell.view + +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.AlarmContentModel +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.AlarmViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import com.zhy.view.flowlayout.FlowLayout +import com.zhy.view.flowlayout.TagAdapter +import kotlinx.android.synthetic.main.activity_order_search.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class SearchOrderActivity : BaseActivity() { + + private lateinit var contentTypeViewModel: AlarmViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var inflater: LayoutInflater + private lateinit var contentTypeAdapter: TagAdapter + private lateinit var orderStatusAdapter: TagAdapter + private var contentModels: MutableList = ArrayList() + private var orderStatusModels: MutableList = ArrayList() + private var alarmContentType = "" + private var alarmLevel = "" + private var orderState = "" + + override fun initLayoutView(): Int = R.layout.activity_order_search + + override fun setupTopBarLayout() { + titleView.text = "工单查询" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + inflater = LayoutInflater.from(this) + //告警内容 + contentTypeViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + //工单状态 + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + contentTypeViewModel.obtainAlarmContent("1") + contentTypeViewModel.contentModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = AlarmContentModel.DataBean.ListBean() + bean.value = "" + bean.name = "全部" + bean.alarmType = "" + bean.deviceType = "" + contentModels.add(bean) + + it.data!!.list?.forEach { contentTypeBean -> + contentModels.add(contentTypeBean) + } + contentTypeAdapter = + object : TagAdapter(contentModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: AlarmContentModel.DataBean.ListBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmContentLayout, false + ) as TextView + tagView.text = contentModels[position].name + return tagView + } + } + alarmContentLayout.adapter = contentTypeAdapter + contentTypeAdapter.setSelectedList(0) + alarmContentLayout.setOnTagClickListener { _, position, _ -> + this.alarmContentType = contentModels[position].value.toString() + true + } + } + }) + + val levelMaps: MutableList> = ArrayList() + for (i in 0..3) { + val map = HashMap() + map["name"] = i.toString().toChinese() + map["value"] = i.toLevel() + levelMaps.add(map) + } + val levelAdapter = object : TagAdapter>(levelMaps) { + override fun getView( + parent: FlowLayout?, + position: Int, map: Map? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmLevelLayout, false + ) as TextView + tagView.text = levelMaps[position]["name"] + return tagView + } + } + alarmLevelLayout.adapter = levelAdapter + levelAdapter.setSelectedList(0) + alarmLevelLayout.setOnTagClickListener { _, position, _ -> + this.alarmLevel = levelMaps[position]["value"].toString() + true + } + + workOrderViewModel.obtainOrderStatus() + workOrderViewModel.orderStatusModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = OrderStatusModel.DataBean() + bean.name = "全部" + bean.id = "" + bean.value = "" + orderStatusModels.add(bean) + it.data!!.forEach { statusBean -> + orderStatusModels.add(statusBean) + } + orderStatusAdapter = + object : TagAdapter(orderStatusModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: OrderStatusModel.DataBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + orderStatusLayout, false + ) as TextView + tagView.text = orderStatusModels[position].name + return tagView + } + } + orderStatusLayout.adapter = orderStatusAdapter + orderStatusAdapter.setSelectedList(0) + orderStatusLayout.setOnTagClickListener { _, position, _ -> + this.orderState = orderStatusModels[position].value.toString() + true + } + } + }) + + startTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择开始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + startTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + endTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) { + "结束时间不合法,不能早于开始时间".show() + return@setCallBack + } + endTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + searchButton.setOnClickListener { + //页面跳转,将查询参数传过去 + navigatePageTo( + addAll( + wellCodeView.text.toString().trim(), + alarmContentType, + alarmLevel, + orderState, + startTimeView.text.toString(), + endTimeView.text.toString() + ) + ) + } + + clearButton.setOnClickListener { + wellCodeView.text.clear() + contentTypeAdapter.setSelectedList(0) + levelAdapter.setSelectedList(0) + orderStatusAdapter.setSelectedList(0) + startTimeView.text = "" + endTimeView.text = "" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt index b1f9fc3..c21fe1a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt @@ -112,16 +112,20 @@ }) fun obtainMapDeviceResult(keywords: String?, devType: String?) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.obtainMapDeviceResult(keywords, devType) val responseCode = response.separateResponseCode() if (responseCode == 200) { + loadState.value = LoadState.Success mapDeviceResultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { + loadState.value = LoadState.Fail response.toErrorMessage().show() } }, { + loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt new file mode 100644 index 0000000..1f1b5de --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt @@ -0,0 +1,47 @@ +package com.casic.qd.smartwell.view + +import androidx.fragment.app.Fragment +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.TopViewPagerAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.navigatePageTo +import com.casic.qd.smartwell.fragment.OrderCompletedFragment +import com.casic.qd.smartwell.fragment.OrderInHandleFragment +import com.casic.qd.smartwell.fragment.OrderNotConfirmedFragment +import com.casic.qd.smartwell.fragment.OrderNotProcessedFragment +import com.casic.qd.smartwell.utils.Constant +import kotlinx.android.synthetic.main.activity_order_management.* +import java.util.* + +class OrderManagementActivity : BaseActivity() { + + private var fragmentList: ArrayList = ArrayList() + + init { + fragmentList.add(OrderNotProcessedFragment())//待处理 + fragmentList.add(OrderNotConfirmedFragment())//待确认 + fragmentList.add(OrderInHandleFragment())//处理中 + fragmentList.add(OrderCompletedFragment())//已完成 + } + + override fun initLayoutView(): Int = R.layout.activity_order_management + + override fun setupTopBarLayout() { + titleView.text = "工单管理" + } + + override fun initData() { + val topViewPagerAdapter = TopViewPagerAdapter( + supportFragmentManager, Constant.SUB_PAGE_TITLES, fragmentList + ) + orderViewPager.offscreenPageLimit = fragmentList.size + orderViewPager.adapter = topViewPagerAdapter + orderTabLayout.setupWithViewPager(orderViewPager) + } + + override fun initEvent() { + rightOptionView.setOnClickListener { + navigatePageTo() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt new file mode 100644 index 0000000..6e7e65e --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -0,0 +1,217 @@ +package com.casic.qd.smartwell.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.SearchResultAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.showEmptyPage +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.WeakReferenceHandler +import com.casic.qd.smartwell.vm.OperationViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.TimeLineBottomSheet +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_order_search_result.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_empty_view.* + +class OrderSearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var operationViewModel: OperationViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var args: ArrayList + private lateinit var searchResultAdapter: SearchResultAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_order_search_result + + override fun setupTopBarLayout() { + titleView.text = "查询结果" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + weakReferenceHandler = WeakReferenceHandler(callback) + operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + obtainSearchResult(args, pageIndex) + workOrderViewModel.listModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + resultRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show() + } + dataBeans.addAll(dataRows!!) + resultRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022040101) + } + }) + workOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + resultRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + resultRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainSearchResult(args, pageIndex) + } + + //接单状态处理 + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + //通知列表刷行数据 + weakReferenceHandler.sendEmptyMessage(2022040102) + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + workOrderViewModel.detailModel.observe(this, { + if (it.code == 200) { + val orderDetail = it.data!![0] + val orderFlow = orderDetail.flow!! + if (orderFlow.size != 0) { + TimeLineBottomSheet.Builder().setContext(this) + .setFlowItems(orderFlow).build().show() + } else { + "抱歉,无法查到该工单的流转记录".show() + } + } + }) + } + + private fun obtainSearchResult(args: ArrayList, pageIndex: Int) { + workOrderViewModel.obtainSearchResult( + keywords = args[0], + alarmContent = args[1], + alarmLevel = args[2], + jobStatus = args[3], + beginTime = args[4], + endTime = args[5], + page = pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2022040102 -> { + isRefresh = true + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + 2022040101 -> { + if (isRefresh || isLoadMore) { + searchResultAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + obtainSearchResult(args, pageIndex) + } + } else { + emptyView!!.hide() + searchResultAdapter = SearchResultAdapter(this, dataBeans) + resultRecyclerView!!.layoutManager = LinearLayoutManager(this) + resultRecyclerView!!.adapter = searchResultAdapter + searchResultAdapter.setOnItemClickListener(object : + SearchResultAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } + if (dataBeans[position].jobStatus == "0") { +// navigatePageTo(jobId) + } else { +// navigatePageTo(jobId) + } + } + + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(this@OrderSearchResultActivity) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptWorkOrder(jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + + override fun onTransferViewClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看工单流转记录".show() + return + } + workOrderViewModel.obtainWorkOrderDetail(jobId) + } + }) + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index 2b92d86..fccff95 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -145,7 +145,6 @@ }.build().show(supportFragmentManager, "all") } - searchButton.setChangeAlphaWhenPress(true) searchButton.setOnClickListener { //页面跳转,将查询参数传过去 navigatePageTo( @@ -160,7 +159,6 @@ ) } - clearButton.setChangeAlphaWhenPress(true) clearButton.setOnClickListener { wellCodeView.setText("") alarmTypeView.text = "" diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt new file mode 100644 index 0000000..a4b66b9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt @@ -0,0 +1,207 @@ +package com.casic.qd.smartwell.view + +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.AlarmContentModel +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.AlarmViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import com.zhy.view.flowlayout.FlowLayout +import com.zhy.view.flowlayout.TagAdapter +import kotlinx.android.synthetic.main.activity_order_search.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class SearchOrderActivity : BaseActivity() { + + private lateinit var contentTypeViewModel: AlarmViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var inflater: LayoutInflater + private lateinit var contentTypeAdapter: TagAdapter + private lateinit var orderStatusAdapter: TagAdapter + private var contentModels: MutableList = ArrayList() + private var orderStatusModels: MutableList = ArrayList() + private var alarmContentType = "" + private var alarmLevel = "" + private var orderState = "" + + override fun initLayoutView(): Int = R.layout.activity_order_search + + override fun setupTopBarLayout() { + titleView.text = "工单查询" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + inflater = LayoutInflater.from(this) + //告警内容 + contentTypeViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + //工单状态 + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + contentTypeViewModel.obtainAlarmContent("1") + contentTypeViewModel.contentModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = AlarmContentModel.DataBean.ListBean() + bean.value = "" + bean.name = "全部" + bean.alarmType = "" + bean.deviceType = "" + contentModels.add(bean) + + it.data!!.list?.forEach { contentTypeBean -> + contentModels.add(contentTypeBean) + } + contentTypeAdapter = + object : TagAdapter(contentModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: AlarmContentModel.DataBean.ListBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmContentLayout, false + ) as TextView + tagView.text = contentModels[position].name + return tagView + } + } + alarmContentLayout.adapter = contentTypeAdapter + contentTypeAdapter.setSelectedList(0) + alarmContentLayout.setOnTagClickListener { _, position, _ -> + this.alarmContentType = contentModels[position].value.toString() + true + } + } + }) + + val levelMaps: MutableList> = ArrayList() + for (i in 0..3) { + val map = HashMap() + map["name"] = i.toString().toChinese() + map["value"] = i.toLevel() + levelMaps.add(map) + } + val levelAdapter = object : TagAdapter>(levelMaps) { + override fun getView( + parent: FlowLayout?, + position: Int, map: Map? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmLevelLayout, false + ) as TextView + tagView.text = levelMaps[position]["name"] + return tagView + } + } + alarmLevelLayout.adapter = levelAdapter + levelAdapter.setSelectedList(0) + alarmLevelLayout.setOnTagClickListener { _, position, _ -> + this.alarmLevel = levelMaps[position]["value"].toString() + true + } + + workOrderViewModel.obtainOrderStatus() + workOrderViewModel.orderStatusModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = OrderStatusModel.DataBean() + bean.name = "全部" + bean.id = "" + bean.value = "" + orderStatusModels.add(bean) + it.data!!.forEach { statusBean -> + orderStatusModels.add(statusBean) + } + orderStatusAdapter = + object : TagAdapter(orderStatusModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: OrderStatusModel.DataBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + orderStatusLayout, false + ) as TextView + tagView.text = orderStatusModels[position].name + return tagView + } + } + orderStatusLayout.adapter = orderStatusAdapter + orderStatusAdapter.setSelectedList(0) + orderStatusLayout.setOnTagClickListener { _, position, _ -> + this.orderState = orderStatusModels[position].value.toString() + true + } + } + }) + + startTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择开始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + startTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + endTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) { + "结束时间不合法,不能早于开始时间".show() + return@setCallBack + } + endTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + searchButton.setOnClickListener { + //页面跳转,将查询参数传过去 + navigatePageTo( + addAll( + wellCodeView.text.toString().trim(), + alarmContentType, + alarmLevel, + orderState, + startTimeView.text.toString(), + endTimeView.text.toString() + ) + ) + } + + clearButton.setOnClickListener { + wellCodeView.text.clear() + contentTypeAdapter.setSelectedList(0) + levelAdapter.setSelectedList(0) + orderStatusAdapter.setSelectedList(0) + startTimeView.text = "" + endTimeView.text = "" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt index b1f9fc3..c21fe1a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt @@ -112,16 +112,20 @@ }) fun obtainMapDeviceResult(keywords: String?, devType: String?) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.obtainMapDeviceResult(keywords, devType) val responseCode = response.separateResponseCode() if (responseCode == 200) { + loadState.value = LoadState.Success mapDeviceResultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { + loadState.value = LoadState.Fail response.toErrorMessage().show() } }, { + loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt new file mode 100644 index 0000000..6a528a4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt @@ -0,0 +1,83 @@ +package com.casic.qd.smartwell.vm + +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager + +/** + * 转单、接单、处理等vm + * */ +class OperationViewModel : BaseViewModel() { + + fun acceptWorkOrder(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.acceptWorkOrder(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "接单成功".show() + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun confirmWorkOrder( +// id: String, firstState: String, +// firstStatePhotos: String, needHandle: String +// ) = launch({ +// loadState.value = LoadState.Loading +// val response = +// RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单确认成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun transferWorkOrder(id: String, userId: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.transferWorkOrder(id, userId) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "转单成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun completeWorkOrder(id: String, handleMessage: String, handlePhotos: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.completeWorkOrder(id, handleMessage, handlePhotos) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单处理成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt new file mode 100644 index 0000000..1f1b5de --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt @@ -0,0 +1,47 @@ +package com.casic.qd.smartwell.view + +import androidx.fragment.app.Fragment +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.TopViewPagerAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.navigatePageTo +import com.casic.qd.smartwell.fragment.OrderCompletedFragment +import com.casic.qd.smartwell.fragment.OrderInHandleFragment +import com.casic.qd.smartwell.fragment.OrderNotConfirmedFragment +import com.casic.qd.smartwell.fragment.OrderNotProcessedFragment +import com.casic.qd.smartwell.utils.Constant +import kotlinx.android.synthetic.main.activity_order_management.* +import java.util.* + +class OrderManagementActivity : BaseActivity() { + + private var fragmentList: ArrayList = ArrayList() + + init { + fragmentList.add(OrderNotProcessedFragment())//待处理 + fragmentList.add(OrderNotConfirmedFragment())//待确认 + fragmentList.add(OrderInHandleFragment())//处理中 + fragmentList.add(OrderCompletedFragment())//已完成 + } + + override fun initLayoutView(): Int = R.layout.activity_order_management + + override fun setupTopBarLayout() { + titleView.text = "工单管理" + } + + override fun initData() { + val topViewPagerAdapter = TopViewPagerAdapter( + supportFragmentManager, Constant.SUB_PAGE_TITLES, fragmentList + ) + orderViewPager.offscreenPageLimit = fragmentList.size + orderViewPager.adapter = topViewPagerAdapter + orderTabLayout.setupWithViewPager(orderViewPager) + } + + override fun initEvent() { + rightOptionView.setOnClickListener { + navigatePageTo() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt new file mode 100644 index 0000000..6e7e65e --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -0,0 +1,217 @@ +package com.casic.qd.smartwell.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.SearchResultAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.showEmptyPage +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.WeakReferenceHandler +import com.casic.qd.smartwell.vm.OperationViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.TimeLineBottomSheet +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_order_search_result.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_empty_view.* + +class OrderSearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var operationViewModel: OperationViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var args: ArrayList + private lateinit var searchResultAdapter: SearchResultAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_order_search_result + + override fun setupTopBarLayout() { + titleView.text = "查询结果" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + weakReferenceHandler = WeakReferenceHandler(callback) + operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + obtainSearchResult(args, pageIndex) + workOrderViewModel.listModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + resultRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show() + } + dataBeans.addAll(dataRows!!) + resultRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022040101) + } + }) + workOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + resultRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + resultRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainSearchResult(args, pageIndex) + } + + //接单状态处理 + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + //通知列表刷行数据 + weakReferenceHandler.sendEmptyMessage(2022040102) + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + workOrderViewModel.detailModel.observe(this, { + if (it.code == 200) { + val orderDetail = it.data!![0] + val orderFlow = orderDetail.flow!! + if (orderFlow.size != 0) { + TimeLineBottomSheet.Builder().setContext(this) + .setFlowItems(orderFlow).build().show() + } else { + "抱歉,无法查到该工单的流转记录".show() + } + } + }) + } + + private fun obtainSearchResult(args: ArrayList, pageIndex: Int) { + workOrderViewModel.obtainSearchResult( + keywords = args[0], + alarmContent = args[1], + alarmLevel = args[2], + jobStatus = args[3], + beginTime = args[4], + endTime = args[5], + page = pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2022040102 -> { + isRefresh = true + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + 2022040101 -> { + if (isRefresh || isLoadMore) { + searchResultAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + obtainSearchResult(args, pageIndex) + } + } else { + emptyView!!.hide() + searchResultAdapter = SearchResultAdapter(this, dataBeans) + resultRecyclerView!!.layoutManager = LinearLayoutManager(this) + resultRecyclerView!!.adapter = searchResultAdapter + searchResultAdapter.setOnItemClickListener(object : + SearchResultAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } + if (dataBeans[position].jobStatus == "0") { +// navigatePageTo(jobId) + } else { +// navigatePageTo(jobId) + } + } + + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(this@OrderSearchResultActivity) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptWorkOrder(jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + + override fun onTransferViewClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看工单流转记录".show() + return + } + workOrderViewModel.obtainWorkOrderDetail(jobId) + } + }) + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index 2b92d86..fccff95 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -145,7 +145,6 @@ }.build().show(supportFragmentManager, "all") } - searchButton.setChangeAlphaWhenPress(true) searchButton.setOnClickListener { //页面跳转,将查询参数传过去 navigatePageTo( @@ -160,7 +159,6 @@ ) } - clearButton.setChangeAlphaWhenPress(true) clearButton.setOnClickListener { wellCodeView.setText("") alarmTypeView.text = "" diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt new file mode 100644 index 0000000..a4b66b9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt @@ -0,0 +1,207 @@ +package com.casic.qd.smartwell.view + +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.AlarmContentModel +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.AlarmViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import com.zhy.view.flowlayout.FlowLayout +import com.zhy.view.flowlayout.TagAdapter +import kotlinx.android.synthetic.main.activity_order_search.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class SearchOrderActivity : BaseActivity() { + + private lateinit var contentTypeViewModel: AlarmViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var inflater: LayoutInflater + private lateinit var contentTypeAdapter: TagAdapter + private lateinit var orderStatusAdapter: TagAdapter + private var contentModels: MutableList = ArrayList() + private var orderStatusModels: MutableList = ArrayList() + private var alarmContentType = "" + private var alarmLevel = "" + private var orderState = "" + + override fun initLayoutView(): Int = R.layout.activity_order_search + + override fun setupTopBarLayout() { + titleView.text = "工单查询" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + inflater = LayoutInflater.from(this) + //告警内容 + contentTypeViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + //工单状态 + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + contentTypeViewModel.obtainAlarmContent("1") + contentTypeViewModel.contentModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = AlarmContentModel.DataBean.ListBean() + bean.value = "" + bean.name = "全部" + bean.alarmType = "" + bean.deviceType = "" + contentModels.add(bean) + + it.data!!.list?.forEach { contentTypeBean -> + contentModels.add(contentTypeBean) + } + contentTypeAdapter = + object : TagAdapter(contentModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: AlarmContentModel.DataBean.ListBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmContentLayout, false + ) as TextView + tagView.text = contentModels[position].name + return tagView + } + } + alarmContentLayout.adapter = contentTypeAdapter + contentTypeAdapter.setSelectedList(0) + alarmContentLayout.setOnTagClickListener { _, position, _ -> + this.alarmContentType = contentModels[position].value.toString() + true + } + } + }) + + val levelMaps: MutableList> = ArrayList() + for (i in 0..3) { + val map = HashMap() + map["name"] = i.toString().toChinese() + map["value"] = i.toLevel() + levelMaps.add(map) + } + val levelAdapter = object : TagAdapter>(levelMaps) { + override fun getView( + parent: FlowLayout?, + position: Int, map: Map? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmLevelLayout, false + ) as TextView + tagView.text = levelMaps[position]["name"] + return tagView + } + } + alarmLevelLayout.adapter = levelAdapter + levelAdapter.setSelectedList(0) + alarmLevelLayout.setOnTagClickListener { _, position, _ -> + this.alarmLevel = levelMaps[position]["value"].toString() + true + } + + workOrderViewModel.obtainOrderStatus() + workOrderViewModel.orderStatusModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = OrderStatusModel.DataBean() + bean.name = "全部" + bean.id = "" + bean.value = "" + orderStatusModels.add(bean) + it.data!!.forEach { statusBean -> + orderStatusModels.add(statusBean) + } + orderStatusAdapter = + object : TagAdapter(orderStatusModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: OrderStatusModel.DataBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + orderStatusLayout, false + ) as TextView + tagView.text = orderStatusModels[position].name + return tagView + } + } + orderStatusLayout.adapter = orderStatusAdapter + orderStatusAdapter.setSelectedList(0) + orderStatusLayout.setOnTagClickListener { _, position, _ -> + this.orderState = orderStatusModels[position].value.toString() + true + } + } + }) + + startTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择开始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + startTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + endTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) { + "结束时间不合法,不能早于开始时间".show() + return@setCallBack + } + endTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + searchButton.setOnClickListener { + //页面跳转,将查询参数传过去 + navigatePageTo( + addAll( + wellCodeView.text.toString().trim(), + alarmContentType, + alarmLevel, + orderState, + startTimeView.text.toString(), + endTimeView.text.toString() + ) + ) + } + + clearButton.setOnClickListener { + wellCodeView.text.clear() + contentTypeAdapter.setSelectedList(0) + levelAdapter.setSelectedList(0) + orderStatusAdapter.setSelectedList(0) + startTimeView.text = "" + endTimeView.text = "" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt index b1f9fc3..c21fe1a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt @@ -112,16 +112,20 @@ }) fun obtainMapDeviceResult(keywords: String?, devType: String?) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.obtainMapDeviceResult(keywords, devType) val responseCode = response.separateResponseCode() if (responseCode == 200) { + loadState.value = LoadState.Success mapDeviceResultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { + loadState.value = LoadState.Fail response.toErrorMessage().show() } }, { + loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt new file mode 100644 index 0000000..6a528a4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt @@ -0,0 +1,83 @@ +package com.casic.qd.smartwell.vm + +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager + +/** + * 转单、接单、处理等vm + * */ +class OperationViewModel : BaseViewModel() { + + fun acceptWorkOrder(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.acceptWorkOrder(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "接单成功".show() + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun confirmWorkOrder( +// id: String, firstState: String, +// firstStatePhotos: String, needHandle: String +// ) = launch({ +// loadState.value = LoadState.Loading +// val response = +// RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单确认成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun transferWorkOrder(id: String, userId: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.transferWorkOrder(id, userId) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "转单成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun completeWorkOrder(id: String, handleMessage: String, handlePhotos: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.completeWorkOrder(id, handleMessage, handlePhotos) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单处理成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt new file mode 100644 index 0000000..411c9a8 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt @@ -0,0 +1,105 @@ +package com.casic.qd.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +class WorkOrderViewModel : BaseViewModel() { + + private val gson = Gson() + val orderStatusModel = MutableLiveData() + val listModel = MutableLiveData() + val detailModel = MutableLiveData() +// val resultModel = MutableLiveData>() + + + fun obtainOrderStatus() = launch({ + val response = RetrofitServiceManager.obtainOrderStatus() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderStatusModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainSearchResult( + keywords, alarmContent, alarmLevel, jobStatus, beginTime, endTime, page + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun obtainWorkOrderDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainWorkOrderDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + detailModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun countWorkOrderByState() = launch({ +// val response = RetrofitServiceManager.countWorkOrderByState() +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// val map = HashMap(4) +// +// val jsonObject = JSONObject(response) +// val data = jsonObject.getJSONObject("data") +// map["beforeGet"] = data.getString("beforeGet") +// map["beforeConfirm"] = data.getString("beforeConfirm") +// map["inHandle"] = data.getString("inHandle") +// map["over"] = data.getString("over") +// resultModel.value = map +// } else { +// response.toErrorMessage().show() +// } +// }, { +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt new file mode 100644 index 0000000..1f1b5de --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt @@ -0,0 +1,47 @@ +package com.casic.qd.smartwell.view + +import androidx.fragment.app.Fragment +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.TopViewPagerAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.navigatePageTo +import com.casic.qd.smartwell.fragment.OrderCompletedFragment +import com.casic.qd.smartwell.fragment.OrderInHandleFragment +import com.casic.qd.smartwell.fragment.OrderNotConfirmedFragment +import com.casic.qd.smartwell.fragment.OrderNotProcessedFragment +import com.casic.qd.smartwell.utils.Constant +import kotlinx.android.synthetic.main.activity_order_management.* +import java.util.* + +class OrderManagementActivity : BaseActivity() { + + private var fragmentList: ArrayList = ArrayList() + + init { + fragmentList.add(OrderNotProcessedFragment())//待处理 + fragmentList.add(OrderNotConfirmedFragment())//待确认 + fragmentList.add(OrderInHandleFragment())//处理中 + fragmentList.add(OrderCompletedFragment())//已完成 + } + + override fun initLayoutView(): Int = R.layout.activity_order_management + + override fun setupTopBarLayout() { + titleView.text = "工单管理" + } + + override fun initData() { + val topViewPagerAdapter = TopViewPagerAdapter( + supportFragmentManager, Constant.SUB_PAGE_TITLES, fragmentList + ) + orderViewPager.offscreenPageLimit = fragmentList.size + orderViewPager.adapter = topViewPagerAdapter + orderTabLayout.setupWithViewPager(orderViewPager) + } + + override fun initEvent() { + rightOptionView.setOnClickListener { + navigatePageTo() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt new file mode 100644 index 0000000..6e7e65e --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -0,0 +1,217 @@ +package com.casic.qd.smartwell.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.SearchResultAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.showEmptyPage +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.WeakReferenceHandler +import com.casic.qd.smartwell.vm.OperationViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.TimeLineBottomSheet +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_order_search_result.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_empty_view.* + +class OrderSearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var operationViewModel: OperationViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var args: ArrayList + private lateinit var searchResultAdapter: SearchResultAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_order_search_result + + override fun setupTopBarLayout() { + titleView.text = "查询结果" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + weakReferenceHandler = WeakReferenceHandler(callback) + operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + obtainSearchResult(args, pageIndex) + workOrderViewModel.listModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + resultRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show() + } + dataBeans.addAll(dataRows!!) + resultRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022040101) + } + }) + workOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + resultRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + resultRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainSearchResult(args, pageIndex) + } + + //接单状态处理 + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + //通知列表刷行数据 + weakReferenceHandler.sendEmptyMessage(2022040102) + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + workOrderViewModel.detailModel.observe(this, { + if (it.code == 200) { + val orderDetail = it.data!![0] + val orderFlow = orderDetail.flow!! + if (orderFlow.size != 0) { + TimeLineBottomSheet.Builder().setContext(this) + .setFlowItems(orderFlow).build().show() + } else { + "抱歉,无法查到该工单的流转记录".show() + } + } + }) + } + + private fun obtainSearchResult(args: ArrayList, pageIndex: Int) { + workOrderViewModel.obtainSearchResult( + keywords = args[0], + alarmContent = args[1], + alarmLevel = args[2], + jobStatus = args[3], + beginTime = args[4], + endTime = args[5], + page = pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2022040102 -> { + isRefresh = true + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + 2022040101 -> { + if (isRefresh || isLoadMore) { + searchResultAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + obtainSearchResult(args, pageIndex) + } + } else { + emptyView!!.hide() + searchResultAdapter = SearchResultAdapter(this, dataBeans) + resultRecyclerView!!.layoutManager = LinearLayoutManager(this) + resultRecyclerView!!.adapter = searchResultAdapter + searchResultAdapter.setOnItemClickListener(object : + SearchResultAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } + if (dataBeans[position].jobStatus == "0") { +// navigatePageTo(jobId) + } else { +// navigatePageTo(jobId) + } + } + + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(this@OrderSearchResultActivity) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptWorkOrder(jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + + override fun onTransferViewClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看工单流转记录".show() + return + } + workOrderViewModel.obtainWorkOrderDetail(jobId) + } + }) + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index 2b92d86..fccff95 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -145,7 +145,6 @@ }.build().show(supportFragmentManager, "all") } - searchButton.setChangeAlphaWhenPress(true) searchButton.setOnClickListener { //页面跳转,将查询参数传过去 navigatePageTo( @@ -160,7 +159,6 @@ ) } - clearButton.setChangeAlphaWhenPress(true) clearButton.setOnClickListener { wellCodeView.setText("") alarmTypeView.text = "" diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt new file mode 100644 index 0000000..a4b66b9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt @@ -0,0 +1,207 @@ +package com.casic.qd.smartwell.view + +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.AlarmContentModel +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.AlarmViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import com.zhy.view.flowlayout.FlowLayout +import com.zhy.view.flowlayout.TagAdapter +import kotlinx.android.synthetic.main.activity_order_search.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class SearchOrderActivity : BaseActivity() { + + private lateinit var contentTypeViewModel: AlarmViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var inflater: LayoutInflater + private lateinit var contentTypeAdapter: TagAdapter + private lateinit var orderStatusAdapter: TagAdapter + private var contentModels: MutableList = ArrayList() + private var orderStatusModels: MutableList = ArrayList() + private var alarmContentType = "" + private var alarmLevel = "" + private var orderState = "" + + override fun initLayoutView(): Int = R.layout.activity_order_search + + override fun setupTopBarLayout() { + titleView.text = "工单查询" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + inflater = LayoutInflater.from(this) + //告警内容 + contentTypeViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + //工单状态 + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + contentTypeViewModel.obtainAlarmContent("1") + contentTypeViewModel.contentModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = AlarmContentModel.DataBean.ListBean() + bean.value = "" + bean.name = "全部" + bean.alarmType = "" + bean.deviceType = "" + contentModels.add(bean) + + it.data!!.list?.forEach { contentTypeBean -> + contentModels.add(contentTypeBean) + } + contentTypeAdapter = + object : TagAdapter(contentModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: AlarmContentModel.DataBean.ListBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmContentLayout, false + ) as TextView + tagView.text = contentModels[position].name + return tagView + } + } + alarmContentLayout.adapter = contentTypeAdapter + contentTypeAdapter.setSelectedList(0) + alarmContentLayout.setOnTagClickListener { _, position, _ -> + this.alarmContentType = contentModels[position].value.toString() + true + } + } + }) + + val levelMaps: MutableList> = ArrayList() + for (i in 0..3) { + val map = HashMap() + map["name"] = i.toString().toChinese() + map["value"] = i.toLevel() + levelMaps.add(map) + } + val levelAdapter = object : TagAdapter>(levelMaps) { + override fun getView( + parent: FlowLayout?, + position: Int, map: Map? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmLevelLayout, false + ) as TextView + tagView.text = levelMaps[position]["name"] + return tagView + } + } + alarmLevelLayout.adapter = levelAdapter + levelAdapter.setSelectedList(0) + alarmLevelLayout.setOnTagClickListener { _, position, _ -> + this.alarmLevel = levelMaps[position]["value"].toString() + true + } + + workOrderViewModel.obtainOrderStatus() + workOrderViewModel.orderStatusModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = OrderStatusModel.DataBean() + bean.name = "全部" + bean.id = "" + bean.value = "" + orderStatusModels.add(bean) + it.data!!.forEach { statusBean -> + orderStatusModels.add(statusBean) + } + orderStatusAdapter = + object : TagAdapter(orderStatusModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: OrderStatusModel.DataBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + orderStatusLayout, false + ) as TextView + tagView.text = orderStatusModels[position].name + return tagView + } + } + orderStatusLayout.adapter = orderStatusAdapter + orderStatusAdapter.setSelectedList(0) + orderStatusLayout.setOnTagClickListener { _, position, _ -> + this.orderState = orderStatusModels[position].value.toString() + true + } + } + }) + + startTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择开始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + startTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + endTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) { + "结束时间不合法,不能早于开始时间".show() + return@setCallBack + } + endTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + searchButton.setOnClickListener { + //页面跳转,将查询参数传过去 + navigatePageTo( + addAll( + wellCodeView.text.toString().trim(), + alarmContentType, + alarmLevel, + orderState, + startTimeView.text.toString(), + endTimeView.text.toString() + ) + ) + } + + clearButton.setOnClickListener { + wellCodeView.text.clear() + contentTypeAdapter.setSelectedList(0) + levelAdapter.setSelectedList(0) + orderStatusAdapter.setSelectedList(0) + startTimeView.text = "" + endTimeView.text = "" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt index b1f9fc3..c21fe1a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt @@ -112,16 +112,20 @@ }) fun obtainMapDeviceResult(keywords: String?, devType: String?) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.obtainMapDeviceResult(keywords, devType) val responseCode = response.separateResponseCode() if (responseCode == 200) { + loadState.value = LoadState.Success mapDeviceResultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { + loadState.value = LoadState.Fail response.toErrorMessage().show() } }, { + loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt new file mode 100644 index 0000000..6a528a4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt @@ -0,0 +1,83 @@ +package com.casic.qd.smartwell.vm + +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager + +/** + * 转单、接单、处理等vm + * */ +class OperationViewModel : BaseViewModel() { + + fun acceptWorkOrder(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.acceptWorkOrder(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "接单成功".show() + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun confirmWorkOrder( +// id: String, firstState: String, +// firstStatePhotos: String, needHandle: String +// ) = launch({ +// loadState.value = LoadState.Loading +// val response = +// RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单确认成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun transferWorkOrder(id: String, userId: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.transferWorkOrder(id, userId) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "转单成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun completeWorkOrder(id: String, handleMessage: String, handlePhotos: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.completeWorkOrder(id, handleMessage, handlePhotos) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单处理成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt new file mode 100644 index 0000000..411c9a8 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt @@ -0,0 +1,105 @@ +package com.casic.qd.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +class WorkOrderViewModel : BaseViewModel() { + + private val gson = Gson() + val orderStatusModel = MutableLiveData() + val listModel = MutableLiveData() + val detailModel = MutableLiveData() +// val resultModel = MutableLiveData>() + + + fun obtainOrderStatus() = launch({ + val response = RetrofitServiceManager.obtainOrderStatus() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderStatusModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainSearchResult( + keywords, alarmContent, alarmLevel, jobStatus, beginTime, endTime, page + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun obtainWorkOrderDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainWorkOrderDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + detailModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun countWorkOrderByState() = launch({ +// val response = RetrofitServiceManager.countWorkOrderByState() +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// val map = HashMap(4) +// +// val jsonObject = JSONObject(response) +// val data = jsonObject.getJSONObject("data") +// map["beforeGet"] = data.getString("beforeGet") +// map["beforeConfirm"] = data.getString("beforeConfirm") +// map["inHandle"] = data.getString("inHandle") +// map["over"] = data.getString("over") +// resultModel.value = map +// } else { +// response.toErrorMessage().show() +// } +// }, { +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt index 39d6d09..6de33f7 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt @@ -119,7 +119,6 @@ } } - sheetConfirmButton.setChangeAlphaWhenPress(true) sheetConfirmButton.setOnClickListener { listener.onAreaSelected(areaName, areaId) dismiss() diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt new file mode 100644 index 0000000..1f1b5de --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt @@ -0,0 +1,47 @@ +package com.casic.qd.smartwell.view + +import androidx.fragment.app.Fragment +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.TopViewPagerAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.navigatePageTo +import com.casic.qd.smartwell.fragment.OrderCompletedFragment +import com.casic.qd.smartwell.fragment.OrderInHandleFragment +import com.casic.qd.smartwell.fragment.OrderNotConfirmedFragment +import com.casic.qd.smartwell.fragment.OrderNotProcessedFragment +import com.casic.qd.smartwell.utils.Constant +import kotlinx.android.synthetic.main.activity_order_management.* +import java.util.* + +class OrderManagementActivity : BaseActivity() { + + private var fragmentList: ArrayList = ArrayList() + + init { + fragmentList.add(OrderNotProcessedFragment())//待处理 + fragmentList.add(OrderNotConfirmedFragment())//待确认 + fragmentList.add(OrderInHandleFragment())//处理中 + fragmentList.add(OrderCompletedFragment())//已完成 + } + + override fun initLayoutView(): Int = R.layout.activity_order_management + + override fun setupTopBarLayout() { + titleView.text = "工单管理" + } + + override fun initData() { + val topViewPagerAdapter = TopViewPagerAdapter( + supportFragmentManager, Constant.SUB_PAGE_TITLES, fragmentList + ) + orderViewPager.offscreenPageLimit = fragmentList.size + orderViewPager.adapter = topViewPagerAdapter + orderTabLayout.setupWithViewPager(orderViewPager) + } + + override fun initEvent() { + rightOptionView.setOnClickListener { + navigatePageTo() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt new file mode 100644 index 0000000..6e7e65e --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -0,0 +1,217 @@ +package com.casic.qd.smartwell.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.SearchResultAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.showEmptyPage +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.WeakReferenceHandler +import com.casic.qd.smartwell.vm.OperationViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.TimeLineBottomSheet +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_order_search_result.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_empty_view.* + +class OrderSearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var operationViewModel: OperationViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var args: ArrayList + private lateinit var searchResultAdapter: SearchResultAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_order_search_result + + override fun setupTopBarLayout() { + titleView.text = "查询结果" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + weakReferenceHandler = WeakReferenceHandler(callback) + operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + obtainSearchResult(args, pageIndex) + workOrderViewModel.listModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + resultRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show() + } + dataBeans.addAll(dataRows!!) + resultRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022040101) + } + }) + workOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + resultRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + resultRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainSearchResult(args, pageIndex) + } + + //接单状态处理 + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + //通知列表刷行数据 + weakReferenceHandler.sendEmptyMessage(2022040102) + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + workOrderViewModel.detailModel.observe(this, { + if (it.code == 200) { + val orderDetail = it.data!![0] + val orderFlow = orderDetail.flow!! + if (orderFlow.size != 0) { + TimeLineBottomSheet.Builder().setContext(this) + .setFlowItems(orderFlow).build().show() + } else { + "抱歉,无法查到该工单的流转记录".show() + } + } + }) + } + + private fun obtainSearchResult(args: ArrayList, pageIndex: Int) { + workOrderViewModel.obtainSearchResult( + keywords = args[0], + alarmContent = args[1], + alarmLevel = args[2], + jobStatus = args[3], + beginTime = args[4], + endTime = args[5], + page = pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2022040102 -> { + isRefresh = true + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + 2022040101 -> { + if (isRefresh || isLoadMore) { + searchResultAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + obtainSearchResult(args, pageIndex) + } + } else { + emptyView!!.hide() + searchResultAdapter = SearchResultAdapter(this, dataBeans) + resultRecyclerView!!.layoutManager = LinearLayoutManager(this) + resultRecyclerView!!.adapter = searchResultAdapter + searchResultAdapter.setOnItemClickListener(object : + SearchResultAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } + if (dataBeans[position].jobStatus == "0") { +// navigatePageTo(jobId) + } else { +// navigatePageTo(jobId) + } + } + + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(this@OrderSearchResultActivity) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptWorkOrder(jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + + override fun onTransferViewClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看工单流转记录".show() + return + } + workOrderViewModel.obtainWorkOrderDetail(jobId) + } + }) + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index 2b92d86..fccff95 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -145,7 +145,6 @@ }.build().show(supportFragmentManager, "all") } - searchButton.setChangeAlphaWhenPress(true) searchButton.setOnClickListener { //页面跳转,将查询参数传过去 navigatePageTo( @@ -160,7 +159,6 @@ ) } - clearButton.setChangeAlphaWhenPress(true) clearButton.setOnClickListener { wellCodeView.setText("") alarmTypeView.text = "" diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt new file mode 100644 index 0000000..a4b66b9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt @@ -0,0 +1,207 @@ +package com.casic.qd.smartwell.view + +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.AlarmContentModel +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.AlarmViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import com.zhy.view.flowlayout.FlowLayout +import com.zhy.view.flowlayout.TagAdapter +import kotlinx.android.synthetic.main.activity_order_search.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class SearchOrderActivity : BaseActivity() { + + private lateinit var contentTypeViewModel: AlarmViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var inflater: LayoutInflater + private lateinit var contentTypeAdapter: TagAdapter + private lateinit var orderStatusAdapter: TagAdapter + private var contentModels: MutableList = ArrayList() + private var orderStatusModels: MutableList = ArrayList() + private var alarmContentType = "" + private var alarmLevel = "" + private var orderState = "" + + override fun initLayoutView(): Int = R.layout.activity_order_search + + override fun setupTopBarLayout() { + titleView.text = "工单查询" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + inflater = LayoutInflater.from(this) + //告警内容 + contentTypeViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + //工单状态 + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + contentTypeViewModel.obtainAlarmContent("1") + contentTypeViewModel.contentModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = AlarmContentModel.DataBean.ListBean() + bean.value = "" + bean.name = "全部" + bean.alarmType = "" + bean.deviceType = "" + contentModels.add(bean) + + it.data!!.list?.forEach { contentTypeBean -> + contentModels.add(contentTypeBean) + } + contentTypeAdapter = + object : TagAdapter(contentModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: AlarmContentModel.DataBean.ListBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmContentLayout, false + ) as TextView + tagView.text = contentModels[position].name + return tagView + } + } + alarmContentLayout.adapter = contentTypeAdapter + contentTypeAdapter.setSelectedList(0) + alarmContentLayout.setOnTagClickListener { _, position, _ -> + this.alarmContentType = contentModels[position].value.toString() + true + } + } + }) + + val levelMaps: MutableList> = ArrayList() + for (i in 0..3) { + val map = HashMap() + map["name"] = i.toString().toChinese() + map["value"] = i.toLevel() + levelMaps.add(map) + } + val levelAdapter = object : TagAdapter>(levelMaps) { + override fun getView( + parent: FlowLayout?, + position: Int, map: Map? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmLevelLayout, false + ) as TextView + tagView.text = levelMaps[position]["name"] + return tagView + } + } + alarmLevelLayout.adapter = levelAdapter + levelAdapter.setSelectedList(0) + alarmLevelLayout.setOnTagClickListener { _, position, _ -> + this.alarmLevel = levelMaps[position]["value"].toString() + true + } + + workOrderViewModel.obtainOrderStatus() + workOrderViewModel.orderStatusModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = OrderStatusModel.DataBean() + bean.name = "全部" + bean.id = "" + bean.value = "" + orderStatusModels.add(bean) + it.data!!.forEach { statusBean -> + orderStatusModels.add(statusBean) + } + orderStatusAdapter = + object : TagAdapter(orderStatusModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: OrderStatusModel.DataBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + orderStatusLayout, false + ) as TextView + tagView.text = orderStatusModels[position].name + return tagView + } + } + orderStatusLayout.adapter = orderStatusAdapter + orderStatusAdapter.setSelectedList(0) + orderStatusLayout.setOnTagClickListener { _, position, _ -> + this.orderState = orderStatusModels[position].value.toString() + true + } + } + }) + + startTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择开始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + startTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + endTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) { + "结束时间不合法,不能早于开始时间".show() + return@setCallBack + } + endTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + searchButton.setOnClickListener { + //页面跳转,将查询参数传过去 + navigatePageTo( + addAll( + wellCodeView.text.toString().trim(), + alarmContentType, + alarmLevel, + orderState, + startTimeView.text.toString(), + endTimeView.text.toString() + ) + ) + } + + clearButton.setOnClickListener { + wellCodeView.text.clear() + contentTypeAdapter.setSelectedList(0) + levelAdapter.setSelectedList(0) + orderStatusAdapter.setSelectedList(0) + startTimeView.text = "" + endTimeView.text = "" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt index b1f9fc3..c21fe1a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt @@ -112,16 +112,20 @@ }) fun obtainMapDeviceResult(keywords: String?, devType: String?) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.obtainMapDeviceResult(keywords, devType) val responseCode = response.separateResponseCode() if (responseCode == 200) { + loadState.value = LoadState.Success mapDeviceResultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { + loadState.value = LoadState.Fail response.toErrorMessage().show() } }, { + loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt new file mode 100644 index 0000000..6a528a4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt @@ -0,0 +1,83 @@ +package com.casic.qd.smartwell.vm + +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager + +/** + * 转单、接单、处理等vm + * */ +class OperationViewModel : BaseViewModel() { + + fun acceptWorkOrder(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.acceptWorkOrder(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "接单成功".show() + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun confirmWorkOrder( +// id: String, firstState: String, +// firstStatePhotos: String, needHandle: String +// ) = launch({ +// loadState.value = LoadState.Loading +// val response = +// RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单确认成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun transferWorkOrder(id: String, userId: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.transferWorkOrder(id, userId) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "转单成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun completeWorkOrder(id: String, handleMessage: String, handlePhotos: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.completeWorkOrder(id, handleMessage, handlePhotos) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单处理成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt new file mode 100644 index 0000000..411c9a8 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt @@ -0,0 +1,105 @@ +package com.casic.qd.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +class WorkOrderViewModel : BaseViewModel() { + + private val gson = Gson() + val orderStatusModel = MutableLiveData() + val listModel = MutableLiveData() + val detailModel = MutableLiveData() +// val resultModel = MutableLiveData>() + + + fun obtainOrderStatus() = launch({ + val response = RetrofitServiceManager.obtainOrderStatus() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderStatusModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainSearchResult( + keywords, alarmContent, alarmLevel, jobStatus, beginTime, endTime, page + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun obtainWorkOrderDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainWorkOrderDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + detailModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun countWorkOrderByState() = launch({ +// val response = RetrofitServiceManager.countWorkOrderByState() +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// val map = HashMap(4) +// +// val jsonObject = JSONObject(response) +// val data = jsonObject.getJSONObject("data") +// map["beforeGet"] = data.getString("beforeGet") +// map["beforeConfirm"] = data.getString("beforeConfirm") +// map["inHandle"] = data.getString("inHandle") +// map["over"] = data.getString("over") +// resultModel.value = map +// } else { +// response.toErrorMessage().show() +// } +// }, { +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt index 39d6d09..6de33f7 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt @@ -119,7 +119,6 @@ } } - sheetConfirmButton.setChangeAlphaWhenPress(true) sheetConfirmButton.setOnClickListener { listener.onAreaSelected(areaName, areaId) dismiss() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt index 98ff307..bcd9351 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt @@ -47,7 +47,6 @@ setCancelable(true) setCanceledOnTouchOutside(true) - confirmButton.setChangeAlphaWhenPress(true) confirmButton.setOnClickListener { val oldPwd = oldPwdView.text.toString() val newPwd = newPwdView.text.toString() @@ -66,6 +65,7 @@ } if (!newPwd.isLetterAndDigit()) { "新密码需包含数字和字母".show() + return@setOnClickListener } if (newPwd != confirmPwd) { "新密码和确认密码不一致,请检查".show() diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt new file mode 100644 index 0000000..1f1b5de --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt @@ -0,0 +1,47 @@ +package com.casic.qd.smartwell.view + +import androidx.fragment.app.Fragment +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.TopViewPagerAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.navigatePageTo +import com.casic.qd.smartwell.fragment.OrderCompletedFragment +import com.casic.qd.smartwell.fragment.OrderInHandleFragment +import com.casic.qd.smartwell.fragment.OrderNotConfirmedFragment +import com.casic.qd.smartwell.fragment.OrderNotProcessedFragment +import com.casic.qd.smartwell.utils.Constant +import kotlinx.android.synthetic.main.activity_order_management.* +import java.util.* + +class OrderManagementActivity : BaseActivity() { + + private var fragmentList: ArrayList = ArrayList() + + init { + fragmentList.add(OrderNotProcessedFragment())//待处理 + fragmentList.add(OrderNotConfirmedFragment())//待确认 + fragmentList.add(OrderInHandleFragment())//处理中 + fragmentList.add(OrderCompletedFragment())//已完成 + } + + override fun initLayoutView(): Int = R.layout.activity_order_management + + override fun setupTopBarLayout() { + titleView.text = "工单管理" + } + + override fun initData() { + val topViewPagerAdapter = TopViewPagerAdapter( + supportFragmentManager, Constant.SUB_PAGE_TITLES, fragmentList + ) + orderViewPager.offscreenPageLimit = fragmentList.size + orderViewPager.adapter = topViewPagerAdapter + orderTabLayout.setupWithViewPager(orderViewPager) + } + + override fun initEvent() { + rightOptionView.setOnClickListener { + navigatePageTo() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt new file mode 100644 index 0000000..6e7e65e --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -0,0 +1,217 @@ +package com.casic.qd.smartwell.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.SearchResultAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.showEmptyPage +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.WeakReferenceHandler +import com.casic.qd.smartwell.vm.OperationViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.TimeLineBottomSheet +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_order_search_result.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_empty_view.* + +class OrderSearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var operationViewModel: OperationViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var args: ArrayList + private lateinit var searchResultAdapter: SearchResultAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_order_search_result + + override fun setupTopBarLayout() { + titleView.text = "查询结果" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + weakReferenceHandler = WeakReferenceHandler(callback) + operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + obtainSearchResult(args, pageIndex) + workOrderViewModel.listModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + resultRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show() + } + dataBeans.addAll(dataRows!!) + resultRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022040101) + } + }) + workOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + resultRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + resultRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainSearchResult(args, pageIndex) + } + + //接单状态处理 + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + //通知列表刷行数据 + weakReferenceHandler.sendEmptyMessage(2022040102) + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + workOrderViewModel.detailModel.observe(this, { + if (it.code == 200) { + val orderDetail = it.data!![0] + val orderFlow = orderDetail.flow!! + if (orderFlow.size != 0) { + TimeLineBottomSheet.Builder().setContext(this) + .setFlowItems(orderFlow).build().show() + } else { + "抱歉,无法查到该工单的流转记录".show() + } + } + }) + } + + private fun obtainSearchResult(args: ArrayList, pageIndex: Int) { + workOrderViewModel.obtainSearchResult( + keywords = args[0], + alarmContent = args[1], + alarmLevel = args[2], + jobStatus = args[3], + beginTime = args[4], + endTime = args[5], + page = pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2022040102 -> { + isRefresh = true + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + 2022040101 -> { + if (isRefresh || isLoadMore) { + searchResultAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + obtainSearchResult(args, pageIndex) + } + } else { + emptyView!!.hide() + searchResultAdapter = SearchResultAdapter(this, dataBeans) + resultRecyclerView!!.layoutManager = LinearLayoutManager(this) + resultRecyclerView!!.adapter = searchResultAdapter + searchResultAdapter.setOnItemClickListener(object : + SearchResultAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } + if (dataBeans[position].jobStatus == "0") { +// navigatePageTo(jobId) + } else { +// navigatePageTo(jobId) + } + } + + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(this@OrderSearchResultActivity) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptWorkOrder(jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + + override fun onTransferViewClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看工单流转记录".show() + return + } + workOrderViewModel.obtainWorkOrderDetail(jobId) + } + }) + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index 2b92d86..fccff95 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -145,7 +145,6 @@ }.build().show(supportFragmentManager, "all") } - searchButton.setChangeAlphaWhenPress(true) searchButton.setOnClickListener { //页面跳转,将查询参数传过去 navigatePageTo( @@ -160,7 +159,6 @@ ) } - clearButton.setChangeAlphaWhenPress(true) clearButton.setOnClickListener { wellCodeView.setText("") alarmTypeView.text = "" diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt new file mode 100644 index 0000000..a4b66b9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt @@ -0,0 +1,207 @@ +package com.casic.qd.smartwell.view + +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.AlarmContentModel +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.AlarmViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import com.zhy.view.flowlayout.FlowLayout +import com.zhy.view.flowlayout.TagAdapter +import kotlinx.android.synthetic.main.activity_order_search.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class SearchOrderActivity : BaseActivity() { + + private lateinit var contentTypeViewModel: AlarmViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var inflater: LayoutInflater + private lateinit var contentTypeAdapter: TagAdapter + private lateinit var orderStatusAdapter: TagAdapter + private var contentModels: MutableList = ArrayList() + private var orderStatusModels: MutableList = ArrayList() + private var alarmContentType = "" + private var alarmLevel = "" + private var orderState = "" + + override fun initLayoutView(): Int = R.layout.activity_order_search + + override fun setupTopBarLayout() { + titleView.text = "工单查询" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + inflater = LayoutInflater.from(this) + //告警内容 + contentTypeViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + //工单状态 + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + contentTypeViewModel.obtainAlarmContent("1") + contentTypeViewModel.contentModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = AlarmContentModel.DataBean.ListBean() + bean.value = "" + bean.name = "全部" + bean.alarmType = "" + bean.deviceType = "" + contentModels.add(bean) + + it.data!!.list?.forEach { contentTypeBean -> + contentModels.add(contentTypeBean) + } + contentTypeAdapter = + object : TagAdapter(contentModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: AlarmContentModel.DataBean.ListBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmContentLayout, false + ) as TextView + tagView.text = contentModels[position].name + return tagView + } + } + alarmContentLayout.adapter = contentTypeAdapter + contentTypeAdapter.setSelectedList(0) + alarmContentLayout.setOnTagClickListener { _, position, _ -> + this.alarmContentType = contentModels[position].value.toString() + true + } + } + }) + + val levelMaps: MutableList> = ArrayList() + for (i in 0..3) { + val map = HashMap() + map["name"] = i.toString().toChinese() + map["value"] = i.toLevel() + levelMaps.add(map) + } + val levelAdapter = object : TagAdapter>(levelMaps) { + override fun getView( + parent: FlowLayout?, + position: Int, map: Map? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmLevelLayout, false + ) as TextView + tagView.text = levelMaps[position]["name"] + return tagView + } + } + alarmLevelLayout.adapter = levelAdapter + levelAdapter.setSelectedList(0) + alarmLevelLayout.setOnTagClickListener { _, position, _ -> + this.alarmLevel = levelMaps[position]["value"].toString() + true + } + + workOrderViewModel.obtainOrderStatus() + workOrderViewModel.orderStatusModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = OrderStatusModel.DataBean() + bean.name = "全部" + bean.id = "" + bean.value = "" + orderStatusModels.add(bean) + it.data!!.forEach { statusBean -> + orderStatusModels.add(statusBean) + } + orderStatusAdapter = + object : TagAdapter(orderStatusModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: OrderStatusModel.DataBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + orderStatusLayout, false + ) as TextView + tagView.text = orderStatusModels[position].name + return tagView + } + } + orderStatusLayout.adapter = orderStatusAdapter + orderStatusAdapter.setSelectedList(0) + orderStatusLayout.setOnTagClickListener { _, position, _ -> + this.orderState = orderStatusModels[position].value.toString() + true + } + } + }) + + startTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择开始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + startTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + endTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) { + "结束时间不合法,不能早于开始时间".show() + return@setCallBack + } + endTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + searchButton.setOnClickListener { + //页面跳转,将查询参数传过去 + navigatePageTo( + addAll( + wellCodeView.text.toString().trim(), + alarmContentType, + alarmLevel, + orderState, + startTimeView.text.toString(), + endTimeView.text.toString() + ) + ) + } + + clearButton.setOnClickListener { + wellCodeView.text.clear() + contentTypeAdapter.setSelectedList(0) + levelAdapter.setSelectedList(0) + orderStatusAdapter.setSelectedList(0) + startTimeView.text = "" + endTimeView.text = "" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt index b1f9fc3..c21fe1a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt @@ -112,16 +112,20 @@ }) fun obtainMapDeviceResult(keywords: String?, devType: String?) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.obtainMapDeviceResult(keywords, devType) val responseCode = response.separateResponseCode() if (responseCode == 200) { + loadState.value = LoadState.Success mapDeviceResultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { + loadState.value = LoadState.Fail response.toErrorMessage().show() } }, { + loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt new file mode 100644 index 0000000..6a528a4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt @@ -0,0 +1,83 @@ +package com.casic.qd.smartwell.vm + +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager + +/** + * 转单、接单、处理等vm + * */ +class OperationViewModel : BaseViewModel() { + + fun acceptWorkOrder(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.acceptWorkOrder(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "接单成功".show() + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun confirmWorkOrder( +// id: String, firstState: String, +// firstStatePhotos: String, needHandle: String +// ) = launch({ +// loadState.value = LoadState.Loading +// val response = +// RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单确认成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun transferWorkOrder(id: String, userId: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.transferWorkOrder(id, userId) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "转单成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun completeWorkOrder(id: String, handleMessage: String, handlePhotos: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.completeWorkOrder(id, handleMessage, handlePhotos) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单处理成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt new file mode 100644 index 0000000..411c9a8 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt @@ -0,0 +1,105 @@ +package com.casic.qd.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +class WorkOrderViewModel : BaseViewModel() { + + private val gson = Gson() + val orderStatusModel = MutableLiveData() + val listModel = MutableLiveData() + val detailModel = MutableLiveData() +// val resultModel = MutableLiveData>() + + + fun obtainOrderStatus() = launch({ + val response = RetrofitServiceManager.obtainOrderStatus() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderStatusModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainSearchResult( + keywords, alarmContent, alarmLevel, jobStatus, beginTime, endTime, page + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun obtainWorkOrderDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainWorkOrderDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + detailModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun countWorkOrderByState() = launch({ +// val response = RetrofitServiceManager.countWorkOrderByState() +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// val map = HashMap(4) +// +// val jsonObject = JSONObject(response) +// val data = jsonObject.getJSONObject("data") +// map["beforeGet"] = data.getString("beforeGet") +// map["beforeConfirm"] = data.getString("beforeConfirm") +// map["inHandle"] = data.getString("inHandle") +// map["over"] = data.getString("over") +// resultModel.value = map +// } else { +// response.toErrorMessage().show() +// } +// }, { +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt index 39d6d09..6de33f7 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt @@ -119,7 +119,6 @@ } } - sheetConfirmButton.setChangeAlphaWhenPress(true) sheetConfirmButton.setOnClickListener { listener.onAreaSelected(areaName, areaId) dismiss() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt index 98ff307..bcd9351 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt @@ -47,7 +47,6 @@ setCancelable(true) setCanceledOnTouchOutside(true) - confirmButton.setChangeAlphaWhenPress(true) confirmButton.setOnClickListener { val oldPwd = oldPwdView.text.toString() val newPwd = newPwdView.text.toString() @@ -66,6 +65,7 @@ } if (!newPwd.isLetterAndDigit()) { "新密码需包含数字和字母".show() + return@setOnClickListener } if (newPwd != confirmPwd) { "新密码和确认密码不一致,请检查".show() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt new file mode 100644 index 0000000..2b3dfe7 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt @@ -0,0 +1,102 @@ +package com.casic.qd.smartwell.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.* +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineBottomSheet private constructor(builder: Builder) : Dialog( + builder.context!!, R.style.ActionSheetDialogStyle +) { + private val ctx: Context = builder.context!! + private val items: MutableList = builder.items!! + + class Builder { + var context: Context? = null + var items: MutableList? = null + + fun setContext(context: Context?): Builder { + this.context = context + return this + } + + fun setFlowItems(flowItems: MutableList?): Builder { + this.items = flowItems + return this + } + + fun build(): TimeLineBottomSheet { + return TimeLineBottomSheet(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_bottom_sheet) + setCancelable(true) + setCanceledOnTouchOutside(true) + //绑定流程进展数据 + val orderFlowRecyclerView = findViewById(R.id.orderFlowRecyclerView) + orderFlowRecyclerView.layoutManager = LinearLayoutManager(ctx) + orderFlowRecyclerView.adapter = OrderFlowAdapter() + + val dismissView = findViewById(R.id.dismissView) + dismissView.setOnClickListener { + this.dismiss() + } + } + + private fun configDialogLayout() { + val window = window ?: return + window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window.decorView.setBackgroundColor(Color.TRANSPARENT) + window.setGravity(Gravity.BOTTOM) + //设置Dialog出现的动画 + window.setWindowAnimations(R.style.ActionSheetDialogAnimation) + val params = window.attributes + params.width = SizeUtil.getScreenWidth(ctx) + params.height = WindowManager.LayoutParams.WRAP_CONTENT + window.attributes = params + } + + internal inner class OrderFlowAdapter : + RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(ctx) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OrderFlowAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_flow_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = items.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = items[position] + holder.fromPersonView.text = rowsBean.from + holder.toPersonView.text = rowsBean.to + holder.transferDateView.text = rowsBean.time + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var fromPersonView: TextView = view.findViewById(R.id.fromPersonView) + var toPersonView: TextView = view.findViewById(R.id.toPersonView) + var transferDateView: TextView = view.findViewById(R.id.transferDateView) + } + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt new file mode 100644 index 0000000..1f1b5de --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt @@ -0,0 +1,47 @@ +package com.casic.qd.smartwell.view + +import androidx.fragment.app.Fragment +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.TopViewPagerAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.navigatePageTo +import com.casic.qd.smartwell.fragment.OrderCompletedFragment +import com.casic.qd.smartwell.fragment.OrderInHandleFragment +import com.casic.qd.smartwell.fragment.OrderNotConfirmedFragment +import com.casic.qd.smartwell.fragment.OrderNotProcessedFragment +import com.casic.qd.smartwell.utils.Constant +import kotlinx.android.synthetic.main.activity_order_management.* +import java.util.* + +class OrderManagementActivity : BaseActivity() { + + private var fragmentList: ArrayList = ArrayList() + + init { + fragmentList.add(OrderNotProcessedFragment())//待处理 + fragmentList.add(OrderNotConfirmedFragment())//待确认 + fragmentList.add(OrderInHandleFragment())//处理中 + fragmentList.add(OrderCompletedFragment())//已完成 + } + + override fun initLayoutView(): Int = R.layout.activity_order_management + + override fun setupTopBarLayout() { + titleView.text = "工单管理" + } + + override fun initData() { + val topViewPagerAdapter = TopViewPagerAdapter( + supportFragmentManager, Constant.SUB_PAGE_TITLES, fragmentList + ) + orderViewPager.offscreenPageLimit = fragmentList.size + orderViewPager.adapter = topViewPagerAdapter + orderTabLayout.setupWithViewPager(orderViewPager) + } + + override fun initEvent() { + rightOptionView.setOnClickListener { + navigatePageTo() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt new file mode 100644 index 0000000..6e7e65e --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -0,0 +1,217 @@ +package com.casic.qd.smartwell.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.SearchResultAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.showEmptyPage +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.WeakReferenceHandler +import com.casic.qd.smartwell.vm.OperationViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.TimeLineBottomSheet +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_order_search_result.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_empty_view.* + +class OrderSearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var operationViewModel: OperationViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var args: ArrayList + private lateinit var searchResultAdapter: SearchResultAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_order_search_result + + override fun setupTopBarLayout() { + titleView.text = "查询结果" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + weakReferenceHandler = WeakReferenceHandler(callback) + operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + obtainSearchResult(args, pageIndex) + workOrderViewModel.listModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + resultRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show() + } + dataBeans.addAll(dataRows!!) + resultRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022040101) + } + }) + workOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + resultRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + resultRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainSearchResult(args, pageIndex) + } + + //接单状态处理 + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + //通知列表刷行数据 + weakReferenceHandler.sendEmptyMessage(2022040102) + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + workOrderViewModel.detailModel.observe(this, { + if (it.code == 200) { + val orderDetail = it.data!![0] + val orderFlow = orderDetail.flow!! + if (orderFlow.size != 0) { + TimeLineBottomSheet.Builder().setContext(this) + .setFlowItems(orderFlow).build().show() + } else { + "抱歉,无法查到该工单的流转记录".show() + } + } + }) + } + + private fun obtainSearchResult(args: ArrayList, pageIndex: Int) { + workOrderViewModel.obtainSearchResult( + keywords = args[0], + alarmContent = args[1], + alarmLevel = args[2], + jobStatus = args[3], + beginTime = args[4], + endTime = args[5], + page = pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2022040102 -> { + isRefresh = true + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + 2022040101 -> { + if (isRefresh || isLoadMore) { + searchResultAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + obtainSearchResult(args, pageIndex) + } + } else { + emptyView!!.hide() + searchResultAdapter = SearchResultAdapter(this, dataBeans) + resultRecyclerView!!.layoutManager = LinearLayoutManager(this) + resultRecyclerView!!.adapter = searchResultAdapter + searchResultAdapter.setOnItemClickListener(object : + SearchResultAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } + if (dataBeans[position].jobStatus == "0") { +// navigatePageTo(jobId) + } else { +// navigatePageTo(jobId) + } + } + + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(this@OrderSearchResultActivity) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptWorkOrder(jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + + override fun onTransferViewClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看工单流转记录".show() + return + } + workOrderViewModel.obtainWorkOrderDetail(jobId) + } + }) + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index 2b92d86..fccff95 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -145,7 +145,6 @@ }.build().show(supportFragmentManager, "all") } - searchButton.setChangeAlphaWhenPress(true) searchButton.setOnClickListener { //页面跳转,将查询参数传过去 navigatePageTo( @@ -160,7 +159,6 @@ ) } - clearButton.setChangeAlphaWhenPress(true) clearButton.setOnClickListener { wellCodeView.setText("") alarmTypeView.text = "" diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt new file mode 100644 index 0000000..a4b66b9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt @@ -0,0 +1,207 @@ +package com.casic.qd.smartwell.view + +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.AlarmContentModel +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.AlarmViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import com.zhy.view.flowlayout.FlowLayout +import com.zhy.view.flowlayout.TagAdapter +import kotlinx.android.synthetic.main.activity_order_search.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class SearchOrderActivity : BaseActivity() { + + private lateinit var contentTypeViewModel: AlarmViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var inflater: LayoutInflater + private lateinit var contentTypeAdapter: TagAdapter + private lateinit var orderStatusAdapter: TagAdapter + private var contentModels: MutableList = ArrayList() + private var orderStatusModels: MutableList = ArrayList() + private var alarmContentType = "" + private var alarmLevel = "" + private var orderState = "" + + override fun initLayoutView(): Int = R.layout.activity_order_search + + override fun setupTopBarLayout() { + titleView.text = "工单查询" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + inflater = LayoutInflater.from(this) + //告警内容 + contentTypeViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + //工单状态 + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + contentTypeViewModel.obtainAlarmContent("1") + contentTypeViewModel.contentModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = AlarmContentModel.DataBean.ListBean() + bean.value = "" + bean.name = "全部" + bean.alarmType = "" + bean.deviceType = "" + contentModels.add(bean) + + it.data!!.list?.forEach { contentTypeBean -> + contentModels.add(contentTypeBean) + } + contentTypeAdapter = + object : TagAdapter(contentModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: AlarmContentModel.DataBean.ListBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmContentLayout, false + ) as TextView + tagView.text = contentModels[position].name + return tagView + } + } + alarmContentLayout.adapter = contentTypeAdapter + contentTypeAdapter.setSelectedList(0) + alarmContentLayout.setOnTagClickListener { _, position, _ -> + this.alarmContentType = contentModels[position].value.toString() + true + } + } + }) + + val levelMaps: MutableList> = ArrayList() + for (i in 0..3) { + val map = HashMap() + map["name"] = i.toString().toChinese() + map["value"] = i.toLevel() + levelMaps.add(map) + } + val levelAdapter = object : TagAdapter>(levelMaps) { + override fun getView( + parent: FlowLayout?, + position: Int, map: Map? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmLevelLayout, false + ) as TextView + tagView.text = levelMaps[position]["name"] + return tagView + } + } + alarmLevelLayout.adapter = levelAdapter + levelAdapter.setSelectedList(0) + alarmLevelLayout.setOnTagClickListener { _, position, _ -> + this.alarmLevel = levelMaps[position]["value"].toString() + true + } + + workOrderViewModel.obtainOrderStatus() + workOrderViewModel.orderStatusModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = OrderStatusModel.DataBean() + bean.name = "全部" + bean.id = "" + bean.value = "" + orderStatusModels.add(bean) + it.data!!.forEach { statusBean -> + orderStatusModels.add(statusBean) + } + orderStatusAdapter = + object : TagAdapter(orderStatusModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: OrderStatusModel.DataBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + orderStatusLayout, false + ) as TextView + tagView.text = orderStatusModels[position].name + return tagView + } + } + orderStatusLayout.adapter = orderStatusAdapter + orderStatusAdapter.setSelectedList(0) + orderStatusLayout.setOnTagClickListener { _, position, _ -> + this.orderState = orderStatusModels[position].value.toString() + true + } + } + }) + + startTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择开始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + startTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + endTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) { + "结束时间不合法,不能早于开始时间".show() + return@setCallBack + } + endTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + searchButton.setOnClickListener { + //页面跳转,将查询参数传过去 + navigatePageTo( + addAll( + wellCodeView.text.toString().trim(), + alarmContentType, + alarmLevel, + orderState, + startTimeView.text.toString(), + endTimeView.text.toString() + ) + ) + } + + clearButton.setOnClickListener { + wellCodeView.text.clear() + contentTypeAdapter.setSelectedList(0) + levelAdapter.setSelectedList(0) + orderStatusAdapter.setSelectedList(0) + startTimeView.text = "" + endTimeView.text = "" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt index b1f9fc3..c21fe1a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt @@ -112,16 +112,20 @@ }) fun obtainMapDeviceResult(keywords: String?, devType: String?) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.obtainMapDeviceResult(keywords, devType) val responseCode = response.separateResponseCode() if (responseCode == 200) { + loadState.value = LoadState.Success mapDeviceResultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { + loadState.value = LoadState.Fail response.toErrorMessage().show() } }, { + loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt new file mode 100644 index 0000000..6a528a4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt @@ -0,0 +1,83 @@ +package com.casic.qd.smartwell.vm + +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager + +/** + * 转单、接单、处理等vm + * */ +class OperationViewModel : BaseViewModel() { + + fun acceptWorkOrder(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.acceptWorkOrder(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "接单成功".show() + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun confirmWorkOrder( +// id: String, firstState: String, +// firstStatePhotos: String, needHandle: String +// ) = launch({ +// loadState.value = LoadState.Loading +// val response = +// RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单确认成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun transferWorkOrder(id: String, userId: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.transferWorkOrder(id, userId) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "转单成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun completeWorkOrder(id: String, handleMessage: String, handlePhotos: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.completeWorkOrder(id, handleMessage, handlePhotos) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单处理成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt new file mode 100644 index 0000000..411c9a8 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt @@ -0,0 +1,105 @@ +package com.casic.qd.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +class WorkOrderViewModel : BaseViewModel() { + + private val gson = Gson() + val orderStatusModel = MutableLiveData() + val listModel = MutableLiveData() + val detailModel = MutableLiveData() +// val resultModel = MutableLiveData>() + + + fun obtainOrderStatus() = launch({ + val response = RetrofitServiceManager.obtainOrderStatus() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderStatusModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainSearchResult( + keywords, alarmContent, alarmLevel, jobStatus, beginTime, endTime, page + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun obtainWorkOrderDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainWorkOrderDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + detailModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun countWorkOrderByState() = launch({ +// val response = RetrofitServiceManager.countWorkOrderByState() +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// val map = HashMap(4) +// +// val jsonObject = JSONObject(response) +// val data = jsonObject.getJSONObject("data") +// map["beforeGet"] = data.getString("beforeGet") +// map["beforeConfirm"] = data.getString("beforeConfirm") +// map["inHandle"] = data.getString("inHandle") +// map["over"] = data.getString("over") +// resultModel.value = map +// } else { +// response.toErrorMessage().show() +// } +// }, { +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt index 39d6d09..6de33f7 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt @@ -119,7 +119,6 @@ } } - sheetConfirmButton.setChangeAlphaWhenPress(true) sheetConfirmButton.setOnClickListener { listener.onAreaSelected(areaName, areaId) dismiss() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt index 98ff307..bcd9351 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt @@ -47,7 +47,6 @@ setCancelable(true) setCanceledOnTouchOutside(true) - confirmButton.setChangeAlphaWhenPress(true) confirmButton.setOnClickListener { val oldPwd = oldPwdView.text.toString() val newPwd = newPwdView.text.toString() @@ -66,6 +65,7 @@ } if (!newPwd.isLetterAndDigit()) { "新密码需包含数字和字母".show() + return@setOnClickListener } if (newPwd != confirmPwd) { "新密码和确认密码不一致,请检查".show() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt new file mode 100644 index 0000000..2b3dfe7 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt @@ -0,0 +1,102 @@ +package com.casic.qd.smartwell.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.* +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineBottomSheet private constructor(builder: Builder) : Dialog( + builder.context!!, R.style.ActionSheetDialogStyle +) { + private val ctx: Context = builder.context!! + private val items: MutableList = builder.items!! + + class Builder { + var context: Context? = null + var items: MutableList? = null + + fun setContext(context: Context?): Builder { + this.context = context + return this + } + + fun setFlowItems(flowItems: MutableList?): Builder { + this.items = flowItems + return this + } + + fun build(): TimeLineBottomSheet { + return TimeLineBottomSheet(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_bottom_sheet) + setCancelable(true) + setCanceledOnTouchOutside(true) + //绑定流程进展数据 + val orderFlowRecyclerView = findViewById(R.id.orderFlowRecyclerView) + orderFlowRecyclerView.layoutManager = LinearLayoutManager(ctx) + orderFlowRecyclerView.adapter = OrderFlowAdapter() + + val dismissView = findViewById(R.id.dismissView) + dismissView.setOnClickListener { + this.dismiss() + } + } + + private fun configDialogLayout() { + val window = window ?: return + window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window.decorView.setBackgroundColor(Color.TRANSPARENT) + window.setGravity(Gravity.BOTTOM) + //设置Dialog出现的动画 + window.setWindowAnimations(R.style.ActionSheetDialogAnimation) + val params = window.attributes + params.width = SizeUtil.getScreenWidth(ctx) + params.height = WindowManager.LayoutParams.WRAP_CONTENT + window.attributes = params + } + + internal inner class OrderFlowAdapter : + RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(ctx) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OrderFlowAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_flow_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = items.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = items[position] + holder.fromPersonView.text = rowsBean.from + holder.toPersonView.text = rowsBean.to + holder.transferDateView.text = rowsBean.time + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var fromPersonView: TextView = view.findViewById(R.id.fromPersonView) + var toPersonView: TextView = view.findViewById(R.id.toPersonView) + var transferDateView: TextView = view.findViewById(R.id.transferDateView) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml new file mode 100644 index 0000000..5875998 --- /dev/null +++ b/app/src/main/res/drawable/button_main_selector.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt new file mode 100644 index 0000000..1f1b5de --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt @@ -0,0 +1,47 @@ +package com.casic.qd.smartwell.view + +import androidx.fragment.app.Fragment +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.TopViewPagerAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.navigatePageTo +import com.casic.qd.smartwell.fragment.OrderCompletedFragment +import com.casic.qd.smartwell.fragment.OrderInHandleFragment +import com.casic.qd.smartwell.fragment.OrderNotConfirmedFragment +import com.casic.qd.smartwell.fragment.OrderNotProcessedFragment +import com.casic.qd.smartwell.utils.Constant +import kotlinx.android.synthetic.main.activity_order_management.* +import java.util.* + +class OrderManagementActivity : BaseActivity() { + + private var fragmentList: ArrayList = ArrayList() + + init { + fragmentList.add(OrderNotProcessedFragment())//待处理 + fragmentList.add(OrderNotConfirmedFragment())//待确认 + fragmentList.add(OrderInHandleFragment())//处理中 + fragmentList.add(OrderCompletedFragment())//已完成 + } + + override fun initLayoutView(): Int = R.layout.activity_order_management + + override fun setupTopBarLayout() { + titleView.text = "工单管理" + } + + override fun initData() { + val topViewPagerAdapter = TopViewPagerAdapter( + supportFragmentManager, Constant.SUB_PAGE_TITLES, fragmentList + ) + orderViewPager.offscreenPageLimit = fragmentList.size + orderViewPager.adapter = topViewPagerAdapter + orderTabLayout.setupWithViewPager(orderViewPager) + } + + override fun initEvent() { + rightOptionView.setOnClickListener { + navigatePageTo() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt new file mode 100644 index 0000000..6e7e65e --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -0,0 +1,217 @@ +package com.casic.qd.smartwell.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.SearchResultAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.showEmptyPage +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.WeakReferenceHandler +import com.casic.qd.smartwell.vm.OperationViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.TimeLineBottomSheet +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_order_search_result.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_empty_view.* + +class OrderSearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var operationViewModel: OperationViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var args: ArrayList + private lateinit var searchResultAdapter: SearchResultAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_order_search_result + + override fun setupTopBarLayout() { + titleView.text = "查询结果" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + weakReferenceHandler = WeakReferenceHandler(callback) + operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + obtainSearchResult(args, pageIndex) + workOrderViewModel.listModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + resultRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show() + } + dataBeans.addAll(dataRows!!) + resultRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022040101) + } + }) + workOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + resultRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + resultRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainSearchResult(args, pageIndex) + } + + //接单状态处理 + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + //通知列表刷行数据 + weakReferenceHandler.sendEmptyMessage(2022040102) + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + workOrderViewModel.detailModel.observe(this, { + if (it.code == 200) { + val orderDetail = it.data!![0] + val orderFlow = orderDetail.flow!! + if (orderFlow.size != 0) { + TimeLineBottomSheet.Builder().setContext(this) + .setFlowItems(orderFlow).build().show() + } else { + "抱歉,无法查到该工单的流转记录".show() + } + } + }) + } + + private fun obtainSearchResult(args: ArrayList, pageIndex: Int) { + workOrderViewModel.obtainSearchResult( + keywords = args[0], + alarmContent = args[1], + alarmLevel = args[2], + jobStatus = args[3], + beginTime = args[4], + endTime = args[5], + page = pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2022040102 -> { + isRefresh = true + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + 2022040101 -> { + if (isRefresh || isLoadMore) { + searchResultAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + obtainSearchResult(args, pageIndex) + } + } else { + emptyView!!.hide() + searchResultAdapter = SearchResultAdapter(this, dataBeans) + resultRecyclerView!!.layoutManager = LinearLayoutManager(this) + resultRecyclerView!!.adapter = searchResultAdapter + searchResultAdapter.setOnItemClickListener(object : + SearchResultAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } + if (dataBeans[position].jobStatus == "0") { +// navigatePageTo(jobId) + } else { +// navigatePageTo(jobId) + } + } + + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(this@OrderSearchResultActivity) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptWorkOrder(jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + + override fun onTransferViewClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看工单流转记录".show() + return + } + workOrderViewModel.obtainWorkOrderDetail(jobId) + } + }) + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index 2b92d86..fccff95 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -145,7 +145,6 @@ }.build().show(supportFragmentManager, "all") } - searchButton.setChangeAlphaWhenPress(true) searchButton.setOnClickListener { //页面跳转,将查询参数传过去 navigatePageTo( @@ -160,7 +159,6 @@ ) } - clearButton.setChangeAlphaWhenPress(true) clearButton.setOnClickListener { wellCodeView.setText("") alarmTypeView.text = "" diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt new file mode 100644 index 0000000..a4b66b9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt @@ -0,0 +1,207 @@ +package com.casic.qd.smartwell.view + +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.AlarmContentModel +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.AlarmViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import com.zhy.view.flowlayout.FlowLayout +import com.zhy.view.flowlayout.TagAdapter +import kotlinx.android.synthetic.main.activity_order_search.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class SearchOrderActivity : BaseActivity() { + + private lateinit var contentTypeViewModel: AlarmViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var inflater: LayoutInflater + private lateinit var contentTypeAdapter: TagAdapter + private lateinit var orderStatusAdapter: TagAdapter + private var contentModels: MutableList = ArrayList() + private var orderStatusModels: MutableList = ArrayList() + private var alarmContentType = "" + private var alarmLevel = "" + private var orderState = "" + + override fun initLayoutView(): Int = R.layout.activity_order_search + + override fun setupTopBarLayout() { + titleView.text = "工单查询" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + inflater = LayoutInflater.from(this) + //告警内容 + contentTypeViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + //工单状态 + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + contentTypeViewModel.obtainAlarmContent("1") + contentTypeViewModel.contentModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = AlarmContentModel.DataBean.ListBean() + bean.value = "" + bean.name = "全部" + bean.alarmType = "" + bean.deviceType = "" + contentModels.add(bean) + + it.data!!.list?.forEach { contentTypeBean -> + contentModels.add(contentTypeBean) + } + contentTypeAdapter = + object : TagAdapter(contentModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: AlarmContentModel.DataBean.ListBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmContentLayout, false + ) as TextView + tagView.text = contentModels[position].name + return tagView + } + } + alarmContentLayout.adapter = contentTypeAdapter + contentTypeAdapter.setSelectedList(0) + alarmContentLayout.setOnTagClickListener { _, position, _ -> + this.alarmContentType = contentModels[position].value.toString() + true + } + } + }) + + val levelMaps: MutableList> = ArrayList() + for (i in 0..3) { + val map = HashMap() + map["name"] = i.toString().toChinese() + map["value"] = i.toLevel() + levelMaps.add(map) + } + val levelAdapter = object : TagAdapter>(levelMaps) { + override fun getView( + parent: FlowLayout?, + position: Int, map: Map? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmLevelLayout, false + ) as TextView + tagView.text = levelMaps[position]["name"] + return tagView + } + } + alarmLevelLayout.adapter = levelAdapter + levelAdapter.setSelectedList(0) + alarmLevelLayout.setOnTagClickListener { _, position, _ -> + this.alarmLevel = levelMaps[position]["value"].toString() + true + } + + workOrderViewModel.obtainOrderStatus() + workOrderViewModel.orderStatusModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = OrderStatusModel.DataBean() + bean.name = "全部" + bean.id = "" + bean.value = "" + orderStatusModels.add(bean) + it.data!!.forEach { statusBean -> + orderStatusModels.add(statusBean) + } + orderStatusAdapter = + object : TagAdapter(orderStatusModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: OrderStatusModel.DataBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + orderStatusLayout, false + ) as TextView + tagView.text = orderStatusModels[position].name + return tagView + } + } + orderStatusLayout.adapter = orderStatusAdapter + orderStatusAdapter.setSelectedList(0) + orderStatusLayout.setOnTagClickListener { _, position, _ -> + this.orderState = orderStatusModels[position].value.toString() + true + } + } + }) + + startTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择开始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + startTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + endTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) { + "结束时间不合法,不能早于开始时间".show() + return@setCallBack + } + endTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + searchButton.setOnClickListener { + //页面跳转,将查询参数传过去 + navigatePageTo( + addAll( + wellCodeView.text.toString().trim(), + alarmContentType, + alarmLevel, + orderState, + startTimeView.text.toString(), + endTimeView.text.toString() + ) + ) + } + + clearButton.setOnClickListener { + wellCodeView.text.clear() + contentTypeAdapter.setSelectedList(0) + levelAdapter.setSelectedList(0) + orderStatusAdapter.setSelectedList(0) + startTimeView.text = "" + endTimeView.text = "" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt index b1f9fc3..c21fe1a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt @@ -112,16 +112,20 @@ }) fun obtainMapDeviceResult(keywords: String?, devType: String?) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.obtainMapDeviceResult(keywords, devType) val responseCode = response.separateResponseCode() if (responseCode == 200) { + loadState.value = LoadState.Success mapDeviceResultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { + loadState.value = LoadState.Fail response.toErrorMessage().show() } }, { + loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt new file mode 100644 index 0000000..6a528a4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt @@ -0,0 +1,83 @@ +package com.casic.qd.smartwell.vm + +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager + +/** + * 转单、接单、处理等vm + * */ +class OperationViewModel : BaseViewModel() { + + fun acceptWorkOrder(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.acceptWorkOrder(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "接单成功".show() + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun confirmWorkOrder( +// id: String, firstState: String, +// firstStatePhotos: String, needHandle: String +// ) = launch({ +// loadState.value = LoadState.Loading +// val response = +// RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单确认成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun transferWorkOrder(id: String, userId: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.transferWorkOrder(id, userId) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "转单成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun completeWorkOrder(id: String, handleMessage: String, handlePhotos: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.completeWorkOrder(id, handleMessage, handlePhotos) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单处理成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt new file mode 100644 index 0000000..411c9a8 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt @@ -0,0 +1,105 @@ +package com.casic.qd.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +class WorkOrderViewModel : BaseViewModel() { + + private val gson = Gson() + val orderStatusModel = MutableLiveData() + val listModel = MutableLiveData() + val detailModel = MutableLiveData() +// val resultModel = MutableLiveData>() + + + fun obtainOrderStatus() = launch({ + val response = RetrofitServiceManager.obtainOrderStatus() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderStatusModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainSearchResult( + keywords, alarmContent, alarmLevel, jobStatus, beginTime, endTime, page + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun obtainWorkOrderDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainWorkOrderDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + detailModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun countWorkOrderByState() = launch({ +// val response = RetrofitServiceManager.countWorkOrderByState() +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// val map = HashMap(4) +// +// val jsonObject = JSONObject(response) +// val data = jsonObject.getJSONObject("data") +// map["beforeGet"] = data.getString("beforeGet") +// map["beforeConfirm"] = data.getString("beforeConfirm") +// map["inHandle"] = data.getString("inHandle") +// map["over"] = data.getString("over") +// resultModel.value = map +// } else { +// response.toErrorMessage().show() +// } +// }, { +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt index 39d6d09..6de33f7 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt @@ -119,7 +119,6 @@ } } - sheetConfirmButton.setChangeAlphaWhenPress(true) sheetConfirmButton.setOnClickListener { listener.onAreaSelected(areaName, areaId) dismiss() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt index 98ff307..bcd9351 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt @@ -47,7 +47,6 @@ setCancelable(true) setCanceledOnTouchOutside(true) - confirmButton.setChangeAlphaWhenPress(true) confirmButton.setOnClickListener { val oldPwd = oldPwdView.text.toString() val newPwd = newPwdView.text.toString() @@ -66,6 +65,7 @@ } if (!newPwd.isLetterAndDigit()) { "新密码需包含数字和字母".show() + return@setOnClickListener } if (newPwd != confirmPwd) { "新密码和确认密码不一致,请检查".show() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt new file mode 100644 index 0000000..2b3dfe7 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt @@ -0,0 +1,102 @@ +package com.casic.qd.smartwell.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.* +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineBottomSheet private constructor(builder: Builder) : Dialog( + builder.context!!, R.style.ActionSheetDialogStyle +) { + private val ctx: Context = builder.context!! + private val items: MutableList = builder.items!! + + class Builder { + var context: Context? = null + var items: MutableList? = null + + fun setContext(context: Context?): Builder { + this.context = context + return this + } + + fun setFlowItems(flowItems: MutableList?): Builder { + this.items = flowItems + return this + } + + fun build(): TimeLineBottomSheet { + return TimeLineBottomSheet(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_bottom_sheet) + setCancelable(true) + setCanceledOnTouchOutside(true) + //绑定流程进展数据 + val orderFlowRecyclerView = findViewById(R.id.orderFlowRecyclerView) + orderFlowRecyclerView.layoutManager = LinearLayoutManager(ctx) + orderFlowRecyclerView.adapter = OrderFlowAdapter() + + val dismissView = findViewById(R.id.dismissView) + dismissView.setOnClickListener { + this.dismiss() + } + } + + private fun configDialogLayout() { + val window = window ?: return + window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window.decorView.setBackgroundColor(Color.TRANSPARENT) + window.setGravity(Gravity.BOTTOM) + //设置Dialog出现的动画 + window.setWindowAnimations(R.style.ActionSheetDialogAnimation) + val params = window.attributes + params.width = SizeUtil.getScreenWidth(ctx) + params.height = WindowManager.LayoutParams.WRAP_CONTENT + window.attributes = params + } + + internal inner class OrderFlowAdapter : + RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(ctx) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OrderFlowAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_flow_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = items.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = items[position] + holder.fromPersonView.text = rowsBean.from + holder.toPersonView.text = rowsBean.to + holder.transferDateView.text = rowsBean.time + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var fromPersonView: TextView = view.findViewById(R.id.fromPersonView) + var toPersonView: TextView = view.findViewById(R.id.toPersonView) + var transferDateView: TextView = view.findViewById(R.id.transferDateView) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml new file mode 100644 index 0000000..5875998 --- /dev/null +++ b/app/src/main/res/drawable/button_main_selector.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml new file mode 100644 index 0000000..a925019 --- /dev/null +++ b/app/src/main/res/drawable/button_white_selector.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt new file mode 100644 index 0000000..1f1b5de --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt @@ -0,0 +1,47 @@ +package com.casic.qd.smartwell.view + +import androidx.fragment.app.Fragment +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.TopViewPagerAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.navigatePageTo +import com.casic.qd.smartwell.fragment.OrderCompletedFragment +import com.casic.qd.smartwell.fragment.OrderInHandleFragment +import com.casic.qd.smartwell.fragment.OrderNotConfirmedFragment +import com.casic.qd.smartwell.fragment.OrderNotProcessedFragment +import com.casic.qd.smartwell.utils.Constant +import kotlinx.android.synthetic.main.activity_order_management.* +import java.util.* + +class OrderManagementActivity : BaseActivity() { + + private var fragmentList: ArrayList = ArrayList() + + init { + fragmentList.add(OrderNotProcessedFragment())//待处理 + fragmentList.add(OrderNotConfirmedFragment())//待确认 + fragmentList.add(OrderInHandleFragment())//处理中 + fragmentList.add(OrderCompletedFragment())//已完成 + } + + override fun initLayoutView(): Int = R.layout.activity_order_management + + override fun setupTopBarLayout() { + titleView.text = "工单管理" + } + + override fun initData() { + val topViewPagerAdapter = TopViewPagerAdapter( + supportFragmentManager, Constant.SUB_PAGE_TITLES, fragmentList + ) + orderViewPager.offscreenPageLimit = fragmentList.size + orderViewPager.adapter = topViewPagerAdapter + orderTabLayout.setupWithViewPager(orderViewPager) + } + + override fun initEvent() { + rightOptionView.setOnClickListener { + navigatePageTo() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt new file mode 100644 index 0000000..6e7e65e --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -0,0 +1,217 @@ +package com.casic.qd.smartwell.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.SearchResultAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.showEmptyPage +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.WeakReferenceHandler +import com.casic.qd.smartwell.vm.OperationViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.TimeLineBottomSheet +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_order_search_result.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_empty_view.* + +class OrderSearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var operationViewModel: OperationViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var args: ArrayList + private lateinit var searchResultAdapter: SearchResultAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_order_search_result + + override fun setupTopBarLayout() { + titleView.text = "查询结果" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + weakReferenceHandler = WeakReferenceHandler(callback) + operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + obtainSearchResult(args, pageIndex) + workOrderViewModel.listModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + resultRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show() + } + dataBeans.addAll(dataRows!!) + resultRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022040101) + } + }) + workOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + resultRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + resultRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainSearchResult(args, pageIndex) + } + + //接单状态处理 + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + //通知列表刷行数据 + weakReferenceHandler.sendEmptyMessage(2022040102) + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + workOrderViewModel.detailModel.observe(this, { + if (it.code == 200) { + val orderDetail = it.data!![0] + val orderFlow = orderDetail.flow!! + if (orderFlow.size != 0) { + TimeLineBottomSheet.Builder().setContext(this) + .setFlowItems(orderFlow).build().show() + } else { + "抱歉,无法查到该工单的流转记录".show() + } + } + }) + } + + private fun obtainSearchResult(args: ArrayList, pageIndex: Int) { + workOrderViewModel.obtainSearchResult( + keywords = args[0], + alarmContent = args[1], + alarmLevel = args[2], + jobStatus = args[3], + beginTime = args[4], + endTime = args[5], + page = pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2022040102 -> { + isRefresh = true + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + 2022040101 -> { + if (isRefresh || isLoadMore) { + searchResultAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + obtainSearchResult(args, pageIndex) + } + } else { + emptyView!!.hide() + searchResultAdapter = SearchResultAdapter(this, dataBeans) + resultRecyclerView!!.layoutManager = LinearLayoutManager(this) + resultRecyclerView!!.adapter = searchResultAdapter + searchResultAdapter.setOnItemClickListener(object : + SearchResultAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } + if (dataBeans[position].jobStatus == "0") { +// navigatePageTo(jobId) + } else { +// navigatePageTo(jobId) + } + } + + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(this@OrderSearchResultActivity) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptWorkOrder(jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + + override fun onTransferViewClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看工单流转记录".show() + return + } + workOrderViewModel.obtainWorkOrderDetail(jobId) + } + }) + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index 2b92d86..fccff95 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -145,7 +145,6 @@ }.build().show(supportFragmentManager, "all") } - searchButton.setChangeAlphaWhenPress(true) searchButton.setOnClickListener { //页面跳转,将查询参数传过去 navigatePageTo( @@ -160,7 +159,6 @@ ) } - clearButton.setChangeAlphaWhenPress(true) clearButton.setOnClickListener { wellCodeView.setText("") alarmTypeView.text = "" diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt new file mode 100644 index 0000000..a4b66b9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt @@ -0,0 +1,207 @@ +package com.casic.qd.smartwell.view + +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.AlarmContentModel +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.AlarmViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import com.zhy.view.flowlayout.FlowLayout +import com.zhy.view.flowlayout.TagAdapter +import kotlinx.android.synthetic.main.activity_order_search.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class SearchOrderActivity : BaseActivity() { + + private lateinit var contentTypeViewModel: AlarmViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var inflater: LayoutInflater + private lateinit var contentTypeAdapter: TagAdapter + private lateinit var orderStatusAdapter: TagAdapter + private var contentModels: MutableList = ArrayList() + private var orderStatusModels: MutableList = ArrayList() + private var alarmContentType = "" + private var alarmLevel = "" + private var orderState = "" + + override fun initLayoutView(): Int = R.layout.activity_order_search + + override fun setupTopBarLayout() { + titleView.text = "工单查询" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + inflater = LayoutInflater.from(this) + //告警内容 + contentTypeViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + //工单状态 + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + contentTypeViewModel.obtainAlarmContent("1") + contentTypeViewModel.contentModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = AlarmContentModel.DataBean.ListBean() + bean.value = "" + bean.name = "全部" + bean.alarmType = "" + bean.deviceType = "" + contentModels.add(bean) + + it.data!!.list?.forEach { contentTypeBean -> + contentModels.add(contentTypeBean) + } + contentTypeAdapter = + object : TagAdapter(contentModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: AlarmContentModel.DataBean.ListBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmContentLayout, false + ) as TextView + tagView.text = contentModels[position].name + return tagView + } + } + alarmContentLayout.adapter = contentTypeAdapter + contentTypeAdapter.setSelectedList(0) + alarmContentLayout.setOnTagClickListener { _, position, _ -> + this.alarmContentType = contentModels[position].value.toString() + true + } + } + }) + + val levelMaps: MutableList> = ArrayList() + for (i in 0..3) { + val map = HashMap() + map["name"] = i.toString().toChinese() + map["value"] = i.toLevel() + levelMaps.add(map) + } + val levelAdapter = object : TagAdapter>(levelMaps) { + override fun getView( + parent: FlowLayout?, + position: Int, map: Map? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmLevelLayout, false + ) as TextView + tagView.text = levelMaps[position]["name"] + return tagView + } + } + alarmLevelLayout.adapter = levelAdapter + levelAdapter.setSelectedList(0) + alarmLevelLayout.setOnTagClickListener { _, position, _ -> + this.alarmLevel = levelMaps[position]["value"].toString() + true + } + + workOrderViewModel.obtainOrderStatus() + workOrderViewModel.orderStatusModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = OrderStatusModel.DataBean() + bean.name = "全部" + bean.id = "" + bean.value = "" + orderStatusModels.add(bean) + it.data!!.forEach { statusBean -> + orderStatusModels.add(statusBean) + } + orderStatusAdapter = + object : TagAdapter(orderStatusModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: OrderStatusModel.DataBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + orderStatusLayout, false + ) as TextView + tagView.text = orderStatusModels[position].name + return tagView + } + } + orderStatusLayout.adapter = orderStatusAdapter + orderStatusAdapter.setSelectedList(0) + orderStatusLayout.setOnTagClickListener { _, position, _ -> + this.orderState = orderStatusModels[position].value.toString() + true + } + } + }) + + startTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择开始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + startTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + endTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) { + "结束时间不合法,不能早于开始时间".show() + return@setCallBack + } + endTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + searchButton.setOnClickListener { + //页面跳转,将查询参数传过去 + navigatePageTo( + addAll( + wellCodeView.text.toString().trim(), + alarmContentType, + alarmLevel, + orderState, + startTimeView.text.toString(), + endTimeView.text.toString() + ) + ) + } + + clearButton.setOnClickListener { + wellCodeView.text.clear() + contentTypeAdapter.setSelectedList(0) + levelAdapter.setSelectedList(0) + orderStatusAdapter.setSelectedList(0) + startTimeView.text = "" + endTimeView.text = "" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt index b1f9fc3..c21fe1a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt @@ -112,16 +112,20 @@ }) fun obtainMapDeviceResult(keywords: String?, devType: String?) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.obtainMapDeviceResult(keywords, devType) val responseCode = response.separateResponseCode() if (responseCode == 200) { + loadState.value = LoadState.Success mapDeviceResultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { + loadState.value = LoadState.Fail response.toErrorMessage().show() } }, { + loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt new file mode 100644 index 0000000..6a528a4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt @@ -0,0 +1,83 @@ +package com.casic.qd.smartwell.vm + +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager + +/** + * 转单、接单、处理等vm + * */ +class OperationViewModel : BaseViewModel() { + + fun acceptWorkOrder(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.acceptWorkOrder(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "接单成功".show() + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun confirmWorkOrder( +// id: String, firstState: String, +// firstStatePhotos: String, needHandle: String +// ) = launch({ +// loadState.value = LoadState.Loading +// val response = +// RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单确认成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun transferWorkOrder(id: String, userId: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.transferWorkOrder(id, userId) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "转单成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun completeWorkOrder(id: String, handleMessage: String, handlePhotos: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.completeWorkOrder(id, handleMessage, handlePhotos) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单处理成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt new file mode 100644 index 0000000..411c9a8 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt @@ -0,0 +1,105 @@ +package com.casic.qd.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +class WorkOrderViewModel : BaseViewModel() { + + private val gson = Gson() + val orderStatusModel = MutableLiveData() + val listModel = MutableLiveData() + val detailModel = MutableLiveData() +// val resultModel = MutableLiveData>() + + + fun obtainOrderStatus() = launch({ + val response = RetrofitServiceManager.obtainOrderStatus() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderStatusModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainSearchResult( + keywords, alarmContent, alarmLevel, jobStatus, beginTime, endTime, page + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun obtainWorkOrderDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainWorkOrderDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + detailModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun countWorkOrderByState() = launch({ +// val response = RetrofitServiceManager.countWorkOrderByState() +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// val map = HashMap(4) +// +// val jsonObject = JSONObject(response) +// val data = jsonObject.getJSONObject("data") +// map["beforeGet"] = data.getString("beforeGet") +// map["beforeConfirm"] = data.getString("beforeConfirm") +// map["inHandle"] = data.getString("inHandle") +// map["over"] = data.getString("over") +// resultModel.value = map +// } else { +// response.toErrorMessage().show() +// } +// }, { +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt index 39d6d09..6de33f7 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt @@ -119,7 +119,6 @@ } } - sheetConfirmButton.setChangeAlphaWhenPress(true) sheetConfirmButton.setOnClickListener { listener.onAreaSelected(areaName, areaId) dismiss() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt index 98ff307..bcd9351 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt @@ -47,7 +47,6 @@ setCancelable(true) setCanceledOnTouchOutside(true) - confirmButton.setChangeAlphaWhenPress(true) confirmButton.setOnClickListener { val oldPwd = oldPwdView.text.toString() val newPwd = newPwdView.text.toString() @@ -66,6 +65,7 @@ } if (!newPwd.isLetterAndDigit()) { "新密码需包含数字和字母".show() + return@setOnClickListener } if (newPwd != confirmPwd) { "新密码和确认密码不一致,请检查".show() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt new file mode 100644 index 0000000..2b3dfe7 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt @@ -0,0 +1,102 @@ +package com.casic.qd.smartwell.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.* +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineBottomSheet private constructor(builder: Builder) : Dialog( + builder.context!!, R.style.ActionSheetDialogStyle +) { + private val ctx: Context = builder.context!! + private val items: MutableList = builder.items!! + + class Builder { + var context: Context? = null + var items: MutableList? = null + + fun setContext(context: Context?): Builder { + this.context = context + return this + } + + fun setFlowItems(flowItems: MutableList?): Builder { + this.items = flowItems + return this + } + + fun build(): TimeLineBottomSheet { + return TimeLineBottomSheet(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_bottom_sheet) + setCancelable(true) + setCanceledOnTouchOutside(true) + //绑定流程进展数据 + val orderFlowRecyclerView = findViewById(R.id.orderFlowRecyclerView) + orderFlowRecyclerView.layoutManager = LinearLayoutManager(ctx) + orderFlowRecyclerView.adapter = OrderFlowAdapter() + + val dismissView = findViewById(R.id.dismissView) + dismissView.setOnClickListener { + this.dismiss() + } + } + + private fun configDialogLayout() { + val window = window ?: return + window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window.decorView.setBackgroundColor(Color.TRANSPARENT) + window.setGravity(Gravity.BOTTOM) + //设置Dialog出现的动画 + window.setWindowAnimations(R.style.ActionSheetDialogAnimation) + val params = window.attributes + params.width = SizeUtil.getScreenWidth(ctx) + params.height = WindowManager.LayoutParams.WRAP_CONTENT + window.attributes = params + } + + internal inner class OrderFlowAdapter : + RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(ctx) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OrderFlowAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_flow_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = items.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = items[position] + holder.fromPersonView.text = rowsBean.from + holder.toPersonView.text = rowsBean.to + holder.transferDateView.text = rowsBean.time + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var fromPersonView: TextView = view.findViewById(R.id.fromPersonView) + var toPersonView: TextView = view.findViewById(R.id.toPersonView) + var transferDateView: TextView = view.findViewById(R.id.transferDateView) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml new file mode 100644 index 0000000..5875998 --- /dev/null +++ b/app/src/main/res/drawable/button_main_selector.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml new file mode 100644 index 0000000..a925019 --- /dev/null +++ b/app/src/main/res/drawable/button_white_selector.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_down.xml b/app/src/main/res/drawable/ic_down.xml new file mode 100644 index 0000000..20e6476 --- /dev/null +++ b/app/src/main/res/drawable/ic_down.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt new file mode 100644 index 0000000..1f1b5de --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt @@ -0,0 +1,47 @@ +package com.casic.qd.smartwell.view + +import androidx.fragment.app.Fragment +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.TopViewPagerAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.navigatePageTo +import com.casic.qd.smartwell.fragment.OrderCompletedFragment +import com.casic.qd.smartwell.fragment.OrderInHandleFragment +import com.casic.qd.smartwell.fragment.OrderNotConfirmedFragment +import com.casic.qd.smartwell.fragment.OrderNotProcessedFragment +import com.casic.qd.smartwell.utils.Constant +import kotlinx.android.synthetic.main.activity_order_management.* +import java.util.* + +class OrderManagementActivity : BaseActivity() { + + private var fragmentList: ArrayList = ArrayList() + + init { + fragmentList.add(OrderNotProcessedFragment())//待处理 + fragmentList.add(OrderNotConfirmedFragment())//待确认 + fragmentList.add(OrderInHandleFragment())//处理中 + fragmentList.add(OrderCompletedFragment())//已完成 + } + + override fun initLayoutView(): Int = R.layout.activity_order_management + + override fun setupTopBarLayout() { + titleView.text = "工单管理" + } + + override fun initData() { + val topViewPagerAdapter = TopViewPagerAdapter( + supportFragmentManager, Constant.SUB_PAGE_TITLES, fragmentList + ) + orderViewPager.offscreenPageLimit = fragmentList.size + orderViewPager.adapter = topViewPagerAdapter + orderTabLayout.setupWithViewPager(orderViewPager) + } + + override fun initEvent() { + rightOptionView.setOnClickListener { + navigatePageTo() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt new file mode 100644 index 0000000..6e7e65e --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -0,0 +1,217 @@ +package com.casic.qd.smartwell.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.SearchResultAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.showEmptyPage +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.WeakReferenceHandler +import com.casic.qd.smartwell.vm.OperationViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.TimeLineBottomSheet +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_order_search_result.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_empty_view.* + +class OrderSearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var operationViewModel: OperationViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var args: ArrayList + private lateinit var searchResultAdapter: SearchResultAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_order_search_result + + override fun setupTopBarLayout() { + titleView.text = "查询结果" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + weakReferenceHandler = WeakReferenceHandler(callback) + operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + obtainSearchResult(args, pageIndex) + workOrderViewModel.listModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + resultRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show() + } + dataBeans.addAll(dataRows!!) + resultRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022040101) + } + }) + workOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + resultRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + resultRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainSearchResult(args, pageIndex) + } + + //接单状态处理 + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + //通知列表刷行数据 + weakReferenceHandler.sendEmptyMessage(2022040102) + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + workOrderViewModel.detailModel.observe(this, { + if (it.code == 200) { + val orderDetail = it.data!![0] + val orderFlow = orderDetail.flow!! + if (orderFlow.size != 0) { + TimeLineBottomSheet.Builder().setContext(this) + .setFlowItems(orderFlow).build().show() + } else { + "抱歉,无法查到该工单的流转记录".show() + } + } + }) + } + + private fun obtainSearchResult(args: ArrayList, pageIndex: Int) { + workOrderViewModel.obtainSearchResult( + keywords = args[0], + alarmContent = args[1], + alarmLevel = args[2], + jobStatus = args[3], + beginTime = args[4], + endTime = args[5], + page = pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2022040102 -> { + isRefresh = true + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + 2022040101 -> { + if (isRefresh || isLoadMore) { + searchResultAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + obtainSearchResult(args, pageIndex) + } + } else { + emptyView!!.hide() + searchResultAdapter = SearchResultAdapter(this, dataBeans) + resultRecyclerView!!.layoutManager = LinearLayoutManager(this) + resultRecyclerView!!.adapter = searchResultAdapter + searchResultAdapter.setOnItemClickListener(object : + SearchResultAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } + if (dataBeans[position].jobStatus == "0") { +// navigatePageTo(jobId) + } else { +// navigatePageTo(jobId) + } + } + + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(this@OrderSearchResultActivity) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptWorkOrder(jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + + override fun onTransferViewClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看工单流转记录".show() + return + } + workOrderViewModel.obtainWorkOrderDetail(jobId) + } + }) + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index 2b92d86..fccff95 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -145,7 +145,6 @@ }.build().show(supportFragmentManager, "all") } - searchButton.setChangeAlphaWhenPress(true) searchButton.setOnClickListener { //页面跳转,将查询参数传过去 navigatePageTo( @@ -160,7 +159,6 @@ ) } - clearButton.setChangeAlphaWhenPress(true) clearButton.setOnClickListener { wellCodeView.setText("") alarmTypeView.text = "" diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt new file mode 100644 index 0000000..a4b66b9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt @@ -0,0 +1,207 @@ +package com.casic.qd.smartwell.view + +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.AlarmContentModel +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.AlarmViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import com.zhy.view.flowlayout.FlowLayout +import com.zhy.view.flowlayout.TagAdapter +import kotlinx.android.synthetic.main.activity_order_search.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class SearchOrderActivity : BaseActivity() { + + private lateinit var contentTypeViewModel: AlarmViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var inflater: LayoutInflater + private lateinit var contentTypeAdapter: TagAdapter + private lateinit var orderStatusAdapter: TagAdapter + private var contentModels: MutableList = ArrayList() + private var orderStatusModels: MutableList = ArrayList() + private var alarmContentType = "" + private var alarmLevel = "" + private var orderState = "" + + override fun initLayoutView(): Int = R.layout.activity_order_search + + override fun setupTopBarLayout() { + titleView.text = "工单查询" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + inflater = LayoutInflater.from(this) + //告警内容 + contentTypeViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + //工单状态 + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + contentTypeViewModel.obtainAlarmContent("1") + contentTypeViewModel.contentModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = AlarmContentModel.DataBean.ListBean() + bean.value = "" + bean.name = "全部" + bean.alarmType = "" + bean.deviceType = "" + contentModels.add(bean) + + it.data!!.list?.forEach { contentTypeBean -> + contentModels.add(contentTypeBean) + } + contentTypeAdapter = + object : TagAdapter(contentModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: AlarmContentModel.DataBean.ListBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmContentLayout, false + ) as TextView + tagView.text = contentModels[position].name + return tagView + } + } + alarmContentLayout.adapter = contentTypeAdapter + contentTypeAdapter.setSelectedList(0) + alarmContentLayout.setOnTagClickListener { _, position, _ -> + this.alarmContentType = contentModels[position].value.toString() + true + } + } + }) + + val levelMaps: MutableList> = ArrayList() + for (i in 0..3) { + val map = HashMap() + map["name"] = i.toString().toChinese() + map["value"] = i.toLevel() + levelMaps.add(map) + } + val levelAdapter = object : TagAdapter>(levelMaps) { + override fun getView( + parent: FlowLayout?, + position: Int, map: Map? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmLevelLayout, false + ) as TextView + tagView.text = levelMaps[position]["name"] + return tagView + } + } + alarmLevelLayout.adapter = levelAdapter + levelAdapter.setSelectedList(0) + alarmLevelLayout.setOnTagClickListener { _, position, _ -> + this.alarmLevel = levelMaps[position]["value"].toString() + true + } + + workOrderViewModel.obtainOrderStatus() + workOrderViewModel.orderStatusModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = OrderStatusModel.DataBean() + bean.name = "全部" + bean.id = "" + bean.value = "" + orderStatusModels.add(bean) + it.data!!.forEach { statusBean -> + orderStatusModels.add(statusBean) + } + orderStatusAdapter = + object : TagAdapter(orderStatusModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: OrderStatusModel.DataBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + orderStatusLayout, false + ) as TextView + tagView.text = orderStatusModels[position].name + return tagView + } + } + orderStatusLayout.adapter = orderStatusAdapter + orderStatusAdapter.setSelectedList(0) + orderStatusLayout.setOnTagClickListener { _, position, _ -> + this.orderState = orderStatusModels[position].value.toString() + true + } + } + }) + + startTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择开始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + startTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + endTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) { + "结束时间不合法,不能早于开始时间".show() + return@setCallBack + } + endTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + searchButton.setOnClickListener { + //页面跳转,将查询参数传过去 + navigatePageTo( + addAll( + wellCodeView.text.toString().trim(), + alarmContentType, + alarmLevel, + orderState, + startTimeView.text.toString(), + endTimeView.text.toString() + ) + ) + } + + clearButton.setOnClickListener { + wellCodeView.text.clear() + contentTypeAdapter.setSelectedList(0) + levelAdapter.setSelectedList(0) + orderStatusAdapter.setSelectedList(0) + startTimeView.text = "" + endTimeView.text = "" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt index b1f9fc3..c21fe1a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt @@ -112,16 +112,20 @@ }) fun obtainMapDeviceResult(keywords: String?, devType: String?) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.obtainMapDeviceResult(keywords, devType) val responseCode = response.separateResponseCode() if (responseCode == 200) { + loadState.value = LoadState.Success mapDeviceResultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { + loadState.value = LoadState.Fail response.toErrorMessage().show() } }, { + loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt new file mode 100644 index 0000000..6a528a4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt @@ -0,0 +1,83 @@ +package com.casic.qd.smartwell.vm + +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager + +/** + * 转单、接单、处理等vm + * */ +class OperationViewModel : BaseViewModel() { + + fun acceptWorkOrder(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.acceptWorkOrder(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "接单成功".show() + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun confirmWorkOrder( +// id: String, firstState: String, +// firstStatePhotos: String, needHandle: String +// ) = launch({ +// loadState.value = LoadState.Loading +// val response = +// RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单确认成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun transferWorkOrder(id: String, userId: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.transferWorkOrder(id, userId) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "转单成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun completeWorkOrder(id: String, handleMessage: String, handlePhotos: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.completeWorkOrder(id, handleMessage, handlePhotos) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单处理成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt new file mode 100644 index 0000000..411c9a8 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt @@ -0,0 +1,105 @@ +package com.casic.qd.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +class WorkOrderViewModel : BaseViewModel() { + + private val gson = Gson() + val orderStatusModel = MutableLiveData() + val listModel = MutableLiveData() + val detailModel = MutableLiveData() +// val resultModel = MutableLiveData>() + + + fun obtainOrderStatus() = launch({ + val response = RetrofitServiceManager.obtainOrderStatus() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderStatusModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainSearchResult( + keywords, alarmContent, alarmLevel, jobStatus, beginTime, endTime, page + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun obtainWorkOrderDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainWorkOrderDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + detailModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun countWorkOrderByState() = launch({ +// val response = RetrofitServiceManager.countWorkOrderByState() +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// val map = HashMap(4) +// +// val jsonObject = JSONObject(response) +// val data = jsonObject.getJSONObject("data") +// map["beforeGet"] = data.getString("beforeGet") +// map["beforeConfirm"] = data.getString("beforeConfirm") +// map["inHandle"] = data.getString("inHandle") +// map["over"] = data.getString("over") +// resultModel.value = map +// } else { +// response.toErrorMessage().show() +// } +// }, { +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt index 39d6d09..6de33f7 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt @@ -119,7 +119,6 @@ } } - sheetConfirmButton.setChangeAlphaWhenPress(true) sheetConfirmButton.setOnClickListener { listener.onAreaSelected(areaName, areaId) dismiss() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt index 98ff307..bcd9351 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt @@ -47,7 +47,6 @@ setCancelable(true) setCanceledOnTouchOutside(true) - confirmButton.setChangeAlphaWhenPress(true) confirmButton.setOnClickListener { val oldPwd = oldPwdView.text.toString() val newPwd = newPwdView.text.toString() @@ -66,6 +65,7 @@ } if (!newPwd.isLetterAndDigit()) { "新密码需包含数字和字母".show() + return@setOnClickListener } if (newPwd != confirmPwd) { "新密码和确认密码不一致,请检查".show() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt new file mode 100644 index 0000000..2b3dfe7 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt @@ -0,0 +1,102 @@ +package com.casic.qd.smartwell.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.* +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineBottomSheet private constructor(builder: Builder) : Dialog( + builder.context!!, R.style.ActionSheetDialogStyle +) { + private val ctx: Context = builder.context!! + private val items: MutableList = builder.items!! + + class Builder { + var context: Context? = null + var items: MutableList? = null + + fun setContext(context: Context?): Builder { + this.context = context + return this + } + + fun setFlowItems(flowItems: MutableList?): Builder { + this.items = flowItems + return this + } + + fun build(): TimeLineBottomSheet { + return TimeLineBottomSheet(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_bottom_sheet) + setCancelable(true) + setCanceledOnTouchOutside(true) + //绑定流程进展数据 + val orderFlowRecyclerView = findViewById(R.id.orderFlowRecyclerView) + orderFlowRecyclerView.layoutManager = LinearLayoutManager(ctx) + orderFlowRecyclerView.adapter = OrderFlowAdapter() + + val dismissView = findViewById(R.id.dismissView) + dismissView.setOnClickListener { + this.dismiss() + } + } + + private fun configDialogLayout() { + val window = window ?: return + window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window.decorView.setBackgroundColor(Color.TRANSPARENT) + window.setGravity(Gravity.BOTTOM) + //设置Dialog出现的动画 + window.setWindowAnimations(R.style.ActionSheetDialogAnimation) + val params = window.attributes + params.width = SizeUtil.getScreenWidth(ctx) + params.height = WindowManager.LayoutParams.WRAP_CONTENT + window.attributes = params + } + + internal inner class OrderFlowAdapter : + RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(ctx) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OrderFlowAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_flow_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = items.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = items[position] + holder.fromPersonView.text = rowsBean.from + holder.toPersonView.text = rowsBean.to + holder.transferDateView.text = rowsBean.time + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var fromPersonView: TextView = view.findViewById(R.id.fromPersonView) + var toPersonView: TextView = view.findViewById(R.id.toPersonView) + var transferDateView: TextView = view.findViewById(R.id.transferDateView) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml new file mode 100644 index 0000000..5875998 --- /dev/null +++ b/app/src/main/res/drawable/button_main_selector.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml new file mode 100644 index 0000000..a925019 --- /dev/null +++ b/app/src/main/res/drawable/button_white_selector.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_down.xml b/app/src/main/res/drawable/ic_down.xml new file mode 100644 index 0000000..20e6476 --- /dev/null +++ b/app/src/main/res/drawable/ic_down.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_work_order.xml b/app/src/main/res/drawable/ic_work_order.xml new file mode 100644 index 0000000..3c39d54 --- /dev/null +++ b/app/src/main/res/drawable/ic_work_order.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt new file mode 100644 index 0000000..1f1b5de --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt @@ -0,0 +1,47 @@ +package com.casic.qd.smartwell.view + +import androidx.fragment.app.Fragment +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.TopViewPagerAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.navigatePageTo +import com.casic.qd.smartwell.fragment.OrderCompletedFragment +import com.casic.qd.smartwell.fragment.OrderInHandleFragment +import com.casic.qd.smartwell.fragment.OrderNotConfirmedFragment +import com.casic.qd.smartwell.fragment.OrderNotProcessedFragment +import com.casic.qd.smartwell.utils.Constant +import kotlinx.android.synthetic.main.activity_order_management.* +import java.util.* + +class OrderManagementActivity : BaseActivity() { + + private var fragmentList: ArrayList = ArrayList() + + init { + fragmentList.add(OrderNotProcessedFragment())//待处理 + fragmentList.add(OrderNotConfirmedFragment())//待确认 + fragmentList.add(OrderInHandleFragment())//处理中 + fragmentList.add(OrderCompletedFragment())//已完成 + } + + override fun initLayoutView(): Int = R.layout.activity_order_management + + override fun setupTopBarLayout() { + titleView.text = "工单管理" + } + + override fun initData() { + val topViewPagerAdapter = TopViewPagerAdapter( + supportFragmentManager, Constant.SUB_PAGE_TITLES, fragmentList + ) + orderViewPager.offscreenPageLimit = fragmentList.size + orderViewPager.adapter = topViewPagerAdapter + orderTabLayout.setupWithViewPager(orderViewPager) + } + + override fun initEvent() { + rightOptionView.setOnClickListener { + navigatePageTo() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt new file mode 100644 index 0000000..6e7e65e --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -0,0 +1,217 @@ +package com.casic.qd.smartwell.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.SearchResultAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.showEmptyPage +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.WeakReferenceHandler +import com.casic.qd.smartwell.vm.OperationViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.TimeLineBottomSheet +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_order_search_result.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_empty_view.* + +class OrderSearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var operationViewModel: OperationViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var args: ArrayList + private lateinit var searchResultAdapter: SearchResultAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_order_search_result + + override fun setupTopBarLayout() { + titleView.text = "查询结果" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + weakReferenceHandler = WeakReferenceHandler(callback) + operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + obtainSearchResult(args, pageIndex) + workOrderViewModel.listModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + resultRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show() + } + dataBeans.addAll(dataRows!!) + resultRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022040101) + } + }) + workOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + resultRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + resultRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainSearchResult(args, pageIndex) + } + + //接单状态处理 + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + //通知列表刷行数据 + weakReferenceHandler.sendEmptyMessage(2022040102) + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + workOrderViewModel.detailModel.observe(this, { + if (it.code == 200) { + val orderDetail = it.data!![0] + val orderFlow = orderDetail.flow!! + if (orderFlow.size != 0) { + TimeLineBottomSheet.Builder().setContext(this) + .setFlowItems(orderFlow).build().show() + } else { + "抱歉,无法查到该工单的流转记录".show() + } + } + }) + } + + private fun obtainSearchResult(args: ArrayList, pageIndex: Int) { + workOrderViewModel.obtainSearchResult( + keywords = args[0], + alarmContent = args[1], + alarmLevel = args[2], + jobStatus = args[3], + beginTime = args[4], + endTime = args[5], + page = pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2022040102 -> { + isRefresh = true + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + 2022040101 -> { + if (isRefresh || isLoadMore) { + searchResultAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + obtainSearchResult(args, pageIndex) + } + } else { + emptyView!!.hide() + searchResultAdapter = SearchResultAdapter(this, dataBeans) + resultRecyclerView!!.layoutManager = LinearLayoutManager(this) + resultRecyclerView!!.adapter = searchResultAdapter + searchResultAdapter.setOnItemClickListener(object : + SearchResultAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } + if (dataBeans[position].jobStatus == "0") { +// navigatePageTo(jobId) + } else { +// navigatePageTo(jobId) + } + } + + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(this@OrderSearchResultActivity) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptWorkOrder(jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + + override fun onTransferViewClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看工单流转记录".show() + return + } + workOrderViewModel.obtainWorkOrderDetail(jobId) + } + }) + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index 2b92d86..fccff95 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -145,7 +145,6 @@ }.build().show(supportFragmentManager, "all") } - searchButton.setChangeAlphaWhenPress(true) searchButton.setOnClickListener { //页面跳转,将查询参数传过去 navigatePageTo( @@ -160,7 +159,6 @@ ) } - clearButton.setChangeAlphaWhenPress(true) clearButton.setOnClickListener { wellCodeView.setText("") alarmTypeView.text = "" diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt new file mode 100644 index 0000000..a4b66b9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt @@ -0,0 +1,207 @@ +package com.casic.qd.smartwell.view + +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.AlarmContentModel +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.AlarmViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import com.zhy.view.flowlayout.FlowLayout +import com.zhy.view.flowlayout.TagAdapter +import kotlinx.android.synthetic.main.activity_order_search.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class SearchOrderActivity : BaseActivity() { + + private lateinit var contentTypeViewModel: AlarmViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var inflater: LayoutInflater + private lateinit var contentTypeAdapter: TagAdapter + private lateinit var orderStatusAdapter: TagAdapter + private var contentModels: MutableList = ArrayList() + private var orderStatusModels: MutableList = ArrayList() + private var alarmContentType = "" + private var alarmLevel = "" + private var orderState = "" + + override fun initLayoutView(): Int = R.layout.activity_order_search + + override fun setupTopBarLayout() { + titleView.text = "工单查询" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + inflater = LayoutInflater.from(this) + //告警内容 + contentTypeViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + //工单状态 + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + contentTypeViewModel.obtainAlarmContent("1") + contentTypeViewModel.contentModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = AlarmContentModel.DataBean.ListBean() + bean.value = "" + bean.name = "全部" + bean.alarmType = "" + bean.deviceType = "" + contentModels.add(bean) + + it.data!!.list?.forEach { contentTypeBean -> + contentModels.add(contentTypeBean) + } + contentTypeAdapter = + object : TagAdapter(contentModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: AlarmContentModel.DataBean.ListBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmContentLayout, false + ) as TextView + tagView.text = contentModels[position].name + return tagView + } + } + alarmContentLayout.adapter = contentTypeAdapter + contentTypeAdapter.setSelectedList(0) + alarmContentLayout.setOnTagClickListener { _, position, _ -> + this.alarmContentType = contentModels[position].value.toString() + true + } + } + }) + + val levelMaps: MutableList> = ArrayList() + for (i in 0..3) { + val map = HashMap() + map["name"] = i.toString().toChinese() + map["value"] = i.toLevel() + levelMaps.add(map) + } + val levelAdapter = object : TagAdapter>(levelMaps) { + override fun getView( + parent: FlowLayout?, + position: Int, map: Map? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmLevelLayout, false + ) as TextView + tagView.text = levelMaps[position]["name"] + return tagView + } + } + alarmLevelLayout.adapter = levelAdapter + levelAdapter.setSelectedList(0) + alarmLevelLayout.setOnTagClickListener { _, position, _ -> + this.alarmLevel = levelMaps[position]["value"].toString() + true + } + + workOrderViewModel.obtainOrderStatus() + workOrderViewModel.orderStatusModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = OrderStatusModel.DataBean() + bean.name = "全部" + bean.id = "" + bean.value = "" + orderStatusModels.add(bean) + it.data!!.forEach { statusBean -> + orderStatusModels.add(statusBean) + } + orderStatusAdapter = + object : TagAdapter(orderStatusModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: OrderStatusModel.DataBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + orderStatusLayout, false + ) as TextView + tagView.text = orderStatusModels[position].name + return tagView + } + } + orderStatusLayout.adapter = orderStatusAdapter + orderStatusAdapter.setSelectedList(0) + orderStatusLayout.setOnTagClickListener { _, position, _ -> + this.orderState = orderStatusModels[position].value.toString() + true + } + } + }) + + startTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择开始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + startTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + endTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) { + "结束时间不合法,不能早于开始时间".show() + return@setCallBack + } + endTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + searchButton.setOnClickListener { + //页面跳转,将查询参数传过去 + navigatePageTo( + addAll( + wellCodeView.text.toString().trim(), + alarmContentType, + alarmLevel, + orderState, + startTimeView.text.toString(), + endTimeView.text.toString() + ) + ) + } + + clearButton.setOnClickListener { + wellCodeView.text.clear() + contentTypeAdapter.setSelectedList(0) + levelAdapter.setSelectedList(0) + orderStatusAdapter.setSelectedList(0) + startTimeView.text = "" + endTimeView.text = "" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt index b1f9fc3..c21fe1a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt @@ -112,16 +112,20 @@ }) fun obtainMapDeviceResult(keywords: String?, devType: String?) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.obtainMapDeviceResult(keywords, devType) val responseCode = response.separateResponseCode() if (responseCode == 200) { + loadState.value = LoadState.Success mapDeviceResultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { + loadState.value = LoadState.Fail response.toErrorMessage().show() } }, { + loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt new file mode 100644 index 0000000..6a528a4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt @@ -0,0 +1,83 @@ +package com.casic.qd.smartwell.vm + +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager + +/** + * 转单、接单、处理等vm + * */ +class OperationViewModel : BaseViewModel() { + + fun acceptWorkOrder(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.acceptWorkOrder(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "接单成功".show() + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun confirmWorkOrder( +// id: String, firstState: String, +// firstStatePhotos: String, needHandle: String +// ) = launch({ +// loadState.value = LoadState.Loading +// val response = +// RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单确认成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun transferWorkOrder(id: String, userId: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.transferWorkOrder(id, userId) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "转单成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun completeWorkOrder(id: String, handleMessage: String, handlePhotos: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.completeWorkOrder(id, handleMessage, handlePhotos) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单处理成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt new file mode 100644 index 0000000..411c9a8 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt @@ -0,0 +1,105 @@ +package com.casic.qd.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +class WorkOrderViewModel : BaseViewModel() { + + private val gson = Gson() + val orderStatusModel = MutableLiveData() + val listModel = MutableLiveData() + val detailModel = MutableLiveData() +// val resultModel = MutableLiveData>() + + + fun obtainOrderStatus() = launch({ + val response = RetrofitServiceManager.obtainOrderStatus() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderStatusModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainSearchResult( + keywords, alarmContent, alarmLevel, jobStatus, beginTime, endTime, page + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun obtainWorkOrderDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainWorkOrderDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + detailModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun countWorkOrderByState() = launch({ +// val response = RetrofitServiceManager.countWorkOrderByState() +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// val map = HashMap(4) +// +// val jsonObject = JSONObject(response) +// val data = jsonObject.getJSONObject("data") +// map["beforeGet"] = data.getString("beforeGet") +// map["beforeConfirm"] = data.getString("beforeConfirm") +// map["inHandle"] = data.getString("inHandle") +// map["over"] = data.getString("over") +// resultModel.value = map +// } else { +// response.toErrorMessage().show() +// } +// }, { +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt index 39d6d09..6de33f7 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt @@ -119,7 +119,6 @@ } } - sheetConfirmButton.setChangeAlphaWhenPress(true) sheetConfirmButton.setOnClickListener { listener.onAreaSelected(areaName, areaId) dismiss() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt index 98ff307..bcd9351 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt @@ -47,7 +47,6 @@ setCancelable(true) setCanceledOnTouchOutside(true) - confirmButton.setChangeAlphaWhenPress(true) confirmButton.setOnClickListener { val oldPwd = oldPwdView.text.toString() val newPwd = newPwdView.text.toString() @@ -66,6 +65,7 @@ } if (!newPwd.isLetterAndDigit()) { "新密码需包含数字和字母".show() + return@setOnClickListener } if (newPwd != confirmPwd) { "新密码和确认密码不一致,请检查".show() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt new file mode 100644 index 0000000..2b3dfe7 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt @@ -0,0 +1,102 @@ +package com.casic.qd.smartwell.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.* +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineBottomSheet private constructor(builder: Builder) : Dialog( + builder.context!!, R.style.ActionSheetDialogStyle +) { + private val ctx: Context = builder.context!! + private val items: MutableList = builder.items!! + + class Builder { + var context: Context? = null + var items: MutableList? = null + + fun setContext(context: Context?): Builder { + this.context = context + return this + } + + fun setFlowItems(flowItems: MutableList?): Builder { + this.items = flowItems + return this + } + + fun build(): TimeLineBottomSheet { + return TimeLineBottomSheet(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_bottom_sheet) + setCancelable(true) + setCanceledOnTouchOutside(true) + //绑定流程进展数据 + val orderFlowRecyclerView = findViewById(R.id.orderFlowRecyclerView) + orderFlowRecyclerView.layoutManager = LinearLayoutManager(ctx) + orderFlowRecyclerView.adapter = OrderFlowAdapter() + + val dismissView = findViewById(R.id.dismissView) + dismissView.setOnClickListener { + this.dismiss() + } + } + + private fun configDialogLayout() { + val window = window ?: return + window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window.decorView.setBackgroundColor(Color.TRANSPARENT) + window.setGravity(Gravity.BOTTOM) + //设置Dialog出现的动画 + window.setWindowAnimations(R.style.ActionSheetDialogAnimation) + val params = window.attributes + params.width = SizeUtil.getScreenWidth(ctx) + params.height = WindowManager.LayoutParams.WRAP_CONTENT + window.attributes = params + } + + internal inner class OrderFlowAdapter : + RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(ctx) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OrderFlowAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_flow_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = items.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = items[position] + holder.fromPersonView.text = rowsBean.from + holder.toPersonView.text = rowsBean.to + holder.transferDateView.text = rowsBean.time + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var fromPersonView: TextView = view.findViewById(R.id.fromPersonView) + var toPersonView: TextView = view.findViewById(R.id.toPersonView) + var transferDateView: TextView = view.findViewById(R.id.transferDateView) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml new file mode 100644 index 0000000..5875998 --- /dev/null +++ b/app/src/main/res/drawable/button_main_selector.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml new file mode 100644 index 0000000..a925019 --- /dev/null +++ b/app/src/main/res/drawable/button_white_selector.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_down.xml b/app/src/main/res/drawable/ic_down.xml new file mode 100644 index 0000000..20e6476 --- /dev/null +++ b/app/src/main/res/drawable/ic_down.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_work_order.xml b/app/src/main/res/drawable/ic_work_order.xml new file mode 100644 index 0000000..3c39d54 --- /dev/null +++ b/app/src/main/res/drawable/ic_work_order.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/selector_tag.xml b/app/src/main/res/drawable/selector_tag.xml new file mode 100644 index 0000000..c1fee7b --- /dev/null +++ b/app/src/main/res/drawable/selector_tag.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt new file mode 100644 index 0000000..1f1b5de --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt @@ -0,0 +1,47 @@ +package com.casic.qd.smartwell.view + +import androidx.fragment.app.Fragment +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.TopViewPagerAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.navigatePageTo +import com.casic.qd.smartwell.fragment.OrderCompletedFragment +import com.casic.qd.smartwell.fragment.OrderInHandleFragment +import com.casic.qd.smartwell.fragment.OrderNotConfirmedFragment +import com.casic.qd.smartwell.fragment.OrderNotProcessedFragment +import com.casic.qd.smartwell.utils.Constant +import kotlinx.android.synthetic.main.activity_order_management.* +import java.util.* + +class OrderManagementActivity : BaseActivity() { + + private var fragmentList: ArrayList = ArrayList() + + init { + fragmentList.add(OrderNotProcessedFragment())//待处理 + fragmentList.add(OrderNotConfirmedFragment())//待确认 + fragmentList.add(OrderInHandleFragment())//处理中 + fragmentList.add(OrderCompletedFragment())//已完成 + } + + override fun initLayoutView(): Int = R.layout.activity_order_management + + override fun setupTopBarLayout() { + titleView.text = "工单管理" + } + + override fun initData() { + val topViewPagerAdapter = TopViewPagerAdapter( + supportFragmentManager, Constant.SUB_PAGE_TITLES, fragmentList + ) + orderViewPager.offscreenPageLimit = fragmentList.size + orderViewPager.adapter = topViewPagerAdapter + orderTabLayout.setupWithViewPager(orderViewPager) + } + + override fun initEvent() { + rightOptionView.setOnClickListener { + navigatePageTo() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt new file mode 100644 index 0000000..6e7e65e --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -0,0 +1,217 @@ +package com.casic.qd.smartwell.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.SearchResultAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.showEmptyPage +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.WeakReferenceHandler +import com.casic.qd.smartwell.vm.OperationViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.TimeLineBottomSheet +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_order_search_result.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_empty_view.* + +class OrderSearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var operationViewModel: OperationViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var args: ArrayList + private lateinit var searchResultAdapter: SearchResultAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_order_search_result + + override fun setupTopBarLayout() { + titleView.text = "查询结果" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + weakReferenceHandler = WeakReferenceHandler(callback) + operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + obtainSearchResult(args, pageIndex) + workOrderViewModel.listModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + resultRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show() + } + dataBeans.addAll(dataRows!!) + resultRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022040101) + } + }) + workOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + resultRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + resultRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainSearchResult(args, pageIndex) + } + + //接单状态处理 + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + //通知列表刷行数据 + weakReferenceHandler.sendEmptyMessage(2022040102) + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + workOrderViewModel.detailModel.observe(this, { + if (it.code == 200) { + val orderDetail = it.data!![0] + val orderFlow = orderDetail.flow!! + if (orderFlow.size != 0) { + TimeLineBottomSheet.Builder().setContext(this) + .setFlowItems(orderFlow).build().show() + } else { + "抱歉,无法查到该工单的流转记录".show() + } + } + }) + } + + private fun obtainSearchResult(args: ArrayList, pageIndex: Int) { + workOrderViewModel.obtainSearchResult( + keywords = args[0], + alarmContent = args[1], + alarmLevel = args[2], + jobStatus = args[3], + beginTime = args[4], + endTime = args[5], + page = pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2022040102 -> { + isRefresh = true + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + 2022040101 -> { + if (isRefresh || isLoadMore) { + searchResultAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + obtainSearchResult(args, pageIndex) + } + } else { + emptyView!!.hide() + searchResultAdapter = SearchResultAdapter(this, dataBeans) + resultRecyclerView!!.layoutManager = LinearLayoutManager(this) + resultRecyclerView!!.adapter = searchResultAdapter + searchResultAdapter.setOnItemClickListener(object : + SearchResultAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } + if (dataBeans[position].jobStatus == "0") { +// navigatePageTo(jobId) + } else { +// navigatePageTo(jobId) + } + } + + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(this@OrderSearchResultActivity) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptWorkOrder(jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + + override fun onTransferViewClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看工单流转记录".show() + return + } + workOrderViewModel.obtainWorkOrderDetail(jobId) + } + }) + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index 2b92d86..fccff95 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -145,7 +145,6 @@ }.build().show(supportFragmentManager, "all") } - searchButton.setChangeAlphaWhenPress(true) searchButton.setOnClickListener { //页面跳转,将查询参数传过去 navigatePageTo( @@ -160,7 +159,6 @@ ) } - clearButton.setChangeAlphaWhenPress(true) clearButton.setOnClickListener { wellCodeView.setText("") alarmTypeView.text = "" diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt new file mode 100644 index 0000000..a4b66b9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt @@ -0,0 +1,207 @@ +package com.casic.qd.smartwell.view + +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.AlarmContentModel +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.AlarmViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import com.zhy.view.flowlayout.FlowLayout +import com.zhy.view.flowlayout.TagAdapter +import kotlinx.android.synthetic.main.activity_order_search.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class SearchOrderActivity : BaseActivity() { + + private lateinit var contentTypeViewModel: AlarmViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var inflater: LayoutInflater + private lateinit var contentTypeAdapter: TagAdapter + private lateinit var orderStatusAdapter: TagAdapter + private var contentModels: MutableList = ArrayList() + private var orderStatusModels: MutableList = ArrayList() + private var alarmContentType = "" + private var alarmLevel = "" + private var orderState = "" + + override fun initLayoutView(): Int = R.layout.activity_order_search + + override fun setupTopBarLayout() { + titleView.text = "工单查询" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + inflater = LayoutInflater.from(this) + //告警内容 + contentTypeViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + //工单状态 + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + contentTypeViewModel.obtainAlarmContent("1") + contentTypeViewModel.contentModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = AlarmContentModel.DataBean.ListBean() + bean.value = "" + bean.name = "全部" + bean.alarmType = "" + bean.deviceType = "" + contentModels.add(bean) + + it.data!!.list?.forEach { contentTypeBean -> + contentModels.add(contentTypeBean) + } + contentTypeAdapter = + object : TagAdapter(contentModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: AlarmContentModel.DataBean.ListBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmContentLayout, false + ) as TextView + tagView.text = contentModels[position].name + return tagView + } + } + alarmContentLayout.adapter = contentTypeAdapter + contentTypeAdapter.setSelectedList(0) + alarmContentLayout.setOnTagClickListener { _, position, _ -> + this.alarmContentType = contentModels[position].value.toString() + true + } + } + }) + + val levelMaps: MutableList> = ArrayList() + for (i in 0..3) { + val map = HashMap() + map["name"] = i.toString().toChinese() + map["value"] = i.toLevel() + levelMaps.add(map) + } + val levelAdapter = object : TagAdapter>(levelMaps) { + override fun getView( + parent: FlowLayout?, + position: Int, map: Map? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmLevelLayout, false + ) as TextView + tagView.text = levelMaps[position]["name"] + return tagView + } + } + alarmLevelLayout.adapter = levelAdapter + levelAdapter.setSelectedList(0) + alarmLevelLayout.setOnTagClickListener { _, position, _ -> + this.alarmLevel = levelMaps[position]["value"].toString() + true + } + + workOrderViewModel.obtainOrderStatus() + workOrderViewModel.orderStatusModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = OrderStatusModel.DataBean() + bean.name = "全部" + bean.id = "" + bean.value = "" + orderStatusModels.add(bean) + it.data!!.forEach { statusBean -> + orderStatusModels.add(statusBean) + } + orderStatusAdapter = + object : TagAdapter(orderStatusModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: OrderStatusModel.DataBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + orderStatusLayout, false + ) as TextView + tagView.text = orderStatusModels[position].name + return tagView + } + } + orderStatusLayout.adapter = orderStatusAdapter + orderStatusAdapter.setSelectedList(0) + orderStatusLayout.setOnTagClickListener { _, position, _ -> + this.orderState = orderStatusModels[position].value.toString() + true + } + } + }) + + startTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择开始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + startTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + endTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) { + "结束时间不合法,不能早于开始时间".show() + return@setCallBack + } + endTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + searchButton.setOnClickListener { + //页面跳转,将查询参数传过去 + navigatePageTo( + addAll( + wellCodeView.text.toString().trim(), + alarmContentType, + alarmLevel, + orderState, + startTimeView.text.toString(), + endTimeView.text.toString() + ) + ) + } + + clearButton.setOnClickListener { + wellCodeView.text.clear() + contentTypeAdapter.setSelectedList(0) + levelAdapter.setSelectedList(0) + orderStatusAdapter.setSelectedList(0) + startTimeView.text = "" + endTimeView.text = "" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt index b1f9fc3..c21fe1a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt @@ -112,16 +112,20 @@ }) fun obtainMapDeviceResult(keywords: String?, devType: String?) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.obtainMapDeviceResult(keywords, devType) val responseCode = response.separateResponseCode() if (responseCode == 200) { + loadState.value = LoadState.Success mapDeviceResultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { + loadState.value = LoadState.Fail response.toErrorMessage().show() } }, { + loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt new file mode 100644 index 0000000..6a528a4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt @@ -0,0 +1,83 @@ +package com.casic.qd.smartwell.vm + +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager + +/** + * 转单、接单、处理等vm + * */ +class OperationViewModel : BaseViewModel() { + + fun acceptWorkOrder(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.acceptWorkOrder(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "接单成功".show() + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun confirmWorkOrder( +// id: String, firstState: String, +// firstStatePhotos: String, needHandle: String +// ) = launch({ +// loadState.value = LoadState.Loading +// val response = +// RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单确认成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun transferWorkOrder(id: String, userId: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.transferWorkOrder(id, userId) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "转单成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun completeWorkOrder(id: String, handleMessage: String, handlePhotos: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.completeWorkOrder(id, handleMessage, handlePhotos) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单处理成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt new file mode 100644 index 0000000..411c9a8 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt @@ -0,0 +1,105 @@ +package com.casic.qd.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +class WorkOrderViewModel : BaseViewModel() { + + private val gson = Gson() + val orderStatusModel = MutableLiveData() + val listModel = MutableLiveData() + val detailModel = MutableLiveData() +// val resultModel = MutableLiveData>() + + + fun obtainOrderStatus() = launch({ + val response = RetrofitServiceManager.obtainOrderStatus() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderStatusModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainSearchResult( + keywords, alarmContent, alarmLevel, jobStatus, beginTime, endTime, page + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun obtainWorkOrderDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainWorkOrderDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + detailModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun countWorkOrderByState() = launch({ +// val response = RetrofitServiceManager.countWorkOrderByState() +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// val map = HashMap(4) +// +// val jsonObject = JSONObject(response) +// val data = jsonObject.getJSONObject("data") +// map["beforeGet"] = data.getString("beforeGet") +// map["beforeConfirm"] = data.getString("beforeConfirm") +// map["inHandle"] = data.getString("inHandle") +// map["over"] = data.getString("over") +// resultModel.value = map +// } else { +// response.toErrorMessage().show() +// } +// }, { +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt index 39d6d09..6de33f7 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt @@ -119,7 +119,6 @@ } } - sheetConfirmButton.setChangeAlphaWhenPress(true) sheetConfirmButton.setOnClickListener { listener.onAreaSelected(areaName, areaId) dismiss() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt index 98ff307..bcd9351 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt @@ -47,7 +47,6 @@ setCancelable(true) setCanceledOnTouchOutside(true) - confirmButton.setChangeAlphaWhenPress(true) confirmButton.setOnClickListener { val oldPwd = oldPwdView.text.toString() val newPwd = newPwdView.text.toString() @@ -66,6 +65,7 @@ } if (!newPwd.isLetterAndDigit()) { "新密码需包含数字和字母".show() + return@setOnClickListener } if (newPwd != confirmPwd) { "新密码和确认密码不一致,请检查".show() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt new file mode 100644 index 0000000..2b3dfe7 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt @@ -0,0 +1,102 @@ +package com.casic.qd.smartwell.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.* +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineBottomSheet private constructor(builder: Builder) : Dialog( + builder.context!!, R.style.ActionSheetDialogStyle +) { + private val ctx: Context = builder.context!! + private val items: MutableList = builder.items!! + + class Builder { + var context: Context? = null + var items: MutableList? = null + + fun setContext(context: Context?): Builder { + this.context = context + return this + } + + fun setFlowItems(flowItems: MutableList?): Builder { + this.items = flowItems + return this + } + + fun build(): TimeLineBottomSheet { + return TimeLineBottomSheet(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_bottom_sheet) + setCancelable(true) + setCanceledOnTouchOutside(true) + //绑定流程进展数据 + val orderFlowRecyclerView = findViewById(R.id.orderFlowRecyclerView) + orderFlowRecyclerView.layoutManager = LinearLayoutManager(ctx) + orderFlowRecyclerView.adapter = OrderFlowAdapter() + + val dismissView = findViewById(R.id.dismissView) + dismissView.setOnClickListener { + this.dismiss() + } + } + + private fun configDialogLayout() { + val window = window ?: return + window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window.decorView.setBackgroundColor(Color.TRANSPARENT) + window.setGravity(Gravity.BOTTOM) + //设置Dialog出现的动画 + window.setWindowAnimations(R.style.ActionSheetDialogAnimation) + val params = window.attributes + params.width = SizeUtil.getScreenWidth(ctx) + params.height = WindowManager.LayoutParams.WRAP_CONTENT + window.attributes = params + } + + internal inner class OrderFlowAdapter : + RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(ctx) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OrderFlowAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_flow_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = items.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = items[position] + holder.fromPersonView.text = rowsBean.from + holder.toPersonView.text = rowsBean.to + holder.transferDateView.text = rowsBean.time + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var fromPersonView: TextView = view.findViewById(R.id.fromPersonView) + var toPersonView: TextView = view.findViewById(R.id.toPersonView) + var transferDateView: TextView = view.findViewById(R.id.transferDateView) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml new file mode 100644 index 0000000..5875998 --- /dev/null +++ b/app/src/main/res/drawable/button_main_selector.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml new file mode 100644 index 0000000..a925019 --- /dev/null +++ b/app/src/main/res/drawable/button_white_selector.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_down.xml b/app/src/main/res/drawable/ic_down.xml new file mode 100644 index 0000000..20e6476 --- /dev/null +++ b/app/src/main/res/drawable/ic_down.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_work_order.xml b/app/src/main/res/drawable/ic_work_order.xml new file mode 100644 index 0000000..3c39d54 --- /dev/null +++ b/app/src/main/res/drawable/ic_work_order.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/selector_tag.xml b/app/src/main/res/drawable/selector_tag.xml new file mode 100644 index 0000000..c1fee7b --- /dev/null +++ b/app/src/main/res/drawable/selector_tag.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/selector_text.xml b/app/src/main/res/drawable/selector_text.xml new file mode 100644 index 0000000..d8c9398 --- /dev/null +++ b/app/src/main/res/drawable/selector_text.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt new file mode 100644 index 0000000..1f1b5de --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt @@ -0,0 +1,47 @@ +package com.casic.qd.smartwell.view + +import androidx.fragment.app.Fragment +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.TopViewPagerAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.navigatePageTo +import com.casic.qd.smartwell.fragment.OrderCompletedFragment +import com.casic.qd.smartwell.fragment.OrderInHandleFragment +import com.casic.qd.smartwell.fragment.OrderNotConfirmedFragment +import com.casic.qd.smartwell.fragment.OrderNotProcessedFragment +import com.casic.qd.smartwell.utils.Constant +import kotlinx.android.synthetic.main.activity_order_management.* +import java.util.* + +class OrderManagementActivity : BaseActivity() { + + private var fragmentList: ArrayList = ArrayList() + + init { + fragmentList.add(OrderNotProcessedFragment())//待处理 + fragmentList.add(OrderNotConfirmedFragment())//待确认 + fragmentList.add(OrderInHandleFragment())//处理中 + fragmentList.add(OrderCompletedFragment())//已完成 + } + + override fun initLayoutView(): Int = R.layout.activity_order_management + + override fun setupTopBarLayout() { + titleView.text = "工单管理" + } + + override fun initData() { + val topViewPagerAdapter = TopViewPagerAdapter( + supportFragmentManager, Constant.SUB_PAGE_TITLES, fragmentList + ) + orderViewPager.offscreenPageLimit = fragmentList.size + orderViewPager.adapter = topViewPagerAdapter + orderTabLayout.setupWithViewPager(orderViewPager) + } + + override fun initEvent() { + rightOptionView.setOnClickListener { + navigatePageTo() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt new file mode 100644 index 0000000..6e7e65e --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -0,0 +1,217 @@ +package com.casic.qd.smartwell.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.SearchResultAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.showEmptyPage +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.WeakReferenceHandler +import com.casic.qd.smartwell.vm.OperationViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.TimeLineBottomSheet +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_order_search_result.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_empty_view.* + +class OrderSearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var operationViewModel: OperationViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var args: ArrayList + private lateinit var searchResultAdapter: SearchResultAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_order_search_result + + override fun setupTopBarLayout() { + titleView.text = "查询结果" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + weakReferenceHandler = WeakReferenceHandler(callback) + operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + obtainSearchResult(args, pageIndex) + workOrderViewModel.listModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + resultRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show() + } + dataBeans.addAll(dataRows!!) + resultRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022040101) + } + }) + workOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + resultRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + resultRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainSearchResult(args, pageIndex) + } + + //接单状态处理 + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + //通知列表刷行数据 + weakReferenceHandler.sendEmptyMessage(2022040102) + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + workOrderViewModel.detailModel.observe(this, { + if (it.code == 200) { + val orderDetail = it.data!![0] + val orderFlow = orderDetail.flow!! + if (orderFlow.size != 0) { + TimeLineBottomSheet.Builder().setContext(this) + .setFlowItems(orderFlow).build().show() + } else { + "抱歉,无法查到该工单的流转记录".show() + } + } + }) + } + + private fun obtainSearchResult(args: ArrayList, pageIndex: Int) { + workOrderViewModel.obtainSearchResult( + keywords = args[0], + alarmContent = args[1], + alarmLevel = args[2], + jobStatus = args[3], + beginTime = args[4], + endTime = args[5], + page = pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2022040102 -> { + isRefresh = true + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + 2022040101 -> { + if (isRefresh || isLoadMore) { + searchResultAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + obtainSearchResult(args, pageIndex) + } + } else { + emptyView!!.hide() + searchResultAdapter = SearchResultAdapter(this, dataBeans) + resultRecyclerView!!.layoutManager = LinearLayoutManager(this) + resultRecyclerView!!.adapter = searchResultAdapter + searchResultAdapter.setOnItemClickListener(object : + SearchResultAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } + if (dataBeans[position].jobStatus == "0") { +// navigatePageTo(jobId) + } else { +// navigatePageTo(jobId) + } + } + + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(this@OrderSearchResultActivity) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptWorkOrder(jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + + override fun onTransferViewClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看工单流转记录".show() + return + } + workOrderViewModel.obtainWorkOrderDetail(jobId) + } + }) + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index 2b92d86..fccff95 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -145,7 +145,6 @@ }.build().show(supportFragmentManager, "all") } - searchButton.setChangeAlphaWhenPress(true) searchButton.setOnClickListener { //页面跳转,将查询参数传过去 navigatePageTo( @@ -160,7 +159,6 @@ ) } - clearButton.setChangeAlphaWhenPress(true) clearButton.setOnClickListener { wellCodeView.setText("") alarmTypeView.text = "" diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt new file mode 100644 index 0000000..a4b66b9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt @@ -0,0 +1,207 @@ +package com.casic.qd.smartwell.view + +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.AlarmContentModel +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.AlarmViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import com.zhy.view.flowlayout.FlowLayout +import com.zhy.view.flowlayout.TagAdapter +import kotlinx.android.synthetic.main.activity_order_search.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class SearchOrderActivity : BaseActivity() { + + private lateinit var contentTypeViewModel: AlarmViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var inflater: LayoutInflater + private lateinit var contentTypeAdapter: TagAdapter + private lateinit var orderStatusAdapter: TagAdapter + private var contentModels: MutableList = ArrayList() + private var orderStatusModels: MutableList = ArrayList() + private var alarmContentType = "" + private var alarmLevel = "" + private var orderState = "" + + override fun initLayoutView(): Int = R.layout.activity_order_search + + override fun setupTopBarLayout() { + titleView.text = "工单查询" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + inflater = LayoutInflater.from(this) + //告警内容 + contentTypeViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + //工单状态 + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + contentTypeViewModel.obtainAlarmContent("1") + contentTypeViewModel.contentModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = AlarmContentModel.DataBean.ListBean() + bean.value = "" + bean.name = "全部" + bean.alarmType = "" + bean.deviceType = "" + contentModels.add(bean) + + it.data!!.list?.forEach { contentTypeBean -> + contentModels.add(contentTypeBean) + } + contentTypeAdapter = + object : TagAdapter(contentModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: AlarmContentModel.DataBean.ListBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmContentLayout, false + ) as TextView + tagView.text = contentModels[position].name + return tagView + } + } + alarmContentLayout.adapter = contentTypeAdapter + contentTypeAdapter.setSelectedList(0) + alarmContentLayout.setOnTagClickListener { _, position, _ -> + this.alarmContentType = contentModels[position].value.toString() + true + } + } + }) + + val levelMaps: MutableList> = ArrayList() + for (i in 0..3) { + val map = HashMap() + map["name"] = i.toString().toChinese() + map["value"] = i.toLevel() + levelMaps.add(map) + } + val levelAdapter = object : TagAdapter>(levelMaps) { + override fun getView( + parent: FlowLayout?, + position: Int, map: Map? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmLevelLayout, false + ) as TextView + tagView.text = levelMaps[position]["name"] + return tagView + } + } + alarmLevelLayout.adapter = levelAdapter + levelAdapter.setSelectedList(0) + alarmLevelLayout.setOnTagClickListener { _, position, _ -> + this.alarmLevel = levelMaps[position]["value"].toString() + true + } + + workOrderViewModel.obtainOrderStatus() + workOrderViewModel.orderStatusModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = OrderStatusModel.DataBean() + bean.name = "全部" + bean.id = "" + bean.value = "" + orderStatusModels.add(bean) + it.data!!.forEach { statusBean -> + orderStatusModels.add(statusBean) + } + orderStatusAdapter = + object : TagAdapter(orderStatusModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: OrderStatusModel.DataBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + orderStatusLayout, false + ) as TextView + tagView.text = orderStatusModels[position].name + return tagView + } + } + orderStatusLayout.adapter = orderStatusAdapter + orderStatusAdapter.setSelectedList(0) + orderStatusLayout.setOnTagClickListener { _, position, _ -> + this.orderState = orderStatusModels[position].value.toString() + true + } + } + }) + + startTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择开始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + startTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + endTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) { + "结束时间不合法,不能早于开始时间".show() + return@setCallBack + } + endTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + searchButton.setOnClickListener { + //页面跳转,将查询参数传过去 + navigatePageTo( + addAll( + wellCodeView.text.toString().trim(), + alarmContentType, + alarmLevel, + orderState, + startTimeView.text.toString(), + endTimeView.text.toString() + ) + ) + } + + clearButton.setOnClickListener { + wellCodeView.text.clear() + contentTypeAdapter.setSelectedList(0) + levelAdapter.setSelectedList(0) + orderStatusAdapter.setSelectedList(0) + startTimeView.text = "" + endTimeView.text = "" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt index b1f9fc3..c21fe1a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt @@ -112,16 +112,20 @@ }) fun obtainMapDeviceResult(keywords: String?, devType: String?) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.obtainMapDeviceResult(keywords, devType) val responseCode = response.separateResponseCode() if (responseCode == 200) { + loadState.value = LoadState.Success mapDeviceResultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { + loadState.value = LoadState.Fail response.toErrorMessage().show() } }, { + loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt new file mode 100644 index 0000000..6a528a4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt @@ -0,0 +1,83 @@ +package com.casic.qd.smartwell.vm + +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager + +/** + * 转单、接单、处理等vm + * */ +class OperationViewModel : BaseViewModel() { + + fun acceptWorkOrder(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.acceptWorkOrder(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "接单成功".show() + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun confirmWorkOrder( +// id: String, firstState: String, +// firstStatePhotos: String, needHandle: String +// ) = launch({ +// loadState.value = LoadState.Loading +// val response = +// RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单确认成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun transferWorkOrder(id: String, userId: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.transferWorkOrder(id, userId) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "转单成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun completeWorkOrder(id: String, handleMessage: String, handlePhotos: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.completeWorkOrder(id, handleMessage, handlePhotos) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单处理成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt new file mode 100644 index 0000000..411c9a8 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt @@ -0,0 +1,105 @@ +package com.casic.qd.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +class WorkOrderViewModel : BaseViewModel() { + + private val gson = Gson() + val orderStatusModel = MutableLiveData() + val listModel = MutableLiveData() + val detailModel = MutableLiveData() +// val resultModel = MutableLiveData>() + + + fun obtainOrderStatus() = launch({ + val response = RetrofitServiceManager.obtainOrderStatus() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderStatusModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainSearchResult( + keywords, alarmContent, alarmLevel, jobStatus, beginTime, endTime, page + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun obtainWorkOrderDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainWorkOrderDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + detailModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun countWorkOrderByState() = launch({ +// val response = RetrofitServiceManager.countWorkOrderByState() +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// val map = HashMap(4) +// +// val jsonObject = JSONObject(response) +// val data = jsonObject.getJSONObject("data") +// map["beforeGet"] = data.getString("beforeGet") +// map["beforeConfirm"] = data.getString("beforeConfirm") +// map["inHandle"] = data.getString("inHandle") +// map["over"] = data.getString("over") +// resultModel.value = map +// } else { +// response.toErrorMessage().show() +// } +// }, { +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt index 39d6d09..6de33f7 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt @@ -119,7 +119,6 @@ } } - sheetConfirmButton.setChangeAlphaWhenPress(true) sheetConfirmButton.setOnClickListener { listener.onAreaSelected(areaName, areaId) dismiss() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt index 98ff307..bcd9351 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt @@ -47,7 +47,6 @@ setCancelable(true) setCanceledOnTouchOutside(true) - confirmButton.setChangeAlphaWhenPress(true) confirmButton.setOnClickListener { val oldPwd = oldPwdView.text.toString() val newPwd = newPwdView.text.toString() @@ -66,6 +65,7 @@ } if (!newPwd.isLetterAndDigit()) { "新密码需包含数字和字母".show() + return@setOnClickListener } if (newPwd != confirmPwd) { "新密码和确认密码不一致,请检查".show() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt new file mode 100644 index 0000000..2b3dfe7 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt @@ -0,0 +1,102 @@ +package com.casic.qd.smartwell.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.* +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineBottomSheet private constructor(builder: Builder) : Dialog( + builder.context!!, R.style.ActionSheetDialogStyle +) { + private val ctx: Context = builder.context!! + private val items: MutableList = builder.items!! + + class Builder { + var context: Context? = null + var items: MutableList? = null + + fun setContext(context: Context?): Builder { + this.context = context + return this + } + + fun setFlowItems(flowItems: MutableList?): Builder { + this.items = flowItems + return this + } + + fun build(): TimeLineBottomSheet { + return TimeLineBottomSheet(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_bottom_sheet) + setCancelable(true) + setCanceledOnTouchOutside(true) + //绑定流程进展数据 + val orderFlowRecyclerView = findViewById(R.id.orderFlowRecyclerView) + orderFlowRecyclerView.layoutManager = LinearLayoutManager(ctx) + orderFlowRecyclerView.adapter = OrderFlowAdapter() + + val dismissView = findViewById(R.id.dismissView) + dismissView.setOnClickListener { + this.dismiss() + } + } + + private fun configDialogLayout() { + val window = window ?: return + window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window.decorView.setBackgroundColor(Color.TRANSPARENT) + window.setGravity(Gravity.BOTTOM) + //设置Dialog出现的动画 + window.setWindowAnimations(R.style.ActionSheetDialogAnimation) + val params = window.attributes + params.width = SizeUtil.getScreenWidth(ctx) + params.height = WindowManager.LayoutParams.WRAP_CONTENT + window.attributes = params + } + + internal inner class OrderFlowAdapter : + RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(ctx) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OrderFlowAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_flow_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = items.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = items[position] + holder.fromPersonView.text = rowsBean.from + holder.toPersonView.text = rowsBean.to + holder.transferDateView.text = rowsBean.time + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var fromPersonView: TextView = view.findViewById(R.id.fromPersonView) + var toPersonView: TextView = view.findViewById(R.id.toPersonView) + var transferDateView: TextView = view.findViewById(R.id.transferDateView) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml new file mode 100644 index 0000000..5875998 --- /dev/null +++ b/app/src/main/res/drawable/button_main_selector.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml new file mode 100644 index 0000000..a925019 --- /dev/null +++ b/app/src/main/res/drawable/button_white_selector.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_down.xml b/app/src/main/res/drawable/ic_down.xml new file mode 100644 index 0000000..20e6476 --- /dev/null +++ b/app/src/main/res/drawable/ic_down.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_work_order.xml b/app/src/main/res/drawable/ic_work_order.xml new file mode 100644 index 0000000..3c39d54 --- /dev/null +++ b/app/src/main/res/drawable/ic_work_order.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/selector_tag.xml b/app/src/main/res/drawable/selector_tag.xml new file mode 100644 index 0000000..c1fee7b --- /dev/null +++ b/app/src/main/res/drawable/selector_tag.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/selector_text.xml b/app/src/main/res/drawable/selector_text.xml new file mode 100644 index 0000000..d8c9398 --- /dev/null +++ b/app/src/main/res/drawable/selector_text.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tag_checked.xml b/app/src/main/res/drawable/tag_checked.xml new file mode 100644 index 0000000..616dcb1 --- /dev/null +++ b/app/src/main/res/drawable/tag_checked.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt new file mode 100644 index 0000000..1f1b5de --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt @@ -0,0 +1,47 @@ +package com.casic.qd.smartwell.view + +import androidx.fragment.app.Fragment +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.TopViewPagerAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.navigatePageTo +import com.casic.qd.smartwell.fragment.OrderCompletedFragment +import com.casic.qd.smartwell.fragment.OrderInHandleFragment +import com.casic.qd.smartwell.fragment.OrderNotConfirmedFragment +import com.casic.qd.smartwell.fragment.OrderNotProcessedFragment +import com.casic.qd.smartwell.utils.Constant +import kotlinx.android.synthetic.main.activity_order_management.* +import java.util.* + +class OrderManagementActivity : BaseActivity() { + + private var fragmentList: ArrayList = ArrayList() + + init { + fragmentList.add(OrderNotProcessedFragment())//待处理 + fragmentList.add(OrderNotConfirmedFragment())//待确认 + fragmentList.add(OrderInHandleFragment())//处理中 + fragmentList.add(OrderCompletedFragment())//已完成 + } + + override fun initLayoutView(): Int = R.layout.activity_order_management + + override fun setupTopBarLayout() { + titleView.text = "工单管理" + } + + override fun initData() { + val topViewPagerAdapter = TopViewPagerAdapter( + supportFragmentManager, Constant.SUB_PAGE_TITLES, fragmentList + ) + orderViewPager.offscreenPageLimit = fragmentList.size + orderViewPager.adapter = topViewPagerAdapter + orderTabLayout.setupWithViewPager(orderViewPager) + } + + override fun initEvent() { + rightOptionView.setOnClickListener { + navigatePageTo() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt new file mode 100644 index 0000000..6e7e65e --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -0,0 +1,217 @@ +package com.casic.qd.smartwell.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.SearchResultAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.showEmptyPage +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.WeakReferenceHandler +import com.casic.qd.smartwell.vm.OperationViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.TimeLineBottomSheet +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_order_search_result.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_empty_view.* + +class OrderSearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var operationViewModel: OperationViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var args: ArrayList + private lateinit var searchResultAdapter: SearchResultAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_order_search_result + + override fun setupTopBarLayout() { + titleView.text = "查询结果" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + weakReferenceHandler = WeakReferenceHandler(callback) + operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + obtainSearchResult(args, pageIndex) + workOrderViewModel.listModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + resultRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show() + } + dataBeans.addAll(dataRows!!) + resultRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022040101) + } + }) + workOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + resultRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + resultRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainSearchResult(args, pageIndex) + } + + //接单状态处理 + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + //通知列表刷行数据 + weakReferenceHandler.sendEmptyMessage(2022040102) + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + workOrderViewModel.detailModel.observe(this, { + if (it.code == 200) { + val orderDetail = it.data!![0] + val orderFlow = orderDetail.flow!! + if (orderFlow.size != 0) { + TimeLineBottomSheet.Builder().setContext(this) + .setFlowItems(orderFlow).build().show() + } else { + "抱歉,无法查到该工单的流转记录".show() + } + } + }) + } + + private fun obtainSearchResult(args: ArrayList, pageIndex: Int) { + workOrderViewModel.obtainSearchResult( + keywords = args[0], + alarmContent = args[1], + alarmLevel = args[2], + jobStatus = args[3], + beginTime = args[4], + endTime = args[5], + page = pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2022040102 -> { + isRefresh = true + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + 2022040101 -> { + if (isRefresh || isLoadMore) { + searchResultAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + obtainSearchResult(args, pageIndex) + } + } else { + emptyView!!.hide() + searchResultAdapter = SearchResultAdapter(this, dataBeans) + resultRecyclerView!!.layoutManager = LinearLayoutManager(this) + resultRecyclerView!!.adapter = searchResultAdapter + searchResultAdapter.setOnItemClickListener(object : + SearchResultAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } + if (dataBeans[position].jobStatus == "0") { +// navigatePageTo(jobId) + } else { +// navigatePageTo(jobId) + } + } + + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(this@OrderSearchResultActivity) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptWorkOrder(jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + + override fun onTransferViewClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看工单流转记录".show() + return + } + workOrderViewModel.obtainWorkOrderDetail(jobId) + } + }) + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index 2b92d86..fccff95 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -145,7 +145,6 @@ }.build().show(supportFragmentManager, "all") } - searchButton.setChangeAlphaWhenPress(true) searchButton.setOnClickListener { //页面跳转,将查询参数传过去 navigatePageTo( @@ -160,7 +159,6 @@ ) } - clearButton.setChangeAlphaWhenPress(true) clearButton.setOnClickListener { wellCodeView.setText("") alarmTypeView.text = "" diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt new file mode 100644 index 0000000..a4b66b9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt @@ -0,0 +1,207 @@ +package com.casic.qd.smartwell.view + +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.AlarmContentModel +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.AlarmViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import com.zhy.view.flowlayout.FlowLayout +import com.zhy.view.flowlayout.TagAdapter +import kotlinx.android.synthetic.main.activity_order_search.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class SearchOrderActivity : BaseActivity() { + + private lateinit var contentTypeViewModel: AlarmViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var inflater: LayoutInflater + private lateinit var contentTypeAdapter: TagAdapter + private lateinit var orderStatusAdapter: TagAdapter + private var contentModels: MutableList = ArrayList() + private var orderStatusModels: MutableList = ArrayList() + private var alarmContentType = "" + private var alarmLevel = "" + private var orderState = "" + + override fun initLayoutView(): Int = R.layout.activity_order_search + + override fun setupTopBarLayout() { + titleView.text = "工单查询" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + inflater = LayoutInflater.from(this) + //告警内容 + contentTypeViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + //工单状态 + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + contentTypeViewModel.obtainAlarmContent("1") + contentTypeViewModel.contentModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = AlarmContentModel.DataBean.ListBean() + bean.value = "" + bean.name = "全部" + bean.alarmType = "" + bean.deviceType = "" + contentModels.add(bean) + + it.data!!.list?.forEach { contentTypeBean -> + contentModels.add(contentTypeBean) + } + contentTypeAdapter = + object : TagAdapter(contentModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: AlarmContentModel.DataBean.ListBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmContentLayout, false + ) as TextView + tagView.text = contentModels[position].name + return tagView + } + } + alarmContentLayout.adapter = contentTypeAdapter + contentTypeAdapter.setSelectedList(0) + alarmContentLayout.setOnTagClickListener { _, position, _ -> + this.alarmContentType = contentModels[position].value.toString() + true + } + } + }) + + val levelMaps: MutableList> = ArrayList() + for (i in 0..3) { + val map = HashMap() + map["name"] = i.toString().toChinese() + map["value"] = i.toLevel() + levelMaps.add(map) + } + val levelAdapter = object : TagAdapter>(levelMaps) { + override fun getView( + parent: FlowLayout?, + position: Int, map: Map? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmLevelLayout, false + ) as TextView + tagView.text = levelMaps[position]["name"] + return tagView + } + } + alarmLevelLayout.adapter = levelAdapter + levelAdapter.setSelectedList(0) + alarmLevelLayout.setOnTagClickListener { _, position, _ -> + this.alarmLevel = levelMaps[position]["value"].toString() + true + } + + workOrderViewModel.obtainOrderStatus() + workOrderViewModel.orderStatusModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = OrderStatusModel.DataBean() + bean.name = "全部" + bean.id = "" + bean.value = "" + orderStatusModels.add(bean) + it.data!!.forEach { statusBean -> + orderStatusModels.add(statusBean) + } + orderStatusAdapter = + object : TagAdapter(orderStatusModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: OrderStatusModel.DataBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + orderStatusLayout, false + ) as TextView + tagView.text = orderStatusModels[position].name + return tagView + } + } + orderStatusLayout.adapter = orderStatusAdapter + orderStatusAdapter.setSelectedList(0) + orderStatusLayout.setOnTagClickListener { _, position, _ -> + this.orderState = orderStatusModels[position].value.toString() + true + } + } + }) + + startTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择开始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + startTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + endTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) { + "结束时间不合法,不能早于开始时间".show() + return@setCallBack + } + endTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + searchButton.setOnClickListener { + //页面跳转,将查询参数传过去 + navigatePageTo( + addAll( + wellCodeView.text.toString().trim(), + alarmContentType, + alarmLevel, + orderState, + startTimeView.text.toString(), + endTimeView.text.toString() + ) + ) + } + + clearButton.setOnClickListener { + wellCodeView.text.clear() + contentTypeAdapter.setSelectedList(0) + levelAdapter.setSelectedList(0) + orderStatusAdapter.setSelectedList(0) + startTimeView.text = "" + endTimeView.text = "" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt index b1f9fc3..c21fe1a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt @@ -112,16 +112,20 @@ }) fun obtainMapDeviceResult(keywords: String?, devType: String?) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.obtainMapDeviceResult(keywords, devType) val responseCode = response.separateResponseCode() if (responseCode == 200) { + loadState.value = LoadState.Success mapDeviceResultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { + loadState.value = LoadState.Fail response.toErrorMessage().show() } }, { + loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt new file mode 100644 index 0000000..6a528a4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt @@ -0,0 +1,83 @@ +package com.casic.qd.smartwell.vm + +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager + +/** + * 转单、接单、处理等vm + * */ +class OperationViewModel : BaseViewModel() { + + fun acceptWorkOrder(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.acceptWorkOrder(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "接单成功".show() + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun confirmWorkOrder( +// id: String, firstState: String, +// firstStatePhotos: String, needHandle: String +// ) = launch({ +// loadState.value = LoadState.Loading +// val response = +// RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单确认成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun transferWorkOrder(id: String, userId: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.transferWorkOrder(id, userId) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "转单成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun completeWorkOrder(id: String, handleMessage: String, handlePhotos: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.completeWorkOrder(id, handleMessage, handlePhotos) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单处理成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt new file mode 100644 index 0000000..411c9a8 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt @@ -0,0 +1,105 @@ +package com.casic.qd.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +class WorkOrderViewModel : BaseViewModel() { + + private val gson = Gson() + val orderStatusModel = MutableLiveData() + val listModel = MutableLiveData() + val detailModel = MutableLiveData() +// val resultModel = MutableLiveData>() + + + fun obtainOrderStatus() = launch({ + val response = RetrofitServiceManager.obtainOrderStatus() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderStatusModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainSearchResult( + keywords, alarmContent, alarmLevel, jobStatus, beginTime, endTime, page + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun obtainWorkOrderDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainWorkOrderDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + detailModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun countWorkOrderByState() = launch({ +// val response = RetrofitServiceManager.countWorkOrderByState() +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// val map = HashMap(4) +// +// val jsonObject = JSONObject(response) +// val data = jsonObject.getJSONObject("data") +// map["beforeGet"] = data.getString("beforeGet") +// map["beforeConfirm"] = data.getString("beforeConfirm") +// map["inHandle"] = data.getString("inHandle") +// map["over"] = data.getString("over") +// resultModel.value = map +// } else { +// response.toErrorMessage().show() +// } +// }, { +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt index 39d6d09..6de33f7 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt @@ -119,7 +119,6 @@ } } - sheetConfirmButton.setChangeAlphaWhenPress(true) sheetConfirmButton.setOnClickListener { listener.onAreaSelected(areaName, areaId) dismiss() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt index 98ff307..bcd9351 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt @@ -47,7 +47,6 @@ setCancelable(true) setCanceledOnTouchOutside(true) - confirmButton.setChangeAlphaWhenPress(true) confirmButton.setOnClickListener { val oldPwd = oldPwdView.text.toString() val newPwd = newPwdView.text.toString() @@ -66,6 +65,7 @@ } if (!newPwd.isLetterAndDigit()) { "新密码需包含数字和字母".show() + return@setOnClickListener } if (newPwd != confirmPwd) { "新密码和确认密码不一致,请检查".show() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt new file mode 100644 index 0000000..2b3dfe7 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt @@ -0,0 +1,102 @@ +package com.casic.qd.smartwell.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.* +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineBottomSheet private constructor(builder: Builder) : Dialog( + builder.context!!, R.style.ActionSheetDialogStyle +) { + private val ctx: Context = builder.context!! + private val items: MutableList = builder.items!! + + class Builder { + var context: Context? = null + var items: MutableList? = null + + fun setContext(context: Context?): Builder { + this.context = context + return this + } + + fun setFlowItems(flowItems: MutableList?): Builder { + this.items = flowItems + return this + } + + fun build(): TimeLineBottomSheet { + return TimeLineBottomSheet(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_bottom_sheet) + setCancelable(true) + setCanceledOnTouchOutside(true) + //绑定流程进展数据 + val orderFlowRecyclerView = findViewById(R.id.orderFlowRecyclerView) + orderFlowRecyclerView.layoutManager = LinearLayoutManager(ctx) + orderFlowRecyclerView.adapter = OrderFlowAdapter() + + val dismissView = findViewById(R.id.dismissView) + dismissView.setOnClickListener { + this.dismiss() + } + } + + private fun configDialogLayout() { + val window = window ?: return + window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window.decorView.setBackgroundColor(Color.TRANSPARENT) + window.setGravity(Gravity.BOTTOM) + //设置Dialog出现的动画 + window.setWindowAnimations(R.style.ActionSheetDialogAnimation) + val params = window.attributes + params.width = SizeUtil.getScreenWidth(ctx) + params.height = WindowManager.LayoutParams.WRAP_CONTENT + window.attributes = params + } + + internal inner class OrderFlowAdapter : + RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(ctx) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OrderFlowAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_flow_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = items.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = items[position] + holder.fromPersonView.text = rowsBean.from + holder.toPersonView.text = rowsBean.to + holder.transferDateView.text = rowsBean.time + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var fromPersonView: TextView = view.findViewById(R.id.fromPersonView) + var toPersonView: TextView = view.findViewById(R.id.toPersonView) + var transferDateView: TextView = view.findViewById(R.id.transferDateView) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml new file mode 100644 index 0000000..5875998 --- /dev/null +++ b/app/src/main/res/drawable/button_main_selector.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml new file mode 100644 index 0000000..a925019 --- /dev/null +++ b/app/src/main/res/drawable/button_white_selector.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_down.xml b/app/src/main/res/drawable/ic_down.xml new file mode 100644 index 0000000..20e6476 --- /dev/null +++ b/app/src/main/res/drawable/ic_down.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_work_order.xml b/app/src/main/res/drawable/ic_work_order.xml new file mode 100644 index 0000000..3c39d54 --- /dev/null +++ b/app/src/main/res/drawable/ic_work_order.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/selector_tag.xml b/app/src/main/res/drawable/selector_tag.xml new file mode 100644 index 0000000..c1fee7b --- /dev/null +++ b/app/src/main/res/drawable/selector_tag.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/selector_text.xml b/app/src/main/res/drawable/selector_text.xml new file mode 100644 index 0000000..d8c9398 --- /dev/null +++ b/app/src/main/res/drawable/selector_text.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tag_checked.xml b/app/src/main/res/drawable/tag_checked.xml new file mode 100644 index 0000000..616dcb1 --- /dev/null +++ b/app/src/main/res/drawable/tag_checked.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tag_normal.xml b/app/src/main/res/drawable/tag_normal.xml new file mode 100644 index 0000000..d38b7cc --- /dev/null +++ b/app/src/main/res/drawable/tag_normal.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt new file mode 100644 index 0000000..1f1b5de --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt @@ -0,0 +1,47 @@ +package com.casic.qd.smartwell.view + +import androidx.fragment.app.Fragment +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.TopViewPagerAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.navigatePageTo +import com.casic.qd.smartwell.fragment.OrderCompletedFragment +import com.casic.qd.smartwell.fragment.OrderInHandleFragment +import com.casic.qd.smartwell.fragment.OrderNotConfirmedFragment +import com.casic.qd.smartwell.fragment.OrderNotProcessedFragment +import com.casic.qd.smartwell.utils.Constant +import kotlinx.android.synthetic.main.activity_order_management.* +import java.util.* + +class OrderManagementActivity : BaseActivity() { + + private var fragmentList: ArrayList = ArrayList() + + init { + fragmentList.add(OrderNotProcessedFragment())//待处理 + fragmentList.add(OrderNotConfirmedFragment())//待确认 + fragmentList.add(OrderInHandleFragment())//处理中 + fragmentList.add(OrderCompletedFragment())//已完成 + } + + override fun initLayoutView(): Int = R.layout.activity_order_management + + override fun setupTopBarLayout() { + titleView.text = "工单管理" + } + + override fun initData() { + val topViewPagerAdapter = TopViewPagerAdapter( + supportFragmentManager, Constant.SUB_PAGE_TITLES, fragmentList + ) + orderViewPager.offscreenPageLimit = fragmentList.size + orderViewPager.adapter = topViewPagerAdapter + orderTabLayout.setupWithViewPager(orderViewPager) + } + + override fun initEvent() { + rightOptionView.setOnClickListener { + navigatePageTo() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt new file mode 100644 index 0000000..6e7e65e --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -0,0 +1,217 @@ +package com.casic.qd.smartwell.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.SearchResultAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.showEmptyPage +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.WeakReferenceHandler +import com.casic.qd.smartwell.vm.OperationViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.TimeLineBottomSheet +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_order_search_result.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_empty_view.* + +class OrderSearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var operationViewModel: OperationViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var args: ArrayList + private lateinit var searchResultAdapter: SearchResultAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_order_search_result + + override fun setupTopBarLayout() { + titleView.text = "查询结果" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + weakReferenceHandler = WeakReferenceHandler(callback) + operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + obtainSearchResult(args, pageIndex) + workOrderViewModel.listModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + resultRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show() + } + dataBeans.addAll(dataRows!!) + resultRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022040101) + } + }) + workOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + resultRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + resultRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainSearchResult(args, pageIndex) + } + + //接单状态处理 + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + //通知列表刷行数据 + weakReferenceHandler.sendEmptyMessage(2022040102) + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + workOrderViewModel.detailModel.observe(this, { + if (it.code == 200) { + val orderDetail = it.data!![0] + val orderFlow = orderDetail.flow!! + if (orderFlow.size != 0) { + TimeLineBottomSheet.Builder().setContext(this) + .setFlowItems(orderFlow).build().show() + } else { + "抱歉,无法查到该工单的流转记录".show() + } + } + }) + } + + private fun obtainSearchResult(args: ArrayList, pageIndex: Int) { + workOrderViewModel.obtainSearchResult( + keywords = args[0], + alarmContent = args[1], + alarmLevel = args[2], + jobStatus = args[3], + beginTime = args[4], + endTime = args[5], + page = pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2022040102 -> { + isRefresh = true + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + 2022040101 -> { + if (isRefresh || isLoadMore) { + searchResultAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + obtainSearchResult(args, pageIndex) + } + } else { + emptyView!!.hide() + searchResultAdapter = SearchResultAdapter(this, dataBeans) + resultRecyclerView!!.layoutManager = LinearLayoutManager(this) + resultRecyclerView!!.adapter = searchResultAdapter + searchResultAdapter.setOnItemClickListener(object : + SearchResultAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } + if (dataBeans[position].jobStatus == "0") { +// navigatePageTo(jobId) + } else { +// navigatePageTo(jobId) + } + } + + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(this@OrderSearchResultActivity) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptWorkOrder(jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + + override fun onTransferViewClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看工单流转记录".show() + return + } + workOrderViewModel.obtainWorkOrderDetail(jobId) + } + }) + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index 2b92d86..fccff95 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -145,7 +145,6 @@ }.build().show(supportFragmentManager, "all") } - searchButton.setChangeAlphaWhenPress(true) searchButton.setOnClickListener { //页面跳转,将查询参数传过去 navigatePageTo( @@ -160,7 +159,6 @@ ) } - clearButton.setChangeAlphaWhenPress(true) clearButton.setOnClickListener { wellCodeView.setText("") alarmTypeView.text = "" diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt new file mode 100644 index 0000000..a4b66b9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt @@ -0,0 +1,207 @@ +package com.casic.qd.smartwell.view + +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.AlarmContentModel +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.AlarmViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import com.zhy.view.flowlayout.FlowLayout +import com.zhy.view.flowlayout.TagAdapter +import kotlinx.android.synthetic.main.activity_order_search.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class SearchOrderActivity : BaseActivity() { + + private lateinit var contentTypeViewModel: AlarmViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var inflater: LayoutInflater + private lateinit var contentTypeAdapter: TagAdapter + private lateinit var orderStatusAdapter: TagAdapter + private var contentModels: MutableList = ArrayList() + private var orderStatusModels: MutableList = ArrayList() + private var alarmContentType = "" + private var alarmLevel = "" + private var orderState = "" + + override fun initLayoutView(): Int = R.layout.activity_order_search + + override fun setupTopBarLayout() { + titleView.text = "工单查询" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + inflater = LayoutInflater.from(this) + //告警内容 + contentTypeViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + //工单状态 + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + contentTypeViewModel.obtainAlarmContent("1") + contentTypeViewModel.contentModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = AlarmContentModel.DataBean.ListBean() + bean.value = "" + bean.name = "全部" + bean.alarmType = "" + bean.deviceType = "" + contentModels.add(bean) + + it.data!!.list?.forEach { contentTypeBean -> + contentModels.add(contentTypeBean) + } + contentTypeAdapter = + object : TagAdapter(contentModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: AlarmContentModel.DataBean.ListBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmContentLayout, false + ) as TextView + tagView.text = contentModels[position].name + return tagView + } + } + alarmContentLayout.adapter = contentTypeAdapter + contentTypeAdapter.setSelectedList(0) + alarmContentLayout.setOnTagClickListener { _, position, _ -> + this.alarmContentType = contentModels[position].value.toString() + true + } + } + }) + + val levelMaps: MutableList> = ArrayList() + for (i in 0..3) { + val map = HashMap() + map["name"] = i.toString().toChinese() + map["value"] = i.toLevel() + levelMaps.add(map) + } + val levelAdapter = object : TagAdapter>(levelMaps) { + override fun getView( + parent: FlowLayout?, + position: Int, map: Map? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmLevelLayout, false + ) as TextView + tagView.text = levelMaps[position]["name"] + return tagView + } + } + alarmLevelLayout.adapter = levelAdapter + levelAdapter.setSelectedList(0) + alarmLevelLayout.setOnTagClickListener { _, position, _ -> + this.alarmLevel = levelMaps[position]["value"].toString() + true + } + + workOrderViewModel.obtainOrderStatus() + workOrderViewModel.orderStatusModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = OrderStatusModel.DataBean() + bean.name = "全部" + bean.id = "" + bean.value = "" + orderStatusModels.add(bean) + it.data!!.forEach { statusBean -> + orderStatusModels.add(statusBean) + } + orderStatusAdapter = + object : TagAdapter(orderStatusModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: OrderStatusModel.DataBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + orderStatusLayout, false + ) as TextView + tagView.text = orderStatusModels[position].name + return tagView + } + } + orderStatusLayout.adapter = orderStatusAdapter + orderStatusAdapter.setSelectedList(0) + orderStatusLayout.setOnTagClickListener { _, position, _ -> + this.orderState = orderStatusModels[position].value.toString() + true + } + } + }) + + startTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择开始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + startTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + endTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) { + "结束时间不合法,不能早于开始时间".show() + return@setCallBack + } + endTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + searchButton.setOnClickListener { + //页面跳转,将查询参数传过去 + navigatePageTo( + addAll( + wellCodeView.text.toString().trim(), + alarmContentType, + alarmLevel, + orderState, + startTimeView.text.toString(), + endTimeView.text.toString() + ) + ) + } + + clearButton.setOnClickListener { + wellCodeView.text.clear() + contentTypeAdapter.setSelectedList(0) + levelAdapter.setSelectedList(0) + orderStatusAdapter.setSelectedList(0) + startTimeView.text = "" + endTimeView.text = "" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt index b1f9fc3..c21fe1a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt @@ -112,16 +112,20 @@ }) fun obtainMapDeviceResult(keywords: String?, devType: String?) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.obtainMapDeviceResult(keywords, devType) val responseCode = response.separateResponseCode() if (responseCode == 200) { + loadState.value = LoadState.Success mapDeviceResultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { + loadState.value = LoadState.Fail response.toErrorMessage().show() } }, { + loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt new file mode 100644 index 0000000..6a528a4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt @@ -0,0 +1,83 @@ +package com.casic.qd.smartwell.vm + +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager + +/** + * 转单、接单、处理等vm + * */ +class OperationViewModel : BaseViewModel() { + + fun acceptWorkOrder(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.acceptWorkOrder(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "接单成功".show() + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun confirmWorkOrder( +// id: String, firstState: String, +// firstStatePhotos: String, needHandle: String +// ) = launch({ +// loadState.value = LoadState.Loading +// val response = +// RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单确认成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun transferWorkOrder(id: String, userId: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.transferWorkOrder(id, userId) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "转单成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun completeWorkOrder(id: String, handleMessage: String, handlePhotos: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.completeWorkOrder(id, handleMessage, handlePhotos) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单处理成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt new file mode 100644 index 0000000..411c9a8 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt @@ -0,0 +1,105 @@ +package com.casic.qd.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +class WorkOrderViewModel : BaseViewModel() { + + private val gson = Gson() + val orderStatusModel = MutableLiveData() + val listModel = MutableLiveData() + val detailModel = MutableLiveData() +// val resultModel = MutableLiveData>() + + + fun obtainOrderStatus() = launch({ + val response = RetrofitServiceManager.obtainOrderStatus() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderStatusModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainSearchResult( + keywords, alarmContent, alarmLevel, jobStatus, beginTime, endTime, page + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun obtainWorkOrderDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainWorkOrderDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + detailModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun countWorkOrderByState() = launch({ +// val response = RetrofitServiceManager.countWorkOrderByState() +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// val map = HashMap(4) +// +// val jsonObject = JSONObject(response) +// val data = jsonObject.getJSONObject("data") +// map["beforeGet"] = data.getString("beforeGet") +// map["beforeConfirm"] = data.getString("beforeConfirm") +// map["inHandle"] = data.getString("inHandle") +// map["over"] = data.getString("over") +// resultModel.value = map +// } else { +// response.toErrorMessage().show() +// } +// }, { +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt index 39d6d09..6de33f7 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt @@ -119,7 +119,6 @@ } } - sheetConfirmButton.setChangeAlphaWhenPress(true) sheetConfirmButton.setOnClickListener { listener.onAreaSelected(areaName, areaId) dismiss() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt index 98ff307..bcd9351 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt @@ -47,7 +47,6 @@ setCancelable(true) setCanceledOnTouchOutside(true) - confirmButton.setChangeAlphaWhenPress(true) confirmButton.setOnClickListener { val oldPwd = oldPwdView.text.toString() val newPwd = newPwdView.text.toString() @@ -66,6 +65,7 @@ } if (!newPwd.isLetterAndDigit()) { "新密码需包含数字和字母".show() + return@setOnClickListener } if (newPwd != confirmPwd) { "新密码和确认密码不一致,请检查".show() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt new file mode 100644 index 0000000..2b3dfe7 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt @@ -0,0 +1,102 @@ +package com.casic.qd.smartwell.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.* +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineBottomSheet private constructor(builder: Builder) : Dialog( + builder.context!!, R.style.ActionSheetDialogStyle +) { + private val ctx: Context = builder.context!! + private val items: MutableList = builder.items!! + + class Builder { + var context: Context? = null + var items: MutableList? = null + + fun setContext(context: Context?): Builder { + this.context = context + return this + } + + fun setFlowItems(flowItems: MutableList?): Builder { + this.items = flowItems + return this + } + + fun build(): TimeLineBottomSheet { + return TimeLineBottomSheet(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_bottom_sheet) + setCancelable(true) + setCanceledOnTouchOutside(true) + //绑定流程进展数据 + val orderFlowRecyclerView = findViewById(R.id.orderFlowRecyclerView) + orderFlowRecyclerView.layoutManager = LinearLayoutManager(ctx) + orderFlowRecyclerView.adapter = OrderFlowAdapter() + + val dismissView = findViewById(R.id.dismissView) + dismissView.setOnClickListener { + this.dismiss() + } + } + + private fun configDialogLayout() { + val window = window ?: return + window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window.decorView.setBackgroundColor(Color.TRANSPARENT) + window.setGravity(Gravity.BOTTOM) + //设置Dialog出现的动画 + window.setWindowAnimations(R.style.ActionSheetDialogAnimation) + val params = window.attributes + params.width = SizeUtil.getScreenWidth(ctx) + params.height = WindowManager.LayoutParams.WRAP_CONTENT + window.attributes = params + } + + internal inner class OrderFlowAdapter : + RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(ctx) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OrderFlowAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_flow_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = items.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = items[position] + holder.fromPersonView.text = rowsBean.from + holder.toPersonView.text = rowsBean.to + holder.transferDateView.text = rowsBean.time + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var fromPersonView: TextView = view.findViewById(R.id.fromPersonView) + var toPersonView: TextView = view.findViewById(R.id.toPersonView) + var transferDateView: TextView = view.findViewById(R.id.transferDateView) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml new file mode 100644 index 0000000..5875998 --- /dev/null +++ b/app/src/main/res/drawable/button_main_selector.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml new file mode 100644 index 0000000..a925019 --- /dev/null +++ b/app/src/main/res/drawable/button_white_selector.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_down.xml b/app/src/main/res/drawable/ic_down.xml new file mode 100644 index 0000000..20e6476 --- /dev/null +++ b/app/src/main/res/drawable/ic_down.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_work_order.xml b/app/src/main/res/drawable/ic_work_order.xml new file mode 100644 index 0000000..3c39d54 --- /dev/null +++ b/app/src/main/res/drawable/ic_work_order.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/selector_tag.xml b/app/src/main/res/drawable/selector_tag.xml new file mode 100644 index 0000000..c1fee7b --- /dev/null +++ b/app/src/main/res/drawable/selector_tag.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/selector_text.xml b/app/src/main/res/drawable/selector_text.xml new file mode 100644 index 0000000..d8c9398 --- /dev/null +++ b/app/src/main/res/drawable/selector_text.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tag_checked.xml b/app/src/main/res/drawable/tag_checked.xml new file mode 100644 index 0000000..616dcb1 --- /dev/null +++ b/app/src/main/res/drawable/tag_checked.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tag_normal.xml b/app/src/main/res/drawable/tag_normal.xml new file mode 100644 index 0000000..d38b7cc --- /dev/null +++ b/app/src/main/res/drawable/tag_normal.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/app/src/main/res/layout/activity_alarm_search.xml b/app/src/main/res/layout/activity_alarm_search.xml index 9f0c138..6baf0b5 100644 --- a/app/src/main/res/layout/activity_alarm_search.xml +++ b/app/src/main/res/layout/activity_alarm_search.xml @@ -1,6 +1,5 @@ - + android:text="清空" /> - + android:text="查询" /> \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt new file mode 100644 index 0000000..1f1b5de --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt @@ -0,0 +1,47 @@ +package com.casic.qd.smartwell.view + +import androidx.fragment.app.Fragment +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.TopViewPagerAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.navigatePageTo +import com.casic.qd.smartwell.fragment.OrderCompletedFragment +import com.casic.qd.smartwell.fragment.OrderInHandleFragment +import com.casic.qd.smartwell.fragment.OrderNotConfirmedFragment +import com.casic.qd.smartwell.fragment.OrderNotProcessedFragment +import com.casic.qd.smartwell.utils.Constant +import kotlinx.android.synthetic.main.activity_order_management.* +import java.util.* + +class OrderManagementActivity : BaseActivity() { + + private var fragmentList: ArrayList = ArrayList() + + init { + fragmentList.add(OrderNotProcessedFragment())//待处理 + fragmentList.add(OrderNotConfirmedFragment())//待确认 + fragmentList.add(OrderInHandleFragment())//处理中 + fragmentList.add(OrderCompletedFragment())//已完成 + } + + override fun initLayoutView(): Int = R.layout.activity_order_management + + override fun setupTopBarLayout() { + titleView.text = "工单管理" + } + + override fun initData() { + val topViewPagerAdapter = TopViewPagerAdapter( + supportFragmentManager, Constant.SUB_PAGE_TITLES, fragmentList + ) + orderViewPager.offscreenPageLimit = fragmentList.size + orderViewPager.adapter = topViewPagerAdapter + orderTabLayout.setupWithViewPager(orderViewPager) + } + + override fun initEvent() { + rightOptionView.setOnClickListener { + navigatePageTo() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt new file mode 100644 index 0000000..6e7e65e --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -0,0 +1,217 @@ +package com.casic.qd.smartwell.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.SearchResultAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.showEmptyPage +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.WeakReferenceHandler +import com.casic.qd.smartwell.vm.OperationViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.TimeLineBottomSheet +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_order_search_result.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_empty_view.* + +class OrderSearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var operationViewModel: OperationViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var args: ArrayList + private lateinit var searchResultAdapter: SearchResultAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_order_search_result + + override fun setupTopBarLayout() { + titleView.text = "查询结果" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + weakReferenceHandler = WeakReferenceHandler(callback) + operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + obtainSearchResult(args, pageIndex) + workOrderViewModel.listModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + resultRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show() + } + dataBeans.addAll(dataRows!!) + resultRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022040101) + } + }) + workOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + resultRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + resultRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainSearchResult(args, pageIndex) + } + + //接单状态处理 + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + //通知列表刷行数据 + weakReferenceHandler.sendEmptyMessage(2022040102) + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + workOrderViewModel.detailModel.observe(this, { + if (it.code == 200) { + val orderDetail = it.data!![0] + val orderFlow = orderDetail.flow!! + if (orderFlow.size != 0) { + TimeLineBottomSheet.Builder().setContext(this) + .setFlowItems(orderFlow).build().show() + } else { + "抱歉,无法查到该工单的流转记录".show() + } + } + }) + } + + private fun obtainSearchResult(args: ArrayList, pageIndex: Int) { + workOrderViewModel.obtainSearchResult( + keywords = args[0], + alarmContent = args[1], + alarmLevel = args[2], + jobStatus = args[3], + beginTime = args[4], + endTime = args[5], + page = pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2022040102 -> { + isRefresh = true + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + 2022040101 -> { + if (isRefresh || isLoadMore) { + searchResultAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + obtainSearchResult(args, pageIndex) + } + } else { + emptyView!!.hide() + searchResultAdapter = SearchResultAdapter(this, dataBeans) + resultRecyclerView!!.layoutManager = LinearLayoutManager(this) + resultRecyclerView!!.adapter = searchResultAdapter + searchResultAdapter.setOnItemClickListener(object : + SearchResultAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } + if (dataBeans[position].jobStatus == "0") { +// navigatePageTo(jobId) + } else { +// navigatePageTo(jobId) + } + } + + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(this@OrderSearchResultActivity) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptWorkOrder(jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + + override fun onTransferViewClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看工单流转记录".show() + return + } + workOrderViewModel.obtainWorkOrderDetail(jobId) + } + }) + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index 2b92d86..fccff95 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -145,7 +145,6 @@ }.build().show(supportFragmentManager, "all") } - searchButton.setChangeAlphaWhenPress(true) searchButton.setOnClickListener { //页面跳转,将查询参数传过去 navigatePageTo( @@ -160,7 +159,6 @@ ) } - clearButton.setChangeAlphaWhenPress(true) clearButton.setOnClickListener { wellCodeView.setText("") alarmTypeView.text = "" diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt new file mode 100644 index 0000000..a4b66b9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt @@ -0,0 +1,207 @@ +package com.casic.qd.smartwell.view + +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.AlarmContentModel +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.AlarmViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import com.zhy.view.flowlayout.FlowLayout +import com.zhy.view.flowlayout.TagAdapter +import kotlinx.android.synthetic.main.activity_order_search.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class SearchOrderActivity : BaseActivity() { + + private lateinit var contentTypeViewModel: AlarmViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var inflater: LayoutInflater + private lateinit var contentTypeAdapter: TagAdapter + private lateinit var orderStatusAdapter: TagAdapter + private var contentModels: MutableList = ArrayList() + private var orderStatusModels: MutableList = ArrayList() + private var alarmContentType = "" + private var alarmLevel = "" + private var orderState = "" + + override fun initLayoutView(): Int = R.layout.activity_order_search + + override fun setupTopBarLayout() { + titleView.text = "工单查询" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + inflater = LayoutInflater.from(this) + //告警内容 + contentTypeViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + //工单状态 + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + contentTypeViewModel.obtainAlarmContent("1") + contentTypeViewModel.contentModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = AlarmContentModel.DataBean.ListBean() + bean.value = "" + bean.name = "全部" + bean.alarmType = "" + bean.deviceType = "" + contentModels.add(bean) + + it.data!!.list?.forEach { contentTypeBean -> + contentModels.add(contentTypeBean) + } + contentTypeAdapter = + object : TagAdapter(contentModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: AlarmContentModel.DataBean.ListBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmContentLayout, false + ) as TextView + tagView.text = contentModels[position].name + return tagView + } + } + alarmContentLayout.adapter = contentTypeAdapter + contentTypeAdapter.setSelectedList(0) + alarmContentLayout.setOnTagClickListener { _, position, _ -> + this.alarmContentType = contentModels[position].value.toString() + true + } + } + }) + + val levelMaps: MutableList> = ArrayList() + for (i in 0..3) { + val map = HashMap() + map["name"] = i.toString().toChinese() + map["value"] = i.toLevel() + levelMaps.add(map) + } + val levelAdapter = object : TagAdapter>(levelMaps) { + override fun getView( + parent: FlowLayout?, + position: Int, map: Map? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmLevelLayout, false + ) as TextView + tagView.text = levelMaps[position]["name"] + return tagView + } + } + alarmLevelLayout.adapter = levelAdapter + levelAdapter.setSelectedList(0) + alarmLevelLayout.setOnTagClickListener { _, position, _ -> + this.alarmLevel = levelMaps[position]["value"].toString() + true + } + + workOrderViewModel.obtainOrderStatus() + workOrderViewModel.orderStatusModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = OrderStatusModel.DataBean() + bean.name = "全部" + bean.id = "" + bean.value = "" + orderStatusModels.add(bean) + it.data!!.forEach { statusBean -> + orderStatusModels.add(statusBean) + } + orderStatusAdapter = + object : TagAdapter(orderStatusModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: OrderStatusModel.DataBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + orderStatusLayout, false + ) as TextView + tagView.text = orderStatusModels[position].name + return tagView + } + } + orderStatusLayout.adapter = orderStatusAdapter + orderStatusAdapter.setSelectedList(0) + orderStatusLayout.setOnTagClickListener { _, position, _ -> + this.orderState = orderStatusModels[position].value.toString() + true + } + } + }) + + startTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择开始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + startTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + endTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) { + "结束时间不合法,不能早于开始时间".show() + return@setCallBack + } + endTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + searchButton.setOnClickListener { + //页面跳转,将查询参数传过去 + navigatePageTo( + addAll( + wellCodeView.text.toString().trim(), + alarmContentType, + alarmLevel, + orderState, + startTimeView.text.toString(), + endTimeView.text.toString() + ) + ) + } + + clearButton.setOnClickListener { + wellCodeView.text.clear() + contentTypeAdapter.setSelectedList(0) + levelAdapter.setSelectedList(0) + orderStatusAdapter.setSelectedList(0) + startTimeView.text = "" + endTimeView.text = "" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt index b1f9fc3..c21fe1a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt @@ -112,16 +112,20 @@ }) fun obtainMapDeviceResult(keywords: String?, devType: String?) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.obtainMapDeviceResult(keywords, devType) val responseCode = response.separateResponseCode() if (responseCode == 200) { + loadState.value = LoadState.Success mapDeviceResultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { + loadState.value = LoadState.Fail response.toErrorMessage().show() } }, { + loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt new file mode 100644 index 0000000..6a528a4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt @@ -0,0 +1,83 @@ +package com.casic.qd.smartwell.vm + +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager + +/** + * 转单、接单、处理等vm + * */ +class OperationViewModel : BaseViewModel() { + + fun acceptWorkOrder(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.acceptWorkOrder(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "接单成功".show() + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun confirmWorkOrder( +// id: String, firstState: String, +// firstStatePhotos: String, needHandle: String +// ) = launch({ +// loadState.value = LoadState.Loading +// val response = +// RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单确认成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun transferWorkOrder(id: String, userId: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.transferWorkOrder(id, userId) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "转单成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun completeWorkOrder(id: String, handleMessage: String, handlePhotos: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.completeWorkOrder(id, handleMessage, handlePhotos) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单处理成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt new file mode 100644 index 0000000..411c9a8 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt @@ -0,0 +1,105 @@ +package com.casic.qd.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +class WorkOrderViewModel : BaseViewModel() { + + private val gson = Gson() + val orderStatusModel = MutableLiveData() + val listModel = MutableLiveData() + val detailModel = MutableLiveData() +// val resultModel = MutableLiveData>() + + + fun obtainOrderStatus() = launch({ + val response = RetrofitServiceManager.obtainOrderStatus() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderStatusModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainSearchResult( + keywords, alarmContent, alarmLevel, jobStatus, beginTime, endTime, page + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun obtainWorkOrderDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainWorkOrderDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + detailModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun countWorkOrderByState() = launch({ +// val response = RetrofitServiceManager.countWorkOrderByState() +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// val map = HashMap(4) +// +// val jsonObject = JSONObject(response) +// val data = jsonObject.getJSONObject("data") +// map["beforeGet"] = data.getString("beforeGet") +// map["beforeConfirm"] = data.getString("beforeConfirm") +// map["inHandle"] = data.getString("inHandle") +// map["over"] = data.getString("over") +// resultModel.value = map +// } else { +// response.toErrorMessage().show() +// } +// }, { +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt index 39d6d09..6de33f7 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt @@ -119,7 +119,6 @@ } } - sheetConfirmButton.setChangeAlphaWhenPress(true) sheetConfirmButton.setOnClickListener { listener.onAreaSelected(areaName, areaId) dismiss() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt index 98ff307..bcd9351 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt @@ -47,7 +47,6 @@ setCancelable(true) setCanceledOnTouchOutside(true) - confirmButton.setChangeAlphaWhenPress(true) confirmButton.setOnClickListener { val oldPwd = oldPwdView.text.toString() val newPwd = newPwdView.text.toString() @@ -66,6 +65,7 @@ } if (!newPwd.isLetterAndDigit()) { "新密码需包含数字和字母".show() + return@setOnClickListener } if (newPwd != confirmPwd) { "新密码和确认密码不一致,请检查".show() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt new file mode 100644 index 0000000..2b3dfe7 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt @@ -0,0 +1,102 @@ +package com.casic.qd.smartwell.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.* +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineBottomSheet private constructor(builder: Builder) : Dialog( + builder.context!!, R.style.ActionSheetDialogStyle +) { + private val ctx: Context = builder.context!! + private val items: MutableList = builder.items!! + + class Builder { + var context: Context? = null + var items: MutableList? = null + + fun setContext(context: Context?): Builder { + this.context = context + return this + } + + fun setFlowItems(flowItems: MutableList?): Builder { + this.items = flowItems + return this + } + + fun build(): TimeLineBottomSheet { + return TimeLineBottomSheet(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_bottom_sheet) + setCancelable(true) + setCanceledOnTouchOutside(true) + //绑定流程进展数据 + val orderFlowRecyclerView = findViewById(R.id.orderFlowRecyclerView) + orderFlowRecyclerView.layoutManager = LinearLayoutManager(ctx) + orderFlowRecyclerView.adapter = OrderFlowAdapter() + + val dismissView = findViewById(R.id.dismissView) + dismissView.setOnClickListener { + this.dismiss() + } + } + + private fun configDialogLayout() { + val window = window ?: return + window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window.decorView.setBackgroundColor(Color.TRANSPARENT) + window.setGravity(Gravity.BOTTOM) + //设置Dialog出现的动画 + window.setWindowAnimations(R.style.ActionSheetDialogAnimation) + val params = window.attributes + params.width = SizeUtil.getScreenWidth(ctx) + params.height = WindowManager.LayoutParams.WRAP_CONTENT + window.attributes = params + } + + internal inner class OrderFlowAdapter : + RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(ctx) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OrderFlowAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_flow_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = items.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = items[position] + holder.fromPersonView.text = rowsBean.from + holder.toPersonView.text = rowsBean.to + holder.transferDateView.text = rowsBean.time + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var fromPersonView: TextView = view.findViewById(R.id.fromPersonView) + var toPersonView: TextView = view.findViewById(R.id.toPersonView) + var transferDateView: TextView = view.findViewById(R.id.transferDateView) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml new file mode 100644 index 0000000..5875998 --- /dev/null +++ b/app/src/main/res/drawable/button_main_selector.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml new file mode 100644 index 0000000..a925019 --- /dev/null +++ b/app/src/main/res/drawable/button_white_selector.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_down.xml b/app/src/main/res/drawable/ic_down.xml new file mode 100644 index 0000000..20e6476 --- /dev/null +++ b/app/src/main/res/drawable/ic_down.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_work_order.xml b/app/src/main/res/drawable/ic_work_order.xml new file mode 100644 index 0000000..3c39d54 --- /dev/null +++ b/app/src/main/res/drawable/ic_work_order.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/selector_tag.xml b/app/src/main/res/drawable/selector_tag.xml new file mode 100644 index 0000000..c1fee7b --- /dev/null +++ b/app/src/main/res/drawable/selector_tag.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/selector_text.xml b/app/src/main/res/drawable/selector_text.xml new file mode 100644 index 0000000..d8c9398 --- /dev/null +++ b/app/src/main/res/drawable/selector_text.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tag_checked.xml b/app/src/main/res/drawable/tag_checked.xml new file mode 100644 index 0000000..616dcb1 --- /dev/null +++ b/app/src/main/res/drawable/tag_checked.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tag_normal.xml b/app/src/main/res/drawable/tag_normal.xml new file mode 100644 index 0000000..d38b7cc --- /dev/null +++ b/app/src/main/res/drawable/tag_normal.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/app/src/main/res/layout/activity_alarm_search.xml b/app/src/main/res/layout/activity_alarm_search.xml index 9f0c138..6baf0b5 100644 --- a/app/src/main/res/layout/activity_alarm_search.xml +++ b/app/src/main/res/layout/activity_alarm_search.xml @@ -1,6 +1,5 @@ - + android:text="清空" /> - + android:text="查询" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_data_search.xml b/app/src/main/res/layout/activity_data_search.xml index 96367b7..db46ab7 100644 --- a/app/src/main/res/layout/activity_data_search.xml +++ b/app/src/main/res/layout/activity_data_search.xml @@ -1,6 +1,5 @@ - + android:text="清空" /> - + android:text="查询" /> diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt new file mode 100644 index 0000000..1f1b5de --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt @@ -0,0 +1,47 @@ +package com.casic.qd.smartwell.view + +import androidx.fragment.app.Fragment +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.TopViewPagerAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.navigatePageTo +import com.casic.qd.smartwell.fragment.OrderCompletedFragment +import com.casic.qd.smartwell.fragment.OrderInHandleFragment +import com.casic.qd.smartwell.fragment.OrderNotConfirmedFragment +import com.casic.qd.smartwell.fragment.OrderNotProcessedFragment +import com.casic.qd.smartwell.utils.Constant +import kotlinx.android.synthetic.main.activity_order_management.* +import java.util.* + +class OrderManagementActivity : BaseActivity() { + + private var fragmentList: ArrayList = ArrayList() + + init { + fragmentList.add(OrderNotProcessedFragment())//待处理 + fragmentList.add(OrderNotConfirmedFragment())//待确认 + fragmentList.add(OrderInHandleFragment())//处理中 + fragmentList.add(OrderCompletedFragment())//已完成 + } + + override fun initLayoutView(): Int = R.layout.activity_order_management + + override fun setupTopBarLayout() { + titleView.text = "工单管理" + } + + override fun initData() { + val topViewPagerAdapter = TopViewPagerAdapter( + supportFragmentManager, Constant.SUB_PAGE_TITLES, fragmentList + ) + orderViewPager.offscreenPageLimit = fragmentList.size + orderViewPager.adapter = topViewPagerAdapter + orderTabLayout.setupWithViewPager(orderViewPager) + } + + override fun initEvent() { + rightOptionView.setOnClickListener { + navigatePageTo() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt new file mode 100644 index 0000000..6e7e65e --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -0,0 +1,217 @@ +package com.casic.qd.smartwell.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.SearchResultAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.showEmptyPage +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.WeakReferenceHandler +import com.casic.qd.smartwell.vm.OperationViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.TimeLineBottomSheet +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_order_search_result.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_empty_view.* + +class OrderSearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var operationViewModel: OperationViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var args: ArrayList + private lateinit var searchResultAdapter: SearchResultAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_order_search_result + + override fun setupTopBarLayout() { + titleView.text = "查询结果" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + weakReferenceHandler = WeakReferenceHandler(callback) + operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + obtainSearchResult(args, pageIndex) + workOrderViewModel.listModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + resultRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show() + } + dataBeans.addAll(dataRows!!) + resultRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022040101) + } + }) + workOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + resultRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + resultRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainSearchResult(args, pageIndex) + } + + //接单状态处理 + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + //通知列表刷行数据 + weakReferenceHandler.sendEmptyMessage(2022040102) + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + workOrderViewModel.detailModel.observe(this, { + if (it.code == 200) { + val orderDetail = it.data!![0] + val orderFlow = orderDetail.flow!! + if (orderFlow.size != 0) { + TimeLineBottomSheet.Builder().setContext(this) + .setFlowItems(orderFlow).build().show() + } else { + "抱歉,无法查到该工单的流转记录".show() + } + } + }) + } + + private fun obtainSearchResult(args: ArrayList, pageIndex: Int) { + workOrderViewModel.obtainSearchResult( + keywords = args[0], + alarmContent = args[1], + alarmLevel = args[2], + jobStatus = args[3], + beginTime = args[4], + endTime = args[5], + page = pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2022040102 -> { + isRefresh = true + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + 2022040101 -> { + if (isRefresh || isLoadMore) { + searchResultAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + obtainSearchResult(args, pageIndex) + } + } else { + emptyView!!.hide() + searchResultAdapter = SearchResultAdapter(this, dataBeans) + resultRecyclerView!!.layoutManager = LinearLayoutManager(this) + resultRecyclerView!!.adapter = searchResultAdapter + searchResultAdapter.setOnItemClickListener(object : + SearchResultAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } + if (dataBeans[position].jobStatus == "0") { +// navigatePageTo(jobId) + } else { +// navigatePageTo(jobId) + } + } + + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(this@OrderSearchResultActivity) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptWorkOrder(jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + + override fun onTransferViewClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看工单流转记录".show() + return + } + workOrderViewModel.obtainWorkOrderDetail(jobId) + } + }) + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index 2b92d86..fccff95 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -145,7 +145,6 @@ }.build().show(supportFragmentManager, "all") } - searchButton.setChangeAlphaWhenPress(true) searchButton.setOnClickListener { //页面跳转,将查询参数传过去 navigatePageTo( @@ -160,7 +159,6 @@ ) } - clearButton.setChangeAlphaWhenPress(true) clearButton.setOnClickListener { wellCodeView.setText("") alarmTypeView.text = "" diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt new file mode 100644 index 0000000..a4b66b9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt @@ -0,0 +1,207 @@ +package com.casic.qd.smartwell.view + +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.AlarmContentModel +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.AlarmViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import com.zhy.view.flowlayout.FlowLayout +import com.zhy.view.flowlayout.TagAdapter +import kotlinx.android.synthetic.main.activity_order_search.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class SearchOrderActivity : BaseActivity() { + + private lateinit var contentTypeViewModel: AlarmViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var inflater: LayoutInflater + private lateinit var contentTypeAdapter: TagAdapter + private lateinit var orderStatusAdapter: TagAdapter + private var contentModels: MutableList = ArrayList() + private var orderStatusModels: MutableList = ArrayList() + private var alarmContentType = "" + private var alarmLevel = "" + private var orderState = "" + + override fun initLayoutView(): Int = R.layout.activity_order_search + + override fun setupTopBarLayout() { + titleView.text = "工单查询" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + inflater = LayoutInflater.from(this) + //告警内容 + contentTypeViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + //工单状态 + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + contentTypeViewModel.obtainAlarmContent("1") + contentTypeViewModel.contentModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = AlarmContentModel.DataBean.ListBean() + bean.value = "" + bean.name = "全部" + bean.alarmType = "" + bean.deviceType = "" + contentModels.add(bean) + + it.data!!.list?.forEach { contentTypeBean -> + contentModels.add(contentTypeBean) + } + contentTypeAdapter = + object : TagAdapter(contentModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: AlarmContentModel.DataBean.ListBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmContentLayout, false + ) as TextView + tagView.text = contentModels[position].name + return tagView + } + } + alarmContentLayout.adapter = contentTypeAdapter + contentTypeAdapter.setSelectedList(0) + alarmContentLayout.setOnTagClickListener { _, position, _ -> + this.alarmContentType = contentModels[position].value.toString() + true + } + } + }) + + val levelMaps: MutableList> = ArrayList() + for (i in 0..3) { + val map = HashMap() + map["name"] = i.toString().toChinese() + map["value"] = i.toLevel() + levelMaps.add(map) + } + val levelAdapter = object : TagAdapter>(levelMaps) { + override fun getView( + parent: FlowLayout?, + position: Int, map: Map? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmLevelLayout, false + ) as TextView + tagView.text = levelMaps[position]["name"] + return tagView + } + } + alarmLevelLayout.adapter = levelAdapter + levelAdapter.setSelectedList(0) + alarmLevelLayout.setOnTagClickListener { _, position, _ -> + this.alarmLevel = levelMaps[position]["value"].toString() + true + } + + workOrderViewModel.obtainOrderStatus() + workOrderViewModel.orderStatusModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = OrderStatusModel.DataBean() + bean.name = "全部" + bean.id = "" + bean.value = "" + orderStatusModels.add(bean) + it.data!!.forEach { statusBean -> + orderStatusModels.add(statusBean) + } + orderStatusAdapter = + object : TagAdapter(orderStatusModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: OrderStatusModel.DataBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + orderStatusLayout, false + ) as TextView + tagView.text = orderStatusModels[position].name + return tagView + } + } + orderStatusLayout.adapter = orderStatusAdapter + orderStatusAdapter.setSelectedList(0) + orderStatusLayout.setOnTagClickListener { _, position, _ -> + this.orderState = orderStatusModels[position].value.toString() + true + } + } + }) + + startTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择开始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + startTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + endTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) { + "结束时间不合法,不能早于开始时间".show() + return@setCallBack + } + endTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + searchButton.setOnClickListener { + //页面跳转,将查询参数传过去 + navigatePageTo( + addAll( + wellCodeView.text.toString().trim(), + alarmContentType, + alarmLevel, + orderState, + startTimeView.text.toString(), + endTimeView.text.toString() + ) + ) + } + + clearButton.setOnClickListener { + wellCodeView.text.clear() + contentTypeAdapter.setSelectedList(0) + levelAdapter.setSelectedList(0) + orderStatusAdapter.setSelectedList(0) + startTimeView.text = "" + endTimeView.text = "" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt index b1f9fc3..c21fe1a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt @@ -112,16 +112,20 @@ }) fun obtainMapDeviceResult(keywords: String?, devType: String?) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.obtainMapDeviceResult(keywords, devType) val responseCode = response.separateResponseCode() if (responseCode == 200) { + loadState.value = LoadState.Success mapDeviceResultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { + loadState.value = LoadState.Fail response.toErrorMessage().show() } }, { + loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt new file mode 100644 index 0000000..6a528a4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt @@ -0,0 +1,83 @@ +package com.casic.qd.smartwell.vm + +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager + +/** + * 转单、接单、处理等vm + * */ +class OperationViewModel : BaseViewModel() { + + fun acceptWorkOrder(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.acceptWorkOrder(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "接单成功".show() + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun confirmWorkOrder( +// id: String, firstState: String, +// firstStatePhotos: String, needHandle: String +// ) = launch({ +// loadState.value = LoadState.Loading +// val response = +// RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单确认成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun transferWorkOrder(id: String, userId: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.transferWorkOrder(id, userId) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "转单成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun completeWorkOrder(id: String, handleMessage: String, handlePhotos: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.completeWorkOrder(id, handleMessage, handlePhotos) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单处理成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt new file mode 100644 index 0000000..411c9a8 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt @@ -0,0 +1,105 @@ +package com.casic.qd.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +class WorkOrderViewModel : BaseViewModel() { + + private val gson = Gson() + val orderStatusModel = MutableLiveData() + val listModel = MutableLiveData() + val detailModel = MutableLiveData() +// val resultModel = MutableLiveData>() + + + fun obtainOrderStatus() = launch({ + val response = RetrofitServiceManager.obtainOrderStatus() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderStatusModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainSearchResult( + keywords, alarmContent, alarmLevel, jobStatus, beginTime, endTime, page + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun obtainWorkOrderDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainWorkOrderDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + detailModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun countWorkOrderByState() = launch({ +// val response = RetrofitServiceManager.countWorkOrderByState() +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// val map = HashMap(4) +// +// val jsonObject = JSONObject(response) +// val data = jsonObject.getJSONObject("data") +// map["beforeGet"] = data.getString("beforeGet") +// map["beforeConfirm"] = data.getString("beforeConfirm") +// map["inHandle"] = data.getString("inHandle") +// map["over"] = data.getString("over") +// resultModel.value = map +// } else { +// response.toErrorMessage().show() +// } +// }, { +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt index 39d6d09..6de33f7 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt @@ -119,7 +119,6 @@ } } - sheetConfirmButton.setChangeAlphaWhenPress(true) sheetConfirmButton.setOnClickListener { listener.onAreaSelected(areaName, areaId) dismiss() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt index 98ff307..bcd9351 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt @@ -47,7 +47,6 @@ setCancelable(true) setCanceledOnTouchOutside(true) - confirmButton.setChangeAlphaWhenPress(true) confirmButton.setOnClickListener { val oldPwd = oldPwdView.text.toString() val newPwd = newPwdView.text.toString() @@ -66,6 +65,7 @@ } if (!newPwd.isLetterAndDigit()) { "新密码需包含数字和字母".show() + return@setOnClickListener } if (newPwd != confirmPwd) { "新密码和确认密码不一致,请检查".show() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt new file mode 100644 index 0000000..2b3dfe7 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt @@ -0,0 +1,102 @@ +package com.casic.qd.smartwell.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.* +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineBottomSheet private constructor(builder: Builder) : Dialog( + builder.context!!, R.style.ActionSheetDialogStyle +) { + private val ctx: Context = builder.context!! + private val items: MutableList = builder.items!! + + class Builder { + var context: Context? = null + var items: MutableList? = null + + fun setContext(context: Context?): Builder { + this.context = context + return this + } + + fun setFlowItems(flowItems: MutableList?): Builder { + this.items = flowItems + return this + } + + fun build(): TimeLineBottomSheet { + return TimeLineBottomSheet(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_bottom_sheet) + setCancelable(true) + setCanceledOnTouchOutside(true) + //绑定流程进展数据 + val orderFlowRecyclerView = findViewById(R.id.orderFlowRecyclerView) + orderFlowRecyclerView.layoutManager = LinearLayoutManager(ctx) + orderFlowRecyclerView.adapter = OrderFlowAdapter() + + val dismissView = findViewById(R.id.dismissView) + dismissView.setOnClickListener { + this.dismiss() + } + } + + private fun configDialogLayout() { + val window = window ?: return + window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window.decorView.setBackgroundColor(Color.TRANSPARENT) + window.setGravity(Gravity.BOTTOM) + //设置Dialog出现的动画 + window.setWindowAnimations(R.style.ActionSheetDialogAnimation) + val params = window.attributes + params.width = SizeUtil.getScreenWidth(ctx) + params.height = WindowManager.LayoutParams.WRAP_CONTENT + window.attributes = params + } + + internal inner class OrderFlowAdapter : + RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(ctx) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OrderFlowAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_flow_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = items.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = items[position] + holder.fromPersonView.text = rowsBean.from + holder.toPersonView.text = rowsBean.to + holder.transferDateView.text = rowsBean.time + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var fromPersonView: TextView = view.findViewById(R.id.fromPersonView) + var toPersonView: TextView = view.findViewById(R.id.toPersonView) + var transferDateView: TextView = view.findViewById(R.id.transferDateView) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml new file mode 100644 index 0000000..5875998 --- /dev/null +++ b/app/src/main/res/drawable/button_main_selector.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml new file mode 100644 index 0000000..a925019 --- /dev/null +++ b/app/src/main/res/drawable/button_white_selector.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_down.xml b/app/src/main/res/drawable/ic_down.xml new file mode 100644 index 0000000..20e6476 --- /dev/null +++ b/app/src/main/res/drawable/ic_down.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_work_order.xml b/app/src/main/res/drawable/ic_work_order.xml new file mode 100644 index 0000000..3c39d54 --- /dev/null +++ b/app/src/main/res/drawable/ic_work_order.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/selector_tag.xml b/app/src/main/res/drawable/selector_tag.xml new file mode 100644 index 0000000..c1fee7b --- /dev/null +++ b/app/src/main/res/drawable/selector_tag.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/selector_text.xml b/app/src/main/res/drawable/selector_text.xml new file mode 100644 index 0000000..d8c9398 --- /dev/null +++ b/app/src/main/res/drawable/selector_text.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tag_checked.xml b/app/src/main/res/drawable/tag_checked.xml new file mode 100644 index 0000000..616dcb1 --- /dev/null +++ b/app/src/main/res/drawable/tag_checked.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tag_normal.xml b/app/src/main/res/drawable/tag_normal.xml new file mode 100644 index 0000000..d38b7cc --- /dev/null +++ b/app/src/main/res/drawable/tag_normal.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/app/src/main/res/layout/activity_alarm_search.xml b/app/src/main/res/layout/activity_alarm_search.xml index 9f0c138..6baf0b5 100644 --- a/app/src/main/res/layout/activity_alarm_search.xml +++ b/app/src/main/res/layout/activity_alarm_search.xml @@ -1,6 +1,5 @@ - + android:text="清空" /> - + android:text="查询" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_data_search.xml b/app/src/main/res/layout/activity_data_search.xml index 96367b7..db46ab7 100644 --- a/app/src/main/res/layout/activity_data_search.xml +++ b/app/src/main/res/layout/activity_data_search.xml @@ -1,6 +1,5 @@ - + android:text="清空" /> - + android:text="查询" /> diff --git a/app/src/main/res/layout/activity_device_search.xml b/app/src/main/res/layout/activity_device_search.xml index 31e22dc..60cf2f2 100644 --- a/app/src/main/res/layout/activity_device_search.xml +++ b/app/src/main/res/layout/activity_device_search.xml @@ -1,6 +1,5 @@ - + android:text="清空" /> - + android:text="查询" /> diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt new file mode 100644 index 0000000..1f1b5de --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt @@ -0,0 +1,47 @@ +package com.casic.qd.smartwell.view + +import androidx.fragment.app.Fragment +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.TopViewPagerAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.navigatePageTo +import com.casic.qd.smartwell.fragment.OrderCompletedFragment +import com.casic.qd.smartwell.fragment.OrderInHandleFragment +import com.casic.qd.smartwell.fragment.OrderNotConfirmedFragment +import com.casic.qd.smartwell.fragment.OrderNotProcessedFragment +import com.casic.qd.smartwell.utils.Constant +import kotlinx.android.synthetic.main.activity_order_management.* +import java.util.* + +class OrderManagementActivity : BaseActivity() { + + private var fragmentList: ArrayList = ArrayList() + + init { + fragmentList.add(OrderNotProcessedFragment())//待处理 + fragmentList.add(OrderNotConfirmedFragment())//待确认 + fragmentList.add(OrderInHandleFragment())//处理中 + fragmentList.add(OrderCompletedFragment())//已完成 + } + + override fun initLayoutView(): Int = R.layout.activity_order_management + + override fun setupTopBarLayout() { + titleView.text = "工单管理" + } + + override fun initData() { + val topViewPagerAdapter = TopViewPagerAdapter( + supportFragmentManager, Constant.SUB_PAGE_TITLES, fragmentList + ) + orderViewPager.offscreenPageLimit = fragmentList.size + orderViewPager.adapter = topViewPagerAdapter + orderTabLayout.setupWithViewPager(orderViewPager) + } + + override fun initEvent() { + rightOptionView.setOnClickListener { + navigatePageTo() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt new file mode 100644 index 0000000..6e7e65e --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -0,0 +1,217 @@ +package com.casic.qd.smartwell.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.SearchResultAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.showEmptyPage +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.WeakReferenceHandler +import com.casic.qd.smartwell.vm.OperationViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.TimeLineBottomSheet +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_order_search_result.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_empty_view.* + +class OrderSearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var operationViewModel: OperationViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var args: ArrayList + private lateinit var searchResultAdapter: SearchResultAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_order_search_result + + override fun setupTopBarLayout() { + titleView.text = "查询结果" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + weakReferenceHandler = WeakReferenceHandler(callback) + operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + obtainSearchResult(args, pageIndex) + workOrderViewModel.listModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + resultRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show() + } + dataBeans.addAll(dataRows!!) + resultRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022040101) + } + }) + workOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + resultRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + resultRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainSearchResult(args, pageIndex) + } + + //接单状态处理 + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + //通知列表刷行数据 + weakReferenceHandler.sendEmptyMessage(2022040102) + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + workOrderViewModel.detailModel.observe(this, { + if (it.code == 200) { + val orderDetail = it.data!![0] + val orderFlow = orderDetail.flow!! + if (orderFlow.size != 0) { + TimeLineBottomSheet.Builder().setContext(this) + .setFlowItems(orderFlow).build().show() + } else { + "抱歉,无法查到该工单的流转记录".show() + } + } + }) + } + + private fun obtainSearchResult(args: ArrayList, pageIndex: Int) { + workOrderViewModel.obtainSearchResult( + keywords = args[0], + alarmContent = args[1], + alarmLevel = args[2], + jobStatus = args[3], + beginTime = args[4], + endTime = args[5], + page = pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2022040102 -> { + isRefresh = true + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + 2022040101 -> { + if (isRefresh || isLoadMore) { + searchResultAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + obtainSearchResult(args, pageIndex) + } + } else { + emptyView!!.hide() + searchResultAdapter = SearchResultAdapter(this, dataBeans) + resultRecyclerView!!.layoutManager = LinearLayoutManager(this) + resultRecyclerView!!.adapter = searchResultAdapter + searchResultAdapter.setOnItemClickListener(object : + SearchResultAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } + if (dataBeans[position].jobStatus == "0") { +// navigatePageTo(jobId) + } else { +// navigatePageTo(jobId) + } + } + + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(this@OrderSearchResultActivity) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptWorkOrder(jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + + override fun onTransferViewClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看工单流转记录".show() + return + } + workOrderViewModel.obtainWorkOrderDetail(jobId) + } + }) + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index 2b92d86..fccff95 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -145,7 +145,6 @@ }.build().show(supportFragmentManager, "all") } - searchButton.setChangeAlphaWhenPress(true) searchButton.setOnClickListener { //页面跳转,将查询参数传过去 navigatePageTo( @@ -160,7 +159,6 @@ ) } - clearButton.setChangeAlphaWhenPress(true) clearButton.setOnClickListener { wellCodeView.setText("") alarmTypeView.text = "" diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt new file mode 100644 index 0000000..a4b66b9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt @@ -0,0 +1,207 @@ +package com.casic.qd.smartwell.view + +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.AlarmContentModel +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.AlarmViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import com.zhy.view.flowlayout.FlowLayout +import com.zhy.view.flowlayout.TagAdapter +import kotlinx.android.synthetic.main.activity_order_search.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class SearchOrderActivity : BaseActivity() { + + private lateinit var contentTypeViewModel: AlarmViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var inflater: LayoutInflater + private lateinit var contentTypeAdapter: TagAdapter + private lateinit var orderStatusAdapter: TagAdapter + private var contentModels: MutableList = ArrayList() + private var orderStatusModels: MutableList = ArrayList() + private var alarmContentType = "" + private var alarmLevel = "" + private var orderState = "" + + override fun initLayoutView(): Int = R.layout.activity_order_search + + override fun setupTopBarLayout() { + titleView.text = "工单查询" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + inflater = LayoutInflater.from(this) + //告警内容 + contentTypeViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + //工单状态 + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + contentTypeViewModel.obtainAlarmContent("1") + contentTypeViewModel.contentModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = AlarmContentModel.DataBean.ListBean() + bean.value = "" + bean.name = "全部" + bean.alarmType = "" + bean.deviceType = "" + contentModels.add(bean) + + it.data!!.list?.forEach { contentTypeBean -> + contentModels.add(contentTypeBean) + } + contentTypeAdapter = + object : TagAdapter(contentModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: AlarmContentModel.DataBean.ListBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmContentLayout, false + ) as TextView + tagView.text = contentModels[position].name + return tagView + } + } + alarmContentLayout.adapter = contentTypeAdapter + contentTypeAdapter.setSelectedList(0) + alarmContentLayout.setOnTagClickListener { _, position, _ -> + this.alarmContentType = contentModels[position].value.toString() + true + } + } + }) + + val levelMaps: MutableList> = ArrayList() + for (i in 0..3) { + val map = HashMap() + map["name"] = i.toString().toChinese() + map["value"] = i.toLevel() + levelMaps.add(map) + } + val levelAdapter = object : TagAdapter>(levelMaps) { + override fun getView( + parent: FlowLayout?, + position: Int, map: Map? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmLevelLayout, false + ) as TextView + tagView.text = levelMaps[position]["name"] + return tagView + } + } + alarmLevelLayout.adapter = levelAdapter + levelAdapter.setSelectedList(0) + alarmLevelLayout.setOnTagClickListener { _, position, _ -> + this.alarmLevel = levelMaps[position]["value"].toString() + true + } + + workOrderViewModel.obtainOrderStatus() + workOrderViewModel.orderStatusModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = OrderStatusModel.DataBean() + bean.name = "全部" + bean.id = "" + bean.value = "" + orderStatusModels.add(bean) + it.data!!.forEach { statusBean -> + orderStatusModels.add(statusBean) + } + orderStatusAdapter = + object : TagAdapter(orderStatusModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: OrderStatusModel.DataBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + orderStatusLayout, false + ) as TextView + tagView.text = orderStatusModels[position].name + return tagView + } + } + orderStatusLayout.adapter = orderStatusAdapter + orderStatusAdapter.setSelectedList(0) + orderStatusLayout.setOnTagClickListener { _, position, _ -> + this.orderState = orderStatusModels[position].value.toString() + true + } + } + }) + + startTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择开始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + startTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + endTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) { + "结束时间不合法,不能早于开始时间".show() + return@setCallBack + } + endTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + searchButton.setOnClickListener { + //页面跳转,将查询参数传过去 + navigatePageTo( + addAll( + wellCodeView.text.toString().trim(), + alarmContentType, + alarmLevel, + orderState, + startTimeView.text.toString(), + endTimeView.text.toString() + ) + ) + } + + clearButton.setOnClickListener { + wellCodeView.text.clear() + contentTypeAdapter.setSelectedList(0) + levelAdapter.setSelectedList(0) + orderStatusAdapter.setSelectedList(0) + startTimeView.text = "" + endTimeView.text = "" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt index b1f9fc3..c21fe1a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt @@ -112,16 +112,20 @@ }) fun obtainMapDeviceResult(keywords: String?, devType: String?) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.obtainMapDeviceResult(keywords, devType) val responseCode = response.separateResponseCode() if (responseCode == 200) { + loadState.value = LoadState.Success mapDeviceResultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { + loadState.value = LoadState.Fail response.toErrorMessage().show() } }, { + loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt new file mode 100644 index 0000000..6a528a4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt @@ -0,0 +1,83 @@ +package com.casic.qd.smartwell.vm + +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager + +/** + * 转单、接单、处理等vm + * */ +class OperationViewModel : BaseViewModel() { + + fun acceptWorkOrder(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.acceptWorkOrder(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "接单成功".show() + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun confirmWorkOrder( +// id: String, firstState: String, +// firstStatePhotos: String, needHandle: String +// ) = launch({ +// loadState.value = LoadState.Loading +// val response = +// RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单确认成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun transferWorkOrder(id: String, userId: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.transferWorkOrder(id, userId) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "转单成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun completeWorkOrder(id: String, handleMessage: String, handlePhotos: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.completeWorkOrder(id, handleMessage, handlePhotos) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单处理成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt new file mode 100644 index 0000000..411c9a8 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt @@ -0,0 +1,105 @@ +package com.casic.qd.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +class WorkOrderViewModel : BaseViewModel() { + + private val gson = Gson() + val orderStatusModel = MutableLiveData() + val listModel = MutableLiveData() + val detailModel = MutableLiveData() +// val resultModel = MutableLiveData>() + + + fun obtainOrderStatus() = launch({ + val response = RetrofitServiceManager.obtainOrderStatus() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderStatusModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainSearchResult( + keywords, alarmContent, alarmLevel, jobStatus, beginTime, endTime, page + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun obtainWorkOrderDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainWorkOrderDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + detailModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun countWorkOrderByState() = launch({ +// val response = RetrofitServiceManager.countWorkOrderByState() +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// val map = HashMap(4) +// +// val jsonObject = JSONObject(response) +// val data = jsonObject.getJSONObject("data") +// map["beforeGet"] = data.getString("beforeGet") +// map["beforeConfirm"] = data.getString("beforeConfirm") +// map["inHandle"] = data.getString("inHandle") +// map["over"] = data.getString("over") +// resultModel.value = map +// } else { +// response.toErrorMessage().show() +// } +// }, { +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt index 39d6d09..6de33f7 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt @@ -119,7 +119,6 @@ } } - sheetConfirmButton.setChangeAlphaWhenPress(true) sheetConfirmButton.setOnClickListener { listener.onAreaSelected(areaName, areaId) dismiss() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt index 98ff307..bcd9351 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt @@ -47,7 +47,6 @@ setCancelable(true) setCanceledOnTouchOutside(true) - confirmButton.setChangeAlphaWhenPress(true) confirmButton.setOnClickListener { val oldPwd = oldPwdView.text.toString() val newPwd = newPwdView.text.toString() @@ -66,6 +65,7 @@ } if (!newPwd.isLetterAndDigit()) { "新密码需包含数字和字母".show() + return@setOnClickListener } if (newPwd != confirmPwd) { "新密码和确认密码不一致,请检查".show() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt new file mode 100644 index 0000000..2b3dfe7 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt @@ -0,0 +1,102 @@ +package com.casic.qd.smartwell.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.* +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineBottomSheet private constructor(builder: Builder) : Dialog( + builder.context!!, R.style.ActionSheetDialogStyle +) { + private val ctx: Context = builder.context!! + private val items: MutableList = builder.items!! + + class Builder { + var context: Context? = null + var items: MutableList? = null + + fun setContext(context: Context?): Builder { + this.context = context + return this + } + + fun setFlowItems(flowItems: MutableList?): Builder { + this.items = flowItems + return this + } + + fun build(): TimeLineBottomSheet { + return TimeLineBottomSheet(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_bottom_sheet) + setCancelable(true) + setCanceledOnTouchOutside(true) + //绑定流程进展数据 + val orderFlowRecyclerView = findViewById(R.id.orderFlowRecyclerView) + orderFlowRecyclerView.layoutManager = LinearLayoutManager(ctx) + orderFlowRecyclerView.adapter = OrderFlowAdapter() + + val dismissView = findViewById(R.id.dismissView) + dismissView.setOnClickListener { + this.dismiss() + } + } + + private fun configDialogLayout() { + val window = window ?: return + window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window.decorView.setBackgroundColor(Color.TRANSPARENT) + window.setGravity(Gravity.BOTTOM) + //设置Dialog出现的动画 + window.setWindowAnimations(R.style.ActionSheetDialogAnimation) + val params = window.attributes + params.width = SizeUtil.getScreenWidth(ctx) + params.height = WindowManager.LayoutParams.WRAP_CONTENT + window.attributes = params + } + + internal inner class OrderFlowAdapter : + RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(ctx) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OrderFlowAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_flow_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = items.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = items[position] + holder.fromPersonView.text = rowsBean.from + holder.toPersonView.text = rowsBean.to + holder.transferDateView.text = rowsBean.time + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var fromPersonView: TextView = view.findViewById(R.id.fromPersonView) + var toPersonView: TextView = view.findViewById(R.id.toPersonView) + var transferDateView: TextView = view.findViewById(R.id.transferDateView) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml new file mode 100644 index 0000000..5875998 --- /dev/null +++ b/app/src/main/res/drawable/button_main_selector.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml new file mode 100644 index 0000000..a925019 --- /dev/null +++ b/app/src/main/res/drawable/button_white_selector.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_down.xml b/app/src/main/res/drawable/ic_down.xml new file mode 100644 index 0000000..20e6476 --- /dev/null +++ b/app/src/main/res/drawable/ic_down.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_work_order.xml b/app/src/main/res/drawable/ic_work_order.xml new file mode 100644 index 0000000..3c39d54 --- /dev/null +++ b/app/src/main/res/drawable/ic_work_order.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/selector_tag.xml b/app/src/main/res/drawable/selector_tag.xml new file mode 100644 index 0000000..c1fee7b --- /dev/null +++ b/app/src/main/res/drawable/selector_tag.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/selector_text.xml b/app/src/main/res/drawable/selector_text.xml new file mode 100644 index 0000000..d8c9398 --- /dev/null +++ b/app/src/main/res/drawable/selector_text.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tag_checked.xml b/app/src/main/res/drawable/tag_checked.xml new file mode 100644 index 0000000..616dcb1 --- /dev/null +++ b/app/src/main/res/drawable/tag_checked.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tag_normal.xml b/app/src/main/res/drawable/tag_normal.xml new file mode 100644 index 0000000..d38b7cc --- /dev/null +++ b/app/src/main/res/drawable/tag_normal.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/app/src/main/res/layout/activity_alarm_search.xml b/app/src/main/res/layout/activity_alarm_search.xml index 9f0c138..6baf0b5 100644 --- a/app/src/main/res/layout/activity_alarm_search.xml +++ b/app/src/main/res/layout/activity_alarm_search.xml @@ -1,6 +1,5 @@ - + android:text="清空" /> - + android:text="查询" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_data_search.xml b/app/src/main/res/layout/activity_data_search.xml index 96367b7..db46ab7 100644 --- a/app/src/main/res/layout/activity_data_search.xml +++ b/app/src/main/res/layout/activity_data_search.xml @@ -1,6 +1,5 @@ - + android:text="清空" /> - + android:text="查询" /> diff --git a/app/src/main/res/layout/activity_device_search.xml b/app/src/main/res/layout/activity_device_search.xml index 31e22dc..60cf2f2 100644 --- a/app/src/main/res/layout/activity_device_search.xml +++ b/app/src/main/res/layout/activity_device_search.xml @@ -1,6 +1,5 @@ - + android:text="清空" /> - + android:text="查询" /> diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index f1182b8..c04136f 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -64,9 +64,9 @@ android:layout_height="@dimen/lineViewSize" android:layout_centerInParent="true" /> - + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt new file mode 100644 index 0000000..1f1b5de --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt @@ -0,0 +1,47 @@ +package com.casic.qd.smartwell.view + +import androidx.fragment.app.Fragment +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.TopViewPagerAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.navigatePageTo +import com.casic.qd.smartwell.fragment.OrderCompletedFragment +import com.casic.qd.smartwell.fragment.OrderInHandleFragment +import com.casic.qd.smartwell.fragment.OrderNotConfirmedFragment +import com.casic.qd.smartwell.fragment.OrderNotProcessedFragment +import com.casic.qd.smartwell.utils.Constant +import kotlinx.android.synthetic.main.activity_order_management.* +import java.util.* + +class OrderManagementActivity : BaseActivity() { + + private var fragmentList: ArrayList = ArrayList() + + init { + fragmentList.add(OrderNotProcessedFragment())//待处理 + fragmentList.add(OrderNotConfirmedFragment())//待确认 + fragmentList.add(OrderInHandleFragment())//处理中 + fragmentList.add(OrderCompletedFragment())//已完成 + } + + override fun initLayoutView(): Int = R.layout.activity_order_management + + override fun setupTopBarLayout() { + titleView.text = "工单管理" + } + + override fun initData() { + val topViewPagerAdapter = TopViewPagerAdapter( + supportFragmentManager, Constant.SUB_PAGE_TITLES, fragmentList + ) + orderViewPager.offscreenPageLimit = fragmentList.size + orderViewPager.adapter = topViewPagerAdapter + orderTabLayout.setupWithViewPager(orderViewPager) + } + + override fun initEvent() { + rightOptionView.setOnClickListener { + navigatePageTo() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt new file mode 100644 index 0000000..6e7e65e --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -0,0 +1,217 @@ +package com.casic.qd.smartwell.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.SearchResultAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.showEmptyPage +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.WeakReferenceHandler +import com.casic.qd.smartwell.vm.OperationViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.TimeLineBottomSheet +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_order_search_result.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_empty_view.* + +class OrderSearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var operationViewModel: OperationViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var args: ArrayList + private lateinit var searchResultAdapter: SearchResultAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_order_search_result + + override fun setupTopBarLayout() { + titleView.text = "查询结果" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + weakReferenceHandler = WeakReferenceHandler(callback) + operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + obtainSearchResult(args, pageIndex) + workOrderViewModel.listModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + resultRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show() + } + dataBeans.addAll(dataRows!!) + resultRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022040101) + } + }) + workOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + resultRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + resultRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainSearchResult(args, pageIndex) + } + + //接单状态处理 + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + //通知列表刷行数据 + weakReferenceHandler.sendEmptyMessage(2022040102) + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + workOrderViewModel.detailModel.observe(this, { + if (it.code == 200) { + val orderDetail = it.data!![0] + val orderFlow = orderDetail.flow!! + if (orderFlow.size != 0) { + TimeLineBottomSheet.Builder().setContext(this) + .setFlowItems(orderFlow).build().show() + } else { + "抱歉,无法查到该工单的流转记录".show() + } + } + }) + } + + private fun obtainSearchResult(args: ArrayList, pageIndex: Int) { + workOrderViewModel.obtainSearchResult( + keywords = args[0], + alarmContent = args[1], + alarmLevel = args[2], + jobStatus = args[3], + beginTime = args[4], + endTime = args[5], + page = pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2022040102 -> { + isRefresh = true + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + 2022040101 -> { + if (isRefresh || isLoadMore) { + searchResultAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + obtainSearchResult(args, pageIndex) + } + } else { + emptyView!!.hide() + searchResultAdapter = SearchResultAdapter(this, dataBeans) + resultRecyclerView!!.layoutManager = LinearLayoutManager(this) + resultRecyclerView!!.adapter = searchResultAdapter + searchResultAdapter.setOnItemClickListener(object : + SearchResultAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } + if (dataBeans[position].jobStatus == "0") { +// navigatePageTo(jobId) + } else { +// navigatePageTo(jobId) + } + } + + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(this@OrderSearchResultActivity) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptWorkOrder(jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + + override fun onTransferViewClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看工单流转记录".show() + return + } + workOrderViewModel.obtainWorkOrderDetail(jobId) + } + }) + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index 2b92d86..fccff95 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -145,7 +145,6 @@ }.build().show(supportFragmentManager, "all") } - searchButton.setChangeAlphaWhenPress(true) searchButton.setOnClickListener { //页面跳转,将查询参数传过去 navigatePageTo( @@ -160,7 +159,6 @@ ) } - clearButton.setChangeAlphaWhenPress(true) clearButton.setOnClickListener { wellCodeView.setText("") alarmTypeView.text = "" diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt new file mode 100644 index 0000000..a4b66b9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt @@ -0,0 +1,207 @@ +package com.casic.qd.smartwell.view + +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.AlarmContentModel +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.AlarmViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import com.zhy.view.flowlayout.FlowLayout +import com.zhy.view.flowlayout.TagAdapter +import kotlinx.android.synthetic.main.activity_order_search.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class SearchOrderActivity : BaseActivity() { + + private lateinit var contentTypeViewModel: AlarmViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var inflater: LayoutInflater + private lateinit var contentTypeAdapter: TagAdapter + private lateinit var orderStatusAdapter: TagAdapter + private var contentModels: MutableList = ArrayList() + private var orderStatusModels: MutableList = ArrayList() + private var alarmContentType = "" + private var alarmLevel = "" + private var orderState = "" + + override fun initLayoutView(): Int = R.layout.activity_order_search + + override fun setupTopBarLayout() { + titleView.text = "工单查询" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + inflater = LayoutInflater.from(this) + //告警内容 + contentTypeViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + //工单状态 + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + contentTypeViewModel.obtainAlarmContent("1") + contentTypeViewModel.contentModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = AlarmContentModel.DataBean.ListBean() + bean.value = "" + bean.name = "全部" + bean.alarmType = "" + bean.deviceType = "" + contentModels.add(bean) + + it.data!!.list?.forEach { contentTypeBean -> + contentModels.add(contentTypeBean) + } + contentTypeAdapter = + object : TagAdapter(contentModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: AlarmContentModel.DataBean.ListBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmContentLayout, false + ) as TextView + tagView.text = contentModels[position].name + return tagView + } + } + alarmContentLayout.adapter = contentTypeAdapter + contentTypeAdapter.setSelectedList(0) + alarmContentLayout.setOnTagClickListener { _, position, _ -> + this.alarmContentType = contentModels[position].value.toString() + true + } + } + }) + + val levelMaps: MutableList> = ArrayList() + for (i in 0..3) { + val map = HashMap() + map["name"] = i.toString().toChinese() + map["value"] = i.toLevel() + levelMaps.add(map) + } + val levelAdapter = object : TagAdapter>(levelMaps) { + override fun getView( + parent: FlowLayout?, + position: Int, map: Map? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmLevelLayout, false + ) as TextView + tagView.text = levelMaps[position]["name"] + return tagView + } + } + alarmLevelLayout.adapter = levelAdapter + levelAdapter.setSelectedList(0) + alarmLevelLayout.setOnTagClickListener { _, position, _ -> + this.alarmLevel = levelMaps[position]["value"].toString() + true + } + + workOrderViewModel.obtainOrderStatus() + workOrderViewModel.orderStatusModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = OrderStatusModel.DataBean() + bean.name = "全部" + bean.id = "" + bean.value = "" + orderStatusModels.add(bean) + it.data!!.forEach { statusBean -> + orderStatusModels.add(statusBean) + } + orderStatusAdapter = + object : TagAdapter(orderStatusModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: OrderStatusModel.DataBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + orderStatusLayout, false + ) as TextView + tagView.text = orderStatusModels[position].name + return tagView + } + } + orderStatusLayout.adapter = orderStatusAdapter + orderStatusAdapter.setSelectedList(0) + orderStatusLayout.setOnTagClickListener { _, position, _ -> + this.orderState = orderStatusModels[position].value.toString() + true + } + } + }) + + startTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择开始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + startTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + endTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) { + "结束时间不合法,不能早于开始时间".show() + return@setCallBack + } + endTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + searchButton.setOnClickListener { + //页面跳转,将查询参数传过去 + navigatePageTo( + addAll( + wellCodeView.text.toString().trim(), + alarmContentType, + alarmLevel, + orderState, + startTimeView.text.toString(), + endTimeView.text.toString() + ) + ) + } + + clearButton.setOnClickListener { + wellCodeView.text.clear() + contentTypeAdapter.setSelectedList(0) + levelAdapter.setSelectedList(0) + orderStatusAdapter.setSelectedList(0) + startTimeView.text = "" + endTimeView.text = "" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt index b1f9fc3..c21fe1a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt @@ -112,16 +112,20 @@ }) fun obtainMapDeviceResult(keywords: String?, devType: String?) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.obtainMapDeviceResult(keywords, devType) val responseCode = response.separateResponseCode() if (responseCode == 200) { + loadState.value = LoadState.Success mapDeviceResultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { + loadState.value = LoadState.Fail response.toErrorMessage().show() } }, { + loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt new file mode 100644 index 0000000..6a528a4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt @@ -0,0 +1,83 @@ +package com.casic.qd.smartwell.vm + +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager + +/** + * 转单、接单、处理等vm + * */ +class OperationViewModel : BaseViewModel() { + + fun acceptWorkOrder(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.acceptWorkOrder(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "接单成功".show() + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun confirmWorkOrder( +// id: String, firstState: String, +// firstStatePhotos: String, needHandle: String +// ) = launch({ +// loadState.value = LoadState.Loading +// val response = +// RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单确认成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun transferWorkOrder(id: String, userId: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.transferWorkOrder(id, userId) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "转单成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun completeWorkOrder(id: String, handleMessage: String, handlePhotos: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.completeWorkOrder(id, handleMessage, handlePhotos) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单处理成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt new file mode 100644 index 0000000..411c9a8 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt @@ -0,0 +1,105 @@ +package com.casic.qd.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +class WorkOrderViewModel : BaseViewModel() { + + private val gson = Gson() + val orderStatusModel = MutableLiveData() + val listModel = MutableLiveData() + val detailModel = MutableLiveData() +// val resultModel = MutableLiveData>() + + + fun obtainOrderStatus() = launch({ + val response = RetrofitServiceManager.obtainOrderStatus() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderStatusModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainSearchResult( + keywords, alarmContent, alarmLevel, jobStatus, beginTime, endTime, page + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun obtainWorkOrderDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainWorkOrderDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + detailModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun countWorkOrderByState() = launch({ +// val response = RetrofitServiceManager.countWorkOrderByState() +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// val map = HashMap(4) +// +// val jsonObject = JSONObject(response) +// val data = jsonObject.getJSONObject("data") +// map["beforeGet"] = data.getString("beforeGet") +// map["beforeConfirm"] = data.getString("beforeConfirm") +// map["inHandle"] = data.getString("inHandle") +// map["over"] = data.getString("over") +// resultModel.value = map +// } else { +// response.toErrorMessage().show() +// } +// }, { +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt index 39d6d09..6de33f7 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt @@ -119,7 +119,6 @@ } } - sheetConfirmButton.setChangeAlphaWhenPress(true) sheetConfirmButton.setOnClickListener { listener.onAreaSelected(areaName, areaId) dismiss() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt index 98ff307..bcd9351 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt @@ -47,7 +47,6 @@ setCancelable(true) setCanceledOnTouchOutside(true) - confirmButton.setChangeAlphaWhenPress(true) confirmButton.setOnClickListener { val oldPwd = oldPwdView.text.toString() val newPwd = newPwdView.text.toString() @@ -66,6 +65,7 @@ } if (!newPwd.isLetterAndDigit()) { "新密码需包含数字和字母".show() + return@setOnClickListener } if (newPwd != confirmPwd) { "新密码和确认密码不一致,请检查".show() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt new file mode 100644 index 0000000..2b3dfe7 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt @@ -0,0 +1,102 @@ +package com.casic.qd.smartwell.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.* +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineBottomSheet private constructor(builder: Builder) : Dialog( + builder.context!!, R.style.ActionSheetDialogStyle +) { + private val ctx: Context = builder.context!! + private val items: MutableList = builder.items!! + + class Builder { + var context: Context? = null + var items: MutableList? = null + + fun setContext(context: Context?): Builder { + this.context = context + return this + } + + fun setFlowItems(flowItems: MutableList?): Builder { + this.items = flowItems + return this + } + + fun build(): TimeLineBottomSheet { + return TimeLineBottomSheet(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_bottom_sheet) + setCancelable(true) + setCanceledOnTouchOutside(true) + //绑定流程进展数据 + val orderFlowRecyclerView = findViewById(R.id.orderFlowRecyclerView) + orderFlowRecyclerView.layoutManager = LinearLayoutManager(ctx) + orderFlowRecyclerView.adapter = OrderFlowAdapter() + + val dismissView = findViewById(R.id.dismissView) + dismissView.setOnClickListener { + this.dismiss() + } + } + + private fun configDialogLayout() { + val window = window ?: return + window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window.decorView.setBackgroundColor(Color.TRANSPARENT) + window.setGravity(Gravity.BOTTOM) + //设置Dialog出现的动画 + window.setWindowAnimations(R.style.ActionSheetDialogAnimation) + val params = window.attributes + params.width = SizeUtil.getScreenWidth(ctx) + params.height = WindowManager.LayoutParams.WRAP_CONTENT + window.attributes = params + } + + internal inner class OrderFlowAdapter : + RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(ctx) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OrderFlowAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_flow_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = items.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = items[position] + holder.fromPersonView.text = rowsBean.from + holder.toPersonView.text = rowsBean.to + holder.transferDateView.text = rowsBean.time + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var fromPersonView: TextView = view.findViewById(R.id.fromPersonView) + var toPersonView: TextView = view.findViewById(R.id.toPersonView) + var transferDateView: TextView = view.findViewById(R.id.transferDateView) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml new file mode 100644 index 0000000..5875998 --- /dev/null +++ b/app/src/main/res/drawable/button_main_selector.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml new file mode 100644 index 0000000..a925019 --- /dev/null +++ b/app/src/main/res/drawable/button_white_selector.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_down.xml b/app/src/main/res/drawable/ic_down.xml new file mode 100644 index 0000000..20e6476 --- /dev/null +++ b/app/src/main/res/drawable/ic_down.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_work_order.xml b/app/src/main/res/drawable/ic_work_order.xml new file mode 100644 index 0000000..3c39d54 --- /dev/null +++ b/app/src/main/res/drawable/ic_work_order.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/selector_tag.xml b/app/src/main/res/drawable/selector_tag.xml new file mode 100644 index 0000000..c1fee7b --- /dev/null +++ b/app/src/main/res/drawable/selector_tag.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/selector_text.xml b/app/src/main/res/drawable/selector_text.xml new file mode 100644 index 0000000..d8c9398 --- /dev/null +++ b/app/src/main/res/drawable/selector_text.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tag_checked.xml b/app/src/main/res/drawable/tag_checked.xml new file mode 100644 index 0000000..616dcb1 --- /dev/null +++ b/app/src/main/res/drawable/tag_checked.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tag_normal.xml b/app/src/main/res/drawable/tag_normal.xml new file mode 100644 index 0000000..d38b7cc --- /dev/null +++ b/app/src/main/res/drawable/tag_normal.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/app/src/main/res/layout/activity_alarm_search.xml b/app/src/main/res/layout/activity_alarm_search.xml index 9f0c138..6baf0b5 100644 --- a/app/src/main/res/layout/activity_alarm_search.xml +++ b/app/src/main/res/layout/activity_alarm_search.xml @@ -1,6 +1,5 @@ - + android:text="清空" /> - + android:text="查询" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_data_search.xml b/app/src/main/res/layout/activity_data_search.xml index 96367b7..db46ab7 100644 --- a/app/src/main/res/layout/activity_data_search.xml +++ b/app/src/main/res/layout/activity_data_search.xml @@ -1,6 +1,5 @@ - + android:text="清空" /> - + android:text="查询" /> diff --git a/app/src/main/res/layout/activity_device_search.xml b/app/src/main/res/layout/activity_device_search.xml index 31e22dc..60cf2f2 100644 --- a/app/src/main/res/layout/activity_device_search.xml +++ b/app/src/main/res/layout/activity_device_search.xml @@ -1,6 +1,5 @@ - + android:text="清空" /> - + android:text="查询" /> diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index f1182b8..c04136f 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -64,9 +64,9 @@ android:layout_height="@dimen/lineViewSize" android:layout_centerInParent="true" /> - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8c2381c..ea77e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,8 @@ targetSdkVersion 31 versionCode 1 versionName "1.0.0" + + ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -101,4 +103,6 @@ implementation 'org.jsoup:jsoup:1.14.3' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + //标签流式布局 + implementation group: 'com.hyman', name: 'flowlayout-lib', version: '1.1.2' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2987e8..b93d019 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,9 @@ + + + () { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var dataRows: MutableList = ArrayList() + + fun setExpandableData(dataSet: MutableList) { + this.dataRows = dataSet + notifyDataSetChanged() + } + + fun clearAll() { + if (dataRows.size != 0) { + dataRows.clear() + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpandableItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_expand_recycleview, parent, false) + return ExpandableItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ExpandableItemViewHolder, position: Int) { + holder.dateView.text = dataRows[position].orderStateTime + holder.operationView.text = dataRows[position].operationPerson + if (position == dataRows.size - 1) { + holder.dateView.setTextColor(R.color.mainThemeColor.convertColor()) + holder.operationView.setTextColor(R.color.mainThemeColor.convertColor()) + } + } + + override fun getItemCount(): Int = dataRows.size + + inner class ExpandableItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var dateView: TextView = view.findViewById(R.id.dateView) + var operationView: TextView = view.findViewById(R.id.operationView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt new file mode 100644 index 0000000..5b43305 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/SearchResultAdapter.kt @@ -0,0 +1,176 @@ +package com.casic.qd.smartwell.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.arrowAnimation +import com.casic.qd.smartwell.model.ExpandableDataModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.TimeLineItemDecoration +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton + +class SearchResultAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var isExpand = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SearchResultAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_search_result_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder( + holder: SearchResultAdapter.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.isBlank()) { + holder.alarmValueView.text = "报警值未知" + } else { + holder.alarmValueView.text = alarmValue + } + holder.wellLocationView.text = rowsBean.position + holder.currentStateView.text = + String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") + if (rowsBean.jobStatus == "0") { + //待处理订单需要显示接单按钮,隐藏流转记录 + holder.operationLayout.visibility = View.VISIBLE + holder.timeLineLayout.visibility = View.GONE + holder.transferLayout.visibility = View.GONE + if (listener != null) { + holder.operationButton.setChangeAlphaWhenPress(true) + holder.operationButton.setOnClickListener { + listener!!.onOperationClicked(position) + } + } + } else { + holder.operationLayout.visibility = View.GONE + holder.timeLineLayout.visibility = View.VISIBLE + //timeLineLayout下属UI + val expandableViewAdapter = ExpandableViewAdapter(context) + holder.expandableView.adapter = expandableViewAdapter + holder.expandableView.layoutManager = LinearLayoutManager(context) + holder.expandableView.addItemDecoration(TimeLineItemDecoration(context)) + holder.expandableImageView.setOnClickListener { + if (!isExpand) { + //展开列表动画 + holder.expandableImageView.arrowAnimation(180f) + isExpand = true + //子列表绑定数据 + expandableViewAdapter.setExpandableData(createExpandableList(rowsBean)) + } else { + //关闭列表动画 + holder.expandableImageView.arrowAnimation(0f) + isExpand = false + //子列表清空数据 + expandableViewAdapter.clearAll() + } + } + //transferLayout下属UI + if (rowsBean.jobStatus == "2" || rowsBean.jobStatus == "3") { + holder.transferLayout.visibility = View.VISIBLE + if (listener != null) { + holder.transferView.setChangeAlphaWhenPress(true) + holder.transferView.setOnClickListener { + listener!!.onTransferViewClicked(position) + } + } + } else { + holder.transferLayout.visibility = View.GONE + } + } + + //item普通点击事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + private fun createExpandableList(rowsBean: SearchResultModel.DataBean.RowsBean): MutableList { + val expandableList: MutableList = ArrayList() + expandableList.add(ExpandableDataModel(rowsBean.createTime, "发起工单")) + expandableList.add( + ExpandableDataModel( + rowsBean.getJobTime, + String.format("${rowsBean.getJobPerson}接单") + ) + ) + + if (rowsBean.confirmJobTime.toString().isBlank()) { + return expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.confirmJobTime, + String.format("${rowsBean.confirmJobPerson}确认工单") + ) + ) + } + + return if (rowsBean.handleJobTime.toString().isBlank()) { + expandableList + } else { + expandableList.add( + ExpandableDataModel( + rowsBean.handleJobTime, + String.format("${rowsBean.handleJobPerson}完成工单") + ) + ) + expandableList + } + } + + 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 operationLayout: RelativeLayout = view.findViewById(R.id.operationLayout) + var operationButton: QMUIRoundButton = view.findViewById(R.id.operationButton) + var timeLineLayout: RelativeLayout = view.findViewById(R.id.timeLineLayout) + var currentStateView: TextView = view.findViewById(R.id.currentStateView) + var expandableImageView: ImageView = view.findViewById(R.id.expandableImageView) + var expandableView: RecyclerView = view.findViewById(R.id.expandableView) + var transferLayout: LinearLayout = view.findViewById(R.id.transferLayout) + var transferView: QMUIRoundButton = view.findViewById(R.id.transferView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + + fun onOperationClicked(position: Int) + + fun onTransferViewClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt new file mode 100644 index 0000000..7a8bd65 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/TopViewPagerAdapter.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class TopViewPagerAdapter( + fragmentManager: FragmentManager, + private val pageTitles: Array, + private val pages: List +) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItem(position: Int): Fragment { + return pages[position] + } + + override fun getCount(): Int { + return pages.size + } + + override fun getPageTitle(position: Int): CharSequence { + return pageTitles[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt new file mode 100644 index 0000000..733f579 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.qd.smartwell.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt new file mode 100644 index 0000000..482dbe0 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/ImageView.kt @@ -0,0 +1,11 @@ +package com.casic.qd.smartwell.extensions + +import android.view.animation.LinearInterpolator +import android.widget.ImageView + +fun ImageView.arrowAnimation(angle: Float) { + val animation = this.animate() + animation.duration = 300 + animation.interpolator = LinearInterpolator() + animation.rotation(angle) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt index 9327e3d..7d4e82d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/Int.kt @@ -13,4 +13,12 @@ return Random.nextInt(100) } return Random.nextInt(this - 100, this + 100) +} + +fun Int.toLevel(): String { + return if (this == 0) { + "" + } else { + this.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index 6c2525f..27134da 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -88,4 +88,16 @@ } } return isDigit && isLetter +} + +fun String.toChinese(): String { + return when (this) { + "0" -> "全部" + "1" -> "一级" + "2" -> "二级" + "3" -> "三级" + else -> { + "未知" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt new file mode 100644 index 0000000..b353d44 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderCompletedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-已完成 + * */ +class OrderCompletedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_completed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt new file mode 100644 index 0000000..bed71bb --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderInHandleFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-处理中 + * */ +class OrderInHandleFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_in_handle + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt new file mode 100644 index 0000000..b8aeec6 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotConfirmedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待确认 + * */ +class OrderNotConfirmedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_confirmed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt new file mode 100644 index 0000000..c31e6d2 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -0,0 +1,24 @@ +package com.casic.qd.smartwell.fragment + +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseFragment + +/** + * 工单-待处理 + * */ +class OrderNotProcessedFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_order_not_processed + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt index 62d6a11..4365045 100644 --- a/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/model/BannerImageModel.kt @@ -1,12 +1,5 @@ package com.casic.qd.smartwell.model -/** - * @author Administrator - * @description TODO - * @package com.example.mutidemo.bean - * @date 2022/2/17 23:43 - * @email 290677893@qq.com - */ class BannerImageModel { /** * imageTitle : 亚洲首例300级深水导管架“海基一号”成... diff --git a/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt new file mode 100644 index 0000000..0dc633d --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/ExpandableDataModel.kt @@ -0,0 +1,3 @@ +package com.casic.qd.smartwell.model + +class ExpandableDataModel(var orderStateTime: String?, var operationPerson: String?) \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt new file mode 100644 index 0000000..336ebed --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/OrderStatusModel.kt @@ -0,0 +1,25 @@ +package com.casic.qd.smartwell.model + +class OrderStatusModel { + /** + * code : 200 + * data : [{"name":"待处理","id":"84","value":"0"},{"name":"待确认","id":"85","value":"1"},{"name":"处理中","id":"86","value":"2"},{"name":"已完成","id":"87","value":"3"},{"name":"已取消","id":"93","value":"4"}] + * message : 请求成功 + * success : true + */ + var code = 0 + var message: String? = null + var success = false + var data: List? = null + + class DataBean { + /** + * name : 待处理 + * id : 84 + * value : 0 + */ + var name: String? = null + var id: String? = null + var value: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt new file mode 100644 index 0000000..b9b8ac9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SearchResultModel.kt @@ -0,0 +1,52 @@ +package com.casic.qd.smartwell.model + +class SearchResultModel { + 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/qd/smartwell/model/WorkOrderDetailModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt new file mode 100644 index 0000000..ebd1709 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WorkOrderDetailModel.kt @@ -0,0 +1,58 @@ +package com.casic.qd.smartwell.model + +class WorkOrderDetailModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var firstState: String? = null + var alarmContent = 0 + var deptName: String? = null + var jobStatus: String? = null + var handleJobPerson: String? = null + var alarmContentName: String? = null + var shouldGetTime: String? = null + var firstStatePhotos: 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 flow: MutableList? = null + var editable = 0 + var alarmTime: String? = null + var handleMessage: String? = null + var alarmMessage: String? = null + var staff: String? = null + var handlePhotos: 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 + + class FlowBean { + var from: String? = null + var to: String? = null + var time: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 6981057..ec30741 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -16,9 +16,13 @@ const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 val HOME_ICONS = arrayOf( - R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, + R.drawable.ic_home_map, + R.drawable.ic_work_order, + R.drawable.ic_home_record, + R.drawable.ic_home_statistics, ) - val HOME_ITEMS = arrayOf("地图展示", "记录查询", "汇总统计") + val HOME_ITEMS = arrayOf("地图展示", "工单管理", "记录查询", "汇总统计") + val SUB_PAGE_TITLES = arrayOf("待处理", "待确认", "处理中", "已完成") val POPUP_IMAGES = arrayOf( R.drawable.ic_menu_map, R.drawable.ic_satellite, R.drawable.ic_3d ) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt index 52bbc99..a07e3b8 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/StatusBarColorUtil.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.utils -import android.R import android.app.Activity import android.view.View import android.view.ViewGroup @@ -19,7 +18,7 @@ decorView.addView(statusView) // 设置根布局的参数 val rootView = - (activity.findViewById(R.id.content) as ViewGroup).getChildAt(0) as ViewGroup + (activity.findViewById(android.R.id.content) as ViewGroup).getChildAt(0) as ViewGroup rootView.fitsSystemWindows = true rootView.clipToPadding = true } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt new file mode 100644 index 0000000..e4e1bf4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/TimeLineItemDecoration.kt @@ -0,0 +1,96 @@ +package com.casic.qd.smartwell.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.convertColor +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineItemDecoration(private val context: Context) : RecyclerView.ItemDecoration() { + private val circlePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val linePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val radius: Int + + init { + linePaint.color = R.color.hintTextColor.convertColor() + linePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + radius = SizeUtil.dp2px(context, 7.5f) + } + + override fun getItemOffsets( + outRect: Rect, view: View, + parent: RecyclerView, state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.left = SizeUtil.dp2px(context, 16.5f) + } + + override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDraw(canvas, parent, state) + val childCount = parent.childCount + val layoutManager = parent.layoutManager + for (i in 0 until childCount) { + val childView = parent.getChildAt(i) + val childViewHeight = childView.height + val itemCount = parent.adapter!!.itemCount + val leftDecorationWidth = layoutManager!!.getLeftDecorationWidth(childView) + val topDecorationHeight = layoutManager.getTopDecorationHeight(childView) + val startX = (leftDecorationWidth shr 1).toFloat() + // 圆顶部部分竖线,起点 Y + val topStartY = (childView.top - topDecorationHeight).toFloat() + // 圆顶部部分竖线,终点 Y + val topStopY = (childView.top + (childViewHeight shr 1) - radius).toFloat() + + // 圆底部部分竖线,起点 Y + val bottomStartY = (childView.top + (childViewHeight shr 1) + radius).toFloat() + // 圆底部部分竖线,终点 Y + val bottomStopY = childView.bottom.toFloat() + + // 获取当前 item 是 recyclerview 的第几个 childView + val childPosition = parent.getChildLayoutPosition(childView) + + // 绘制圆 + when (childPosition) { + 0 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.hintTextColor.convertColor() + } + itemCount - 1 -> { + circlePaint.style = Paint.Style.FILL + circlePaint.color = R.color.mainThemeColor.convertColor() + } + else -> { + circlePaint.style = Paint.Style.STROKE + circlePaint.strokeWidth = SizeUtil.dp2px(context, 1.5f).toFloat() + } + } + canvas.drawCircle( + startX, + (childView.top + (childViewHeight shr 1)).toFloat(), + radius.toFloat(), + circlePaint + ) + + // 绘制竖线 + when (childPosition) { + // 第 0 位置上只需绘制下半部分 + 0 -> { + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + // 最后位置只需绘制上半部分 + parent.adapter!!.itemCount - 1 -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + } + // 都要绘制 + else -> { + canvas.drawLine(startX, topStartY, startX, topStopY, linePaint) + canvas.drawLine(startX, bottomStartY, startX, bottomStopY, linePaint) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index f133ef4..ccbf3b1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -261,4 +261,51 @@ @Query("keywords") keywords: String?, @Query("devType") devType: String? ): String + + /** + * 工单状态 + * */ + @GET("/dict/code/jobStatus") + suspend fun obtainOrderStatus( + @Header("token") token: String + ): String + + /** + * 查询工单 + * */ + @GET("/job/searchList") + suspend fun obtainSearchResult( + @Header("token") token: String, + @Query("keywords") keywords: String?, + @Query("alarmContent") alarmContent: String?, + @Query("alarmLevel") alarmLevel: String?, + @Query("jobStatus") jobStatus: String?, + @Query("beginTime") beginTime: String?, + @Query("endTime") endTime: String?, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): String + + /** + * 获取工单详情 + * + * @param id 工单id + */ + @GET("/job/info") + suspend fun obtainWorkOrderDetail( + @Header("token") token: String, + @Query("id") id: String + ): String + + /** + * 接单 + * + * @param id 工单id + */ + @FormUrlEncoded + @POST("/job/getJob") + suspend fun acceptWorkOrder( + @Header("token") token: String, + @Field("id") id: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 9ee4cc1..67714cd 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -241,4 +241,50 @@ suspend fun obtainMapDeviceResult(keywords: String?, devType: String?): String { return api.obtainMapDeviceResult(AuthenticationHelper.token!!, keywords, devType) } + + /** + * 工单状态 + */ + suspend fun obtainOrderStatus(): String { + return api.obtainOrderStatus(AuthenticationHelper.token!!) + } + + /** + * 查询工单 + */ + suspend fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ): String { + return api.obtainSearchResult( + AuthenticationHelper.token!!, + keywords, + alarmContent, + alarmLevel, + jobStatus, + beginTime, + endTime, + Constant.PAGE_LIMIT, + page + ) + } + + /** + * 获取工单详情 + */ + suspend fun obtainWorkOrderDetail(id: String): String { + return api.obtainWorkOrderDetail(AuthenticationHelper.token!!, id) + } + + /** + * 接单 + */ + suspend fun acceptWorkOrder(id: String): String { + return api.acceptWorkOrder(AuthenticationHelper.token!!, id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt index ccfeb79..562d160 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/LoginActivity.kt @@ -70,7 +70,6 @@ false } - loginButton.setChangeAlphaWhenPress(true) loginButton.setOnClickListener { val account = userNameView.text.toString().trim() val userPassword = userPasswordView.text.toString().trim() diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b989b16..96c23a1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -112,14 +112,15 @@ //首页功能块 val homeRecycleAdapter = HomeRecycleAdapter(this) - homeRecyclerView.layoutManager = GridLayoutManager(this, 3) + homeRecyclerView.layoutManager = GridLayoutManager(this, 4) homeRecyclerView.adapter = homeRecycleAdapter homeRecycleAdapter.setOnGridItemClickListener(object : HomeRecycleAdapter.OnGridItemClickListener { override fun onClick(position: Int) { when (position) { 0 -> context.navigatePageTo() - 1 -> { + 1 -> context.navigatePageTo() + 2 -> { BottomActionSheet.Builder() .setContext(context) .setActionItemTitles(arrayOf("设备", "数据")) @@ -131,7 +132,7 @@ }.build().show() } - 2 -> context.navigatePageTo() + 3 -> context.navigatePageTo() } } }) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 9f16224..acd7137 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -2,9 +2,10 @@ import android.graphics.Point import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -18,12 +19,15 @@ import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.model.MapDeviceListModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues import com.casic.qd.smartwell.vm.DeviceViewModel import com.casic.qd.smartwell.widgets.EasyPopupWindow import com.casic.qd.smartwell.widgets.GaoDeClusterMarkerView import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.utils.SizeUtil import kotlinx.android.synthetic.main.activity_map.* import java.util.* import kotlin.collections.ArrayList @@ -124,10 +128,10 @@ .snippet(dataModel.deviceName) ) } else { - Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}闸井经纬度不在国内,异常经纬度 ===> [${lng},${lat}]") } } else { - Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") +// Log.d(kTag, "${dataModel.devcode}设备经纬度异常,异常经纬度 ===> [${lng},${lat}]") } } //计算所有点的中心点位置 @@ -135,7 +139,17 @@ //移动到指定经纬度 val cameraPosition = CameraPosition(centerLatLng, 14f, 0f, 0f) val cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition) - aMap.animateCamera(cameraUpdate, 3000, null) + aMap.animateCamera(cameraUpdate, 1500, null) + } + }) + deviceViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } } }) } @@ -229,17 +243,17 @@ } override fun getInfoWindow(marker: Marker?): View? { + val availableWidth = (SizeUtil.getScreenWidth(this) * 0.8).toInt() if (infoWindow == null) { infoWindow = LayoutInflater.from(this).inflate(R.layout.popu_map_info, null) } - val v = infoWindow!! //反射得到popup里面的控件对象 - val deviceCodeView = v.findViewById(R.id.deviceCodeView) - val deviceModelView = v.findViewById(R.id.deviceModelView) - val deviceTypeView = v.findViewById(R.id.deviceTypeView) - val wellCodeView = v.findViewById(R.id.wellCodeView) - val ownerShipView = v.findViewById(R.id.ownerShipView) - val locationView = v.findViewById(R.id.locationView) + val deviceCodeView = infoWindow!!.findViewById(R.id.deviceCodeView) + val deviceModelView = infoWindow!!.findViewById(R.id.deviceModelView) + val deviceTypeView = infoWindow!!.findViewById(R.id.deviceTypeView) + val wellCodeView = infoWindow!!.findViewById(R.id.wellCodeView) + val ownerShipView = infoWindow!!.findViewById(R.id.ownerShipView) + val locationView = infoWindow!!.findViewById(R.id.locationView) //绑定数据 val clickedLatLng = marker?.position!! @@ -252,7 +266,34 @@ deviceTypeView.text = String.format("设备类型: ${device.deviceTypeName}") wellCodeView.text = String.format("井编号: ${device.wellCode}") ownerShipView.text = String.format("所属单位: ${device.deptName}") - locationView.text = String.format("详细位置: ${device.position}") + + val temp = String.format("详细位置: ${device.position}") + val textPaint = ownerShipView.paint + if (textPaint.measureText(temp) <= availableWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + locationView.text = temp + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + val wordWidth = textPaint.measureText(temp, 0, 1) + val index = (availableWidth / wordWidth).toInt() + val strings = temp.split("") + val newTextBuilder = StringBuilder() + for (i in strings.indices) { + if (i == index) { + newTextBuilder.append(strings[i]).append("\n") + } else { + newTextBuilder.append(strings[i]) + } + } + locationView.text = newTextBuilder + //动态设置infoWindow宽高 + infoWindow!!.layoutParams = LinearLayout.LayoutParams( + availableWidth, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } return infoWindow } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt new file mode 100644 index 0000000..1f1b5de --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderManagementActivity.kt @@ -0,0 +1,47 @@ +package com.casic.qd.smartwell.view + +import androidx.fragment.app.Fragment +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.TopViewPagerAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.navigatePageTo +import com.casic.qd.smartwell.fragment.OrderCompletedFragment +import com.casic.qd.smartwell.fragment.OrderInHandleFragment +import com.casic.qd.smartwell.fragment.OrderNotConfirmedFragment +import com.casic.qd.smartwell.fragment.OrderNotProcessedFragment +import com.casic.qd.smartwell.utils.Constant +import kotlinx.android.synthetic.main.activity_order_management.* +import java.util.* + +class OrderManagementActivity : BaseActivity() { + + private var fragmentList: ArrayList = ArrayList() + + init { + fragmentList.add(OrderNotProcessedFragment())//待处理 + fragmentList.add(OrderNotConfirmedFragment())//待确认 + fragmentList.add(OrderInHandleFragment())//处理中 + fragmentList.add(OrderCompletedFragment())//已完成 + } + + override fun initLayoutView(): Int = R.layout.activity_order_management + + override fun setupTopBarLayout() { + titleView.text = "工单管理" + } + + override fun initData() { + val topViewPagerAdapter = TopViewPagerAdapter( + supportFragmentManager, Constant.SUB_PAGE_TITLES, fragmentList + ) + orderViewPager.offscreenPageLimit = fragmentList.size + orderViewPager.adapter = topViewPagerAdapter + orderTabLayout.setupWithViewPager(orderViewPager) + } + + override fun initEvent() { + rightOptionView.setOnClickListener { + navigatePageTo() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt new file mode 100644 index 0000000..6e7e65e --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -0,0 +1,217 @@ +package com.casic.qd.smartwell.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.adapter.SearchResultAdapter +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.showEmptyPage +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.DialogHelper +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.WeakReferenceHandler +import com.casic.qd.smartwell.vm.OperationViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.TimeLineBottomSheet +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.activity_order_search_result.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_empty_view.* + +class OrderSearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var operationViewModel: OperationViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var args: ArrayList + private lateinit var searchResultAdapter: SearchResultAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_order_search_result + + override fun setupTopBarLayout() { + titleView.text = "查询结果" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + args = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + weakReferenceHandler = WeakReferenceHandler(callback) + operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + obtainSearchResult(args, pageIndex) + workOrderViewModel.listModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + resultRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show() + } + dataBeans.addAll(dataRows!!) + resultRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022040101) + } + }) + workOrderViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + resultRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + resultRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainSearchResult(args, pageIndex) + } + + //接单状态处理 + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "接单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + //通知列表刷行数据 + weakReferenceHandler.sendEmptyMessage(2022040102) + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + workOrderViewModel.detailModel.observe(this, { + if (it.code == 200) { + val orderDetail = it.data!![0] + val orderFlow = orderDetail.flow!! + if (orderFlow.size != 0) { + TimeLineBottomSheet.Builder().setContext(this) + .setFlowItems(orderFlow).build().show() + } else { + "抱歉,无法查到该工单的流转记录".show() + } + } + }) + } + + private fun obtainSearchResult(args: ArrayList, pageIndex: Int) { + workOrderViewModel.obtainSearchResult( + keywords = args[0], + alarmContent = args[1], + alarmLevel = args[2], + jobStatus = args[3], + beginTime = args[4], + endTime = args[5], + page = pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2022040102 -> { + isRefresh = true + pageIndex = 1 + obtainSearchResult(args, pageIndex) + } + 2022040101 -> { + if (isRefresh || isLoadMore) { + searchResultAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + obtainSearchResult(args, pageIndex) + } + } else { + emptyView!!.hide() + searchResultAdapter = SearchResultAdapter(this, dataBeans) + resultRecyclerView!!.layoutManager = LinearLayoutManager(this) + resultRecyclerView!!.adapter = searchResultAdapter + searchResultAdapter.setOnItemClickListener(object : + SearchResultAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } + if (dataBeans[position].jobStatus == "0") { +// navigatePageTo(jobId) + } else { +// navigatePageTo(jobId) + } + } + + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(this@OrderSearchResultActivity) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptWorkOrder(jobId) + } + + override fun onCancelClick() { + + } + }).build().show() + } + + override fun onTransferViewClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看工单流转记录".show() + return + } + workOrderViewModel.obtainWorkOrderDetail(jobId) + } + }) + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index 2b92d86..fccff95 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -145,7 +145,6 @@ }.build().show(supportFragmentManager, "all") } - searchButton.setChangeAlphaWhenPress(true) searchButton.setOnClickListener { //页面跳转,将查询参数传过去 navigatePageTo( @@ -160,7 +159,6 @@ ) } - clearButton.setChangeAlphaWhenPress(true) clearButton.setOnClickListener { wellCodeView.setText("") alarmTypeView.text = "" diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt new file mode 100644 index 0000000..a4b66b9 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchOrderActivity.kt @@ -0,0 +1,207 @@ +package com.casic.qd.smartwell.view + +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.AlarmContentModel +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.AlarmViewModel +import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import com.zhy.view.flowlayout.FlowLayout +import com.zhy.view.flowlayout.TagAdapter +import kotlinx.android.synthetic.main.activity_order_search.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class SearchOrderActivity : BaseActivity() { + + private lateinit var contentTypeViewModel: AlarmViewModel + private lateinit var workOrderViewModel: WorkOrderViewModel + private lateinit var inflater: LayoutInflater + private lateinit var contentTypeAdapter: TagAdapter + private lateinit var orderStatusAdapter: TagAdapter + private var contentModels: MutableList = ArrayList() + private var orderStatusModels: MutableList = ArrayList() + private var alarmContentType = "" + private var alarmLevel = "" + private var orderState = "" + + override fun initLayoutView(): Int = R.layout.activity_order_search + + override fun setupTopBarLayout() { + titleView.text = "工单查询" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + inflater = LayoutInflater.from(this) + //告警内容 + contentTypeViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + //工单状态 + workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) + } + + override fun initEvent() { + contentTypeViewModel.obtainAlarmContent("1") + contentTypeViewModel.contentModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = AlarmContentModel.DataBean.ListBean() + bean.value = "" + bean.name = "全部" + bean.alarmType = "" + bean.deviceType = "" + contentModels.add(bean) + + it.data!!.list?.forEach { contentTypeBean -> + contentModels.add(contentTypeBean) + } + contentTypeAdapter = + object : TagAdapter(contentModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: AlarmContentModel.DataBean.ListBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmContentLayout, false + ) as TextView + tagView.text = contentModels[position].name + return tagView + } + } + alarmContentLayout.adapter = contentTypeAdapter + contentTypeAdapter.setSelectedList(0) + alarmContentLayout.setOnTagClickListener { _, position, _ -> + this.alarmContentType = contentModels[position].value.toString() + true + } + } + }) + + val levelMaps: MutableList> = ArrayList() + for (i in 0..3) { + val map = HashMap() + map["name"] = i.toString().toChinese() + map["value"] = i.toLevel() + levelMaps.add(map) + } + val levelAdapter = object : TagAdapter>(levelMaps) { + override fun getView( + parent: FlowLayout?, + position: Int, map: Map? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + alarmLevelLayout, false + ) as TextView + tagView.text = levelMaps[position]["name"] + return tagView + } + } + alarmLevelLayout.adapter = levelAdapter + levelAdapter.setSelectedList(0) + alarmLevelLayout.setOnTagClickListener { _, position, _ -> + this.alarmLevel = levelMaps[position]["value"].toString() + true + } + + workOrderViewModel.obtainOrderStatus() + workOrderViewModel.orderStatusModel.observe(this, { + if (it.code == 200) { + //构造一个默认值 + val bean = OrderStatusModel.DataBean() + bean.name = "全部" + bean.id = "" + bean.value = "" + orderStatusModels.add(bean) + it.data!!.forEach { statusBean -> + orderStatusModels.add(statusBean) + } + orderStatusAdapter = + object : TagAdapter(orderStatusModels) { + override fun getView( + parent: FlowLayout?, + position: Int, bean: OrderStatusModel.DataBean? + ): View { + val tagView = inflater.inflate( + R.layout.item_tag_flowlayout, + orderStatusLayout, false + ) as TextView + tagView.text = orderStatusModels[position].name + return tagView + } + } + orderStatusLayout.adapter = orderStatusAdapter + orderStatusAdapter.setSelectedList(0) + orderStatusLayout.setOnTagClickListener { _, position, _ -> + this.orderState = orderStatusModels[position].value.toString() + true + } + } + }) + + startTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择开始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + startTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + endTimeView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(R.color.mainThemeColor.convertColor()) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _: TimePickerDialog?, millSeconds: Long -> + if (millSeconds.isEarlierThanStart(startTimeView.text.toString())) { + "结束时间不合法,不能早于开始时间".show() + return@setCallBack + } + endTimeView.text = millSeconds.timestampToDate() + }.build().show(supportFragmentManager, "year_month_day") + } + + searchButton.setOnClickListener { + //页面跳转,将查询参数传过去 + navigatePageTo( + addAll( + wellCodeView.text.toString().trim(), + alarmContentType, + alarmLevel, + orderState, + startTimeView.text.toString(), + endTimeView.text.toString() + ) + ) + } + + clearButton.setOnClickListener { + wellCodeView.text.clear() + contentTypeAdapter.setSelectedList(0) + levelAdapter.setSelectedList(0) + orderStatusAdapter.setSelectedList(0) + startTimeView.text = "" + endTimeView.text = "" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt index b1f9fc3..c21fe1a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/DeviceViewModel.kt @@ -112,16 +112,20 @@ }) fun obtainMapDeviceResult(keywords: String?, devType: String?) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.obtainMapDeviceResult(keywords, devType) val responseCode = response.separateResponseCode() if (responseCode == 200) { + loadState.value = LoadState.Success mapDeviceResultModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { + loadState.value = LoadState.Fail response.toErrorMessage().show() } }, { + loadState.value = LoadState.Fail it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt new file mode 100644 index 0000000..6a528a4 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt @@ -0,0 +1,83 @@ +package com.casic.qd.smartwell.vm + +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager + +/** + * 转单、接单、处理等vm + * */ +class OperationViewModel : BaseViewModel() { + + fun acceptWorkOrder(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.acceptWorkOrder(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "接单成功".show() + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun confirmWorkOrder( +// id: String, firstState: String, +// firstStatePhotos: String, needHandle: String +// ) = launch({ +// loadState.value = LoadState.Loading +// val response = +// RetrofitServiceManager.confirmWorkOrder(id, firstState, firstStatePhotos, needHandle) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单确认成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun transferWorkOrder(id: String, userId: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.transferWorkOrder(id, userId) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "转单成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +// +// fun completeWorkOrder(id: String, handleMessage: String, handlePhotos: String) = launch({ +// loadState.value = LoadState.Loading +// val response = RetrofitServiceManager.completeWorkOrder(id, handleMessage, handlePhotos) +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// loadState.value = LoadState.Success +// "工单处理成功".show() +// } else { +// loadState.value = LoadState.Fail +// response.toErrorMessage().show() +// } +// }, { +// loadState.value = LoadState.Fail +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt new file mode 100644 index 0000000..411c9a8 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WorkOrderViewModel.kt @@ -0,0 +1,105 @@ +package com.casic.qd.smartwell.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.qd.smartwell.base.BaseViewModel +import com.casic.qd.smartwell.extensions.launch +import com.casic.qd.smartwell.extensions.separateResponseCode +import com.casic.qd.smartwell.extensions.show +import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.OrderStatusModel +import com.casic.qd.smartwell.model.SearchResultModel +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.casic.qd.smartwell.utils.LoadState +import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +class WorkOrderViewModel : BaseViewModel() { + + private val gson = Gson() + val orderStatusModel = MutableLiveData() + val listModel = MutableLiveData() + val detailModel = MutableLiveData() +// val resultModel = MutableLiveData>() + + + fun obtainOrderStatus() = launch({ + val response = RetrofitServiceManager.obtainOrderStatus() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + orderStatusModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + fun obtainSearchResult( + keywords: String?, + alarmContent: String?, + alarmLevel: String?, + jobStatus: String?, + beginTime: String?, + endTime: String?, + page: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainSearchResult( + keywords, alarmContent, alarmLevel, jobStatus, beginTime, endTime, page + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun obtainWorkOrderDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainWorkOrderDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + detailModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + +// fun countWorkOrderByState() = launch({ +// val response = RetrofitServiceManager.countWorkOrderByState() +// val responseCode = response.separateResponseCode() +// if (responseCode == 200) { +// val map = HashMap(4) +// +// val jsonObject = JSONObject(response) +// val data = jsonObject.getJSONObject("data") +// map["beforeGet"] = data.getString("beforeGet") +// map["beforeConfirm"] = data.getString("beforeConfirm") +// map["inHandle"] = data.getString("inHandle") +// map["over"] = data.getString("over") +// resultModel.value = map +// } else { +// response.toErrorMessage().show() +// } +// }, { +// it.printStackTrace() +// }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt index 39d6d09..6de33f7 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/BottomAreaSheet.kt @@ -119,7 +119,6 @@ } } - sheetConfirmButton.setChangeAlphaWhenPress(true) sheetConfirmButton.setOnClickListener { listener.onAreaSelected(areaName, areaId) dismiss() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt index 98ff307..bcd9351 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/ChangePasswordDialog.kt @@ -47,7 +47,6 @@ setCancelable(true) setCanceledOnTouchOutside(true) - confirmButton.setChangeAlphaWhenPress(true) confirmButton.setOnClickListener { val oldPwd = oldPwdView.text.toString() val newPwd = newPwdView.text.toString() @@ -66,6 +65,7 @@ } if (!newPwd.isLetterAndDigit()) { "新密码需包含数字和字母".show() + return@setOnClickListener } if (newPwd != confirmPwd) { "新密码和确认密码不一致,请检查".show() diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt new file mode 100644 index 0000000..2b3dfe7 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/TimeLineBottomSheet.kt @@ -0,0 +1,102 @@ +package com.casic.qd.smartwell.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.* +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.model.WorkOrderDetailModel +import com.pengxh.app.multilib.utils.SizeUtil + +class TimeLineBottomSheet private constructor(builder: Builder) : Dialog( + builder.context!!, R.style.ActionSheetDialogStyle +) { + private val ctx: Context = builder.context!! + private val items: MutableList = builder.items!! + + class Builder { + var context: Context? = null + var items: MutableList? = null + + fun setContext(context: Context?): Builder { + this.context = context + return this + } + + fun setFlowItems(flowItems: MutableList?): Builder { + this.items = flowItems + return this + } + + fun build(): TimeLineBottomSheet { + return TimeLineBottomSheet(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_bottom_sheet) + setCancelable(true) + setCanceledOnTouchOutside(true) + //绑定流程进展数据 + val orderFlowRecyclerView = findViewById(R.id.orderFlowRecyclerView) + orderFlowRecyclerView.layoutManager = LinearLayoutManager(ctx) + orderFlowRecyclerView.adapter = OrderFlowAdapter() + + val dismissView = findViewById(R.id.dismissView) + dismissView.setOnClickListener { + this.dismiss() + } + } + + private fun configDialogLayout() { + val window = window ?: return + window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window.decorView.setBackgroundColor(Color.TRANSPARENT) + window.setGravity(Gravity.BOTTOM) + //设置Dialog出现的动画 + window.setWindowAnimations(R.style.ActionSheetDialogAnimation) + val params = window.attributes + params.width = SizeUtil.getScreenWidth(ctx) + params.height = WindowManager.LayoutParams.WRAP_CONTENT + window.attributes = params + } + + internal inner class OrderFlowAdapter : + RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(ctx) + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OrderFlowAdapter.ItemViewHolder { + val view: View = + layoutInflater.inflate(R.layout.item_order_flow_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int = items.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = items[position] + holder.fromPersonView.text = rowsBean.from + holder.toPersonView.text = rowsBean.to + holder.transferDateView.text = rowsBean.time + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var fromPersonView: TextView = view.findViewById(R.id.fromPersonView) + var toPersonView: TextView = view.findViewById(R.id.toPersonView) + var transferDateView: TextView = view.findViewById(R.id.transferDateView) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml new file mode 100644 index 0000000..5875998 --- /dev/null +++ b/app/src/main/res/drawable/button_main_selector.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml new file mode 100644 index 0000000..a925019 --- /dev/null +++ b/app/src/main/res/drawable/button_white_selector.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_down.xml b/app/src/main/res/drawable/ic_down.xml new file mode 100644 index 0000000..20e6476 --- /dev/null +++ b/app/src/main/res/drawable/ic_down.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_work_order.xml b/app/src/main/res/drawable/ic_work_order.xml new file mode 100644 index 0000000..3c39d54 --- /dev/null +++ b/app/src/main/res/drawable/ic_work_order.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/selector_tag.xml b/app/src/main/res/drawable/selector_tag.xml new file mode 100644 index 0000000..c1fee7b --- /dev/null +++ b/app/src/main/res/drawable/selector_tag.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/selector_text.xml b/app/src/main/res/drawable/selector_text.xml new file mode 100644 index 0000000..d8c9398 --- /dev/null +++ b/app/src/main/res/drawable/selector_text.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tag_checked.xml b/app/src/main/res/drawable/tag_checked.xml new file mode 100644 index 0000000..616dcb1 --- /dev/null +++ b/app/src/main/res/drawable/tag_checked.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tag_normal.xml b/app/src/main/res/drawable/tag_normal.xml new file mode 100644 index 0000000..d38b7cc --- /dev/null +++ b/app/src/main/res/drawable/tag_normal.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/app/src/main/res/layout/activity_alarm_search.xml b/app/src/main/res/layout/activity_alarm_search.xml index 9f0c138..6baf0b5 100644 --- a/app/src/main/res/layout/activity_alarm_search.xml +++ b/app/src/main/res/layout/activity_alarm_search.xml @@ -1,6 +1,5 @@ - + android:text="清空" /> - + android:text="查询" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_data_search.xml b/app/src/main/res/layout/activity_data_search.xml index 96367b7..db46ab7 100644 --- a/app/src/main/res/layout/activity_data_search.xml +++ b/app/src/main/res/layout/activity_data_search.xml @@ -1,6 +1,5 @@ - + android:text="清空" /> - + android:text="查询" /> diff --git a/app/src/main/res/layout/activity_device_search.xml b/app/src/main/res/layout/activity_device_search.xml index 31e22dc..60cf2f2 100644 --- a/app/src/main/res/layout/activity_device_search.xml +++ b/app/src/main/res/layout/activity_device_search.xml @@ -1,6 +1,5 @@ - + android:text="清空" /> - + android:text="查询" /> diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index f1182b8..c04136f 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -64,9 +64,9 @@ android:layout_height="@dimen/lineViewSize" android:layout_centerInParent="true" /> - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_order_search.xml b/app/src/main/res/layout/activity_order_search.xml new file mode 100644 index 0000000..4cebb3e --- /dev/null +++ b/app/src/main/res/layout/activity_order_search.xml @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +