diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt index 6234d43..f8e3324 100644 --- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt +++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt @@ -32,8 +32,10 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.ExecutionException +import kotlin.math.abs /** * String扩展方法 @@ -146,6 +148,30 @@ return (t2 - t1) > 0 } +/** + * 时间差-小时 + * */ +fun String.diffCurrentTime(): Int { + if (this.isBlank()) { + return 0 + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + val diff = abs(System.currentTimeMillis() - date.time) + return (diff / (3600000)).toInt() +} + +fun String.formatToDate(): String { + if (this.isBlank()) { + return this + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + + val dateFormat = SimpleDateFormat("MM-dd", Locale.CHINA) + return dateFormat.format(date) +} + fun String.toChineseGrade(): String { if (this.isBlank()) { return "级别未知" @@ -155,7 +181,7 @@ "1" -> "B" "2" -> "C" "3" -> "D" - else -> "级别未知" + else -> "未知" } } diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt index 6234d43..f8e3324 100644 --- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt +++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt @@ -32,8 +32,10 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.ExecutionException +import kotlin.math.abs /** * String扩展方法 @@ -146,6 +148,30 @@ return (t2 - t1) > 0 } +/** + * 时间差-小时 + * */ +fun String.diffCurrentTime(): Int { + if (this.isBlank()) { + return 0 + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + val diff = abs(System.currentTimeMillis() - date.time) + return (diff / (3600000)).toInt() +} + +fun String.formatToDate(): String { + if (this.isBlank()) { + return this + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + + val dateFormat = SimpleDateFormat("MM-dd", Locale.CHINA) + return dateFormat.format(date) +} + fun String.toChineseGrade(): String { if (this.isBlank()) { return "级别未知" @@ -155,7 +181,7 @@ "1" -> "B" "2" -> "C" "3" -> "D" - else -> "级别未知" + else -> "未知" } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 66bd2e6..90c55ab 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,10 +5,15 @@ import android.widget.TextView import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.diffCurrentTime +import com.casic.xz.meterage.extensions.formatToDate +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant @@ -26,8 +31,10 @@ import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* +import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* class HomePageFragment : KotlinBaseFragment() { @@ -37,7 +44,13 @@ private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel private lateinit var userData: UserInfoModel.DataModel + private lateinit var remindAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false private var currentIndex = 0 + private var clickedPosition = 0 private val qrManager by lazy { QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) } @@ -45,12 +58,89 @@ override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } weakReferenceHandler = WeakReferenceHandler { msg -> - if (msg.what == 2023030601) { - val rowsModel = msg.obj as List + when (msg.what) { + 2023030601 -> { + val rowsModel = msg.obj as List - //TODO 添加切换动画 - noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) - currentIndex++ + //TODO 添加切换动画 + noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) + currentIndex++ + } + 2023030801 -> { + if (isRefresh || isLoadMore) { + remindAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有待办提醒") { + pageIndex = 1 + getRemindListByPage() + } + } else { + emptyView!!.hide() + remindAdapter = + object : NormalRecyclerAdapter( + R.layout.item_remind_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: RemindListModel.DataModel.RowsModel + ) { + if (position < 3) { + val deltaT = item.createTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.createTime.formatToDate() + } + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText(R.id.remindTimeView, diffTime) + } else { + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText( + R.id.remindTimeView, + item.createTime.formatToDate() + ) + } + } + } + remindRecyclerView.addItemDecoration( + DividerItemDecoration( + requireContext(), DividerItemDecoration.VERTICAL + ) + ) + remindRecyclerView.adapter = remindAdapter + remindAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: RemindListModel.DataModel.RowsModel + ) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("标记此条待办提醒?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + noticeViewModel.updateRemindStatus(t.id) + } + }).build().show() + } + }) + } + } + } } true } @@ -71,6 +161,7 @@ } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + //消息通知 noticeViewModel.noticeList.observe(this) { if (it.code == 200) { val data = it.data @@ -103,6 +194,42 @@ } } } + //待办提醒 + noticeViewModel.remindListResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + remindLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + remindLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + noticeViewModel.updateStatusResult.observe(this) { + if (it.code == 200) { + //刷新待办提醒列表 + dataBeans.removeAt(clickedPosition) + remindAdapter.notifyItemRemoved(clickedPosition) + remindAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } val homeAdapter = object : NormalRecyclerAdapter( R.layout.item_home_rv_g, LocaleConstant.HOME_FUNC_OPERATE.toList() @@ -138,6 +265,9 @@ override fun onResume() { super.onResume() noticeViewModel.getNoticeList("", "", "", "", "", 1) + + pageIndex = 1 + getRemindListByPage() } override fun initEvent() { @@ -154,6 +284,23 @@ noticeLayout.setOnClickListener { requireContext().navigatePageTo() } + + remindLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getRemindListByPage() + } + + remindLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getRemindListByPage() + } + } + + private fun getRemindListByPage() { + noticeViewModel.getRemindList("", "", "", "", "", pageIndex) } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt index 6234d43..f8e3324 100644 --- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt +++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt @@ -32,8 +32,10 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.ExecutionException +import kotlin.math.abs /** * String扩展方法 @@ -146,6 +148,30 @@ return (t2 - t1) > 0 } +/** + * 时间差-小时 + * */ +fun String.diffCurrentTime(): Int { + if (this.isBlank()) { + return 0 + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + val diff = abs(System.currentTimeMillis() - date.time) + return (diff / (3600000)).toInt() +} + +fun String.formatToDate(): String { + if (this.isBlank()) { + return this + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + + val dateFormat = SimpleDateFormat("MM-dd", Locale.CHINA) + return dateFormat.format(date) +} + fun String.toChineseGrade(): String { if (this.isBlank()) { return "级别未知" @@ -155,7 +181,7 @@ "1" -> "B" "2" -> "C" "3" -> "D" - else -> "级别未知" + else -> "未知" } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 66bd2e6..90c55ab 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,10 +5,15 @@ import android.widget.TextView import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.diffCurrentTime +import com.casic.xz.meterage.extensions.formatToDate +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant @@ -26,8 +31,10 @@ import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* +import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* class HomePageFragment : KotlinBaseFragment() { @@ -37,7 +44,13 @@ private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel private lateinit var userData: UserInfoModel.DataModel + private lateinit var remindAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false private var currentIndex = 0 + private var clickedPosition = 0 private val qrManager by lazy { QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) } @@ -45,12 +58,89 @@ override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } weakReferenceHandler = WeakReferenceHandler { msg -> - if (msg.what == 2023030601) { - val rowsModel = msg.obj as List + when (msg.what) { + 2023030601 -> { + val rowsModel = msg.obj as List - //TODO 添加切换动画 - noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) - currentIndex++ + //TODO 添加切换动画 + noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) + currentIndex++ + } + 2023030801 -> { + if (isRefresh || isLoadMore) { + remindAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有待办提醒") { + pageIndex = 1 + getRemindListByPage() + } + } else { + emptyView!!.hide() + remindAdapter = + object : NormalRecyclerAdapter( + R.layout.item_remind_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: RemindListModel.DataModel.RowsModel + ) { + if (position < 3) { + val deltaT = item.createTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.createTime.formatToDate() + } + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText(R.id.remindTimeView, diffTime) + } else { + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText( + R.id.remindTimeView, + item.createTime.formatToDate() + ) + } + } + } + remindRecyclerView.addItemDecoration( + DividerItemDecoration( + requireContext(), DividerItemDecoration.VERTICAL + ) + ) + remindRecyclerView.adapter = remindAdapter + remindAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: RemindListModel.DataModel.RowsModel + ) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("标记此条待办提醒?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + noticeViewModel.updateRemindStatus(t.id) + } + }).build().show() + } + }) + } + } + } } true } @@ -71,6 +161,7 @@ } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + //消息通知 noticeViewModel.noticeList.observe(this) { if (it.code == 200) { val data = it.data @@ -103,6 +194,42 @@ } } } + //待办提醒 + noticeViewModel.remindListResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + remindLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + remindLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + noticeViewModel.updateStatusResult.observe(this) { + if (it.code == 200) { + //刷新待办提醒列表 + dataBeans.removeAt(clickedPosition) + remindAdapter.notifyItemRemoved(clickedPosition) + remindAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } val homeAdapter = object : NormalRecyclerAdapter( R.layout.item_home_rv_g, LocaleConstant.HOME_FUNC_OPERATE.toList() @@ -138,6 +265,9 @@ override fun onResume() { super.onResume() noticeViewModel.getNoticeList("", "", "", "", "", 1) + + pageIndex = 1 + getRemindListByPage() } override fun initEvent() { @@ -154,6 +284,23 @@ noticeLayout.setOnClickListener { requireContext().navigatePageTo() } + + remindLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getRemindListByPage() + } + + remindLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getRemindListByPage() + } + } + + private fun getRemindListByPage() { + noticeViewModel.getRemindList("", "", "", "", "", pageIndex) } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java new file mode 100644 index 0000000..2158f6c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java @@ -0,0 +1,184 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class RemindListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessCode; + private String businessId; + private String createTime; + private String createUser; + private String createUserName; + private String id; + private String messageContent; + private String messageTitle; + private String messageType; + private String messageTypeName; + private String remindDeptId; + private String remindId; + private String status; + private String updateTime; + + public String getBusinessCode() { + return businessCode; + } + + public void setBusinessCode(String businessCode) { + this.businessCode = businessCode; + } + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getCreateUserName() { + return createUserName; + } + + public void setCreateUserName(String createUserName) { + this.createUserName = createUserName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMessageContent() { + return messageContent; + } + + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + + public String getMessageTitle() { + return messageTitle; + } + + public void setMessageTitle(String messageTitle) { + this.messageTitle = messageTitle; + } + + public String getMessageType() { + return messageType; + } + + public void setMessageType(String messageType) { + this.messageType = messageType; + } + + public String getMessageTypeName() { + return messageTypeName; + } + + public void setMessageTypeName(String messageTypeName) { + this.messageTypeName = messageTypeName; + } + + public String getRemindDeptId() { + return remindDeptId; + } + + public void setRemindDeptId(String remindDeptId) { + this.remindDeptId = remindDeptId; + } + + public String getRemindId() { + return remindId; + } + + public void setRemindId(String remindId) { + this.remindId = remindId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt index 6234d43..f8e3324 100644 --- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt +++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt @@ -32,8 +32,10 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.ExecutionException +import kotlin.math.abs /** * String扩展方法 @@ -146,6 +148,30 @@ return (t2 - t1) > 0 } +/** + * 时间差-小时 + * */ +fun String.diffCurrentTime(): Int { + if (this.isBlank()) { + return 0 + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + val diff = abs(System.currentTimeMillis() - date.time) + return (diff / (3600000)).toInt() +} + +fun String.formatToDate(): String { + if (this.isBlank()) { + return this + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + + val dateFormat = SimpleDateFormat("MM-dd", Locale.CHINA) + return dateFormat.format(date) +} + fun String.toChineseGrade(): String { if (this.isBlank()) { return "级别未知" @@ -155,7 +181,7 @@ "1" -> "B" "2" -> "C" "3" -> "D" - else -> "级别未知" + else -> "未知" } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 66bd2e6..90c55ab 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,10 +5,15 @@ import android.widget.TextView import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.diffCurrentTime +import com.casic.xz.meterage.extensions.formatToDate +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant @@ -26,8 +31,10 @@ import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* +import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* class HomePageFragment : KotlinBaseFragment() { @@ -37,7 +44,13 @@ private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel private lateinit var userData: UserInfoModel.DataModel + private lateinit var remindAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false private var currentIndex = 0 + private var clickedPosition = 0 private val qrManager by lazy { QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) } @@ -45,12 +58,89 @@ override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } weakReferenceHandler = WeakReferenceHandler { msg -> - if (msg.what == 2023030601) { - val rowsModel = msg.obj as List + when (msg.what) { + 2023030601 -> { + val rowsModel = msg.obj as List - //TODO 添加切换动画 - noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) - currentIndex++ + //TODO 添加切换动画 + noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) + currentIndex++ + } + 2023030801 -> { + if (isRefresh || isLoadMore) { + remindAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有待办提醒") { + pageIndex = 1 + getRemindListByPage() + } + } else { + emptyView!!.hide() + remindAdapter = + object : NormalRecyclerAdapter( + R.layout.item_remind_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: RemindListModel.DataModel.RowsModel + ) { + if (position < 3) { + val deltaT = item.createTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.createTime.formatToDate() + } + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText(R.id.remindTimeView, diffTime) + } else { + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText( + R.id.remindTimeView, + item.createTime.formatToDate() + ) + } + } + } + remindRecyclerView.addItemDecoration( + DividerItemDecoration( + requireContext(), DividerItemDecoration.VERTICAL + ) + ) + remindRecyclerView.adapter = remindAdapter + remindAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: RemindListModel.DataModel.RowsModel + ) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("标记此条待办提醒?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + noticeViewModel.updateRemindStatus(t.id) + } + }).build().show() + } + }) + } + } + } } true } @@ -71,6 +161,7 @@ } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + //消息通知 noticeViewModel.noticeList.observe(this) { if (it.code == 200) { val data = it.data @@ -103,6 +194,42 @@ } } } + //待办提醒 + noticeViewModel.remindListResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + remindLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + remindLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + noticeViewModel.updateStatusResult.observe(this) { + if (it.code == 200) { + //刷新待办提醒列表 + dataBeans.removeAt(clickedPosition) + remindAdapter.notifyItemRemoved(clickedPosition) + remindAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } val homeAdapter = object : NormalRecyclerAdapter( R.layout.item_home_rv_g, LocaleConstant.HOME_FUNC_OPERATE.toList() @@ -138,6 +265,9 @@ override fun onResume() { super.onResume() noticeViewModel.getNoticeList("", "", "", "", "", 1) + + pageIndex = 1 + getRemindListByPage() } override fun initEvent() { @@ -154,6 +284,23 @@ noticeLayout.setOnClickListener { requireContext().navigatePageTo() } + + remindLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getRemindListByPage() + } + + remindLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getRemindListByPage() + } + } + + private fun getRemindListByPage() { + noticeViewModel.getRemindList("", "", "", "", "", pageIndex) } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java new file mode 100644 index 0000000..2158f6c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java @@ -0,0 +1,184 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class RemindListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessCode; + private String businessId; + private String createTime; + private String createUser; + private String createUserName; + private String id; + private String messageContent; + private String messageTitle; + private String messageType; + private String messageTypeName; + private String remindDeptId; + private String remindId; + private String status; + private String updateTime; + + public String getBusinessCode() { + return businessCode; + } + + public void setBusinessCode(String businessCode) { + this.businessCode = businessCode; + } + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getCreateUserName() { + return createUserName; + } + + public void setCreateUserName(String createUserName) { + this.createUserName = createUserName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMessageContent() { + return messageContent; + } + + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + + public String getMessageTitle() { + return messageTitle; + } + + public void setMessageTitle(String messageTitle) { + this.messageTitle = messageTitle; + } + + public String getMessageType() { + return messageType; + } + + public void setMessageType(String messageType) { + this.messageType = messageType; + } + + public String getMessageTypeName() { + return messageTypeName; + } + + public void setMessageTypeName(String messageTypeName) { + this.messageTypeName = messageTypeName; + } + + public String getRemindDeptId() { + return remindDeptId; + } + + public void setRemindDeptId(String remindDeptId) { + this.remindDeptId = remindDeptId; + } + + public String getRemindId() { + return remindId; + } + + public void setRemindId(String remindId) { + this.remindId = remindId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3b8b208..40cfb7e 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -66,6 +66,26 @@ ): String /** + * 获取待办提醒列表 + */ + @POST("/workbench/remindMessage/list") + suspend fun getRemindList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 待办提醒已读 + */ + @POST("/workbench/remindMessage/updateStatus") + suspend fun updateRemindStatus( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取设备列表 */ @POST("/meter/assets/listPage") diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt index 6234d43..f8e3324 100644 --- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt +++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt @@ -32,8 +32,10 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.ExecutionException +import kotlin.math.abs /** * String扩展方法 @@ -146,6 +148,30 @@ return (t2 - t1) > 0 } +/** + * 时间差-小时 + * */ +fun String.diffCurrentTime(): Int { + if (this.isBlank()) { + return 0 + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + val diff = abs(System.currentTimeMillis() - date.time) + return (diff / (3600000)).toInt() +} + +fun String.formatToDate(): String { + if (this.isBlank()) { + return this + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + + val dateFormat = SimpleDateFormat("MM-dd", Locale.CHINA) + return dateFormat.format(date) +} + fun String.toChineseGrade(): String { if (this.isBlank()) { return "级别未知" @@ -155,7 +181,7 @@ "1" -> "B" "2" -> "C" "3" -> "D" - else -> "级别未知" + else -> "未知" } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 66bd2e6..90c55ab 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,10 +5,15 @@ import android.widget.TextView import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.diffCurrentTime +import com.casic.xz.meterage.extensions.formatToDate +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant @@ -26,8 +31,10 @@ import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* +import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* class HomePageFragment : KotlinBaseFragment() { @@ -37,7 +44,13 @@ private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel private lateinit var userData: UserInfoModel.DataModel + private lateinit var remindAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false private var currentIndex = 0 + private var clickedPosition = 0 private val qrManager by lazy { QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) } @@ -45,12 +58,89 @@ override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } weakReferenceHandler = WeakReferenceHandler { msg -> - if (msg.what == 2023030601) { - val rowsModel = msg.obj as List + when (msg.what) { + 2023030601 -> { + val rowsModel = msg.obj as List - //TODO 添加切换动画 - noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) - currentIndex++ + //TODO 添加切换动画 + noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) + currentIndex++ + } + 2023030801 -> { + if (isRefresh || isLoadMore) { + remindAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有待办提醒") { + pageIndex = 1 + getRemindListByPage() + } + } else { + emptyView!!.hide() + remindAdapter = + object : NormalRecyclerAdapter( + R.layout.item_remind_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: RemindListModel.DataModel.RowsModel + ) { + if (position < 3) { + val deltaT = item.createTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.createTime.formatToDate() + } + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText(R.id.remindTimeView, diffTime) + } else { + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText( + R.id.remindTimeView, + item.createTime.formatToDate() + ) + } + } + } + remindRecyclerView.addItemDecoration( + DividerItemDecoration( + requireContext(), DividerItemDecoration.VERTICAL + ) + ) + remindRecyclerView.adapter = remindAdapter + remindAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: RemindListModel.DataModel.RowsModel + ) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("标记此条待办提醒?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + noticeViewModel.updateRemindStatus(t.id) + } + }).build().show() + } + }) + } + } + } } true } @@ -71,6 +161,7 @@ } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + //消息通知 noticeViewModel.noticeList.observe(this) { if (it.code == 200) { val data = it.data @@ -103,6 +194,42 @@ } } } + //待办提醒 + noticeViewModel.remindListResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + remindLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + remindLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + noticeViewModel.updateStatusResult.observe(this) { + if (it.code == 200) { + //刷新待办提醒列表 + dataBeans.removeAt(clickedPosition) + remindAdapter.notifyItemRemoved(clickedPosition) + remindAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } val homeAdapter = object : NormalRecyclerAdapter( R.layout.item_home_rv_g, LocaleConstant.HOME_FUNC_OPERATE.toList() @@ -138,6 +265,9 @@ override fun onResume() { super.onResume() noticeViewModel.getNoticeList("", "", "", "", "", 1) + + pageIndex = 1 + getRemindListByPage() } override fun initEvent() { @@ -154,6 +284,23 @@ noticeLayout.setOnClickListener { requireContext().navigatePageTo() } + + remindLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getRemindListByPage() + } + + remindLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getRemindListByPage() + } + } + + private fun getRemindListByPage() { + noticeViewModel.getRemindList("", "", "", "", "", pageIndex) } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java new file mode 100644 index 0000000..2158f6c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java @@ -0,0 +1,184 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class RemindListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessCode; + private String businessId; + private String createTime; + private String createUser; + private String createUserName; + private String id; + private String messageContent; + private String messageTitle; + private String messageType; + private String messageTypeName; + private String remindDeptId; + private String remindId; + private String status; + private String updateTime; + + public String getBusinessCode() { + return businessCode; + } + + public void setBusinessCode(String businessCode) { + this.businessCode = businessCode; + } + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getCreateUserName() { + return createUserName; + } + + public void setCreateUserName(String createUserName) { + this.createUserName = createUserName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMessageContent() { + return messageContent; + } + + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + + public String getMessageTitle() { + return messageTitle; + } + + public void setMessageTitle(String messageTitle) { + this.messageTitle = messageTitle; + } + + public String getMessageType() { + return messageType; + } + + public void setMessageType(String messageType) { + this.messageType = messageType; + } + + public String getMessageTypeName() { + return messageTypeName; + } + + public void setMessageTypeName(String messageTypeName) { + this.messageTypeName = messageTypeName; + } + + public String getRemindDeptId() { + return remindDeptId; + } + + public void setRemindDeptId(String remindDeptId) { + this.remindDeptId = remindDeptId; + } + + public String getRemindId() { + return remindId; + } + + public void setRemindId(String remindId) { + this.remindId = remindId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3b8b208..40cfb7e 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -66,6 +66,26 @@ ): String /** + * 获取待办提醒列表 + */ + @POST("/workbench/remindMessage/list") + suspend fun getRemindList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 待办提醒已读 + */ + @POST("/workbench/remindMessage/updateStatus") + suspend fun updateRemindStatus( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取设备列表 */ @POST("/meter/assets/listPage") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 086ba97..321e780 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -121,6 +121,48 @@ } /** + * 获取待办提醒列表 + */ + suspend fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ): String { + val param = JsonObject() + param.addProperty("remindId", remindId) + param.addProperty("remindDeptId", remindDeptId) + param.addProperty("messageType", messageType) + param.addProperty("startTime", startTime) + param.addProperty("endTime", endTime) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getRemindList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 待办提醒已读 + */ + suspend fun updateRemindStatus(id: String): String { + val param = JsonObject() + param.addProperty("id", id) + param.addProperty("status", "1") + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateRemindStatus(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取设备列表 */ suspend fun getEquipmentList( diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt index 6234d43..f8e3324 100644 --- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt +++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt @@ -32,8 +32,10 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.ExecutionException +import kotlin.math.abs /** * String扩展方法 @@ -146,6 +148,30 @@ return (t2 - t1) > 0 } +/** + * 时间差-小时 + * */ +fun String.diffCurrentTime(): Int { + if (this.isBlank()) { + return 0 + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + val diff = abs(System.currentTimeMillis() - date.time) + return (diff / (3600000)).toInt() +} + +fun String.formatToDate(): String { + if (this.isBlank()) { + return this + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + + val dateFormat = SimpleDateFormat("MM-dd", Locale.CHINA) + return dateFormat.format(date) +} + fun String.toChineseGrade(): String { if (this.isBlank()) { return "级别未知" @@ -155,7 +181,7 @@ "1" -> "B" "2" -> "C" "3" -> "D" - else -> "级别未知" + else -> "未知" } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 66bd2e6..90c55ab 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,10 +5,15 @@ import android.widget.TextView import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.diffCurrentTime +import com.casic.xz.meterage.extensions.formatToDate +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant @@ -26,8 +31,10 @@ import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* +import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* class HomePageFragment : KotlinBaseFragment() { @@ -37,7 +44,13 @@ private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel private lateinit var userData: UserInfoModel.DataModel + private lateinit var remindAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false private var currentIndex = 0 + private var clickedPosition = 0 private val qrManager by lazy { QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) } @@ -45,12 +58,89 @@ override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } weakReferenceHandler = WeakReferenceHandler { msg -> - if (msg.what == 2023030601) { - val rowsModel = msg.obj as List + when (msg.what) { + 2023030601 -> { + val rowsModel = msg.obj as List - //TODO 添加切换动画 - noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) - currentIndex++ + //TODO 添加切换动画 + noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) + currentIndex++ + } + 2023030801 -> { + if (isRefresh || isLoadMore) { + remindAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有待办提醒") { + pageIndex = 1 + getRemindListByPage() + } + } else { + emptyView!!.hide() + remindAdapter = + object : NormalRecyclerAdapter( + R.layout.item_remind_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: RemindListModel.DataModel.RowsModel + ) { + if (position < 3) { + val deltaT = item.createTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.createTime.formatToDate() + } + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText(R.id.remindTimeView, diffTime) + } else { + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText( + R.id.remindTimeView, + item.createTime.formatToDate() + ) + } + } + } + remindRecyclerView.addItemDecoration( + DividerItemDecoration( + requireContext(), DividerItemDecoration.VERTICAL + ) + ) + remindRecyclerView.adapter = remindAdapter + remindAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: RemindListModel.DataModel.RowsModel + ) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("标记此条待办提醒?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + noticeViewModel.updateRemindStatus(t.id) + } + }).build().show() + } + }) + } + } + } } true } @@ -71,6 +161,7 @@ } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + //消息通知 noticeViewModel.noticeList.observe(this) { if (it.code == 200) { val data = it.data @@ -103,6 +194,42 @@ } } } + //待办提醒 + noticeViewModel.remindListResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + remindLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + remindLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + noticeViewModel.updateStatusResult.observe(this) { + if (it.code == 200) { + //刷新待办提醒列表 + dataBeans.removeAt(clickedPosition) + remindAdapter.notifyItemRemoved(clickedPosition) + remindAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } val homeAdapter = object : NormalRecyclerAdapter( R.layout.item_home_rv_g, LocaleConstant.HOME_FUNC_OPERATE.toList() @@ -138,6 +265,9 @@ override fun onResume() { super.onResume() noticeViewModel.getNoticeList("", "", "", "", "", 1) + + pageIndex = 1 + getRemindListByPage() } override fun initEvent() { @@ -154,6 +284,23 @@ noticeLayout.setOnClickListener { requireContext().navigatePageTo() } + + remindLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getRemindListByPage() + } + + remindLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getRemindListByPage() + } + } + + private fun getRemindListByPage() { + noticeViewModel.getRemindList("", "", "", "", "", pageIndex) } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java new file mode 100644 index 0000000..2158f6c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java @@ -0,0 +1,184 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class RemindListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessCode; + private String businessId; + private String createTime; + private String createUser; + private String createUserName; + private String id; + private String messageContent; + private String messageTitle; + private String messageType; + private String messageTypeName; + private String remindDeptId; + private String remindId; + private String status; + private String updateTime; + + public String getBusinessCode() { + return businessCode; + } + + public void setBusinessCode(String businessCode) { + this.businessCode = businessCode; + } + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getCreateUserName() { + return createUserName; + } + + public void setCreateUserName(String createUserName) { + this.createUserName = createUserName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMessageContent() { + return messageContent; + } + + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + + public String getMessageTitle() { + return messageTitle; + } + + public void setMessageTitle(String messageTitle) { + this.messageTitle = messageTitle; + } + + public String getMessageType() { + return messageType; + } + + public void setMessageType(String messageType) { + this.messageType = messageType; + } + + public String getMessageTypeName() { + return messageTypeName; + } + + public void setMessageTypeName(String messageTypeName) { + this.messageTypeName = messageTypeName; + } + + public String getRemindDeptId() { + return remindDeptId; + } + + public void setRemindDeptId(String remindDeptId) { + this.remindDeptId = remindDeptId; + } + + public String getRemindId() { + return remindId; + } + + public void setRemindId(String remindId) { + this.remindId = remindId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3b8b208..40cfb7e 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -66,6 +66,26 @@ ): String /** + * 获取待办提醒列表 + */ + @POST("/workbench/remindMessage/list") + suspend fun getRemindList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 待办提醒已读 + */ + @POST("/workbench/remindMessage/updateStatus") + suspend fun updateRemindStatus( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取设备列表 */ @POST("/meter/assets/listPage") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 086ba97..321e780 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -121,6 +121,48 @@ } /** + * 获取待办提醒列表 + */ + suspend fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ): String { + val param = JsonObject() + param.addProperty("remindId", remindId) + param.addProperty("remindDeptId", remindDeptId) + param.addProperty("messageType", messageType) + param.addProperty("startTime", startTime) + param.addProperty("endTime", endTime) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getRemindList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 待办提醒已读 + */ + suspend fun updateRemindStatus(id: String): String { + val param = JsonObject() + param.addProperty("id", id) + param.addProperty("status", "1") + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateRemindStatus(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取设备列表 */ suspend fun getEquipmentList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt index 885777b..98dbc87 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt @@ -135,6 +135,11 @@ } } + if (count == 0) { + "没有未读消息".show(this@NoticeListActivity) + return + } + //声明一个全是未读消息长度的空数组 val ids = arrayOfNulls(count) dataBeans.forEachIndexed { index, model -> @@ -241,10 +246,12 @@ override fun onItemClicked( position: Int, t: NoticeListModel.DataModel.RowsModel ) { - isAllRead = false - //标记被点击的item位置 - clickedPosition = position - noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + if (t.read == "0") { + isAllRead = false + //标记被点击的item位置 + clickedPosition = position + noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + } navigatePageTo(t.toJson()) } diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt index 6234d43..f8e3324 100644 --- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt +++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt @@ -32,8 +32,10 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.ExecutionException +import kotlin.math.abs /** * String扩展方法 @@ -146,6 +148,30 @@ return (t2 - t1) > 0 } +/** + * 时间差-小时 + * */ +fun String.diffCurrentTime(): Int { + if (this.isBlank()) { + return 0 + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + val diff = abs(System.currentTimeMillis() - date.time) + return (diff / (3600000)).toInt() +} + +fun String.formatToDate(): String { + if (this.isBlank()) { + return this + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + + val dateFormat = SimpleDateFormat("MM-dd", Locale.CHINA) + return dateFormat.format(date) +} + fun String.toChineseGrade(): String { if (this.isBlank()) { return "级别未知" @@ -155,7 +181,7 @@ "1" -> "B" "2" -> "C" "3" -> "D" - else -> "级别未知" + else -> "未知" } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 66bd2e6..90c55ab 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,10 +5,15 @@ import android.widget.TextView import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.diffCurrentTime +import com.casic.xz.meterage.extensions.formatToDate +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant @@ -26,8 +31,10 @@ import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* +import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* class HomePageFragment : KotlinBaseFragment() { @@ -37,7 +44,13 @@ private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel private lateinit var userData: UserInfoModel.DataModel + private lateinit var remindAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false private var currentIndex = 0 + private var clickedPosition = 0 private val qrManager by lazy { QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) } @@ -45,12 +58,89 @@ override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } weakReferenceHandler = WeakReferenceHandler { msg -> - if (msg.what == 2023030601) { - val rowsModel = msg.obj as List + when (msg.what) { + 2023030601 -> { + val rowsModel = msg.obj as List - //TODO 添加切换动画 - noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) - currentIndex++ + //TODO 添加切换动画 + noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) + currentIndex++ + } + 2023030801 -> { + if (isRefresh || isLoadMore) { + remindAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有待办提醒") { + pageIndex = 1 + getRemindListByPage() + } + } else { + emptyView!!.hide() + remindAdapter = + object : NormalRecyclerAdapter( + R.layout.item_remind_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: RemindListModel.DataModel.RowsModel + ) { + if (position < 3) { + val deltaT = item.createTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.createTime.formatToDate() + } + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText(R.id.remindTimeView, diffTime) + } else { + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText( + R.id.remindTimeView, + item.createTime.formatToDate() + ) + } + } + } + remindRecyclerView.addItemDecoration( + DividerItemDecoration( + requireContext(), DividerItemDecoration.VERTICAL + ) + ) + remindRecyclerView.adapter = remindAdapter + remindAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: RemindListModel.DataModel.RowsModel + ) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("标记此条待办提醒?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + noticeViewModel.updateRemindStatus(t.id) + } + }).build().show() + } + }) + } + } + } } true } @@ -71,6 +161,7 @@ } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + //消息通知 noticeViewModel.noticeList.observe(this) { if (it.code == 200) { val data = it.data @@ -103,6 +194,42 @@ } } } + //待办提醒 + noticeViewModel.remindListResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + remindLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + remindLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + noticeViewModel.updateStatusResult.observe(this) { + if (it.code == 200) { + //刷新待办提醒列表 + dataBeans.removeAt(clickedPosition) + remindAdapter.notifyItemRemoved(clickedPosition) + remindAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } val homeAdapter = object : NormalRecyclerAdapter( R.layout.item_home_rv_g, LocaleConstant.HOME_FUNC_OPERATE.toList() @@ -138,6 +265,9 @@ override fun onResume() { super.onResume() noticeViewModel.getNoticeList("", "", "", "", "", 1) + + pageIndex = 1 + getRemindListByPage() } override fun initEvent() { @@ -154,6 +284,23 @@ noticeLayout.setOnClickListener { requireContext().navigatePageTo() } + + remindLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getRemindListByPage() + } + + remindLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getRemindListByPage() + } + } + + private fun getRemindListByPage() { + noticeViewModel.getRemindList("", "", "", "", "", pageIndex) } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java new file mode 100644 index 0000000..2158f6c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java @@ -0,0 +1,184 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class RemindListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessCode; + private String businessId; + private String createTime; + private String createUser; + private String createUserName; + private String id; + private String messageContent; + private String messageTitle; + private String messageType; + private String messageTypeName; + private String remindDeptId; + private String remindId; + private String status; + private String updateTime; + + public String getBusinessCode() { + return businessCode; + } + + public void setBusinessCode(String businessCode) { + this.businessCode = businessCode; + } + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getCreateUserName() { + return createUserName; + } + + public void setCreateUserName(String createUserName) { + this.createUserName = createUserName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMessageContent() { + return messageContent; + } + + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + + public String getMessageTitle() { + return messageTitle; + } + + public void setMessageTitle(String messageTitle) { + this.messageTitle = messageTitle; + } + + public String getMessageType() { + return messageType; + } + + public void setMessageType(String messageType) { + this.messageType = messageType; + } + + public String getMessageTypeName() { + return messageTypeName; + } + + public void setMessageTypeName(String messageTypeName) { + this.messageTypeName = messageTypeName; + } + + public String getRemindDeptId() { + return remindDeptId; + } + + public void setRemindDeptId(String remindDeptId) { + this.remindDeptId = remindDeptId; + } + + public String getRemindId() { + return remindId; + } + + public void setRemindId(String remindId) { + this.remindId = remindId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3b8b208..40cfb7e 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -66,6 +66,26 @@ ): String /** + * 获取待办提醒列表 + */ + @POST("/workbench/remindMessage/list") + suspend fun getRemindList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 待办提醒已读 + */ + @POST("/workbench/remindMessage/updateStatus") + suspend fun updateRemindStatus( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取设备列表 */ @POST("/meter/assets/listPage") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 086ba97..321e780 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -121,6 +121,48 @@ } /** + * 获取待办提醒列表 + */ + suspend fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ): String { + val param = JsonObject() + param.addProperty("remindId", remindId) + param.addProperty("remindDeptId", remindDeptId) + param.addProperty("messageType", messageType) + param.addProperty("startTime", startTime) + param.addProperty("endTime", endTime) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getRemindList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 待办提醒已读 + */ + suspend fun updateRemindStatus(id: String): String { + val param = JsonObject() + param.addProperty("id", id) + param.addProperty("status", "1") + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateRemindStatus(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取设备列表 */ suspend fun getEquipmentList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt index 885777b..98dbc87 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt @@ -135,6 +135,11 @@ } } + if (count == 0) { + "没有未读消息".show(this@NoticeListActivity) + return + } + //声明一个全是未读消息长度的空数组 val ids = arrayOfNulls(count) dataBeans.forEachIndexed { index, model -> @@ -241,10 +246,12 @@ override fun onItemClicked( position: Int, t: NoticeListModel.DataModel.RowsModel ) { - isAllRead = false - //标记被点击的item位置 - clickedPosition = position - noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + if (t.read == "0") { + isAllRead = false + //标记被点击的item位置 + clickedPosition = position + noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + } navigatePageTo(t.toJson()) } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt index f3185b8..79f1ba6 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt @@ -32,5 +32,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt index 6234d43..f8e3324 100644 --- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt +++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt @@ -32,8 +32,10 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.ExecutionException +import kotlin.math.abs /** * String扩展方法 @@ -146,6 +148,30 @@ return (t2 - t1) > 0 } +/** + * 时间差-小时 + * */ +fun String.diffCurrentTime(): Int { + if (this.isBlank()) { + return 0 + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + val diff = abs(System.currentTimeMillis() - date.time) + return (diff / (3600000)).toInt() +} + +fun String.formatToDate(): String { + if (this.isBlank()) { + return this + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + + val dateFormat = SimpleDateFormat("MM-dd", Locale.CHINA) + return dateFormat.format(date) +} + fun String.toChineseGrade(): String { if (this.isBlank()) { return "级别未知" @@ -155,7 +181,7 @@ "1" -> "B" "2" -> "C" "3" -> "D" - else -> "级别未知" + else -> "未知" } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 66bd2e6..90c55ab 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,10 +5,15 @@ import android.widget.TextView import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.diffCurrentTime +import com.casic.xz.meterage.extensions.formatToDate +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant @@ -26,8 +31,10 @@ import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* +import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* class HomePageFragment : KotlinBaseFragment() { @@ -37,7 +44,13 @@ private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel private lateinit var userData: UserInfoModel.DataModel + private lateinit var remindAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false private var currentIndex = 0 + private var clickedPosition = 0 private val qrManager by lazy { QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) } @@ -45,12 +58,89 @@ override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } weakReferenceHandler = WeakReferenceHandler { msg -> - if (msg.what == 2023030601) { - val rowsModel = msg.obj as List + when (msg.what) { + 2023030601 -> { + val rowsModel = msg.obj as List - //TODO 添加切换动画 - noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) - currentIndex++ + //TODO 添加切换动画 + noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) + currentIndex++ + } + 2023030801 -> { + if (isRefresh || isLoadMore) { + remindAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有待办提醒") { + pageIndex = 1 + getRemindListByPage() + } + } else { + emptyView!!.hide() + remindAdapter = + object : NormalRecyclerAdapter( + R.layout.item_remind_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: RemindListModel.DataModel.RowsModel + ) { + if (position < 3) { + val deltaT = item.createTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.createTime.formatToDate() + } + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText(R.id.remindTimeView, diffTime) + } else { + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText( + R.id.remindTimeView, + item.createTime.formatToDate() + ) + } + } + } + remindRecyclerView.addItemDecoration( + DividerItemDecoration( + requireContext(), DividerItemDecoration.VERTICAL + ) + ) + remindRecyclerView.adapter = remindAdapter + remindAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: RemindListModel.DataModel.RowsModel + ) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("标记此条待办提醒?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + noticeViewModel.updateRemindStatus(t.id) + } + }).build().show() + } + }) + } + } + } } true } @@ -71,6 +161,7 @@ } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + //消息通知 noticeViewModel.noticeList.observe(this) { if (it.code == 200) { val data = it.data @@ -103,6 +194,42 @@ } } } + //待办提醒 + noticeViewModel.remindListResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + remindLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + remindLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + noticeViewModel.updateStatusResult.observe(this) { + if (it.code == 200) { + //刷新待办提醒列表 + dataBeans.removeAt(clickedPosition) + remindAdapter.notifyItemRemoved(clickedPosition) + remindAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } val homeAdapter = object : NormalRecyclerAdapter( R.layout.item_home_rv_g, LocaleConstant.HOME_FUNC_OPERATE.toList() @@ -138,6 +265,9 @@ override fun onResume() { super.onResume() noticeViewModel.getNoticeList("", "", "", "", "", 1) + + pageIndex = 1 + getRemindListByPage() } override fun initEvent() { @@ -154,6 +284,23 @@ noticeLayout.setOnClickListener { requireContext().navigatePageTo() } + + remindLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getRemindListByPage() + } + + remindLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getRemindListByPage() + } + } + + private fun getRemindListByPage() { + noticeViewModel.getRemindList("", "", "", "", "", pageIndex) } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java new file mode 100644 index 0000000..2158f6c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java @@ -0,0 +1,184 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class RemindListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessCode; + private String businessId; + private String createTime; + private String createUser; + private String createUserName; + private String id; + private String messageContent; + private String messageTitle; + private String messageType; + private String messageTypeName; + private String remindDeptId; + private String remindId; + private String status; + private String updateTime; + + public String getBusinessCode() { + return businessCode; + } + + public void setBusinessCode(String businessCode) { + this.businessCode = businessCode; + } + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getCreateUserName() { + return createUserName; + } + + public void setCreateUserName(String createUserName) { + this.createUserName = createUserName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMessageContent() { + return messageContent; + } + + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + + public String getMessageTitle() { + return messageTitle; + } + + public void setMessageTitle(String messageTitle) { + this.messageTitle = messageTitle; + } + + public String getMessageType() { + return messageType; + } + + public void setMessageType(String messageType) { + this.messageType = messageType; + } + + public String getMessageTypeName() { + return messageTypeName; + } + + public void setMessageTypeName(String messageTypeName) { + this.messageTypeName = messageTypeName; + } + + public String getRemindDeptId() { + return remindDeptId; + } + + public void setRemindDeptId(String remindDeptId) { + this.remindDeptId = remindDeptId; + } + + public String getRemindId() { + return remindId; + } + + public void setRemindId(String remindId) { + this.remindId = remindId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3b8b208..40cfb7e 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -66,6 +66,26 @@ ): String /** + * 获取待办提醒列表 + */ + @POST("/workbench/remindMessage/list") + suspend fun getRemindList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 待办提醒已读 + */ + @POST("/workbench/remindMessage/updateStatus") + suspend fun updateRemindStatus( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取设备列表 */ @POST("/meter/assets/listPage") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 086ba97..321e780 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -121,6 +121,48 @@ } /** + * 获取待办提醒列表 + */ + suspend fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ): String { + val param = JsonObject() + param.addProperty("remindId", remindId) + param.addProperty("remindDeptId", remindDeptId) + param.addProperty("messageType", messageType) + param.addProperty("startTime", startTime) + param.addProperty("endTime", endTime) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getRemindList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 待办提醒已读 + */ + suspend fun updateRemindStatus(id: String): String { + val param = JsonObject() + param.addProperty("id", id) + param.addProperty("status", "1") + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateRemindStatus(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取设备列表 */ suspend fun getEquipmentList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt index 885777b..98dbc87 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt @@ -135,6 +135,11 @@ } } + if (count == 0) { + "没有未读消息".show(this@NoticeListActivity) + return + } + //声明一个全是未读消息长度的空数组 val ids = arrayOfNulls(count) dataBeans.forEachIndexed { index, model -> @@ -241,10 +246,12 @@ override fun onItemClicked( position: Int, t: NoticeListModel.DataModel.RowsModel ) { - isAllRead = false - //标记被点击的item位置 - clickedPosition = position - noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + if (t.read == "0") { + isAllRead = false + //标记被点击的item位置 + clickedPosition = position + noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + } navigatePageTo(t.toJson()) } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt index f3185b8..79f1ba6 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt @@ -32,5 +32,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt index b40cf4f..ea92a54 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt @@ -48,6 +48,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCapabilityDetail(id: String) = launch({ @@ -66,5 +67,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt index 6234d43..f8e3324 100644 --- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt +++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt @@ -32,8 +32,10 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.ExecutionException +import kotlin.math.abs /** * String扩展方法 @@ -146,6 +148,30 @@ return (t2 - t1) > 0 } +/** + * 时间差-小时 + * */ +fun String.diffCurrentTime(): Int { + if (this.isBlank()) { + return 0 + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + val diff = abs(System.currentTimeMillis() - date.time) + return (diff / (3600000)).toInt() +} + +fun String.formatToDate(): String { + if (this.isBlank()) { + return this + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + + val dateFormat = SimpleDateFormat("MM-dd", Locale.CHINA) + return dateFormat.format(date) +} + fun String.toChineseGrade(): String { if (this.isBlank()) { return "级别未知" @@ -155,7 +181,7 @@ "1" -> "B" "2" -> "C" "3" -> "D" - else -> "级别未知" + else -> "未知" } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 66bd2e6..90c55ab 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,10 +5,15 @@ import android.widget.TextView import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.diffCurrentTime +import com.casic.xz.meterage.extensions.formatToDate +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant @@ -26,8 +31,10 @@ import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* +import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* class HomePageFragment : KotlinBaseFragment() { @@ -37,7 +44,13 @@ private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel private lateinit var userData: UserInfoModel.DataModel + private lateinit var remindAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false private var currentIndex = 0 + private var clickedPosition = 0 private val qrManager by lazy { QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) } @@ -45,12 +58,89 @@ override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } weakReferenceHandler = WeakReferenceHandler { msg -> - if (msg.what == 2023030601) { - val rowsModel = msg.obj as List + when (msg.what) { + 2023030601 -> { + val rowsModel = msg.obj as List - //TODO 添加切换动画 - noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) - currentIndex++ + //TODO 添加切换动画 + noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) + currentIndex++ + } + 2023030801 -> { + if (isRefresh || isLoadMore) { + remindAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有待办提醒") { + pageIndex = 1 + getRemindListByPage() + } + } else { + emptyView!!.hide() + remindAdapter = + object : NormalRecyclerAdapter( + R.layout.item_remind_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: RemindListModel.DataModel.RowsModel + ) { + if (position < 3) { + val deltaT = item.createTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.createTime.formatToDate() + } + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText(R.id.remindTimeView, diffTime) + } else { + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText( + R.id.remindTimeView, + item.createTime.formatToDate() + ) + } + } + } + remindRecyclerView.addItemDecoration( + DividerItemDecoration( + requireContext(), DividerItemDecoration.VERTICAL + ) + ) + remindRecyclerView.adapter = remindAdapter + remindAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: RemindListModel.DataModel.RowsModel + ) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("标记此条待办提醒?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + noticeViewModel.updateRemindStatus(t.id) + } + }).build().show() + } + }) + } + } + } } true } @@ -71,6 +161,7 @@ } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + //消息通知 noticeViewModel.noticeList.observe(this) { if (it.code == 200) { val data = it.data @@ -103,6 +194,42 @@ } } } + //待办提醒 + noticeViewModel.remindListResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + remindLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + remindLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + noticeViewModel.updateStatusResult.observe(this) { + if (it.code == 200) { + //刷新待办提醒列表 + dataBeans.removeAt(clickedPosition) + remindAdapter.notifyItemRemoved(clickedPosition) + remindAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } val homeAdapter = object : NormalRecyclerAdapter( R.layout.item_home_rv_g, LocaleConstant.HOME_FUNC_OPERATE.toList() @@ -138,6 +265,9 @@ override fun onResume() { super.onResume() noticeViewModel.getNoticeList("", "", "", "", "", 1) + + pageIndex = 1 + getRemindListByPage() } override fun initEvent() { @@ -154,6 +284,23 @@ noticeLayout.setOnClickListener { requireContext().navigatePageTo() } + + remindLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getRemindListByPage() + } + + remindLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getRemindListByPage() + } + } + + private fun getRemindListByPage() { + noticeViewModel.getRemindList("", "", "", "", "", pageIndex) } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java new file mode 100644 index 0000000..2158f6c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java @@ -0,0 +1,184 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class RemindListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessCode; + private String businessId; + private String createTime; + private String createUser; + private String createUserName; + private String id; + private String messageContent; + private String messageTitle; + private String messageType; + private String messageTypeName; + private String remindDeptId; + private String remindId; + private String status; + private String updateTime; + + public String getBusinessCode() { + return businessCode; + } + + public void setBusinessCode(String businessCode) { + this.businessCode = businessCode; + } + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getCreateUserName() { + return createUserName; + } + + public void setCreateUserName(String createUserName) { + this.createUserName = createUserName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMessageContent() { + return messageContent; + } + + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + + public String getMessageTitle() { + return messageTitle; + } + + public void setMessageTitle(String messageTitle) { + this.messageTitle = messageTitle; + } + + public String getMessageType() { + return messageType; + } + + public void setMessageType(String messageType) { + this.messageType = messageType; + } + + public String getMessageTypeName() { + return messageTypeName; + } + + public void setMessageTypeName(String messageTypeName) { + this.messageTypeName = messageTypeName; + } + + public String getRemindDeptId() { + return remindDeptId; + } + + public void setRemindDeptId(String remindDeptId) { + this.remindDeptId = remindDeptId; + } + + public String getRemindId() { + return remindId; + } + + public void setRemindId(String remindId) { + this.remindId = remindId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3b8b208..40cfb7e 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -66,6 +66,26 @@ ): String /** + * 获取待办提醒列表 + */ + @POST("/workbench/remindMessage/list") + suspend fun getRemindList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 待办提醒已读 + */ + @POST("/workbench/remindMessage/updateStatus") + suspend fun updateRemindStatus( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取设备列表 */ @POST("/meter/assets/listPage") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 086ba97..321e780 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -121,6 +121,48 @@ } /** + * 获取待办提醒列表 + */ + suspend fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ): String { + val param = JsonObject() + param.addProperty("remindId", remindId) + param.addProperty("remindDeptId", remindDeptId) + param.addProperty("messageType", messageType) + param.addProperty("startTime", startTime) + param.addProperty("endTime", endTime) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getRemindList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 待办提醒已读 + */ + suspend fun updateRemindStatus(id: String): String { + val param = JsonObject() + param.addProperty("id", id) + param.addProperty("status", "1") + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateRemindStatus(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取设备列表 */ suspend fun getEquipmentList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt index 885777b..98dbc87 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt @@ -135,6 +135,11 @@ } } + if (count == 0) { + "没有未读消息".show(this@NoticeListActivity) + return + } + //声明一个全是未读消息长度的空数组 val ids = arrayOfNulls(count) dataBeans.forEachIndexed { index, model -> @@ -241,10 +246,12 @@ override fun onItemClicked( position: Int, t: NoticeListModel.DataModel.RowsModel ) { - isAllRead = false - //标记被点击的item位置 - clickedPosition = position - noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + if (t.read == "0") { + isAllRead = false + //标记被点击的item位置 + clickedPosition = position + noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + } navigatePageTo(t.toJson()) } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt index f3185b8..79f1ba6 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt @@ -32,5 +32,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt index b40cf4f..ea92a54 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt @@ -48,6 +48,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCapabilityDetail(id: String) = launch({ @@ -66,5 +67,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt index 0b35cc1..ccfabdd 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt @@ -43,6 +43,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCustomerDetail(id: String) = launch({ @@ -61,5 +62,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt index 6234d43..f8e3324 100644 --- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt +++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt @@ -32,8 +32,10 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.ExecutionException +import kotlin.math.abs /** * String扩展方法 @@ -146,6 +148,30 @@ return (t2 - t1) > 0 } +/** + * 时间差-小时 + * */ +fun String.diffCurrentTime(): Int { + if (this.isBlank()) { + return 0 + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + val diff = abs(System.currentTimeMillis() - date.time) + return (diff / (3600000)).toInt() +} + +fun String.formatToDate(): String { + if (this.isBlank()) { + return this + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + + val dateFormat = SimpleDateFormat("MM-dd", Locale.CHINA) + return dateFormat.format(date) +} + fun String.toChineseGrade(): String { if (this.isBlank()) { return "级别未知" @@ -155,7 +181,7 @@ "1" -> "B" "2" -> "C" "3" -> "D" - else -> "级别未知" + else -> "未知" } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 66bd2e6..90c55ab 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,10 +5,15 @@ import android.widget.TextView import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.diffCurrentTime +import com.casic.xz.meterage.extensions.formatToDate +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant @@ -26,8 +31,10 @@ import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* +import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* class HomePageFragment : KotlinBaseFragment() { @@ -37,7 +44,13 @@ private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel private lateinit var userData: UserInfoModel.DataModel + private lateinit var remindAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false private var currentIndex = 0 + private var clickedPosition = 0 private val qrManager by lazy { QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) } @@ -45,12 +58,89 @@ override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } weakReferenceHandler = WeakReferenceHandler { msg -> - if (msg.what == 2023030601) { - val rowsModel = msg.obj as List + when (msg.what) { + 2023030601 -> { + val rowsModel = msg.obj as List - //TODO 添加切换动画 - noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) - currentIndex++ + //TODO 添加切换动画 + noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) + currentIndex++ + } + 2023030801 -> { + if (isRefresh || isLoadMore) { + remindAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有待办提醒") { + pageIndex = 1 + getRemindListByPage() + } + } else { + emptyView!!.hide() + remindAdapter = + object : NormalRecyclerAdapter( + R.layout.item_remind_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: RemindListModel.DataModel.RowsModel + ) { + if (position < 3) { + val deltaT = item.createTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.createTime.formatToDate() + } + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText(R.id.remindTimeView, diffTime) + } else { + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText( + R.id.remindTimeView, + item.createTime.formatToDate() + ) + } + } + } + remindRecyclerView.addItemDecoration( + DividerItemDecoration( + requireContext(), DividerItemDecoration.VERTICAL + ) + ) + remindRecyclerView.adapter = remindAdapter + remindAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: RemindListModel.DataModel.RowsModel + ) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("标记此条待办提醒?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + noticeViewModel.updateRemindStatus(t.id) + } + }).build().show() + } + }) + } + } + } } true } @@ -71,6 +161,7 @@ } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + //消息通知 noticeViewModel.noticeList.observe(this) { if (it.code == 200) { val data = it.data @@ -103,6 +194,42 @@ } } } + //待办提醒 + noticeViewModel.remindListResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + remindLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + remindLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + noticeViewModel.updateStatusResult.observe(this) { + if (it.code == 200) { + //刷新待办提醒列表 + dataBeans.removeAt(clickedPosition) + remindAdapter.notifyItemRemoved(clickedPosition) + remindAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } val homeAdapter = object : NormalRecyclerAdapter( R.layout.item_home_rv_g, LocaleConstant.HOME_FUNC_OPERATE.toList() @@ -138,6 +265,9 @@ override fun onResume() { super.onResume() noticeViewModel.getNoticeList("", "", "", "", "", 1) + + pageIndex = 1 + getRemindListByPage() } override fun initEvent() { @@ -154,6 +284,23 @@ noticeLayout.setOnClickListener { requireContext().navigatePageTo() } + + remindLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getRemindListByPage() + } + + remindLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getRemindListByPage() + } + } + + private fun getRemindListByPage() { + noticeViewModel.getRemindList("", "", "", "", "", pageIndex) } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java new file mode 100644 index 0000000..2158f6c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java @@ -0,0 +1,184 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class RemindListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessCode; + private String businessId; + private String createTime; + private String createUser; + private String createUserName; + private String id; + private String messageContent; + private String messageTitle; + private String messageType; + private String messageTypeName; + private String remindDeptId; + private String remindId; + private String status; + private String updateTime; + + public String getBusinessCode() { + return businessCode; + } + + public void setBusinessCode(String businessCode) { + this.businessCode = businessCode; + } + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getCreateUserName() { + return createUserName; + } + + public void setCreateUserName(String createUserName) { + this.createUserName = createUserName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMessageContent() { + return messageContent; + } + + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + + public String getMessageTitle() { + return messageTitle; + } + + public void setMessageTitle(String messageTitle) { + this.messageTitle = messageTitle; + } + + public String getMessageType() { + return messageType; + } + + public void setMessageType(String messageType) { + this.messageType = messageType; + } + + public String getMessageTypeName() { + return messageTypeName; + } + + public void setMessageTypeName(String messageTypeName) { + this.messageTypeName = messageTypeName; + } + + public String getRemindDeptId() { + return remindDeptId; + } + + public void setRemindDeptId(String remindDeptId) { + this.remindDeptId = remindDeptId; + } + + public String getRemindId() { + return remindId; + } + + public void setRemindId(String remindId) { + this.remindId = remindId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3b8b208..40cfb7e 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -66,6 +66,26 @@ ): String /** + * 获取待办提醒列表 + */ + @POST("/workbench/remindMessage/list") + suspend fun getRemindList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 待办提醒已读 + */ + @POST("/workbench/remindMessage/updateStatus") + suspend fun updateRemindStatus( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取设备列表 */ @POST("/meter/assets/listPage") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 086ba97..321e780 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -121,6 +121,48 @@ } /** + * 获取待办提醒列表 + */ + suspend fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ): String { + val param = JsonObject() + param.addProperty("remindId", remindId) + param.addProperty("remindDeptId", remindDeptId) + param.addProperty("messageType", messageType) + param.addProperty("startTime", startTime) + param.addProperty("endTime", endTime) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getRemindList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 待办提醒已读 + */ + suspend fun updateRemindStatus(id: String): String { + val param = JsonObject() + param.addProperty("id", id) + param.addProperty("status", "1") + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateRemindStatus(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取设备列表 */ suspend fun getEquipmentList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt index 885777b..98dbc87 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt @@ -135,6 +135,11 @@ } } + if (count == 0) { + "没有未读消息".show(this@NoticeListActivity) + return + } + //声明一个全是未读消息长度的空数组 val ids = arrayOfNulls(count) dataBeans.forEachIndexed { index, model -> @@ -241,10 +246,12 @@ override fun onItemClicked( position: Int, t: NoticeListModel.DataModel.RowsModel ) { - isAllRead = false - //标记被点击的item位置 - clickedPosition = position - noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + if (t.read == "0") { + isAllRead = false + //标记被点击的item位置 + clickedPosition = position + noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + } navigatePageTo(t.toJson()) } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt index f3185b8..79f1ba6 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt @@ -32,5 +32,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt index b40cf4f..ea92a54 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt @@ -48,6 +48,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCapabilityDetail(id: String) = launch({ @@ -66,5 +67,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt index 0b35cc1..ccfabdd 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt @@ -43,6 +43,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCustomerDetail(id: String) = launch({ @@ -61,5 +62,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt index 2997f78..bcf278a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt @@ -29,5 +29,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt index 6234d43..f8e3324 100644 --- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt +++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt @@ -32,8 +32,10 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.ExecutionException +import kotlin.math.abs /** * String扩展方法 @@ -146,6 +148,30 @@ return (t2 - t1) > 0 } +/** + * 时间差-小时 + * */ +fun String.diffCurrentTime(): Int { + if (this.isBlank()) { + return 0 + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + val diff = abs(System.currentTimeMillis() - date.time) + return (diff / (3600000)).toInt() +} + +fun String.formatToDate(): String { + if (this.isBlank()) { + return this + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + + val dateFormat = SimpleDateFormat("MM-dd", Locale.CHINA) + return dateFormat.format(date) +} + fun String.toChineseGrade(): String { if (this.isBlank()) { return "级别未知" @@ -155,7 +181,7 @@ "1" -> "B" "2" -> "C" "3" -> "D" - else -> "级别未知" + else -> "未知" } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 66bd2e6..90c55ab 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,10 +5,15 @@ import android.widget.TextView import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.diffCurrentTime +import com.casic.xz.meterage.extensions.formatToDate +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant @@ -26,8 +31,10 @@ import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* +import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* class HomePageFragment : KotlinBaseFragment() { @@ -37,7 +44,13 @@ private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel private lateinit var userData: UserInfoModel.DataModel + private lateinit var remindAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false private var currentIndex = 0 + private var clickedPosition = 0 private val qrManager by lazy { QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) } @@ -45,12 +58,89 @@ override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } weakReferenceHandler = WeakReferenceHandler { msg -> - if (msg.what == 2023030601) { - val rowsModel = msg.obj as List + when (msg.what) { + 2023030601 -> { + val rowsModel = msg.obj as List - //TODO 添加切换动画 - noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) - currentIndex++ + //TODO 添加切换动画 + noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) + currentIndex++ + } + 2023030801 -> { + if (isRefresh || isLoadMore) { + remindAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有待办提醒") { + pageIndex = 1 + getRemindListByPage() + } + } else { + emptyView!!.hide() + remindAdapter = + object : NormalRecyclerAdapter( + R.layout.item_remind_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: RemindListModel.DataModel.RowsModel + ) { + if (position < 3) { + val deltaT = item.createTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.createTime.formatToDate() + } + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText(R.id.remindTimeView, diffTime) + } else { + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText( + R.id.remindTimeView, + item.createTime.formatToDate() + ) + } + } + } + remindRecyclerView.addItemDecoration( + DividerItemDecoration( + requireContext(), DividerItemDecoration.VERTICAL + ) + ) + remindRecyclerView.adapter = remindAdapter + remindAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: RemindListModel.DataModel.RowsModel + ) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("标记此条待办提醒?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + noticeViewModel.updateRemindStatus(t.id) + } + }).build().show() + } + }) + } + } + } } true } @@ -71,6 +161,7 @@ } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + //消息通知 noticeViewModel.noticeList.observe(this) { if (it.code == 200) { val data = it.data @@ -103,6 +194,42 @@ } } } + //待办提醒 + noticeViewModel.remindListResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + remindLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + remindLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + noticeViewModel.updateStatusResult.observe(this) { + if (it.code == 200) { + //刷新待办提醒列表 + dataBeans.removeAt(clickedPosition) + remindAdapter.notifyItemRemoved(clickedPosition) + remindAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } val homeAdapter = object : NormalRecyclerAdapter( R.layout.item_home_rv_g, LocaleConstant.HOME_FUNC_OPERATE.toList() @@ -138,6 +265,9 @@ override fun onResume() { super.onResume() noticeViewModel.getNoticeList("", "", "", "", "", 1) + + pageIndex = 1 + getRemindListByPage() } override fun initEvent() { @@ -154,6 +284,23 @@ noticeLayout.setOnClickListener { requireContext().navigatePageTo() } + + remindLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getRemindListByPage() + } + + remindLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getRemindListByPage() + } + } + + private fun getRemindListByPage() { + noticeViewModel.getRemindList("", "", "", "", "", pageIndex) } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java new file mode 100644 index 0000000..2158f6c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java @@ -0,0 +1,184 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class RemindListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessCode; + private String businessId; + private String createTime; + private String createUser; + private String createUserName; + private String id; + private String messageContent; + private String messageTitle; + private String messageType; + private String messageTypeName; + private String remindDeptId; + private String remindId; + private String status; + private String updateTime; + + public String getBusinessCode() { + return businessCode; + } + + public void setBusinessCode(String businessCode) { + this.businessCode = businessCode; + } + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getCreateUserName() { + return createUserName; + } + + public void setCreateUserName(String createUserName) { + this.createUserName = createUserName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMessageContent() { + return messageContent; + } + + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + + public String getMessageTitle() { + return messageTitle; + } + + public void setMessageTitle(String messageTitle) { + this.messageTitle = messageTitle; + } + + public String getMessageType() { + return messageType; + } + + public void setMessageType(String messageType) { + this.messageType = messageType; + } + + public String getMessageTypeName() { + return messageTypeName; + } + + public void setMessageTypeName(String messageTypeName) { + this.messageTypeName = messageTypeName; + } + + public String getRemindDeptId() { + return remindDeptId; + } + + public void setRemindDeptId(String remindDeptId) { + this.remindDeptId = remindDeptId; + } + + public String getRemindId() { + return remindId; + } + + public void setRemindId(String remindId) { + this.remindId = remindId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3b8b208..40cfb7e 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -66,6 +66,26 @@ ): String /** + * 获取待办提醒列表 + */ + @POST("/workbench/remindMessage/list") + suspend fun getRemindList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 待办提醒已读 + */ + @POST("/workbench/remindMessage/updateStatus") + suspend fun updateRemindStatus( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取设备列表 */ @POST("/meter/assets/listPage") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 086ba97..321e780 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -121,6 +121,48 @@ } /** + * 获取待办提醒列表 + */ + suspend fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ): String { + val param = JsonObject() + param.addProperty("remindId", remindId) + param.addProperty("remindDeptId", remindDeptId) + param.addProperty("messageType", messageType) + param.addProperty("startTime", startTime) + param.addProperty("endTime", endTime) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getRemindList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 待办提醒已读 + */ + suspend fun updateRemindStatus(id: String): String { + val param = JsonObject() + param.addProperty("id", id) + param.addProperty("status", "1") + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateRemindStatus(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取设备列表 */ suspend fun getEquipmentList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt index 885777b..98dbc87 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt @@ -135,6 +135,11 @@ } } + if (count == 0) { + "没有未读消息".show(this@NoticeListActivity) + return + } + //声明一个全是未读消息长度的空数组 val ids = arrayOfNulls(count) dataBeans.forEachIndexed { index, model -> @@ -241,10 +246,12 @@ override fun onItemClicked( position: Int, t: NoticeListModel.DataModel.RowsModel ) { - isAllRead = false - //标记被点击的item位置 - clickedPosition = position - noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + if (t.read == "0") { + isAllRead = false + //标记被点击的item位置 + clickedPosition = position + noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + } navigatePageTo(t.toJson()) } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt index f3185b8..79f1ba6 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt @@ -32,5 +32,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt index b40cf4f..ea92a54 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt @@ -48,6 +48,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCapabilityDetail(id: String) = launch({ @@ -66,5 +67,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt index 0b35cc1..ccfabdd 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt @@ -43,6 +43,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCustomerDetail(id: String) = launch({ @@ -61,5 +62,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt index 2997f78..bcf278a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt @@ -29,5 +29,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt index 0545762..5ccba03 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt @@ -64,6 +64,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEntrustDetail(id: String) = launch({ @@ -82,6 +83,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun acceptEntrust(id: String) = launch({ @@ -100,6 +102,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun returnEntrust(id: String, selected: ArrayList) = launch({ @@ -118,6 +121,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun addEntrust( @@ -164,6 +168,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEntrustLog(id: String) = launch({ @@ -178,5 +183,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt index 6234d43..f8e3324 100644 --- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt +++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt @@ -32,8 +32,10 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.ExecutionException +import kotlin.math.abs /** * String扩展方法 @@ -146,6 +148,30 @@ return (t2 - t1) > 0 } +/** + * 时间差-小时 + * */ +fun String.diffCurrentTime(): Int { + if (this.isBlank()) { + return 0 + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + val diff = abs(System.currentTimeMillis() - date.time) + return (diff / (3600000)).toInt() +} + +fun String.formatToDate(): String { + if (this.isBlank()) { + return this + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + + val dateFormat = SimpleDateFormat("MM-dd", Locale.CHINA) + return dateFormat.format(date) +} + fun String.toChineseGrade(): String { if (this.isBlank()) { return "级别未知" @@ -155,7 +181,7 @@ "1" -> "B" "2" -> "C" "3" -> "D" - else -> "级别未知" + else -> "未知" } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 66bd2e6..90c55ab 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,10 +5,15 @@ import android.widget.TextView import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.diffCurrentTime +import com.casic.xz.meterage.extensions.formatToDate +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant @@ -26,8 +31,10 @@ import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* +import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* class HomePageFragment : KotlinBaseFragment() { @@ -37,7 +44,13 @@ private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel private lateinit var userData: UserInfoModel.DataModel + private lateinit var remindAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false private var currentIndex = 0 + private var clickedPosition = 0 private val qrManager by lazy { QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) } @@ -45,12 +58,89 @@ override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } weakReferenceHandler = WeakReferenceHandler { msg -> - if (msg.what == 2023030601) { - val rowsModel = msg.obj as List + when (msg.what) { + 2023030601 -> { + val rowsModel = msg.obj as List - //TODO 添加切换动画 - noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) - currentIndex++ + //TODO 添加切换动画 + noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) + currentIndex++ + } + 2023030801 -> { + if (isRefresh || isLoadMore) { + remindAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有待办提醒") { + pageIndex = 1 + getRemindListByPage() + } + } else { + emptyView!!.hide() + remindAdapter = + object : NormalRecyclerAdapter( + R.layout.item_remind_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: RemindListModel.DataModel.RowsModel + ) { + if (position < 3) { + val deltaT = item.createTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.createTime.formatToDate() + } + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText(R.id.remindTimeView, diffTime) + } else { + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText( + R.id.remindTimeView, + item.createTime.formatToDate() + ) + } + } + } + remindRecyclerView.addItemDecoration( + DividerItemDecoration( + requireContext(), DividerItemDecoration.VERTICAL + ) + ) + remindRecyclerView.adapter = remindAdapter + remindAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: RemindListModel.DataModel.RowsModel + ) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("标记此条待办提醒?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + noticeViewModel.updateRemindStatus(t.id) + } + }).build().show() + } + }) + } + } + } } true } @@ -71,6 +161,7 @@ } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + //消息通知 noticeViewModel.noticeList.observe(this) { if (it.code == 200) { val data = it.data @@ -103,6 +194,42 @@ } } } + //待办提醒 + noticeViewModel.remindListResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + remindLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + remindLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + noticeViewModel.updateStatusResult.observe(this) { + if (it.code == 200) { + //刷新待办提醒列表 + dataBeans.removeAt(clickedPosition) + remindAdapter.notifyItemRemoved(clickedPosition) + remindAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } val homeAdapter = object : NormalRecyclerAdapter( R.layout.item_home_rv_g, LocaleConstant.HOME_FUNC_OPERATE.toList() @@ -138,6 +265,9 @@ override fun onResume() { super.onResume() noticeViewModel.getNoticeList("", "", "", "", "", 1) + + pageIndex = 1 + getRemindListByPage() } override fun initEvent() { @@ -154,6 +284,23 @@ noticeLayout.setOnClickListener { requireContext().navigatePageTo() } + + remindLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getRemindListByPage() + } + + remindLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getRemindListByPage() + } + } + + private fun getRemindListByPage() { + noticeViewModel.getRemindList("", "", "", "", "", pageIndex) } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java new file mode 100644 index 0000000..2158f6c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java @@ -0,0 +1,184 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class RemindListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessCode; + private String businessId; + private String createTime; + private String createUser; + private String createUserName; + private String id; + private String messageContent; + private String messageTitle; + private String messageType; + private String messageTypeName; + private String remindDeptId; + private String remindId; + private String status; + private String updateTime; + + public String getBusinessCode() { + return businessCode; + } + + public void setBusinessCode(String businessCode) { + this.businessCode = businessCode; + } + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getCreateUserName() { + return createUserName; + } + + public void setCreateUserName(String createUserName) { + this.createUserName = createUserName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMessageContent() { + return messageContent; + } + + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + + public String getMessageTitle() { + return messageTitle; + } + + public void setMessageTitle(String messageTitle) { + this.messageTitle = messageTitle; + } + + public String getMessageType() { + return messageType; + } + + public void setMessageType(String messageType) { + this.messageType = messageType; + } + + public String getMessageTypeName() { + return messageTypeName; + } + + public void setMessageTypeName(String messageTypeName) { + this.messageTypeName = messageTypeName; + } + + public String getRemindDeptId() { + return remindDeptId; + } + + public void setRemindDeptId(String remindDeptId) { + this.remindDeptId = remindDeptId; + } + + public String getRemindId() { + return remindId; + } + + public void setRemindId(String remindId) { + this.remindId = remindId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3b8b208..40cfb7e 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -66,6 +66,26 @@ ): String /** + * 获取待办提醒列表 + */ + @POST("/workbench/remindMessage/list") + suspend fun getRemindList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 待办提醒已读 + */ + @POST("/workbench/remindMessage/updateStatus") + suspend fun updateRemindStatus( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取设备列表 */ @POST("/meter/assets/listPage") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 086ba97..321e780 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -121,6 +121,48 @@ } /** + * 获取待办提醒列表 + */ + suspend fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ): String { + val param = JsonObject() + param.addProperty("remindId", remindId) + param.addProperty("remindDeptId", remindDeptId) + param.addProperty("messageType", messageType) + param.addProperty("startTime", startTime) + param.addProperty("endTime", endTime) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getRemindList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 待办提醒已读 + */ + suspend fun updateRemindStatus(id: String): String { + val param = JsonObject() + param.addProperty("id", id) + param.addProperty("status", "1") + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateRemindStatus(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取设备列表 */ suspend fun getEquipmentList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt index 885777b..98dbc87 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt @@ -135,6 +135,11 @@ } } + if (count == 0) { + "没有未读消息".show(this@NoticeListActivity) + return + } + //声明一个全是未读消息长度的空数组 val ids = arrayOfNulls(count) dataBeans.forEachIndexed { index, model -> @@ -241,10 +246,12 @@ override fun onItemClicked( position: Int, t: NoticeListModel.DataModel.RowsModel ) { - isAllRead = false - //标记被点击的item位置 - clickedPosition = position - noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + if (t.read == "0") { + isAllRead = false + //标记被点击的item位置 + clickedPosition = position + noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + } navigatePageTo(t.toJson()) } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt index f3185b8..79f1ba6 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt @@ -32,5 +32,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt index b40cf4f..ea92a54 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt @@ -48,6 +48,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCapabilityDetail(id: String) = launch({ @@ -66,5 +67,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt index 0b35cc1..ccfabdd 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt @@ -43,6 +43,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCustomerDetail(id: String) = launch({ @@ -61,5 +62,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt index 2997f78..bcf278a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt @@ -29,5 +29,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt index 0545762..5ccba03 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt @@ -64,6 +64,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEntrustDetail(id: String) = launch({ @@ -82,6 +83,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun acceptEntrust(id: String) = launch({ @@ -100,6 +102,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun returnEntrust(id: String, selected: ArrayList) = launch({ @@ -118,6 +121,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun addEntrust( @@ -164,6 +168,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEntrustLog(id: String) = launch({ @@ -178,5 +183,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt index 3613dda..c7a2e22 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt @@ -77,6 +77,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentDetail(id: String) = launch({ @@ -95,6 +96,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getStandardDeviceList( @@ -131,6 +133,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getStandardDeviceDetail(id: String) = launch({ @@ -149,6 +152,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getSupportEquipmentList(id: String) = launch({ @@ -167,6 +171,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentStateChangeLog(id: String) = launch({ @@ -185,6 +190,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentUsageRecord(id: String) = launch({ @@ -203,5 +209,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt index 6234d43..f8e3324 100644 --- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt +++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt @@ -32,8 +32,10 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.ExecutionException +import kotlin.math.abs /** * String扩展方法 @@ -146,6 +148,30 @@ return (t2 - t1) > 0 } +/** + * 时间差-小时 + * */ +fun String.diffCurrentTime(): Int { + if (this.isBlank()) { + return 0 + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + val diff = abs(System.currentTimeMillis() - date.time) + return (diff / (3600000)).toInt() +} + +fun String.formatToDate(): String { + if (this.isBlank()) { + return this + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + + val dateFormat = SimpleDateFormat("MM-dd", Locale.CHINA) + return dateFormat.format(date) +} + fun String.toChineseGrade(): String { if (this.isBlank()) { return "级别未知" @@ -155,7 +181,7 @@ "1" -> "B" "2" -> "C" "3" -> "D" - else -> "级别未知" + else -> "未知" } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 66bd2e6..90c55ab 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,10 +5,15 @@ import android.widget.TextView import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.diffCurrentTime +import com.casic.xz.meterage.extensions.formatToDate +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant @@ -26,8 +31,10 @@ import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* +import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* class HomePageFragment : KotlinBaseFragment() { @@ -37,7 +44,13 @@ private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel private lateinit var userData: UserInfoModel.DataModel + private lateinit var remindAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false private var currentIndex = 0 + private var clickedPosition = 0 private val qrManager by lazy { QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) } @@ -45,12 +58,89 @@ override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } weakReferenceHandler = WeakReferenceHandler { msg -> - if (msg.what == 2023030601) { - val rowsModel = msg.obj as List + when (msg.what) { + 2023030601 -> { + val rowsModel = msg.obj as List - //TODO 添加切换动画 - noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) - currentIndex++ + //TODO 添加切换动画 + noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) + currentIndex++ + } + 2023030801 -> { + if (isRefresh || isLoadMore) { + remindAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有待办提醒") { + pageIndex = 1 + getRemindListByPage() + } + } else { + emptyView!!.hide() + remindAdapter = + object : NormalRecyclerAdapter( + R.layout.item_remind_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: RemindListModel.DataModel.RowsModel + ) { + if (position < 3) { + val deltaT = item.createTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.createTime.formatToDate() + } + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText(R.id.remindTimeView, diffTime) + } else { + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText( + R.id.remindTimeView, + item.createTime.formatToDate() + ) + } + } + } + remindRecyclerView.addItemDecoration( + DividerItemDecoration( + requireContext(), DividerItemDecoration.VERTICAL + ) + ) + remindRecyclerView.adapter = remindAdapter + remindAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: RemindListModel.DataModel.RowsModel + ) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("标记此条待办提醒?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + noticeViewModel.updateRemindStatus(t.id) + } + }).build().show() + } + }) + } + } + } } true } @@ -71,6 +161,7 @@ } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + //消息通知 noticeViewModel.noticeList.observe(this) { if (it.code == 200) { val data = it.data @@ -103,6 +194,42 @@ } } } + //待办提醒 + noticeViewModel.remindListResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + remindLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + remindLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + noticeViewModel.updateStatusResult.observe(this) { + if (it.code == 200) { + //刷新待办提醒列表 + dataBeans.removeAt(clickedPosition) + remindAdapter.notifyItemRemoved(clickedPosition) + remindAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } val homeAdapter = object : NormalRecyclerAdapter( R.layout.item_home_rv_g, LocaleConstant.HOME_FUNC_OPERATE.toList() @@ -138,6 +265,9 @@ override fun onResume() { super.onResume() noticeViewModel.getNoticeList("", "", "", "", "", 1) + + pageIndex = 1 + getRemindListByPage() } override fun initEvent() { @@ -154,6 +284,23 @@ noticeLayout.setOnClickListener { requireContext().navigatePageTo() } + + remindLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getRemindListByPage() + } + + remindLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getRemindListByPage() + } + } + + private fun getRemindListByPage() { + noticeViewModel.getRemindList("", "", "", "", "", pageIndex) } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java new file mode 100644 index 0000000..2158f6c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java @@ -0,0 +1,184 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class RemindListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessCode; + private String businessId; + private String createTime; + private String createUser; + private String createUserName; + private String id; + private String messageContent; + private String messageTitle; + private String messageType; + private String messageTypeName; + private String remindDeptId; + private String remindId; + private String status; + private String updateTime; + + public String getBusinessCode() { + return businessCode; + } + + public void setBusinessCode(String businessCode) { + this.businessCode = businessCode; + } + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getCreateUserName() { + return createUserName; + } + + public void setCreateUserName(String createUserName) { + this.createUserName = createUserName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMessageContent() { + return messageContent; + } + + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + + public String getMessageTitle() { + return messageTitle; + } + + public void setMessageTitle(String messageTitle) { + this.messageTitle = messageTitle; + } + + public String getMessageType() { + return messageType; + } + + public void setMessageType(String messageType) { + this.messageType = messageType; + } + + public String getMessageTypeName() { + return messageTypeName; + } + + public void setMessageTypeName(String messageTypeName) { + this.messageTypeName = messageTypeName; + } + + public String getRemindDeptId() { + return remindDeptId; + } + + public void setRemindDeptId(String remindDeptId) { + this.remindDeptId = remindDeptId; + } + + public String getRemindId() { + return remindId; + } + + public void setRemindId(String remindId) { + this.remindId = remindId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3b8b208..40cfb7e 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -66,6 +66,26 @@ ): String /** + * 获取待办提醒列表 + */ + @POST("/workbench/remindMessage/list") + suspend fun getRemindList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 待办提醒已读 + */ + @POST("/workbench/remindMessage/updateStatus") + suspend fun updateRemindStatus( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取设备列表 */ @POST("/meter/assets/listPage") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 086ba97..321e780 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -121,6 +121,48 @@ } /** + * 获取待办提醒列表 + */ + suspend fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ): String { + val param = JsonObject() + param.addProperty("remindId", remindId) + param.addProperty("remindDeptId", remindDeptId) + param.addProperty("messageType", messageType) + param.addProperty("startTime", startTime) + param.addProperty("endTime", endTime) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getRemindList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 待办提醒已读 + */ + suspend fun updateRemindStatus(id: String): String { + val param = JsonObject() + param.addProperty("id", id) + param.addProperty("status", "1") + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateRemindStatus(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取设备列表 */ suspend fun getEquipmentList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt index 885777b..98dbc87 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt @@ -135,6 +135,11 @@ } } + if (count == 0) { + "没有未读消息".show(this@NoticeListActivity) + return + } + //声明一个全是未读消息长度的空数组 val ids = arrayOfNulls(count) dataBeans.forEachIndexed { index, model -> @@ -241,10 +246,12 @@ override fun onItemClicked( position: Int, t: NoticeListModel.DataModel.RowsModel ) { - isAllRead = false - //标记被点击的item位置 - clickedPosition = position - noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + if (t.read == "0") { + isAllRead = false + //标记被点击的item位置 + clickedPosition = position + noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + } navigatePageTo(t.toJson()) } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt index f3185b8..79f1ba6 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt @@ -32,5 +32,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt index b40cf4f..ea92a54 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt @@ -48,6 +48,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCapabilityDetail(id: String) = launch({ @@ -66,5 +67,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt index 0b35cc1..ccfabdd 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt @@ -43,6 +43,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCustomerDetail(id: String) = launch({ @@ -61,5 +62,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt index 2997f78..bcf278a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt @@ -29,5 +29,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt index 0545762..5ccba03 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt @@ -64,6 +64,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEntrustDetail(id: String) = launch({ @@ -82,6 +83,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun acceptEntrust(id: String) = launch({ @@ -100,6 +102,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun returnEntrust(id: String, selected: ArrayList) = launch({ @@ -118,6 +121,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun addEntrust( @@ -164,6 +168,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEntrustLog(id: String) = launch({ @@ -178,5 +183,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt index 3613dda..c7a2e22 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt @@ -77,6 +77,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentDetail(id: String) = launch({ @@ -95,6 +96,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getStandardDeviceList( @@ -131,6 +133,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getStandardDeviceDetail(id: String) = launch({ @@ -149,6 +152,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getSupportEquipmentList(id: String) = launch({ @@ -167,6 +171,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentStateChangeLog(id: String) = launch({ @@ -185,6 +190,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentUsageRecord(id: String) = launch({ @@ -203,5 +209,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt index b16c1c7..d88fa37 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt @@ -36,5 +36,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt index 6234d43..f8e3324 100644 --- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt +++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt @@ -32,8 +32,10 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.ExecutionException +import kotlin.math.abs /** * String扩展方法 @@ -146,6 +148,30 @@ return (t2 - t1) > 0 } +/** + * 时间差-小时 + * */ +fun String.diffCurrentTime(): Int { + if (this.isBlank()) { + return 0 + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + val diff = abs(System.currentTimeMillis() - date.time) + return (diff / (3600000)).toInt() +} + +fun String.formatToDate(): String { + if (this.isBlank()) { + return this + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + + val dateFormat = SimpleDateFormat("MM-dd", Locale.CHINA) + return dateFormat.format(date) +} + fun String.toChineseGrade(): String { if (this.isBlank()) { return "级别未知" @@ -155,7 +181,7 @@ "1" -> "B" "2" -> "C" "3" -> "D" - else -> "级别未知" + else -> "未知" } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 66bd2e6..90c55ab 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,10 +5,15 @@ import android.widget.TextView import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.diffCurrentTime +import com.casic.xz.meterage.extensions.formatToDate +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant @@ -26,8 +31,10 @@ import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* +import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* class HomePageFragment : KotlinBaseFragment() { @@ -37,7 +44,13 @@ private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel private lateinit var userData: UserInfoModel.DataModel + private lateinit var remindAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false private var currentIndex = 0 + private var clickedPosition = 0 private val qrManager by lazy { QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) } @@ -45,12 +58,89 @@ override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } weakReferenceHandler = WeakReferenceHandler { msg -> - if (msg.what == 2023030601) { - val rowsModel = msg.obj as List + when (msg.what) { + 2023030601 -> { + val rowsModel = msg.obj as List - //TODO 添加切换动画 - noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) - currentIndex++ + //TODO 添加切换动画 + noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) + currentIndex++ + } + 2023030801 -> { + if (isRefresh || isLoadMore) { + remindAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有待办提醒") { + pageIndex = 1 + getRemindListByPage() + } + } else { + emptyView!!.hide() + remindAdapter = + object : NormalRecyclerAdapter( + R.layout.item_remind_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: RemindListModel.DataModel.RowsModel + ) { + if (position < 3) { + val deltaT = item.createTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.createTime.formatToDate() + } + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText(R.id.remindTimeView, diffTime) + } else { + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText( + R.id.remindTimeView, + item.createTime.formatToDate() + ) + } + } + } + remindRecyclerView.addItemDecoration( + DividerItemDecoration( + requireContext(), DividerItemDecoration.VERTICAL + ) + ) + remindRecyclerView.adapter = remindAdapter + remindAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: RemindListModel.DataModel.RowsModel + ) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("标记此条待办提醒?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + noticeViewModel.updateRemindStatus(t.id) + } + }).build().show() + } + }) + } + } + } } true } @@ -71,6 +161,7 @@ } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + //消息通知 noticeViewModel.noticeList.observe(this) { if (it.code == 200) { val data = it.data @@ -103,6 +194,42 @@ } } } + //待办提醒 + noticeViewModel.remindListResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + remindLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + remindLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + noticeViewModel.updateStatusResult.observe(this) { + if (it.code == 200) { + //刷新待办提醒列表 + dataBeans.removeAt(clickedPosition) + remindAdapter.notifyItemRemoved(clickedPosition) + remindAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } val homeAdapter = object : NormalRecyclerAdapter( R.layout.item_home_rv_g, LocaleConstant.HOME_FUNC_OPERATE.toList() @@ -138,6 +265,9 @@ override fun onResume() { super.onResume() noticeViewModel.getNoticeList("", "", "", "", "", 1) + + pageIndex = 1 + getRemindListByPage() } override fun initEvent() { @@ -154,6 +284,23 @@ noticeLayout.setOnClickListener { requireContext().navigatePageTo() } + + remindLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getRemindListByPage() + } + + remindLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getRemindListByPage() + } + } + + private fun getRemindListByPage() { + noticeViewModel.getRemindList("", "", "", "", "", pageIndex) } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java new file mode 100644 index 0000000..2158f6c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java @@ -0,0 +1,184 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class RemindListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessCode; + private String businessId; + private String createTime; + private String createUser; + private String createUserName; + private String id; + private String messageContent; + private String messageTitle; + private String messageType; + private String messageTypeName; + private String remindDeptId; + private String remindId; + private String status; + private String updateTime; + + public String getBusinessCode() { + return businessCode; + } + + public void setBusinessCode(String businessCode) { + this.businessCode = businessCode; + } + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getCreateUserName() { + return createUserName; + } + + public void setCreateUserName(String createUserName) { + this.createUserName = createUserName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMessageContent() { + return messageContent; + } + + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + + public String getMessageTitle() { + return messageTitle; + } + + public void setMessageTitle(String messageTitle) { + this.messageTitle = messageTitle; + } + + public String getMessageType() { + return messageType; + } + + public void setMessageType(String messageType) { + this.messageType = messageType; + } + + public String getMessageTypeName() { + return messageTypeName; + } + + public void setMessageTypeName(String messageTypeName) { + this.messageTypeName = messageTypeName; + } + + public String getRemindDeptId() { + return remindDeptId; + } + + public void setRemindDeptId(String remindDeptId) { + this.remindDeptId = remindDeptId; + } + + public String getRemindId() { + return remindId; + } + + public void setRemindId(String remindId) { + this.remindId = remindId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3b8b208..40cfb7e 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -66,6 +66,26 @@ ): String /** + * 获取待办提醒列表 + */ + @POST("/workbench/remindMessage/list") + suspend fun getRemindList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 待办提醒已读 + */ + @POST("/workbench/remindMessage/updateStatus") + suspend fun updateRemindStatus( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取设备列表 */ @POST("/meter/assets/listPage") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 086ba97..321e780 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -121,6 +121,48 @@ } /** + * 获取待办提醒列表 + */ + suspend fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ): String { + val param = JsonObject() + param.addProperty("remindId", remindId) + param.addProperty("remindDeptId", remindDeptId) + param.addProperty("messageType", messageType) + param.addProperty("startTime", startTime) + param.addProperty("endTime", endTime) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getRemindList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 待办提醒已读 + */ + suspend fun updateRemindStatus(id: String): String { + val param = JsonObject() + param.addProperty("id", id) + param.addProperty("status", "1") + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateRemindStatus(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取设备列表 */ suspend fun getEquipmentList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt index 885777b..98dbc87 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt @@ -135,6 +135,11 @@ } } + if (count == 0) { + "没有未读消息".show(this@NoticeListActivity) + return + } + //声明一个全是未读消息长度的空数组 val ids = arrayOfNulls(count) dataBeans.forEachIndexed { index, model -> @@ -241,10 +246,12 @@ override fun onItemClicked( position: Int, t: NoticeListModel.DataModel.RowsModel ) { - isAllRead = false - //标记被点击的item位置 - clickedPosition = position - noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + if (t.read == "0") { + isAllRead = false + //标记被点击的item位置 + clickedPosition = position + noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + } navigatePageTo(t.toJson()) } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt index f3185b8..79f1ba6 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt @@ -32,5 +32,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt index b40cf4f..ea92a54 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt @@ -48,6 +48,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCapabilityDetail(id: String) = launch({ @@ -66,5 +67,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt index 0b35cc1..ccfabdd 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt @@ -43,6 +43,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCustomerDetail(id: String) = launch({ @@ -61,5 +62,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt index 2997f78..bcf278a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt @@ -29,5 +29,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt index 0545762..5ccba03 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt @@ -64,6 +64,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEntrustDetail(id: String) = launch({ @@ -82,6 +83,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun acceptEntrust(id: String) = launch({ @@ -100,6 +102,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun returnEntrust(id: String, selected: ArrayList) = launch({ @@ -118,6 +121,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun addEntrust( @@ -164,6 +168,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEntrustLog(id: String) = launch({ @@ -178,5 +183,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt index 3613dda..c7a2e22 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt @@ -77,6 +77,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentDetail(id: String) = launch({ @@ -95,6 +96,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getStandardDeviceList( @@ -131,6 +133,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getStandardDeviceDetail(id: String) = launch({ @@ -149,6 +152,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getSupportEquipmentList(id: String) = launch({ @@ -167,6 +171,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentStateChangeLog(id: String) = launch({ @@ -185,6 +190,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentUsageRecord(id: String) = launch({ @@ -203,5 +209,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt index b16c1c7..d88fa37 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt @@ -36,5 +36,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt index 4b56da4..d095ee3 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt @@ -37,5 +37,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt index 6234d43..f8e3324 100644 --- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt +++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt @@ -32,8 +32,10 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.ExecutionException +import kotlin.math.abs /** * String扩展方法 @@ -146,6 +148,30 @@ return (t2 - t1) > 0 } +/** + * 时间差-小时 + * */ +fun String.diffCurrentTime(): Int { + if (this.isBlank()) { + return 0 + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + val diff = abs(System.currentTimeMillis() - date.time) + return (diff / (3600000)).toInt() +} + +fun String.formatToDate(): String { + if (this.isBlank()) { + return this + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + + val dateFormat = SimpleDateFormat("MM-dd", Locale.CHINA) + return dateFormat.format(date) +} + fun String.toChineseGrade(): String { if (this.isBlank()) { return "级别未知" @@ -155,7 +181,7 @@ "1" -> "B" "2" -> "C" "3" -> "D" - else -> "级别未知" + else -> "未知" } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 66bd2e6..90c55ab 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,10 +5,15 @@ import android.widget.TextView import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.diffCurrentTime +import com.casic.xz.meterage.extensions.formatToDate +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant @@ -26,8 +31,10 @@ import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* +import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* class HomePageFragment : KotlinBaseFragment() { @@ -37,7 +44,13 @@ private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel private lateinit var userData: UserInfoModel.DataModel + private lateinit var remindAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false private var currentIndex = 0 + private var clickedPosition = 0 private val qrManager by lazy { QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) } @@ -45,12 +58,89 @@ override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } weakReferenceHandler = WeakReferenceHandler { msg -> - if (msg.what == 2023030601) { - val rowsModel = msg.obj as List + when (msg.what) { + 2023030601 -> { + val rowsModel = msg.obj as List - //TODO 添加切换动画 - noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) - currentIndex++ + //TODO 添加切换动画 + noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) + currentIndex++ + } + 2023030801 -> { + if (isRefresh || isLoadMore) { + remindAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有待办提醒") { + pageIndex = 1 + getRemindListByPage() + } + } else { + emptyView!!.hide() + remindAdapter = + object : NormalRecyclerAdapter( + R.layout.item_remind_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: RemindListModel.DataModel.RowsModel + ) { + if (position < 3) { + val deltaT = item.createTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.createTime.formatToDate() + } + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText(R.id.remindTimeView, diffTime) + } else { + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText( + R.id.remindTimeView, + item.createTime.formatToDate() + ) + } + } + } + remindRecyclerView.addItemDecoration( + DividerItemDecoration( + requireContext(), DividerItemDecoration.VERTICAL + ) + ) + remindRecyclerView.adapter = remindAdapter + remindAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: RemindListModel.DataModel.RowsModel + ) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("标记此条待办提醒?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + noticeViewModel.updateRemindStatus(t.id) + } + }).build().show() + } + }) + } + } + } } true } @@ -71,6 +161,7 @@ } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + //消息通知 noticeViewModel.noticeList.observe(this) { if (it.code == 200) { val data = it.data @@ -103,6 +194,42 @@ } } } + //待办提醒 + noticeViewModel.remindListResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + remindLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + remindLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + noticeViewModel.updateStatusResult.observe(this) { + if (it.code == 200) { + //刷新待办提醒列表 + dataBeans.removeAt(clickedPosition) + remindAdapter.notifyItemRemoved(clickedPosition) + remindAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } val homeAdapter = object : NormalRecyclerAdapter( R.layout.item_home_rv_g, LocaleConstant.HOME_FUNC_OPERATE.toList() @@ -138,6 +265,9 @@ override fun onResume() { super.onResume() noticeViewModel.getNoticeList("", "", "", "", "", 1) + + pageIndex = 1 + getRemindListByPage() } override fun initEvent() { @@ -154,6 +284,23 @@ noticeLayout.setOnClickListener { requireContext().navigatePageTo() } + + remindLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getRemindListByPage() + } + + remindLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getRemindListByPage() + } + } + + private fun getRemindListByPage() { + noticeViewModel.getRemindList("", "", "", "", "", pageIndex) } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java new file mode 100644 index 0000000..2158f6c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java @@ -0,0 +1,184 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class RemindListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessCode; + private String businessId; + private String createTime; + private String createUser; + private String createUserName; + private String id; + private String messageContent; + private String messageTitle; + private String messageType; + private String messageTypeName; + private String remindDeptId; + private String remindId; + private String status; + private String updateTime; + + public String getBusinessCode() { + return businessCode; + } + + public void setBusinessCode(String businessCode) { + this.businessCode = businessCode; + } + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getCreateUserName() { + return createUserName; + } + + public void setCreateUserName(String createUserName) { + this.createUserName = createUserName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMessageContent() { + return messageContent; + } + + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + + public String getMessageTitle() { + return messageTitle; + } + + public void setMessageTitle(String messageTitle) { + this.messageTitle = messageTitle; + } + + public String getMessageType() { + return messageType; + } + + public void setMessageType(String messageType) { + this.messageType = messageType; + } + + public String getMessageTypeName() { + return messageTypeName; + } + + public void setMessageTypeName(String messageTypeName) { + this.messageTypeName = messageTypeName; + } + + public String getRemindDeptId() { + return remindDeptId; + } + + public void setRemindDeptId(String remindDeptId) { + this.remindDeptId = remindDeptId; + } + + public String getRemindId() { + return remindId; + } + + public void setRemindId(String remindId) { + this.remindId = remindId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3b8b208..40cfb7e 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -66,6 +66,26 @@ ): String /** + * 获取待办提醒列表 + */ + @POST("/workbench/remindMessage/list") + suspend fun getRemindList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 待办提醒已读 + */ + @POST("/workbench/remindMessage/updateStatus") + suspend fun updateRemindStatus( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取设备列表 */ @POST("/meter/assets/listPage") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 086ba97..321e780 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -121,6 +121,48 @@ } /** + * 获取待办提醒列表 + */ + suspend fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ): String { + val param = JsonObject() + param.addProperty("remindId", remindId) + param.addProperty("remindDeptId", remindDeptId) + param.addProperty("messageType", messageType) + param.addProperty("startTime", startTime) + param.addProperty("endTime", endTime) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getRemindList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 待办提醒已读 + */ + suspend fun updateRemindStatus(id: String): String { + val param = JsonObject() + param.addProperty("id", id) + param.addProperty("status", "1") + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateRemindStatus(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取设备列表 */ suspend fun getEquipmentList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt index 885777b..98dbc87 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt @@ -135,6 +135,11 @@ } } + if (count == 0) { + "没有未读消息".show(this@NoticeListActivity) + return + } + //声明一个全是未读消息长度的空数组 val ids = arrayOfNulls(count) dataBeans.forEachIndexed { index, model -> @@ -241,10 +246,12 @@ override fun onItemClicked( position: Int, t: NoticeListModel.DataModel.RowsModel ) { - isAllRead = false - //标记被点击的item位置 - clickedPosition = position - noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + if (t.read == "0") { + isAllRead = false + //标记被点击的item位置 + clickedPosition = position + noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + } navigatePageTo(t.toJson()) } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt index f3185b8..79f1ba6 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt @@ -32,5 +32,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt index b40cf4f..ea92a54 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt @@ -48,6 +48,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCapabilityDetail(id: String) = launch({ @@ -66,5 +67,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt index 0b35cc1..ccfabdd 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt @@ -43,6 +43,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCustomerDetail(id: String) = launch({ @@ -61,5 +62,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt index 2997f78..bcf278a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt @@ -29,5 +29,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt index 0545762..5ccba03 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt @@ -64,6 +64,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEntrustDetail(id: String) = launch({ @@ -82,6 +83,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun acceptEntrust(id: String) = launch({ @@ -100,6 +102,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun returnEntrust(id: String, selected: ArrayList) = launch({ @@ -118,6 +121,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun addEntrust( @@ -164,6 +168,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEntrustLog(id: String) = launch({ @@ -178,5 +183,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt index 3613dda..c7a2e22 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt @@ -77,6 +77,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentDetail(id: String) = launch({ @@ -95,6 +96,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getStandardDeviceList( @@ -131,6 +133,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getStandardDeviceDetail(id: String) = launch({ @@ -149,6 +152,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getSupportEquipmentList(id: String) = launch({ @@ -167,6 +171,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentStateChangeLog(id: String) = launch({ @@ -185,6 +190,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentUsageRecord(id: String) = launch({ @@ -203,5 +209,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt index b16c1c7..d88fa37 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt @@ -36,5 +36,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt index 4b56da4..d095ee3 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt @@ -37,5 +37,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt index e0f37ee..4d6df7b 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -63,6 +63,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getMeterageTrainDetail(id: String) = launch({ @@ -81,6 +82,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun signIn(staffId: String, planId: String) = launch({ @@ -99,5 +101,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt index 6234d43..f8e3324 100644 --- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt +++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt @@ -32,8 +32,10 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.ExecutionException +import kotlin.math.abs /** * String扩展方法 @@ -146,6 +148,30 @@ return (t2 - t1) > 0 } +/** + * 时间差-小时 + * */ +fun String.diffCurrentTime(): Int { + if (this.isBlank()) { + return 0 + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + val diff = abs(System.currentTimeMillis() - date.time) + return (diff / (3600000)).toInt() +} + +fun String.formatToDate(): String { + if (this.isBlank()) { + return this + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + + val dateFormat = SimpleDateFormat("MM-dd", Locale.CHINA) + return dateFormat.format(date) +} + fun String.toChineseGrade(): String { if (this.isBlank()) { return "级别未知" @@ -155,7 +181,7 @@ "1" -> "B" "2" -> "C" "3" -> "D" - else -> "级别未知" + else -> "未知" } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 66bd2e6..90c55ab 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,10 +5,15 @@ import android.widget.TextView import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.diffCurrentTime +import com.casic.xz.meterage.extensions.formatToDate +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant @@ -26,8 +31,10 @@ import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* +import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* class HomePageFragment : KotlinBaseFragment() { @@ -37,7 +44,13 @@ private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel private lateinit var userData: UserInfoModel.DataModel + private lateinit var remindAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false private var currentIndex = 0 + private var clickedPosition = 0 private val qrManager by lazy { QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) } @@ -45,12 +58,89 @@ override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } weakReferenceHandler = WeakReferenceHandler { msg -> - if (msg.what == 2023030601) { - val rowsModel = msg.obj as List + when (msg.what) { + 2023030601 -> { + val rowsModel = msg.obj as List - //TODO 添加切换动画 - noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) - currentIndex++ + //TODO 添加切换动画 + noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) + currentIndex++ + } + 2023030801 -> { + if (isRefresh || isLoadMore) { + remindAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有待办提醒") { + pageIndex = 1 + getRemindListByPage() + } + } else { + emptyView!!.hide() + remindAdapter = + object : NormalRecyclerAdapter( + R.layout.item_remind_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: RemindListModel.DataModel.RowsModel + ) { + if (position < 3) { + val deltaT = item.createTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.createTime.formatToDate() + } + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText(R.id.remindTimeView, diffTime) + } else { + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText( + R.id.remindTimeView, + item.createTime.formatToDate() + ) + } + } + } + remindRecyclerView.addItemDecoration( + DividerItemDecoration( + requireContext(), DividerItemDecoration.VERTICAL + ) + ) + remindRecyclerView.adapter = remindAdapter + remindAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: RemindListModel.DataModel.RowsModel + ) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("标记此条待办提醒?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + noticeViewModel.updateRemindStatus(t.id) + } + }).build().show() + } + }) + } + } + } } true } @@ -71,6 +161,7 @@ } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + //消息通知 noticeViewModel.noticeList.observe(this) { if (it.code == 200) { val data = it.data @@ -103,6 +194,42 @@ } } } + //待办提醒 + noticeViewModel.remindListResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + remindLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + remindLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + noticeViewModel.updateStatusResult.observe(this) { + if (it.code == 200) { + //刷新待办提醒列表 + dataBeans.removeAt(clickedPosition) + remindAdapter.notifyItemRemoved(clickedPosition) + remindAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } val homeAdapter = object : NormalRecyclerAdapter( R.layout.item_home_rv_g, LocaleConstant.HOME_FUNC_OPERATE.toList() @@ -138,6 +265,9 @@ override fun onResume() { super.onResume() noticeViewModel.getNoticeList("", "", "", "", "", 1) + + pageIndex = 1 + getRemindListByPage() } override fun initEvent() { @@ -154,6 +284,23 @@ noticeLayout.setOnClickListener { requireContext().navigatePageTo() } + + remindLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getRemindListByPage() + } + + remindLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getRemindListByPage() + } + } + + private fun getRemindListByPage() { + noticeViewModel.getRemindList("", "", "", "", "", pageIndex) } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java new file mode 100644 index 0000000..2158f6c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java @@ -0,0 +1,184 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class RemindListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessCode; + private String businessId; + private String createTime; + private String createUser; + private String createUserName; + private String id; + private String messageContent; + private String messageTitle; + private String messageType; + private String messageTypeName; + private String remindDeptId; + private String remindId; + private String status; + private String updateTime; + + public String getBusinessCode() { + return businessCode; + } + + public void setBusinessCode(String businessCode) { + this.businessCode = businessCode; + } + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getCreateUserName() { + return createUserName; + } + + public void setCreateUserName(String createUserName) { + this.createUserName = createUserName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMessageContent() { + return messageContent; + } + + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + + public String getMessageTitle() { + return messageTitle; + } + + public void setMessageTitle(String messageTitle) { + this.messageTitle = messageTitle; + } + + public String getMessageType() { + return messageType; + } + + public void setMessageType(String messageType) { + this.messageType = messageType; + } + + public String getMessageTypeName() { + return messageTypeName; + } + + public void setMessageTypeName(String messageTypeName) { + this.messageTypeName = messageTypeName; + } + + public String getRemindDeptId() { + return remindDeptId; + } + + public void setRemindDeptId(String remindDeptId) { + this.remindDeptId = remindDeptId; + } + + public String getRemindId() { + return remindId; + } + + public void setRemindId(String remindId) { + this.remindId = remindId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3b8b208..40cfb7e 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -66,6 +66,26 @@ ): String /** + * 获取待办提醒列表 + */ + @POST("/workbench/remindMessage/list") + suspend fun getRemindList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 待办提醒已读 + */ + @POST("/workbench/remindMessage/updateStatus") + suspend fun updateRemindStatus( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取设备列表 */ @POST("/meter/assets/listPage") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 086ba97..321e780 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -121,6 +121,48 @@ } /** + * 获取待办提醒列表 + */ + suspend fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ): String { + val param = JsonObject() + param.addProperty("remindId", remindId) + param.addProperty("remindDeptId", remindDeptId) + param.addProperty("messageType", messageType) + param.addProperty("startTime", startTime) + param.addProperty("endTime", endTime) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getRemindList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 待办提醒已读 + */ + suspend fun updateRemindStatus(id: String): String { + val param = JsonObject() + param.addProperty("id", id) + param.addProperty("status", "1") + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateRemindStatus(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取设备列表 */ suspend fun getEquipmentList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt index 885777b..98dbc87 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt @@ -135,6 +135,11 @@ } } + if (count == 0) { + "没有未读消息".show(this@NoticeListActivity) + return + } + //声明一个全是未读消息长度的空数组 val ids = arrayOfNulls(count) dataBeans.forEachIndexed { index, model -> @@ -241,10 +246,12 @@ override fun onItemClicked( position: Int, t: NoticeListModel.DataModel.RowsModel ) { - isAllRead = false - //标记被点击的item位置 - clickedPosition = position - noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + if (t.read == "0") { + isAllRead = false + //标记被点击的item位置 + clickedPosition = position + noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + } navigatePageTo(t.toJson()) } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt index f3185b8..79f1ba6 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt @@ -32,5 +32,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt index b40cf4f..ea92a54 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt @@ -48,6 +48,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCapabilityDetail(id: String) = launch({ @@ -66,5 +67,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt index 0b35cc1..ccfabdd 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt @@ -43,6 +43,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCustomerDetail(id: String) = launch({ @@ -61,5 +62,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt index 2997f78..bcf278a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt @@ -29,5 +29,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt index 0545762..5ccba03 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt @@ -64,6 +64,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEntrustDetail(id: String) = launch({ @@ -82,6 +83,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun acceptEntrust(id: String) = launch({ @@ -100,6 +102,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun returnEntrust(id: String, selected: ArrayList) = launch({ @@ -118,6 +121,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun addEntrust( @@ -164,6 +168,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEntrustLog(id: String) = launch({ @@ -178,5 +183,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt index 3613dda..c7a2e22 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt @@ -77,6 +77,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentDetail(id: String) = launch({ @@ -95,6 +96,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getStandardDeviceList( @@ -131,6 +133,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getStandardDeviceDetail(id: String) = launch({ @@ -149,6 +152,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getSupportEquipmentList(id: String) = launch({ @@ -167,6 +171,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentStateChangeLog(id: String) = launch({ @@ -185,6 +190,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentUsageRecord(id: String) = launch({ @@ -203,5 +209,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt index b16c1c7..d88fa37 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt @@ -36,5 +36,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt index 4b56da4..d095ee3 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt @@ -37,5 +37,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt index e0f37ee..4d6df7b 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -63,6 +63,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getMeterageTrainDetail(id: String) = launch({ @@ -81,6 +82,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun signIn(staffId: String, planId: String) = launch({ @@ -99,5 +101,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt index d405aac..dd7943a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt @@ -5,6 +5,7 @@ import com.casic.xz.meterage.extensions.separateResponseCode import com.casic.xz.meterage.model.ActionResultModel import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -13,13 +14,15 @@ import com.pengxh.kt.lite.vm.BaseViewModel /** - * 消息通知 VM + * 消息通知提醒 VM * */ class NoticeViewModel : BaseViewModel() { private val gson by lazy { Gson() } val noticeList = MutableLiveData() val readNoticeResult = MutableLiveData() + val remindListResult = MutableLiveData() + val updateStatusResult = MutableLiveData() fun getNoticeList( noticeNo: String, @@ -45,6 +48,7 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun readNotice(userId: String, ids: Array) = launch({ @@ -57,5 +61,41 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ) = launch({ + val response = RetrofitServiceManager.getRemindList( + remindId, remindDeptId, messageType, startTime, endTime, offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + remindListResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun updateRemindStatus(id: String) = launch({ + val response = RetrofitServiceManager.updateRemindStatus(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + updateStatusResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt index 6234d43..f8e3324 100644 --- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt +++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt @@ -32,8 +32,10 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.ExecutionException +import kotlin.math.abs /** * String扩展方法 @@ -146,6 +148,30 @@ return (t2 - t1) > 0 } +/** + * 时间差-小时 + * */ +fun String.diffCurrentTime(): Int { + if (this.isBlank()) { + return 0 + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + val diff = abs(System.currentTimeMillis() - date.time) + return (diff / (3600000)).toInt() +} + +fun String.formatToDate(): String { + if (this.isBlank()) { + return this + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + + val dateFormat = SimpleDateFormat("MM-dd", Locale.CHINA) + return dateFormat.format(date) +} + fun String.toChineseGrade(): String { if (this.isBlank()) { return "级别未知" @@ -155,7 +181,7 @@ "1" -> "B" "2" -> "C" "3" -> "D" - else -> "级别未知" + else -> "未知" } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 66bd2e6..90c55ab 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,10 +5,15 @@ import android.widget.TextView import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.diffCurrentTime +import com.casic.xz.meterage.extensions.formatToDate +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant @@ -26,8 +31,10 @@ import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* +import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* class HomePageFragment : KotlinBaseFragment() { @@ -37,7 +44,13 @@ private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel private lateinit var userData: UserInfoModel.DataModel + private lateinit var remindAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false private var currentIndex = 0 + private var clickedPosition = 0 private val qrManager by lazy { QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) } @@ -45,12 +58,89 @@ override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } weakReferenceHandler = WeakReferenceHandler { msg -> - if (msg.what == 2023030601) { - val rowsModel = msg.obj as List + when (msg.what) { + 2023030601 -> { + val rowsModel = msg.obj as List - //TODO 添加切换动画 - noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) - currentIndex++ + //TODO 添加切换动画 + noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) + currentIndex++ + } + 2023030801 -> { + if (isRefresh || isLoadMore) { + remindAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有待办提醒") { + pageIndex = 1 + getRemindListByPage() + } + } else { + emptyView!!.hide() + remindAdapter = + object : NormalRecyclerAdapter( + R.layout.item_remind_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: RemindListModel.DataModel.RowsModel + ) { + if (position < 3) { + val deltaT = item.createTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.createTime.formatToDate() + } + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText(R.id.remindTimeView, diffTime) + } else { + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText( + R.id.remindTimeView, + item.createTime.formatToDate() + ) + } + } + } + remindRecyclerView.addItemDecoration( + DividerItemDecoration( + requireContext(), DividerItemDecoration.VERTICAL + ) + ) + remindRecyclerView.adapter = remindAdapter + remindAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: RemindListModel.DataModel.RowsModel + ) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("标记此条待办提醒?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + noticeViewModel.updateRemindStatus(t.id) + } + }).build().show() + } + }) + } + } + } } true } @@ -71,6 +161,7 @@ } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + //消息通知 noticeViewModel.noticeList.observe(this) { if (it.code == 200) { val data = it.data @@ -103,6 +194,42 @@ } } } + //待办提醒 + noticeViewModel.remindListResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + remindLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + remindLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + noticeViewModel.updateStatusResult.observe(this) { + if (it.code == 200) { + //刷新待办提醒列表 + dataBeans.removeAt(clickedPosition) + remindAdapter.notifyItemRemoved(clickedPosition) + remindAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } val homeAdapter = object : NormalRecyclerAdapter( R.layout.item_home_rv_g, LocaleConstant.HOME_FUNC_OPERATE.toList() @@ -138,6 +265,9 @@ override fun onResume() { super.onResume() noticeViewModel.getNoticeList("", "", "", "", "", 1) + + pageIndex = 1 + getRemindListByPage() } override fun initEvent() { @@ -154,6 +284,23 @@ noticeLayout.setOnClickListener { requireContext().navigatePageTo() } + + remindLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getRemindListByPage() + } + + remindLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getRemindListByPage() + } + } + + private fun getRemindListByPage() { + noticeViewModel.getRemindList("", "", "", "", "", pageIndex) } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java new file mode 100644 index 0000000..2158f6c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java @@ -0,0 +1,184 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class RemindListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessCode; + private String businessId; + private String createTime; + private String createUser; + private String createUserName; + private String id; + private String messageContent; + private String messageTitle; + private String messageType; + private String messageTypeName; + private String remindDeptId; + private String remindId; + private String status; + private String updateTime; + + public String getBusinessCode() { + return businessCode; + } + + public void setBusinessCode(String businessCode) { + this.businessCode = businessCode; + } + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getCreateUserName() { + return createUserName; + } + + public void setCreateUserName(String createUserName) { + this.createUserName = createUserName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMessageContent() { + return messageContent; + } + + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + + public String getMessageTitle() { + return messageTitle; + } + + public void setMessageTitle(String messageTitle) { + this.messageTitle = messageTitle; + } + + public String getMessageType() { + return messageType; + } + + public void setMessageType(String messageType) { + this.messageType = messageType; + } + + public String getMessageTypeName() { + return messageTypeName; + } + + public void setMessageTypeName(String messageTypeName) { + this.messageTypeName = messageTypeName; + } + + public String getRemindDeptId() { + return remindDeptId; + } + + public void setRemindDeptId(String remindDeptId) { + this.remindDeptId = remindDeptId; + } + + public String getRemindId() { + return remindId; + } + + public void setRemindId(String remindId) { + this.remindId = remindId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3b8b208..40cfb7e 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -66,6 +66,26 @@ ): String /** + * 获取待办提醒列表 + */ + @POST("/workbench/remindMessage/list") + suspend fun getRemindList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 待办提醒已读 + */ + @POST("/workbench/remindMessage/updateStatus") + suspend fun updateRemindStatus( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取设备列表 */ @POST("/meter/assets/listPage") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 086ba97..321e780 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -121,6 +121,48 @@ } /** + * 获取待办提醒列表 + */ + suspend fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ): String { + val param = JsonObject() + param.addProperty("remindId", remindId) + param.addProperty("remindDeptId", remindDeptId) + param.addProperty("messageType", messageType) + param.addProperty("startTime", startTime) + param.addProperty("endTime", endTime) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getRemindList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 待办提醒已读 + */ + suspend fun updateRemindStatus(id: String): String { + val param = JsonObject() + param.addProperty("id", id) + param.addProperty("status", "1") + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateRemindStatus(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取设备列表 */ suspend fun getEquipmentList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt index 885777b..98dbc87 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt @@ -135,6 +135,11 @@ } } + if (count == 0) { + "没有未读消息".show(this@NoticeListActivity) + return + } + //声明一个全是未读消息长度的空数组 val ids = arrayOfNulls(count) dataBeans.forEachIndexed { index, model -> @@ -241,10 +246,12 @@ override fun onItemClicked( position: Int, t: NoticeListModel.DataModel.RowsModel ) { - isAllRead = false - //标记被点击的item位置 - clickedPosition = position - noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + if (t.read == "0") { + isAllRead = false + //标记被点击的item位置 + clickedPosition = position + noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + } navigatePageTo(t.toJson()) } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt index f3185b8..79f1ba6 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt @@ -32,5 +32,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt index b40cf4f..ea92a54 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt @@ -48,6 +48,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCapabilityDetail(id: String) = launch({ @@ -66,5 +67,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt index 0b35cc1..ccfabdd 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt @@ -43,6 +43,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCustomerDetail(id: String) = launch({ @@ -61,5 +62,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt index 2997f78..bcf278a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt @@ -29,5 +29,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt index 0545762..5ccba03 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt @@ -64,6 +64,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEntrustDetail(id: String) = launch({ @@ -82,6 +83,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun acceptEntrust(id: String) = launch({ @@ -100,6 +102,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun returnEntrust(id: String, selected: ArrayList) = launch({ @@ -118,6 +121,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun addEntrust( @@ -164,6 +168,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEntrustLog(id: String) = launch({ @@ -178,5 +183,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt index 3613dda..c7a2e22 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt @@ -77,6 +77,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentDetail(id: String) = launch({ @@ -95,6 +96,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getStandardDeviceList( @@ -131,6 +133,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getStandardDeviceDetail(id: String) = launch({ @@ -149,6 +152,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getSupportEquipmentList(id: String) = launch({ @@ -167,6 +171,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentStateChangeLog(id: String) = launch({ @@ -185,6 +190,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentUsageRecord(id: String) = launch({ @@ -203,5 +209,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt index b16c1c7..d88fa37 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt @@ -36,5 +36,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt index 4b56da4..d095ee3 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt @@ -37,5 +37,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt index e0f37ee..4d6df7b 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -63,6 +63,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getMeterageTrainDetail(id: String) = launch({ @@ -81,6 +82,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun signIn(staffId: String, planId: String) = launch({ @@ -99,5 +101,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt index d405aac..dd7943a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt @@ -5,6 +5,7 @@ import com.casic.xz.meterage.extensions.separateResponseCode import com.casic.xz.meterage.model.ActionResultModel import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -13,13 +14,15 @@ import com.pengxh.kt.lite.vm.BaseViewModel /** - * 消息通知 VM + * 消息通知提醒 VM * */ class NoticeViewModel : BaseViewModel() { private val gson by lazy { Gson() } val noticeList = MutableLiveData() val readNoticeResult = MutableLiveData() + val remindListResult = MutableLiveData() + val updateStatusResult = MutableLiveData() fun getNoticeList( noticeNo: String, @@ -45,6 +48,7 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun readNotice(userId: String, ids: Array) = launch({ @@ -57,5 +61,41 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ) = launch({ + val response = RetrofitServiceManager.getRemindList( + remindId, remindDeptId, messageType, startTime, endTime, offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + remindListResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun updateRemindStatus(id: String) = launch({ + val response = RetrofitServiceManager.updateRemindStatus(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + updateStatusResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/SampleViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/SampleViewModel.kt index 7234d20..5b917dc 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/SampleViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/SampleViewModel.kt @@ -63,6 +63,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun writeSample( @@ -117,5 +118,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt index 6234d43..f8e3324 100644 --- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt +++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt @@ -32,8 +32,10 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.ExecutionException +import kotlin.math.abs /** * String扩展方法 @@ -146,6 +148,30 @@ return (t2 - t1) > 0 } +/** + * 时间差-小时 + * */ +fun String.diffCurrentTime(): Int { + if (this.isBlank()) { + return 0 + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + val diff = abs(System.currentTimeMillis() - date.time) + return (diff / (3600000)).toInt() +} + +fun String.formatToDate(): String { + if (this.isBlank()) { + return this + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + + val dateFormat = SimpleDateFormat("MM-dd", Locale.CHINA) + return dateFormat.format(date) +} + fun String.toChineseGrade(): String { if (this.isBlank()) { return "级别未知" @@ -155,7 +181,7 @@ "1" -> "B" "2" -> "C" "3" -> "D" - else -> "级别未知" + else -> "未知" } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 66bd2e6..90c55ab 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,10 +5,15 @@ import android.widget.TextView import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.diffCurrentTime +import com.casic.xz.meterage.extensions.formatToDate +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant @@ -26,8 +31,10 @@ import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* +import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* class HomePageFragment : KotlinBaseFragment() { @@ -37,7 +44,13 @@ private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel private lateinit var userData: UserInfoModel.DataModel + private lateinit var remindAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false private var currentIndex = 0 + private var clickedPosition = 0 private val qrManager by lazy { QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) } @@ -45,12 +58,89 @@ override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } weakReferenceHandler = WeakReferenceHandler { msg -> - if (msg.what == 2023030601) { - val rowsModel = msg.obj as List + when (msg.what) { + 2023030601 -> { + val rowsModel = msg.obj as List - //TODO 添加切换动画 - noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) - currentIndex++ + //TODO 添加切换动画 + noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) + currentIndex++ + } + 2023030801 -> { + if (isRefresh || isLoadMore) { + remindAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有待办提醒") { + pageIndex = 1 + getRemindListByPage() + } + } else { + emptyView!!.hide() + remindAdapter = + object : NormalRecyclerAdapter( + R.layout.item_remind_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: RemindListModel.DataModel.RowsModel + ) { + if (position < 3) { + val deltaT = item.createTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.createTime.formatToDate() + } + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText(R.id.remindTimeView, diffTime) + } else { + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText( + R.id.remindTimeView, + item.createTime.formatToDate() + ) + } + } + } + remindRecyclerView.addItemDecoration( + DividerItemDecoration( + requireContext(), DividerItemDecoration.VERTICAL + ) + ) + remindRecyclerView.adapter = remindAdapter + remindAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: RemindListModel.DataModel.RowsModel + ) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("标记此条待办提醒?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + noticeViewModel.updateRemindStatus(t.id) + } + }).build().show() + } + }) + } + } + } } true } @@ -71,6 +161,7 @@ } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + //消息通知 noticeViewModel.noticeList.observe(this) { if (it.code == 200) { val data = it.data @@ -103,6 +194,42 @@ } } } + //待办提醒 + noticeViewModel.remindListResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + remindLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + remindLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + noticeViewModel.updateStatusResult.observe(this) { + if (it.code == 200) { + //刷新待办提醒列表 + dataBeans.removeAt(clickedPosition) + remindAdapter.notifyItemRemoved(clickedPosition) + remindAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } val homeAdapter = object : NormalRecyclerAdapter( R.layout.item_home_rv_g, LocaleConstant.HOME_FUNC_OPERATE.toList() @@ -138,6 +265,9 @@ override fun onResume() { super.onResume() noticeViewModel.getNoticeList("", "", "", "", "", 1) + + pageIndex = 1 + getRemindListByPage() } override fun initEvent() { @@ -154,6 +284,23 @@ noticeLayout.setOnClickListener { requireContext().navigatePageTo() } + + remindLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getRemindListByPage() + } + + remindLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getRemindListByPage() + } + } + + private fun getRemindListByPage() { + noticeViewModel.getRemindList("", "", "", "", "", pageIndex) } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java new file mode 100644 index 0000000..2158f6c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java @@ -0,0 +1,184 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class RemindListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessCode; + private String businessId; + private String createTime; + private String createUser; + private String createUserName; + private String id; + private String messageContent; + private String messageTitle; + private String messageType; + private String messageTypeName; + private String remindDeptId; + private String remindId; + private String status; + private String updateTime; + + public String getBusinessCode() { + return businessCode; + } + + public void setBusinessCode(String businessCode) { + this.businessCode = businessCode; + } + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getCreateUserName() { + return createUserName; + } + + public void setCreateUserName(String createUserName) { + this.createUserName = createUserName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMessageContent() { + return messageContent; + } + + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + + public String getMessageTitle() { + return messageTitle; + } + + public void setMessageTitle(String messageTitle) { + this.messageTitle = messageTitle; + } + + public String getMessageType() { + return messageType; + } + + public void setMessageType(String messageType) { + this.messageType = messageType; + } + + public String getMessageTypeName() { + return messageTypeName; + } + + public void setMessageTypeName(String messageTypeName) { + this.messageTypeName = messageTypeName; + } + + public String getRemindDeptId() { + return remindDeptId; + } + + public void setRemindDeptId(String remindDeptId) { + this.remindDeptId = remindDeptId; + } + + public String getRemindId() { + return remindId; + } + + public void setRemindId(String remindId) { + this.remindId = remindId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3b8b208..40cfb7e 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -66,6 +66,26 @@ ): String /** + * 获取待办提醒列表 + */ + @POST("/workbench/remindMessage/list") + suspend fun getRemindList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 待办提醒已读 + */ + @POST("/workbench/remindMessage/updateStatus") + suspend fun updateRemindStatus( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取设备列表 */ @POST("/meter/assets/listPage") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 086ba97..321e780 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -121,6 +121,48 @@ } /** + * 获取待办提醒列表 + */ + suspend fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ): String { + val param = JsonObject() + param.addProperty("remindId", remindId) + param.addProperty("remindDeptId", remindDeptId) + param.addProperty("messageType", messageType) + param.addProperty("startTime", startTime) + param.addProperty("endTime", endTime) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getRemindList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 待办提醒已读 + */ + suspend fun updateRemindStatus(id: String): String { + val param = JsonObject() + param.addProperty("id", id) + param.addProperty("status", "1") + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateRemindStatus(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取设备列表 */ suspend fun getEquipmentList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt index 885777b..98dbc87 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt @@ -135,6 +135,11 @@ } } + if (count == 0) { + "没有未读消息".show(this@NoticeListActivity) + return + } + //声明一个全是未读消息长度的空数组 val ids = arrayOfNulls(count) dataBeans.forEachIndexed { index, model -> @@ -241,10 +246,12 @@ override fun onItemClicked( position: Int, t: NoticeListModel.DataModel.RowsModel ) { - isAllRead = false - //标记被点击的item位置 - clickedPosition = position - noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + if (t.read == "0") { + isAllRead = false + //标记被点击的item位置 + clickedPosition = position + noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + } navigatePageTo(t.toJson()) } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt index f3185b8..79f1ba6 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt @@ -32,5 +32,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt index b40cf4f..ea92a54 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt @@ -48,6 +48,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCapabilityDetail(id: String) = launch({ @@ -66,5 +67,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt index 0b35cc1..ccfabdd 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt @@ -43,6 +43,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCustomerDetail(id: String) = launch({ @@ -61,5 +62,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt index 2997f78..bcf278a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt @@ -29,5 +29,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt index 0545762..5ccba03 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt @@ -64,6 +64,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEntrustDetail(id: String) = launch({ @@ -82,6 +83,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun acceptEntrust(id: String) = launch({ @@ -100,6 +102,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun returnEntrust(id: String, selected: ArrayList) = launch({ @@ -118,6 +121,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun addEntrust( @@ -164,6 +168,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEntrustLog(id: String) = launch({ @@ -178,5 +183,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt index 3613dda..c7a2e22 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt @@ -77,6 +77,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentDetail(id: String) = launch({ @@ -95,6 +96,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getStandardDeviceList( @@ -131,6 +133,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getStandardDeviceDetail(id: String) = launch({ @@ -149,6 +152,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getSupportEquipmentList(id: String) = launch({ @@ -167,6 +171,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentStateChangeLog(id: String) = launch({ @@ -185,6 +190,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentUsageRecord(id: String) = launch({ @@ -203,5 +209,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt index b16c1c7..d88fa37 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt @@ -36,5 +36,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt index 4b56da4..d095ee3 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt @@ -37,5 +37,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt index e0f37ee..4d6df7b 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -63,6 +63,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getMeterageTrainDetail(id: String) = launch({ @@ -81,6 +82,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun signIn(staffId: String, planId: String) = launch({ @@ -99,5 +101,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt index d405aac..dd7943a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt @@ -5,6 +5,7 @@ import com.casic.xz.meterage.extensions.separateResponseCode import com.casic.xz.meterage.model.ActionResultModel import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -13,13 +14,15 @@ import com.pengxh.kt.lite.vm.BaseViewModel /** - * 消息通知 VM + * 消息通知提醒 VM * */ class NoticeViewModel : BaseViewModel() { private val gson by lazy { Gson() } val noticeList = MutableLiveData() val readNoticeResult = MutableLiveData() + val remindListResult = MutableLiveData() + val updateStatusResult = MutableLiveData() fun getNoticeList( noticeNo: String, @@ -45,6 +48,7 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun readNotice(userId: String, ids: Array) = launch({ @@ -57,5 +61,41 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ) = launch({ + val response = RetrofitServiceManager.getRemindList( + remindId, remindDeptId, messageType, startTime, endTime, offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + remindListResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun updateRemindStatus(id: String) = launch({ + val response = RetrofitServiceManager.updateRemindStatus(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + updateStatusResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/SampleViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/SampleViewModel.kt index 7234d20..5b917dc 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/SampleViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/SampleViewModel.kt @@ -63,6 +63,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun writeSample( @@ -117,5 +118,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/StandardFileViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/StandardFileViewModel.kt index e3f183f..0b8c74a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/StandardFileViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/StandardFileViewModel.kt @@ -61,5 +61,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt index 6234d43..f8e3324 100644 --- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt +++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt @@ -32,8 +32,10 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.ExecutionException +import kotlin.math.abs /** * String扩展方法 @@ -146,6 +148,30 @@ return (t2 - t1) > 0 } +/** + * 时间差-小时 + * */ +fun String.diffCurrentTime(): Int { + if (this.isBlank()) { + return 0 + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + val diff = abs(System.currentTimeMillis() - date.time) + return (diff / (3600000)).toInt() +} + +fun String.formatToDate(): String { + if (this.isBlank()) { + return this + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + + val dateFormat = SimpleDateFormat("MM-dd", Locale.CHINA) + return dateFormat.format(date) +} + fun String.toChineseGrade(): String { if (this.isBlank()) { return "级别未知" @@ -155,7 +181,7 @@ "1" -> "B" "2" -> "C" "3" -> "D" - else -> "级别未知" + else -> "未知" } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 66bd2e6..90c55ab 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,10 +5,15 @@ import android.widget.TextView import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.diffCurrentTime +import com.casic.xz.meterage.extensions.formatToDate +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant @@ -26,8 +31,10 @@ import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* +import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* class HomePageFragment : KotlinBaseFragment() { @@ -37,7 +44,13 @@ private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel private lateinit var userData: UserInfoModel.DataModel + private lateinit var remindAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false private var currentIndex = 0 + private var clickedPosition = 0 private val qrManager by lazy { QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) } @@ -45,12 +58,89 @@ override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } weakReferenceHandler = WeakReferenceHandler { msg -> - if (msg.what == 2023030601) { - val rowsModel = msg.obj as List + when (msg.what) { + 2023030601 -> { + val rowsModel = msg.obj as List - //TODO 添加切换动画 - noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) - currentIndex++ + //TODO 添加切换动画 + noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) + currentIndex++ + } + 2023030801 -> { + if (isRefresh || isLoadMore) { + remindAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有待办提醒") { + pageIndex = 1 + getRemindListByPage() + } + } else { + emptyView!!.hide() + remindAdapter = + object : NormalRecyclerAdapter( + R.layout.item_remind_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: RemindListModel.DataModel.RowsModel + ) { + if (position < 3) { + val deltaT = item.createTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.createTime.formatToDate() + } + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText(R.id.remindTimeView, diffTime) + } else { + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText( + R.id.remindTimeView, + item.createTime.formatToDate() + ) + } + } + } + remindRecyclerView.addItemDecoration( + DividerItemDecoration( + requireContext(), DividerItemDecoration.VERTICAL + ) + ) + remindRecyclerView.adapter = remindAdapter + remindAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: RemindListModel.DataModel.RowsModel + ) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("标记此条待办提醒?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + noticeViewModel.updateRemindStatus(t.id) + } + }).build().show() + } + }) + } + } + } } true } @@ -71,6 +161,7 @@ } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + //消息通知 noticeViewModel.noticeList.observe(this) { if (it.code == 200) { val data = it.data @@ -103,6 +194,42 @@ } } } + //待办提醒 + noticeViewModel.remindListResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + remindLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + remindLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + noticeViewModel.updateStatusResult.observe(this) { + if (it.code == 200) { + //刷新待办提醒列表 + dataBeans.removeAt(clickedPosition) + remindAdapter.notifyItemRemoved(clickedPosition) + remindAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } val homeAdapter = object : NormalRecyclerAdapter( R.layout.item_home_rv_g, LocaleConstant.HOME_FUNC_OPERATE.toList() @@ -138,6 +265,9 @@ override fun onResume() { super.onResume() noticeViewModel.getNoticeList("", "", "", "", "", 1) + + pageIndex = 1 + getRemindListByPage() } override fun initEvent() { @@ -154,6 +284,23 @@ noticeLayout.setOnClickListener { requireContext().navigatePageTo() } + + remindLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getRemindListByPage() + } + + remindLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getRemindListByPage() + } + } + + private fun getRemindListByPage() { + noticeViewModel.getRemindList("", "", "", "", "", pageIndex) } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java new file mode 100644 index 0000000..2158f6c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java @@ -0,0 +1,184 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class RemindListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessCode; + private String businessId; + private String createTime; + private String createUser; + private String createUserName; + private String id; + private String messageContent; + private String messageTitle; + private String messageType; + private String messageTypeName; + private String remindDeptId; + private String remindId; + private String status; + private String updateTime; + + public String getBusinessCode() { + return businessCode; + } + + public void setBusinessCode(String businessCode) { + this.businessCode = businessCode; + } + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getCreateUserName() { + return createUserName; + } + + public void setCreateUserName(String createUserName) { + this.createUserName = createUserName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMessageContent() { + return messageContent; + } + + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + + public String getMessageTitle() { + return messageTitle; + } + + public void setMessageTitle(String messageTitle) { + this.messageTitle = messageTitle; + } + + public String getMessageType() { + return messageType; + } + + public void setMessageType(String messageType) { + this.messageType = messageType; + } + + public String getMessageTypeName() { + return messageTypeName; + } + + public void setMessageTypeName(String messageTypeName) { + this.messageTypeName = messageTypeName; + } + + public String getRemindDeptId() { + return remindDeptId; + } + + public void setRemindDeptId(String remindDeptId) { + this.remindDeptId = remindDeptId; + } + + public String getRemindId() { + return remindId; + } + + public void setRemindId(String remindId) { + this.remindId = remindId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3b8b208..40cfb7e 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -66,6 +66,26 @@ ): String /** + * 获取待办提醒列表 + */ + @POST("/workbench/remindMessage/list") + suspend fun getRemindList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 待办提醒已读 + */ + @POST("/workbench/remindMessage/updateStatus") + suspend fun updateRemindStatus( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取设备列表 */ @POST("/meter/assets/listPage") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 086ba97..321e780 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -121,6 +121,48 @@ } /** + * 获取待办提醒列表 + */ + suspend fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ): String { + val param = JsonObject() + param.addProperty("remindId", remindId) + param.addProperty("remindDeptId", remindDeptId) + param.addProperty("messageType", messageType) + param.addProperty("startTime", startTime) + param.addProperty("endTime", endTime) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getRemindList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 待办提醒已读 + */ + suspend fun updateRemindStatus(id: String): String { + val param = JsonObject() + param.addProperty("id", id) + param.addProperty("status", "1") + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateRemindStatus(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取设备列表 */ suspend fun getEquipmentList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt index 885777b..98dbc87 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt @@ -135,6 +135,11 @@ } } + if (count == 0) { + "没有未读消息".show(this@NoticeListActivity) + return + } + //声明一个全是未读消息长度的空数组 val ids = arrayOfNulls(count) dataBeans.forEachIndexed { index, model -> @@ -241,10 +246,12 @@ override fun onItemClicked( position: Int, t: NoticeListModel.DataModel.RowsModel ) { - isAllRead = false - //标记被点击的item位置 - clickedPosition = position - noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + if (t.read == "0") { + isAllRead = false + //标记被点击的item位置 + clickedPosition = position + noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + } navigatePageTo(t.toJson()) } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt index f3185b8..79f1ba6 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt @@ -32,5 +32,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt index b40cf4f..ea92a54 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt @@ -48,6 +48,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCapabilityDetail(id: String) = launch({ @@ -66,5 +67,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt index 0b35cc1..ccfabdd 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt @@ -43,6 +43,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCustomerDetail(id: String) = launch({ @@ -61,5 +62,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt index 2997f78..bcf278a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt @@ -29,5 +29,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt index 0545762..5ccba03 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt @@ -64,6 +64,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEntrustDetail(id: String) = launch({ @@ -82,6 +83,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun acceptEntrust(id: String) = launch({ @@ -100,6 +102,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun returnEntrust(id: String, selected: ArrayList) = launch({ @@ -118,6 +121,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun addEntrust( @@ -164,6 +168,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEntrustLog(id: String) = launch({ @@ -178,5 +183,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt index 3613dda..c7a2e22 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt @@ -77,6 +77,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentDetail(id: String) = launch({ @@ -95,6 +96,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getStandardDeviceList( @@ -131,6 +133,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getStandardDeviceDetail(id: String) = launch({ @@ -149,6 +152,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getSupportEquipmentList(id: String) = launch({ @@ -167,6 +171,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentStateChangeLog(id: String) = launch({ @@ -185,6 +190,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentUsageRecord(id: String) = launch({ @@ -203,5 +209,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt index b16c1c7..d88fa37 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt @@ -36,5 +36,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt index 4b56da4..d095ee3 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt @@ -37,5 +37,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt index e0f37ee..4d6df7b 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -63,6 +63,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getMeterageTrainDetail(id: String) = launch({ @@ -81,6 +82,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun signIn(staffId: String, planId: String) = launch({ @@ -99,5 +101,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt index d405aac..dd7943a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt @@ -5,6 +5,7 @@ import com.casic.xz.meterage.extensions.separateResponseCode import com.casic.xz.meterage.model.ActionResultModel import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -13,13 +14,15 @@ import com.pengxh.kt.lite.vm.BaseViewModel /** - * 消息通知 VM + * 消息通知提醒 VM * */ class NoticeViewModel : BaseViewModel() { private val gson by lazy { Gson() } val noticeList = MutableLiveData() val readNoticeResult = MutableLiveData() + val remindListResult = MutableLiveData() + val updateStatusResult = MutableLiveData() fun getNoticeList( noticeNo: String, @@ -45,6 +48,7 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun readNotice(userId: String, ids: Array) = launch({ @@ -57,5 +61,41 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ) = launch({ + val response = RetrofitServiceManager.getRemindList( + remindId, remindDeptId, messageType, startTime, endTime, offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + remindListResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun updateRemindStatus(id: String) = launch({ + val response = RetrofitServiceManager.updateRemindStatus(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + updateStatusResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/SampleViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/SampleViewModel.kt index 7234d20..5b917dc 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/SampleViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/SampleViewModel.kt @@ -63,6 +63,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun writeSample( @@ -117,5 +118,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/StandardFileViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/StandardFileViewModel.kt index e3f183f..0b8c74a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/StandardFileViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/StandardFileViewModel.kt @@ -61,5 +61,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt index a18380e..f8245f8 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt @@ -21,38 +21,10 @@ private val gson by lazy { Gson() } - // val registerResult = MutableLiveData() val loginResult = MutableLiveData() val userInfo = MutableLiveData() // val outResultModel = MutableLiveData() -// fun register( -// account: String, -// password: String, -// positionLng: Double, -// positionLat: Double, -// clientId: String, -// syncName: String, -// syncDeptid: String -// ) = launch({ -// val response = RetrofitServiceManager.register( -// account, password, positionLng, positionLat, clientId, syncName, syncDeptid -// ) -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// registerResult.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ) -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show(BaseApplication.obtainInstance()) -// } -// }, { -// loadState.value = LoadState.Fail -// it.cause.toString().show(BaseApplication.get()) -// }) - fun enter(sid: String, account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading val response = RetrofitServiceManager.login(sid, account, secretKey) @@ -69,6 +41,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getUserInfo(account: String) = launch({ @@ -81,6 +54,7 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) // fun updateUserInfo(userData: UserDetailModel.DataModel) = launch({ @@ -96,6 +70,7 @@ // }, { // loadState.value = LoadState.Fail // it.cause.toString().show(BaseApplication.get()) +// it.printStackTrace() // }) // // fun out() = launch({ @@ -110,5 +85,6 @@ // } // }, { // it.cause.toString().show(BaseApplication.get()) +// it.printStackTrace() // }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt index 6234d43..f8e3324 100644 --- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt +++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt @@ -32,8 +32,10 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.ExecutionException +import kotlin.math.abs /** * String扩展方法 @@ -146,6 +148,30 @@ return (t2 - t1) > 0 } +/** + * 时间差-小时 + * */ +fun String.diffCurrentTime(): Int { + if (this.isBlank()) { + return 0 + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + val diff = abs(System.currentTimeMillis() - date.time) + return (diff / (3600000)).toInt() +} + +fun String.formatToDate(): String { + if (this.isBlank()) { + return this + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + + val dateFormat = SimpleDateFormat("MM-dd", Locale.CHINA) + return dateFormat.format(date) +} + fun String.toChineseGrade(): String { if (this.isBlank()) { return "级别未知" @@ -155,7 +181,7 @@ "1" -> "B" "2" -> "C" "3" -> "D" - else -> "级别未知" + else -> "未知" } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 66bd2e6..90c55ab 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,10 +5,15 @@ import android.widget.TextView import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.diffCurrentTime +import com.casic.xz.meterage.extensions.formatToDate +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant @@ -26,8 +31,10 @@ import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* +import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* class HomePageFragment : KotlinBaseFragment() { @@ -37,7 +44,13 @@ private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel private lateinit var userData: UserInfoModel.DataModel + private lateinit var remindAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false private var currentIndex = 0 + private var clickedPosition = 0 private val qrManager by lazy { QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) } @@ -45,12 +58,89 @@ override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } weakReferenceHandler = WeakReferenceHandler { msg -> - if (msg.what == 2023030601) { - val rowsModel = msg.obj as List + when (msg.what) { + 2023030601 -> { + val rowsModel = msg.obj as List - //TODO 添加切换动画 - noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) - currentIndex++ + //TODO 添加切换动画 + noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) + currentIndex++ + } + 2023030801 -> { + if (isRefresh || isLoadMore) { + remindAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有待办提醒") { + pageIndex = 1 + getRemindListByPage() + } + } else { + emptyView!!.hide() + remindAdapter = + object : NormalRecyclerAdapter( + R.layout.item_remind_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: RemindListModel.DataModel.RowsModel + ) { + if (position < 3) { + val deltaT = item.createTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.createTime.formatToDate() + } + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText(R.id.remindTimeView, diffTime) + } else { + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText( + R.id.remindTimeView, + item.createTime.formatToDate() + ) + } + } + } + remindRecyclerView.addItemDecoration( + DividerItemDecoration( + requireContext(), DividerItemDecoration.VERTICAL + ) + ) + remindRecyclerView.adapter = remindAdapter + remindAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: RemindListModel.DataModel.RowsModel + ) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("标记此条待办提醒?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + noticeViewModel.updateRemindStatus(t.id) + } + }).build().show() + } + }) + } + } + } } true } @@ -71,6 +161,7 @@ } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + //消息通知 noticeViewModel.noticeList.observe(this) { if (it.code == 200) { val data = it.data @@ -103,6 +194,42 @@ } } } + //待办提醒 + noticeViewModel.remindListResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + remindLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + remindLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + noticeViewModel.updateStatusResult.observe(this) { + if (it.code == 200) { + //刷新待办提醒列表 + dataBeans.removeAt(clickedPosition) + remindAdapter.notifyItemRemoved(clickedPosition) + remindAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } val homeAdapter = object : NormalRecyclerAdapter( R.layout.item_home_rv_g, LocaleConstant.HOME_FUNC_OPERATE.toList() @@ -138,6 +265,9 @@ override fun onResume() { super.onResume() noticeViewModel.getNoticeList("", "", "", "", "", 1) + + pageIndex = 1 + getRemindListByPage() } override fun initEvent() { @@ -154,6 +284,23 @@ noticeLayout.setOnClickListener { requireContext().navigatePageTo() } + + remindLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getRemindListByPage() + } + + remindLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getRemindListByPage() + } + } + + private fun getRemindListByPage() { + noticeViewModel.getRemindList("", "", "", "", "", pageIndex) } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java new file mode 100644 index 0000000..2158f6c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java @@ -0,0 +1,184 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class RemindListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessCode; + private String businessId; + private String createTime; + private String createUser; + private String createUserName; + private String id; + private String messageContent; + private String messageTitle; + private String messageType; + private String messageTypeName; + private String remindDeptId; + private String remindId; + private String status; + private String updateTime; + + public String getBusinessCode() { + return businessCode; + } + + public void setBusinessCode(String businessCode) { + this.businessCode = businessCode; + } + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getCreateUserName() { + return createUserName; + } + + public void setCreateUserName(String createUserName) { + this.createUserName = createUserName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMessageContent() { + return messageContent; + } + + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + + public String getMessageTitle() { + return messageTitle; + } + + public void setMessageTitle(String messageTitle) { + this.messageTitle = messageTitle; + } + + public String getMessageType() { + return messageType; + } + + public void setMessageType(String messageType) { + this.messageType = messageType; + } + + public String getMessageTypeName() { + return messageTypeName; + } + + public void setMessageTypeName(String messageTypeName) { + this.messageTypeName = messageTypeName; + } + + public String getRemindDeptId() { + return remindDeptId; + } + + public void setRemindDeptId(String remindDeptId) { + this.remindDeptId = remindDeptId; + } + + public String getRemindId() { + return remindId; + } + + public void setRemindId(String remindId) { + this.remindId = remindId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3b8b208..40cfb7e 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -66,6 +66,26 @@ ): String /** + * 获取待办提醒列表 + */ + @POST("/workbench/remindMessage/list") + suspend fun getRemindList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 待办提醒已读 + */ + @POST("/workbench/remindMessage/updateStatus") + suspend fun updateRemindStatus( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取设备列表 */ @POST("/meter/assets/listPage") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 086ba97..321e780 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -121,6 +121,48 @@ } /** + * 获取待办提醒列表 + */ + suspend fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ): String { + val param = JsonObject() + param.addProperty("remindId", remindId) + param.addProperty("remindDeptId", remindDeptId) + param.addProperty("messageType", messageType) + param.addProperty("startTime", startTime) + param.addProperty("endTime", endTime) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getRemindList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 待办提醒已读 + */ + suspend fun updateRemindStatus(id: String): String { + val param = JsonObject() + param.addProperty("id", id) + param.addProperty("status", "1") + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateRemindStatus(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取设备列表 */ suspend fun getEquipmentList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt index 885777b..98dbc87 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt @@ -135,6 +135,11 @@ } } + if (count == 0) { + "没有未读消息".show(this@NoticeListActivity) + return + } + //声明一个全是未读消息长度的空数组 val ids = arrayOfNulls(count) dataBeans.forEachIndexed { index, model -> @@ -241,10 +246,12 @@ override fun onItemClicked( position: Int, t: NoticeListModel.DataModel.RowsModel ) { - isAllRead = false - //标记被点击的item位置 - clickedPosition = position - noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + if (t.read == "0") { + isAllRead = false + //标记被点击的item位置 + clickedPosition = position + noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + } navigatePageTo(t.toJson()) } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt index f3185b8..79f1ba6 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt @@ -32,5 +32,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt index b40cf4f..ea92a54 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt @@ -48,6 +48,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCapabilityDetail(id: String) = launch({ @@ -66,5 +67,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt index 0b35cc1..ccfabdd 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt @@ -43,6 +43,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCustomerDetail(id: String) = launch({ @@ -61,5 +62,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt index 2997f78..bcf278a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt @@ -29,5 +29,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt index 0545762..5ccba03 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt @@ -64,6 +64,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEntrustDetail(id: String) = launch({ @@ -82,6 +83,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun acceptEntrust(id: String) = launch({ @@ -100,6 +102,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun returnEntrust(id: String, selected: ArrayList) = launch({ @@ -118,6 +121,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun addEntrust( @@ -164,6 +168,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEntrustLog(id: String) = launch({ @@ -178,5 +183,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt index 3613dda..c7a2e22 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt @@ -77,6 +77,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentDetail(id: String) = launch({ @@ -95,6 +96,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getStandardDeviceList( @@ -131,6 +133,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getStandardDeviceDetail(id: String) = launch({ @@ -149,6 +152,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getSupportEquipmentList(id: String) = launch({ @@ -167,6 +171,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentStateChangeLog(id: String) = launch({ @@ -185,6 +190,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentUsageRecord(id: String) = launch({ @@ -203,5 +209,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt index b16c1c7..d88fa37 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt @@ -36,5 +36,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt index 4b56da4..d095ee3 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt @@ -37,5 +37,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt index e0f37ee..4d6df7b 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -63,6 +63,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getMeterageTrainDetail(id: String) = launch({ @@ -81,6 +82,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun signIn(staffId: String, planId: String) = launch({ @@ -99,5 +101,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt index d405aac..dd7943a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt @@ -5,6 +5,7 @@ import com.casic.xz.meterage.extensions.separateResponseCode import com.casic.xz.meterage.model.ActionResultModel import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -13,13 +14,15 @@ import com.pengxh.kt.lite.vm.BaseViewModel /** - * 消息通知 VM + * 消息通知提醒 VM * */ class NoticeViewModel : BaseViewModel() { private val gson by lazy { Gson() } val noticeList = MutableLiveData() val readNoticeResult = MutableLiveData() + val remindListResult = MutableLiveData() + val updateStatusResult = MutableLiveData() fun getNoticeList( noticeNo: String, @@ -45,6 +48,7 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun readNotice(userId: String, ids: Array) = launch({ @@ -57,5 +61,41 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ) = launch({ + val response = RetrofitServiceManager.getRemindList( + remindId, remindDeptId, messageType, startTime, endTime, offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + remindListResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun updateRemindStatus(id: String) = launch({ + val response = RetrofitServiceManager.updateRemindStatus(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + updateStatusResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/SampleViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/SampleViewModel.kt index 7234d20..5b917dc 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/SampleViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/SampleViewModel.kt @@ -63,6 +63,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun writeSample( @@ -117,5 +118,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/StandardFileViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/StandardFileViewModel.kt index e3f183f..0b8c74a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/StandardFileViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/StandardFileViewModel.kt @@ -61,5 +61,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt index a18380e..f8245f8 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt @@ -21,38 +21,10 @@ private val gson by lazy { Gson() } - // val registerResult = MutableLiveData() val loginResult = MutableLiveData() val userInfo = MutableLiveData() // val outResultModel = MutableLiveData() -// fun register( -// account: String, -// password: String, -// positionLng: Double, -// positionLat: Double, -// clientId: String, -// syncName: String, -// syncDeptid: String -// ) = launch({ -// val response = RetrofitServiceManager.register( -// account, password, positionLng, positionLat, clientId, syncName, syncDeptid -// ) -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// registerResult.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ) -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show(BaseApplication.obtainInstance()) -// } -// }, { -// loadState.value = LoadState.Fail -// it.cause.toString().show(BaseApplication.get()) -// }) - fun enter(sid: String, account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading val response = RetrofitServiceManager.login(sid, account, secretKey) @@ -69,6 +41,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getUserInfo(account: String) = launch({ @@ -81,6 +54,7 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) // fun updateUserInfo(userData: UserDetailModel.DataModel) = launch({ @@ -96,6 +70,7 @@ // }, { // loadState.value = LoadState.Fail // it.cause.toString().show(BaseApplication.get()) +// it.printStackTrace() // }) // // fun out() = launch({ @@ -110,5 +85,6 @@ // } // }, { // it.cause.toString().show(BaseApplication.get()) +// it.printStackTrace() // }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/VerifyViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/VerifyViewModel.kt index 7e21d41..a6119a7 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/VerifyViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/VerifyViewModel.kt @@ -37,5 +37,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt index 6234d43..f8e3324 100644 --- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt +++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt @@ -32,8 +32,10 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.ExecutionException +import kotlin.math.abs /** * String扩展方法 @@ -146,6 +148,30 @@ return (t2 - t1) > 0 } +/** + * 时间差-小时 + * */ +fun String.diffCurrentTime(): Int { + if (this.isBlank()) { + return 0 + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + val diff = abs(System.currentTimeMillis() - date.time) + return (diff / (3600000)).toInt() +} + +fun String.formatToDate(): String { + if (this.isBlank()) { + return this + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + + val dateFormat = SimpleDateFormat("MM-dd", Locale.CHINA) + return dateFormat.format(date) +} + fun String.toChineseGrade(): String { if (this.isBlank()) { return "级别未知" @@ -155,7 +181,7 @@ "1" -> "B" "2" -> "C" "3" -> "D" - else -> "级别未知" + else -> "未知" } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 66bd2e6..90c55ab 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,10 +5,15 @@ import android.widget.TextView import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.diffCurrentTime +import com.casic.xz.meterage.extensions.formatToDate +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant @@ -26,8 +31,10 @@ import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* +import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* class HomePageFragment : KotlinBaseFragment() { @@ -37,7 +44,13 @@ private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel private lateinit var userData: UserInfoModel.DataModel + private lateinit var remindAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false private var currentIndex = 0 + private var clickedPosition = 0 private val qrManager by lazy { QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) } @@ -45,12 +58,89 @@ override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } weakReferenceHandler = WeakReferenceHandler { msg -> - if (msg.what == 2023030601) { - val rowsModel = msg.obj as List + when (msg.what) { + 2023030601 -> { + val rowsModel = msg.obj as List - //TODO 添加切换动画 - noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) - currentIndex++ + //TODO 添加切换动画 + noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) + currentIndex++ + } + 2023030801 -> { + if (isRefresh || isLoadMore) { + remindAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有待办提醒") { + pageIndex = 1 + getRemindListByPage() + } + } else { + emptyView!!.hide() + remindAdapter = + object : NormalRecyclerAdapter( + R.layout.item_remind_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: RemindListModel.DataModel.RowsModel + ) { + if (position < 3) { + val deltaT = item.createTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.createTime.formatToDate() + } + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText(R.id.remindTimeView, diffTime) + } else { + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText( + R.id.remindTimeView, + item.createTime.formatToDate() + ) + } + } + } + remindRecyclerView.addItemDecoration( + DividerItemDecoration( + requireContext(), DividerItemDecoration.VERTICAL + ) + ) + remindRecyclerView.adapter = remindAdapter + remindAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: RemindListModel.DataModel.RowsModel + ) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("标记此条待办提醒?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + noticeViewModel.updateRemindStatus(t.id) + } + }).build().show() + } + }) + } + } + } } true } @@ -71,6 +161,7 @@ } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + //消息通知 noticeViewModel.noticeList.observe(this) { if (it.code == 200) { val data = it.data @@ -103,6 +194,42 @@ } } } + //待办提醒 + noticeViewModel.remindListResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + remindLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + remindLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + noticeViewModel.updateStatusResult.observe(this) { + if (it.code == 200) { + //刷新待办提醒列表 + dataBeans.removeAt(clickedPosition) + remindAdapter.notifyItemRemoved(clickedPosition) + remindAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } val homeAdapter = object : NormalRecyclerAdapter( R.layout.item_home_rv_g, LocaleConstant.HOME_FUNC_OPERATE.toList() @@ -138,6 +265,9 @@ override fun onResume() { super.onResume() noticeViewModel.getNoticeList("", "", "", "", "", 1) + + pageIndex = 1 + getRemindListByPage() } override fun initEvent() { @@ -154,6 +284,23 @@ noticeLayout.setOnClickListener { requireContext().navigatePageTo() } + + remindLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getRemindListByPage() + } + + remindLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getRemindListByPage() + } + } + + private fun getRemindListByPage() { + noticeViewModel.getRemindList("", "", "", "", "", pageIndex) } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java new file mode 100644 index 0000000..2158f6c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java @@ -0,0 +1,184 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class RemindListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessCode; + private String businessId; + private String createTime; + private String createUser; + private String createUserName; + private String id; + private String messageContent; + private String messageTitle; + private String messageType; + private String messageTypeName; + private String remindDeptId; + private String remindId; + private String status; + private String updateTime; + + public String getBusinessCode() { + return businessCode; + } + + public void setBusinessCode(String businessCode) { + this.businessCode = businessCode; + } + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getCreateUserName() { + return createUserName; + } + + public void setCreateUserName(String createUserName) { + this.createUserName = createUserName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMessageContent() { + return messageContent; + } + + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + + public String getMessageTitle() { + return messageTitle; + } + + public void setMessageTitle(String messageTitle) { + this.messageTitle = messageTitle; + } + + public String getMessageType() { + return messageType; + } + + public void setMessageType(String messageType) { + this.messageType = messageType; + } + + public String getMessageTypeName() { + return messageTypeName; + } + + public void setMessageTypeName(String messageTypeName) { + this.messageTypeName = messageTypeName; + } + + public String getRemindDeptId() { + return remindDeptId; + } + + public void setRemindDeptId(String remindDeptId) { + this.remindDeptId = remindDeptId; + } + + public String getRemindId() { + return remindId; + } + + public void setRemindId(String remindId) { + this.remindId = remindId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3b8b208..40cfb7e 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -66,6 +66,26 @@ ): String /** + * 获取待办提醒列表 + */ + @POST("/workbench/remindMessage/list") + suspend fun getRemindList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 待办提醒已读 + */ + @POST("/workbench/remindMessage/updateStatus") + suspend fun updateRemindStatus( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取设备列表 */ @POST("/meter/assets/listPage") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 086ba97..321e780 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -121,6 +121,48 @@ } /** + * 获取待办提醒列表 + */ + suspend fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ): String { + val param = JsonObject() + param.addProperty("remindId", remindId) + param.addProperty("remindDeptId", remindDeptId) + param.addProperty("messageType", messageType) + param.addProperty("startTime", startTime) + param.addProperty("endTime", endTime) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getRemindList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 待办提醒已读 + */ + suspend fun updateRemindStatus(id: String): String { + val param = JsonObject() + param.addProperty("id", id) + param.addProperty("status", "1") + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateRemindStatus(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取设备列表 */ suspend fun getEquipmentList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt index 885777b..98dbc87 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt @@ -135,6 +135,11 @@ } } + if (count == 0) { + "没有未读消息".show(this@NoticeListActivity) + return + } + //声明一个全是未读消息长度的空数组 val ids = arrayOfNulls(count) dataBeans.forEachIndexed { index, model -> @@ -241,10 +246,12 @@ override fun onItemClicked( position: Int, t: NoticeListModel.DataModel.RowsModel ) { - isAllRead = false - //标记被点击的item位置 - clickedPosition = position - noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + if (t.read == "0") { + isAllRead = false + //标记被点击的item位置 + clickedPosition = position + noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + } navigatePageTo(t.toJson()) } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt index f3185b8..79f1ba6 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt @@ -32,5 +32,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt index b40cf4f..ea92a54 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt @@ -48,6 +48,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCapabilityDetail(id: String) = launch({ @@ -66,5 +67,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt index 0b35cc1..ccfabdd 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt @@ -43,6 +43,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCustomerDetail(id: String) = launch({ @@ -61,5 +62,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt index 2997f78..bcf278a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt @@ -29,5 +29,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt index 0545762..5ccba03 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt @@ -64,6 +64,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEntrustDetail(id: String) = launch({ @@ -82,6 +83,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun acceptEntrust(id: String) = launch({ @@ -100,6 +102,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun returnEntrust(id: String, selected: ArrayList) = launch({ @@ -118,6 +121,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun addEntrust( @@ -164,6 +168,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEntrustLog(id: String) = launch({ @@ -178,5 +183,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt index 3613dda..c7a2e22 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt @@ -77,6 +77,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentDetail(id: String) = launch({ @@ -95,6 +96,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getStandardDeviceList( @@ -131,6 +133,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getStandardDeviceDetail(id: String) = launch({ @@ -149,6 +152,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getSupportEquipmentList(id: String) = launch({ @@ -167,6 +171,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentStateChangeLog(id: String) = launch({ @@ -185,6 +190,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentUsageRecord(id: String) = launch({ @@ -203,5 +209,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt index b16c1c7..d88fa37 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt @@ -36,5 +36,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt index 4b56da4..d095ee3 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt @@ -37,5 +37,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt index e0f37ee..4d6df7b 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -63,6 +63,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getMeterageTrainDetail(id: String) = launch({ @@ -81,6 +82,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun signIn(staffId: String, planId: String) = launch({ @@ -99,5 +101,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt index d405aac..dd7943a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt @@ -5,6 +5,7 @@ import com.casic.xz.meterage.extensions.separateResponseCode import com.casic.xz.meterage.model.ActionResultModel import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -13,13 +14,15 @@ import com.pengxh.kt.lite.vm.BaseViewModel /** - * 消息通知 VM + * 消息通知提醒 VM * */ class NoticeViewModel : BaseViewModel() { private val gson by lazy { Gson() } val noticeList = MutableLiveData() val readNoticeResult = MutableLiveData() + val remindListResult = MutableLiveData() + val updateStatusResult = MutableLiveData() fun getNoticeList( noticeNo: String, @@ -45,6 +48,7 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun readNotice(userId: String, ids: Array) = launch({ @@ -57,5 +61,41 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ) = launch({ + val response = RetrofitServiceManager.getRemindList( + remindId, remindDeptId, messageType, startTime, endTime, offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + remindListResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun updateRemindStatus(id: String) = launch({ + val response = RetrofitServiceManager.updateRemindStatus(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + updateStatusResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/SampleViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/SampleViewModel.kt index 7234d20..5b917dc 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/SampleViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/SampleViewModel.kt @@ -63,6 +63,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun writeSample( @@ -117,5 +118,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/StandardFileViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/StandardFileViewModel.kt index e3f183f..0b8c74a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/StandardFileViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/StandardFileViewModel.kt @@ -61,5 +61,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt index a18380e..f8245f8 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt @@ -21,38 +21,10 @@ private val gson by lazy { Gson() } - // val registerResult = MutableLiveData() val loginResult = MutableLiveData() val userInfo = MutableLiveData() // val outResultModel = MutableLiveData() -// fun register( -// account: String, -// password: String, -// positionLng: Double, -// positionLat: Double, -// clientId: String, -// syncName: String, -// syncDeptid: String -// ) = launch({ -// val response = RetrofitServiceManager.register( -// account, password, positionLng, positionLat, clientId, syncName, syncDeptid -// ) -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// registerResult.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ) -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show(BaseApplication.obtainInstance()) -// } -// }, { -// loadState.value = LoadState.Fail -// it.cause.toString().show(BaseApplication.get()) -// }) - fun enter(sid: String, account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading val response = RetrofitServiceManager.login(sid, account, secretKey) @@ -69,6 +41,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getUserInfo(account: String) = launch({ @@ -81,6 +54,7 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) // fun updateUserInfo(userData: UserDetailModel.DataModel) = launch({ @@ -96,6 +70,7 @@ // }, { // loadState.value = LoadState.Fail // it.cause.toString().show(BaseApplication.get()) +// it.printStackTrace() // }) // // fun out() = launch({ @@ -110,5 +85,6 @@ // } // }, { // it.cause.toString().show(BaseApplication.get()) +// it.printStackTrace() // }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/VerifyViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/VerifyViewModel.kt index 7e21d41..a6119a7 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/VerifyViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/VerifyViewModel.kt @@ -37,5 +37,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 14badb1..71b8b08 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -145,11 +145,39 @@ android:text="待办提醒" android:textSize="@dimen/sp_16" /> - + android:orientation="vertical"> + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt index 6234d43..f8e3324 100644 --- a/app/src/main/java/com/casic/xz/meterage/extensions/String.kt +++ b/app/src/main/java/com/casic/xz/meterage/extensions/String.kt @@ -32,8 +32,10 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.ExecutionException +import kotlin.math.abs /** * String扩展方法 @@ -146,6 +148,30 @@ return (t2 - t1) > 0 } +/** + * 时间差-小时 + * */ +fun String.diffCurrentTime(): Int { + if (this.isBlank()) { + return 0 + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + val diff = abs(System.currentTimeMillis() - date.time) + return (diff / (3600000)).toInt() +} + +fun String.formatToDate(): String { + if (this.isBlank()) { + return this + } + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this) + + val dateFormat = SimpleDateFormat("MM-dd", Locale.CHINA) + return dateFormat.format(date) +} + fun String.toChineseGrade(): String { if (this.isBlank()) { return "级别未知" @@ -155,7 +181,7 @@ "1" -> "B" "2" -> "C" "3" -> "D" - else -> "级别未知" + else -> "未知" } } diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 66bd2e6..90c55ab 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,10 +5,15 @@ import android.widget.TextView import androidx.core.text.isDigitsOnly import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import cn.bertsir.zbar.QrManager import com.casic.xz.meterage.R import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.diffCurrentTime +import com.casic.xz.meterage.extensions.formatToDate +import com.casic.xz.meterage.extensions.showEmptyPage import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.model.UserInfoModel import com.casic.xz.meterage.utils.LoadingDialogHub import com.casic.xz.meterage.utils.LocaleConstant @@ -26,8 +31,10 @@ import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_home.* +import kotlinx.android.synthetic.main.include_empty_view.* import java.util.* class HomePageFragment : KotlinBaseFragment() { @@ -37,7 +44,13 @@ private lateinit var meterageTrainViewModel: MeterageTrainViewModel private lateinit var noticeViewModel: NoticeViewModel private lateinit var userData: UserInfoModel.DataModel + private lateinit var remindAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false private var currentIndex = 0 + private var clickedPosition = 0 private val qrManager by lazy { QrManager.getInstance().init(QrConfigCreator.create(BaseApplication.get())) } @@ -45,12 +58,89 @@ override fun initData() { noticeSwitcherView.setFactory { TextView(requireContext()) } weakReferenceHandler = WeakReferenceHandler { msg -> - if (msg.what == 2023030601) { - val rowsModel = msg.obj as List + when (msg.what) { + 2023030601 -> { + val rowsModel = msg.obj as List - //TODO 添加切换动画 - noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) - currentIndex++ + //TODO 添加切换动画 + noticeSwitcherView.setText(rowsModel[currentIndex % rowsModel.size].noticeTitle) + currentIndex++ + } + 2023030801 -> { + if (isRefresh || isLoadMore) { + remindAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有待办提醒") { + pageIndex = 1 + getRemindListByPage() + } + } else { + emptyView!!.hide() + remindAdapter = + object : NormalRecyclerAdapter( + R.layout.item_remind_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: RemindListModel.DataModel.RowsModel + ) { + if (position < 3) { + val deltaT = item.createTime.diffCurrentTime() + val diffTime = if (deltaT < 24) { + "${deltaT}小时前" + } else { + item.createTime.formatToDate() + } + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText(R.id.remindTimeView, diffTime) + } else { + viewHolder.setText( + R.id.remindStateView, item.messageTypeName + ).setText(R.id.remindTitleView, item.messageContent) + .setText( + R.id.remindTimeView, + item.createTime.formatToDate() + ) + } + } + } + remindRecyclerView.addItemDecoration( + DividerItemDecoration( + requireContext(), DividerItemDecoration.VERTICAL + ) + ) + remindRecyclerView.adapter = remindAdapter + remindAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: RemindListModel.DataModel.RowsModel + ) { + clickedPosition = position + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("标记此条待办提醒?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + noticeViewModel.updateRemindStatus(t.id) + } + }).build().show() + } + }) + } + } + } } true } @@ -71,6 +161,7 @@ } noticeViewModel = ViewModelProvider(this)[NoticeViewModel::class.java] + //消息通知 noticeViewModel.noticeList.observe(this) { if (it.code == 200) { val data = it.data @@ -103,6 +194,42 @@ } } } + //待办提醒 + noticeViewModel.remindListResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + remindLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(requireContext()) + } + dataBeans.addAll(dataRows) + remindLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023030801) + } + } + noticeViewModel.updateStatusResult.observe(this) { + if (it.code == 200) { + //刷新待办提醒列表 + dataBeans.removeAt(clickedPosition) + remindAdapter.notifyItemRemoved(clickedPosition) + remindAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + } val homeAdapter = object : NormalRecyclerAdapter( R.layout.item_home_rv_g, LocaleConstant.HOME_FUNC_OPERATE.toList() @@ -138,6 +265,9 @@ override fun onResume() { super.onResume() noticeViewModel.getNoticeList("", "", "", "", "", 1) + + pageIndex = 1 + getRemindListByPage() } override fun initEvent() { @@ -154,6 +284,23 @@ noticeLayout.setOnClickListener { requireContext().navigatePageTo() } + + remindLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getRemindListByPage() + } + + remindLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getRemindListByPage() + } + } + + private fun getRemindListByPage() { + noticeViewModel.getRemindList("", "", "", "", "", pageIndex) } override fun initLayoutView(): Int = R.layout.fragment_home diff --git a/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java new file mode 100644 index 0000000..2158f6c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/RemindListModel.java @@ -0,0 +1,184 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class RemindListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessCode; + private String businessId; + private String createTime; + private String createUser; + private String createUserName; + private String id; + private String messageContent; + private String messageTitle; + private String messageType; + private String messageTypeName; + private String remindDeptId; + private String remindId; + private String status; + private String updateTime; + + public String getBusinessCode() { + return businessCode; + } + + public void setBusinessCode(String businessCode) { + this.businessCode = businessCode; + } + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getCreateUserName() { + return createUserName; + } + + public void setCreateUserName(String createUserName) { + this.createUserName = createUserName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMessageContent() { + return messageContent; + } + + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + + public String getMessageTitle() { + return messageTitle; + } + + public void setMessageTitle(String messageTitle) { + this.messageTitle = messageTitle; + } + + public String getMessageType() { + return messageType; + } + + public void setMessageType(String messageType) { + this.messageType = messageType; + } + + public String getMessageTypeName() { + return messageTypeName; + } + + public void setMessageTypeName(String messageTypeName) { + this.messageTypeName = messageTypeName; + } + + public String getRemindDeptId() { + return remindDeptId; + } + + public void setRemindDeptId(String remindDeptId) { + this.remindDeptId = remindDeptId; + } + + public String getRemindId() { + return remindId; + } + + public void setRemindId(String remindId) { + this.remindId = remindId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3b8b208..40cfb7e 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -66,6 +66,26 @@ ): String /** + * 获取待办提醒列表 + */ + @POST("/workbench/remindMessage/list") + suspend fun getRemindList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 待办提醒已读 + */ + @POST("/workbench/remindMessage/updateStatus") + suspend fun updateRemindStatus( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 获取设备列表 */ @POST("/meter/assets/listPage") diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 086ba97..321e780 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -121,6 +121,48 @@ } /** + * 获取待办提醒列表 + */ + suspend fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ): String { + val param = JsonObject() + param.addProperty("remindId", remindId) + param.addProperty("remindDeptId", remindDeptId) + param.addProperty("messageType", messageType) + param.addProperty("startTime", startTime) + param.addProperty("endTime", endTime) + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getRemindList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 待办提醒已读 + */ + suspend fun updateRemindStatus(id: String): String { + val param = JsonObject() + param.addProperty("id", id) + param.addProperty("status", "1") + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateRemindStatus(AuthenticationHelper.token!!, requestBody) + } + + /** * 获取设备列表 */ suspend fun getEquipmentList( diff --git a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt index 885777b..98dbc87 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/notice/NoticeListActivity.kt @@ -135,6 +135,11 @@ } } + if (count == 0) { + "没有未读消息".show(this@NoticeListActivity) + return + } + //声明一个全是未读消息长度的空数组 val ids = arrayOfNulls(count) dataBeans.forEachIndexed { index, model -> @@ -241,10 +246,12 @@ override fun onItemClicked( position: Int, t: NoticeListModel.DataModel.RowsModel ) { - isAllRead = false - //标记被点击的item位置 - clickedPosition = position - noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + if (t.read == "0") { + isAllRead = false + //标记被点击的item位置 + clickedPosition = position + noticeViewModel.readNotice(userInfo.id, arrayOf(t.id)) + } navigatePageTo(t.toJson()) } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt index f3185b8..79f1ba6 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/AuthenticateViewModel.kt @@ -32,5 +32,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt index b40cf4f..ea92a54 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt @@ -48,6 +48,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCapabilityDetail(id: String) = launch({ @@ -66,5 +67,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt index 0b35cc1..ccfabdd 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/CustomerViewModel.kt @@ -43,6 +43,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getCustomerDetail(id: String) = launch({ @@ -61,5 +62,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt index 2997f78..bcf278a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/DictionaryViewModel.kt @@ -29,5 +29,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt index 0545762..5ccba03 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/EntrustViewModel.kt @@ -64,6 +64,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEntrustDetail(id: String) = launch({ @@ -82,6 +83,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun acceptEntrust(id: String) = launch({ @@ -100,6 +102,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun returnEntrust(id: String, selected: ArrayList) = launch({ @@ -118,6 +121,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun addEntrust( @@ -164,6 +168,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEntrustLog(id: String) = launch({ @@ -178,5 +183,6 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt index 3613dda..c7a2e22 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/EquipmentViewModel.kt @@ -77,6 +77,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentDetail(id: String) = launch({ @@ -95,6 +96,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getStandardDeviceList( @@ -131,6 +133,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getStandardDeviceDetail(id: String) = launch({ @@ -149,6 +152,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getSupportEquipmentList(id: String) = launch({ @@ -167,6 +171,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentStateChangeLog(id: String) = launch({ @@ -185,6 +190,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getEquipmentUsageRecord(id: String) = launch({ @@ -203,5 +209,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt index b16c1c7..d88fa37 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/FileUploadViewModel.kt @@ -36,5 +36,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt index 4b56da4..d095ee3 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageStaffViewModel.kt @@ -37,5 +37,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } diff --git a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt index e0f37ee..4d6df7b 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/MeterageTrainViewModel.kt @@ -63,6 +63,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getMeterageTrainDetail(id: String) = launch({ @@ -81,6 +82,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun signIn(staffId: String, planId: String) = launch({ @@ -99,5 +101,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt index d405aac..dd7943a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/NoticeViewModel.kt @@ -5,6 +5,7 @@ import com.casic.xz.meterage.extensions.separateResponseCode import com.casic.xz.meterage.model.ActionResultModel import com.casic.xz.meterage.model.NoticeListModel +import com.casic.xz.meterage.model.RemindListModel import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -13,13 +14,15 @@ import com.pengxh.kt.lite.vm.BaseViewModel /** - * 消息通知 VM + * 消息通知提醒 VM * */ class NoticeViewModel : BaseViewModel() { private val gson by lazy { Gson() } val noticeList = MutableLiveData() val readNoticeResult = MutableLiveData() + val remindListResult = MutableLiveData() + val updateStatusResult = MutableLiveData() fun getNoticeList( noticeNo: String, @@ -45,6 +48,7 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun readNotice(userId: String, ids: Array) = launch({ @@ -57,5 +61,41 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun getRemindList( + remindId: String, + remindDeptId: String, + messageType: String, + startTime: String, + endTime: String, + offset: Int + ) = launch({ + val response = RetrofitServiceManager.getRemindList( + remindId, remindDeptId, messageType, startTime, endTime, offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + remindListResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun updateRemindStatus(id: String) = launch({ + val response = RetrofitServiceManager.updateRemindStatus(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + updateStatusResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/SampleViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/SampleViewModel.kt index 7234d20..5b917dc 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/SampleViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/SampleViewModel.kt @@ -63,6 +63,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun writeSample( @@ -117,5 +118,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/StandardFileViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/StandardFileViewModel.kt index e3f183f..0b8c74a 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/StandardFileViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/StandardFileViewModel.kt @@ -61,5 +61,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt index a18380e..f8245f8 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/UserViewModel.kt @@ -21,38 +21,10 @@ private val gson by lazy { Gson() } - // val registerResult = MutableLiveData() val loginResult = MutableLiveData() val userInfo = MutableLiveData() // val outResultModel = MutableLiveData() -// fun register( -// account: String, -// password: String, -// positionLng: Double, -// positionLat: Double, -// clientId: String, -// syncName: String, -// syncDeptid: String -// ) = launch({ -// val response = RetrofitServiceManager.register( -// account, password, positionLng, positionLat, clientId, syncName, syncDeptid -// ) -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// registerResult.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ) -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show(BaseApplication.obtainInstance()) -// } -// }, { -// loadState.value = LoadState.Fail -// it.cause.toString().show(BaseApplication.get()) -// }) - fun enter(sid: String, account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading val response = RetrofitServiceManager.login(sid, account, secretKey) @@ -69,6 +41,7 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) fun getUserInfo(account: String) = launch({ @@ -81,6 +54,7 @@ } }, { it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) // fun updateUserInfo(userData: UserDetailModel.DataModel) = launch({ @@ -96,6 +70,7 @@ // }, { // loadState.value = LoadState.Fail // it.cause.toString().show(BaseApplication.get()) +// it.printStackTrace() // }) // // fun out() = launch({ @@ -110,5 +85,6 @@ // } // }, { // it.cause.toString().show(BaseApplication.get()) +// it.printStackTrace() // }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/VerifyViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/VerifyViewModel.kt index 7e21d41..a6119a7 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/VerifyViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/VerifyViewModel.kt @@ -37,5 +37,6 @@ }, { loadState.value = LoadState.Fail it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 14badb1..71b8b08 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -145,11 +145,39 @@ android:text="待办提醒" android:textSize="@dimen/sp_16" /> - + android:orientation="vertical"> + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_remind_rv_l.xml b/app/src/main/res/layout/item_remind_rv_l.xml new file mode 100644 index 0000000..1e4a9e5 --- /dev/null +++ b/app/src/main/res/layout/item_remind_rv_l.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + \ No newline at end of file