优化:单个转发规则支持绑定多个发送通道,且支持执行逻辑(全部执行/失败即止/成功即止) #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")
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")
fun count(type: String, forwardStatus: Int): Single<Int>

@ -22,4 +22,6 @@ class LogsRepository(private val logsDao: LogsDao) {
@WorkerThread
fun updateStatus(id: Long, status: Int, response: String): Int =
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.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<FragmentLogsBinding?>(), 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<FragmentLogsBinding?>(), MsgPagingAdapter.OnIt
.negativeText(R.string.resend)
.onNegative { _: MaterialDialog?, _: DialogAction? ->
XToastUtils.toast(R.string.resend_toast)
//SendUtils.resendMsg(item, false)
SendUtils.retrySendMsg(item.id)
}
.show()
}

@ -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<String, String>() {
init {
put("sms", getString(R.string.rule_sms))

@ -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<SendWorker>()
.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<SendWorker>().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<SendLogicWorker>()
.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<SendLogicWorker>().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<UpdateLogsWorker>()
.setInputData(
workDataOf(
Worker.updateLogs to Gson().toJson(sendResponse)
)
val request = OneTimeWorkRequestBuilder<UpdateLogsWorker>().setInputData(
workDataOf(
Worker.updateLogs to Gson().toJson(sendResponse)
)
.build()
).build()
WorkManager.getInstance(XUtil.getContext()).enqueue(request)
}

Loading…
Cancel
Save