优化:单个转发规则支持绑定多个发送通道,且支持执行逻辑(全部执行/失败即止/成功即止) #247

pull/286/head
pppscn 2 years ago
parent 9f41ff7d0b
commit f9ddbd7261

@ -31,6 +31,10 @@ interface LogsDao {
@Query("SELECT * FROM Logs where id=:id") @Query("SELECT * FROM Logs where id=:id")
fun get(id: Long): Single<Logs> fun get(id: Long): Single<Logs>
@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") @Query("SELECT count(*) FROM Logs where type=:type and forward_status=:forwardStatus")
fun count(type: String, forwardStatus: Int): Single<Int> fun count(type: String, forwardStatus: Int): Single<Int>

@ -22,4 +22,6 @@ class LogsRepository(private val logsDao: LogsDao) {
@WorkerThread @WorkerThread
fun updateStatus(id: Long, status: Int, response: String): Int = fun updateStatus(id: Long, status: Int, response: String): Int =
logsDao.updateStatus(id, status, response) logsDao.updateStatus(id, status, response)
fun getOne(id: Long) = logsDao.getOne(id)
} }

@ -21,6 +21,7 @@ import com.idormy.sms.forwarder.database.viewmodel.MsgViewModel
import com.idormy.sms.forwarder.databinding.FragmentLogsBinding import com.idormy.sms.forwarder.databinding.FragmentLogsBinding
import com.idormy.sms.forwarder.utils.EVENT_UPDATE_LOGS_TYPE 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.FORWARD_STATUS_MAP
import com.idormy.sms.forwarder.utils.SendUtils
import com.idormy.sms.forwarder.utils.XToastUtils import com.idormy.sms.forwarder.utils.XToastUtils
import com.jeremyliao.liveeventbus.LiveEventBus import com.jeremyliao.liveeventbus.LiveEventBus
import com.scwang.smartrefresh.layout.api.RefreshLayout import com.scwang.smartrefresh.layout.api.RefreshLayout
@ -123,7 +124,7 @@ class LogsFragment : BaseFragment<FragmentLogsBinding?>(), MsgPagingAdapter.OnIt
.neutralColor(ResUtils.getColors(R.color.red)) .neutralColor(ResUtils.getColors(R.color.red))
.onNeutral { _: MaterialDialog?, _: DialogAction? -> .onNeutral { _: MaterialDialog?, _: DialogAction? ->
XToastUtils.toast(R.string.rematch_toast) XToastUtils.toast(R.string.rematch_toast)
//SendUtils.resendMsg(item, true) SendUtils.rematchSendMsg(item)
} }
.show() .show()
} }
@ -150,7 +151,7 @@ class LogsFragment : BaseFragment<FragmentLogsBinding?>(), MsgPagingAdapter.OnIt
.negativeText(R.string.resend) .negativeText(R.string.resend)
.onNegative { _: MaterialDialog?, _: DialogAction? -> .onNegative { _: MaterialDialog?, _: DialogAction? ->
XToastUtils.toast(R.string.resend_toast) XToastUtils.toast(R.string.resend_toast)
//SendUtils.resendMsg(item, false) SendUtils.retrySendMsg(item.id)
} }
.show() .show()
} }

