mirror of
https://github.com/pppscn/SmsForwarder
synced 2025-08-03 17:37:40 +08:00
优化:单个转发规则支持绑定多个发送通道,且支持执行逻辑(全部执行/失败即止/成功即止) #247
This commit is contained in:
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) {
|
var senderIndex = 0
|
||||||
e.printStackTrace()
|
for (sender in item.rule.senderList) {
|
||||||
Date()
|
if (item.logs.senderId == sender.id) {
|
||||||
|
Log.d(TAG, "sender = $sender")
|
||||||
|
senderIndex = item.rule.senderList.indexOf(sender)
|
||||||
|
break
|
||||||
}
|
}
|
||||||
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) {
|
|
||||||
sendMsg(msgInfo)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//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…
x
Reference in New Issue
Block a user