From f9ddbd7261d00a3dfae0ab32882361e3234e879e Mon Sep 17 00:00:00 2001 From: pppscn <35696959@qq.com> Date: Fri, 10 Feb 2023 11:19:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=9A=E5=8D=95=E4=B8=AA?= =?UTF-8?q?=E8=BD=AC=E5=8F=91=E8=A7=84=E5=88=99=E6=94=AF=E6=8C=81=E7=BB=91?= =?UTF-8?q?=E5=AE=9A=E5=A4=9A=E4=B8=AA=E5=8F=91=E9=80=81=E9=80=9A=E9=81=93?= =?UTF-8?q?=EF=BC=8C=E4=B8=94=E6=94=AF=E6=8C=81=E6=89=A7=E8=A1=8C=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=88=E5=85=A8=E9=83=A8=E6=89=A7=E8=A1=8C/?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E5=8D=B3=E6=AD=A2/=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E5=8D=B3=E6=AD=A2=EF=BC=89=20#247?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sms/forwarder/database/dao/LogsDao.kt | 4 + .../database/repository/LogsRepository.kt | 50 ++++++----- .../sms/forwarder/fragment/LogsFragment.kt | 5 +- .../idormy/sms/forwarder/utils/Constants.kt | 1 + .../idormy/sms/forwarder/utils/SendUtils.kt | 87 +++++++++---------- 5 files changed, 76 insertions(+), 71 deletions(-) diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/dao/LogsDao.kt b/app/src/main/java/com/idormy/sms/forwarder/database/dao/LogsDao.kt index 129c18c3..64db091c 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/dao/LogsDao.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/dao/LogsDao.kt @@ -31,6 +31,10 @@ interface LogsDao { @Query("SELECT * FROM Logs where id=:id") fun get(id: Long): Single + @Transaction + @Query("SELECT * FROM Logs where id=:id") + fun getOne(id: Long): LogsAndRuleAndSender + @Query("SELECT count(*) FROM Logs where type=:type and forward_status=:forwardStatus") fun count(type: String, forwardStatus: Int): Single diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/repository/LogsRepository.kt b/app/src/main/java/com/idormy/sms/forwarder/database/repository/LogsRepository.kt index 8449b71a..8c93ecba 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/repository/LogsRepository.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/repository/LogsRepository.kt @@ -1,25 +1,27 @@ -package com.idormy.sms.forwarder.database.repository - -import androidx.annotation.WorkerThread -import com.idormy.sms.forwarder.database.dao.LogsDao -import com.idormy.sms.forwarder.database.entity.Logs - -class LogsRepository(private val logsDao: LogsDao) { - - @WorkerThread - fun delete(id: Long) { - logsDao.delete(id) - } - - @WorkerThread - fun deleteTimeAgo(time: Long) { - logsDao.deleteTimeAgo(time) - } - - @WorkerThread - suspend fun insert(logs: Logs): Long = logsDao.insert(logs) - - @WorkerThread - fun updateStatus(id: Long, status: Int, response: String): Int = - logsDao.updateStatus(id, status, response) +package com.idormy.sms.forwarder.database.repository + +import androidx.annotation.WorkerThread +import com.idormy.sms.forwarder.database.dao.LogsDao +import com.idormy.sms.forwarder.database.entity.Logs + +class LogsRepository(private val logsDao: LogsDao) { + + @WorkerThread + fun delete(id: Long) { + logsDao.delete(id) + } + + @WorkerThread + fun deleteTimeAgo(time: Long) { + logsDao.deleteTimeAgo(time) + } + + @WorkerThread + suspend fun insert(logs: Logs): Long = logsDao.insert(logs) + + @WorkerThread + fun updateStatus(id: Long, status: Int, response: String): Int = + logsDao.updateStatus(id, status, response) + + fun getOne(id: Long) = logsDao.getOne(id) } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/LogsFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/LogsFragment.kt index c96e1e86..966edcad 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/LogsFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/LogsFragment.kt @@ -21,6 +21,7 @@ import com.idormy.sms.forwarder.database.viewmodel.MsgViewModel import com.idormy.sms.forwarder.databinding.FragmentLogsBinding import com.idormy.sms.forwarder.utils.EVENT_UPDATE_LOGS_TYPE import com.idormy.sms.forwarder.utils.FORWARD_STATUS_MAP +import com.idormy.sms.forwarder.utils.SendUtils import com.idormy.sms.forwarder.utils.XToastUtils import com.jeremyliao.liveeventbus.LiveEventBus import com.scwang.smartrefresh.layout.api.RefreshLayout @@ -123,7 +124,7 @@ class LogsFragment : BaseFragment(), MsgPagingAdapter.OnIt .neutralColor(ResUtils.getColors(R.color.red)) .onNeutral { _: MaterialDialog?, _: DialogAction? -> XToastUtils.toast(R.string.rematch_toast) - //SendUtils.resendMsg(item, true) + SendUtils.rematchSendMsg(item) } .show() } @@ -150,7 +151,7 @@ class LogsFragment : BaseFragment(), MsgPagingAdapter.OnIt .negativeText(R.string.resend) .onNegative { _: MaterialDialog?, _: DialogAction? -> XToastUtils.toast(R.string.resend_toast) - //SendUtils.resendMsg(item, false) + SendUtils.retrySendMsg(item.id) } .show() } diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt index cf668926..75c067f5 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt @@ -114,6 +114,7 @@ const val CHECK_SIM_SLOT_2 = "SIM2" const val SENDER_LOGIC_ALL = "ALL" const val SENDER_LOGIC_UNTIL_FAIL = "UntilFail" const val SENDER_LOGIC_UNTIL_SUCCESS = "UntilSuccess" +const val SENDER_LOGIC_RETRY = "Retry" val TYPE_MAP = object : HashMap() { init { put("sms", getString(R.string.rule_sms)) diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/SendUtils.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/SendUtils.kt index eab93ae9..5e16311c 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/SendUtils.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/SendUtils.kt @@ -7,7 +7,8 @@ import androidx.work.WorkManager import androidx.work.workDataOf import com.google.gson.Gson import com.idormy.sms.forwarder.R -import com.idormy.sms.forwarder.database.entity.LogsAndRuleAndSender +import com.idormy.sms.forwarder.core.Core +import com.idormy.sms.forwarder.database.entity.MsgAndLogs import com.idormy.sms.forwarder.database.entity.Rule import com.idormy.sms.forwarder.entity.MsgInfo import com.idormy.sms.forwarder.entity.result.SendResponse @@ -24,39 +25,38 @@ import java.util.* object SendUtils { private const val TAG = "SendUtils" - //发送消息 - fun sendMsg(msgInfo: MsgInfo) { - val request = OneTimeWorkRequestBuilder() - .setInputData(workDataOf(Worker.sendMsgInfo to Gson().toJson(msgInfo))) - .build() + //重新匹配规则并发送消息 + fun rematchSendMsg(item: MsgAndLogs) { + val msgInfo = MsgInfo(item.msg.type, item.msg.from, item.msg.content, Date(), item.msg.simInfo, item.msg.simSlot, item.msg.subId) + Log.d(TAG, "msgInfo = $msgInfo") + + val request = OneTimeWorkRequestBuilder().setInputData( + workDataOf( + Worker.sendMsgInfo to Gson().toJson(msgInfo) + ) + ).build() WorkManager.getInstance(XUtil.getContext()).enqueue(request) } - /** - * 重发消息:从日志获取消息内容并尝试重发 - * 根据当前rule和sender来重发,而不是失败时设置的规则 - */ - fun resendMsg(item: LogsAndRuleAndSender, rematch: Boolean) { - Log.d(TAG, item.logs.toString()) + //重试发送消息 + fun retrySendMsg(logId: Long) { + val item = Core.logs.getOne(logId) - val date: Date = try { - //DateUtils.string2Date(item.logs.time.toString(), SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())) - item.logs.time - } catch (e: Exception) { - e.printStackTrace() - Date() - } - val simInfo: String = item.msg.simInfo - val simSlot: Int = if (simInfo.startsWith("SIM2")) 2 else 1 - val msgInfo = MsgInfo(item.msg.type, item.msg.from, item.msg.content, date, simInfo, simSlot) - Log.d(TAG, "resendMsg msgInfo:$msgInfo") + val msgInfo = MsgInfo(item.msg.type, item.msg.from, item.msg.content, Date(), item.msg.simInfo, item.msg.simSlot, item.msg.subId) + Log.d(TAG, "msgInfo = $msgInfo") - if (rematch) { - sendMsg(msgInfo) - return + var senderIndex = 0 + for (sender in item.rule.senderList) { + if (item.logs.senderId == sender.id) { + Log.d(TAG, "sender = $sender") + senderIndex = item.rule.senderList.indexOf(sender) + break + } } - //sendMsgSender(msgInfo, item.rule, item.sender, item.logs.id) + var rule = item.rule + rule.senderLogic = SENDER_LOGIC_RETRY + sendMsgSender(msgInfo, rule, senderIndex, logId, item.msg.id) } //匹配发送通道发送消息 @@ -134,20 +134,19 @@ object SendUtils { } } + //发送通道执行逻辑:ALL=全部执行, UntilFail=失败即终止, UntilSuccess=成功即终止, Retry=重试发送 fun senderLogic(status: Int, msgInfo: MsgInfo, rule: Rule?, senderIndex: Int = 0, msgId: Long = 0L) { - if (rule == null) return - //发送通道执行逻辑:ALL=全部执行, UntilFail=失败即终止, UntilSuccess=成功即终止 - if (senderIndex < rule.senderList.count() - 1 && ((status == 2 && rule.senderLogic == SENDER_LOGIC_UNTIL_FAIL) || (status == 0 && rule.senderLogic == SENDER_LOGIC_UNTIL_SUCCESS))) { - val request = OneTimeWorkRequestBuilder() - .setInputData( - workDataOf( - Worker.sendMsgInfo to Gson().toJson(msgInfo), - Worker.ruleId to rule.id, - Worker.senderIndex to senderIndex + 1, - Worker.msgId to msgId, - ) + if (rule == null || rule.senderLogic == SENDER_LOGIC_RETRY) return + + if (senderIndex < rule.senderList.count() - 1 && (rule.senderLogic == SENDER_LOGIC_ALL || (status == 2 && rule.senderLogic == SENDER_LOGIC_UNTIL_FAIL) || (status == 0 && rule.senderLogic == SENDER_LOGIC_UNTIL_SUCCESS))) { + val request = OneTimeWorkRequestBuilder().setInputData( + workDataOf( + Worker.sendMsgInfo to Gson().toJson(msgInfo), + Worker.ruleId to rule.id, + Worker.senderIndex to senderIndex + 1, + Worker.msgId to msgId, ) - .build() + ).build() WorkManager.getInstance(XUtil.getContext()).enqueue(request) } } @@ -168,13 +167,11 @@ object SendUtils { } val sendResponse = SendResponse(logId, status, response) - val request = OneTimeWorkRequestBuilder() - .setInputData( - workDataOf( - Worker.updateLogs to Gson().toJson(sendResponse) - ) + val request = OneTimeWorkRequestBuilder().setInputData( + workDataOf( + Worker.updateLogs to Gson().toJson(sendResponse) ) - .build() + ).build() WorkManager.getInstance(XUtil.getContext()).enqueue(request) }