@ -114,6 +114,7 @@ const val CHECK_SIM_SLOT_2 = "SIM2"
const val SENDER_LOGIC_ALL = "ALL" const val SENDER_LOGIC_ALL = "ALL"
const val SENDER_LOGIC_UNTIL_FAIL = "UntilFail" const val SENDER_LOGIC_UNTIL_FAIL = "UntilFail"
const val SENDER_LOGIC_UNTIL_SUCCESS = "UntilSuccess" const val SENDER_LOGIC_UNTIL_SUCCESS = "UntilSuccess"
const val SENDER_LOGIC_RETRY = "Retry"
val TYPE_MAP = object : HashMap<String, String>() { val TYPE_MAP = object : HashMap<String, String>() {
init { init {
put("sms", getString(R.string.rule_sms)) put("sms", getString(R.string.rule_sms))

@ -7,7 +7,8 @@ import androidx.work.WorkManager
import androidx.work.workDataOf import androidx.work.workDataOf
import com.google.gson.Gson import com.google.gson.Gson
import com.idormy.sms.forwarder.R 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.database.entity.Rule
import com.idormy.sms.forwarder.entity.MsgInfo import com.idormy.sms.forwarder.entity.MsgInfo
import com.idormy.sms.forwarder.entity.result.SendResponse import com.idormy.sms.forwarder.entity.result.SendResponse
@ -24,39 +25,38 @@ import java.util.*
object SendUtils { object SendUtils {
private const val TAG = "SendUtils" private const val TAG = "SendUtils"
//发送消息 //重新匹配规则并发送消息
fun sendMsg(msgInfo: MsgInfo) { fun rematchSendMsg(item: MsgAndLogs) {
val request = OneTimeWorkRequestBuilder<SendWorker>() val msgInfo = MsgInfo(item.msg.type, item.msg.from, item.msg.content, Date(), item.msg.simInfo, item.msg.simSlot, item.msg.subId)
.setInputData(workDataOf(Worker.sendMsgInfo to Gson().toJson(msgInfo))) Log.d(TAG, "msgInfo = $msgInfo")
.build()
val request = OneTimeWorkRequestBuilder<SendWorker>().setInputData(
workDataOf(
Worker.sendMsgInfo to Gson().toJson(msgInfo)
)
).build()
WorkManager.getInstance(XUtil.getContext()).enqueue(request) WorkManager.getInstance(XUtil.getContext()).enqueue(request)
} }
/** //重试发送消息
* 重发消息从日志获取消息内容并尝试重发 fun retrySendMsg(logId: Long) {
* 根据当前rule和sender来重发而不是失败时设置的规则 val item = Core.logs.getOne(logId)
*/
fun resendMsg(item: LogsAndRuleAndSender, rematch: Boolean) {
Log.d(TAG, item.logs.toString())
val date: Date = try { val msgInfo = MsgInfo(item.msg.type, item.msg.from, item.msg.content, Date(), item.msg.simInfo, item.msg.simSlot, item.msg.subId)
//DateUtils.string2Date(item.logs.time.toString(), SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())) Log.d(TAG, "msgInfo = $msgInfo")
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")
if (rematch) { var senderIndex = 0
sendMsg(msgInfo) for (sender in item.rule.senderList) {
return 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) { fun senderLogic(status: Int, msgInfo: MsgInfo, rule: Rule?, senderIndex: Int = 0, msgId: Long = 0L) {
if (rule == null) return if (rule == null || rule.senderLogic == SENDER_LOGIC_RETRY) 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))) { 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<SendLogicWorker>() val request = OneTimeWorkRequestBuilder<SendLogicWorker>().setInputData(
.setInputData( workDataOf(
workDataOf( Worker.sendMsgInfo to Gson().toJson(msgInfo),
Worker.sendMsgInfo to Gson().toJson(msgInfo), Worker.ruleId to rule.id,
Worker.ruleId to rule.id, Worker.senderIndex to senderIndex + 1,
Worker.senderIndex to senderIndex + 1, Worker.msgId to msgId,
Worker.msgId to msgId,
)
) )
.build() ).build()
WorkManager.getInstance(XUtil.getContext()).enqueue(request) WorkManager.getInstance(XUtil.getContext()).enqueue(request)
} }
} }
@ -168,13 +167,11 @@ object SendUtils {
} }
val sendResponse = SendResponse(logId, status, response) val sendResponse = SendResponse(logId, status, response)
val request = OneTimeWorkRequestBuilder<UpdateLogsWorker>() val request = OneTimeWorkRequestBuilder<UpdateLogsWorker>().setInputData(
.setInputData( workDataOf(
workDataOf( Worker.updateLogs to Gson().toJson(sendResponse)
Worker.updateLogs to Gson().toJson(sendResponse)
)
) )
.build() ).build()
WorkManager.getInstance(XUtil.getContext()).enqueue(request) WorkManager.getInstance(XUtil.getContext()).enqueue(request)
} }

Loading…
Cancel
Save