fix(agent): retry purchases in place (#225)
This commit is contained in:
@@ -11,8 +11,8 @@ android {
|
||||
applicationId = "cn.ilapage.goauto.agent"
|
||||
minSdk = 23
|
||||
targetSdk = 34
|
||||
versionCode = 59
|
||||
versionName = "0.9.46"
|
||||
versionCode = 60
|
||||
versionName = "0.9.47"
|
||||
|
||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||
|
||||
|
||||
@@ -83,10 +83,12 @@ internal object CollectionResetPolicy {
|
||||
internal object PurchaseRetryPolicy {
|
||||
fun showsAction(status: String, retryable: Boolean): Boolean = status == "failed" && retryable
|
||||
|
||||
fun usesInPlaceReset(continuing: Boolean): Boolean = !continuing
|
||||
|
||||
fun confirmationMessage(continuing: Boolean = false): String = if (continuing) {
|
||||
"替代商品已完成匹配。系统会保留原任务并创建一笔新采购任务;可能创建拼多多待付款订单,但不会支付。"
|
||||
} else {
|
||||
"系统会保留原任务,并根据当前商品档案和最新采购规则创建一笔新采购任务;可能创建拼多多待付款订单,但不会支付。"
|
||||
"系统会复用原采购任务并开始新一次执行,使用当前有效采购规则,商品和规格等任务快照保持不变;可能创建拼多多待付款订单,但不会支付。"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -746,7 +748,7 @@ class TaskHistoryFragment : Fragment() {
|
||||
contentDescription = "重试采购任务 CG-${task.taskId}"
|
||||
setOnClickListener { confirmPurchaseRetry(task) }
|
||||
}, collectionCardParams())
|
||||
resultColumn.addView(context.centeredMessage("重试边界", "保留当前失败任务并创建新任务;新任务读取当前商品档案和采购规则,不会执行支付。"))
|
||||
resultColumn.addView(context.centeredMessage("重试边界", "复用当前任务并新增一次执行;使用当前有效采购规则,商品和规格快照不变,不会执行支付。"))
|
||||
} else if (!replacementInProgress && task.status == "failed") {
|
||||
val reason = task.retryDisabledReason?.takeIf(String::isNotBlank) ?: "请在管理端核对任务状态。"
|
||||
resultColumn.addView(context.centeredMessage("不可重试", reason))
|
||||
@@ -864,18 +866,25 @@ class TaskHistoryFragment : Fragment() {
|
||||
val generation = ++requestGeneration
|
||||
showLoading(if (continuing) "正在提交继续采购请求…" else "正在提交重试请求…")
|
||||
Thread {
|
||||
runCatching {
|
||||
runCatching<Unit> {
|
||||
val client = AgentApiClient(serverUrl)
|
||||
val requestId = UUID.randomUUID().toString()
|
||||
client.retryPurchaseTask(taskId, requestId, credentials.token)
|
||||
}
|
||||
.onSuccess { result ->
|
||||
if (PurchaseRetryPolicy.usesInPlaceReset(continuing)) {
|
||||
val result = client.resetPurchaseTask(taskId, requestId, credentials.token)
|
||||
resultColumn.post {
|
||||
if (!isAdded || generation != requestGeneration) return@post
|
||||
AgentForegroundService.start(requireContext())
|
||||
showPurchaseResetSuccess(result.taskNo, result.taskId, result.attemptNumber)
|
||||
}
|
||||
} else {
|
||||
val result = client.retryPurchaseTask(taskId, requestId, credentials.token)
|
||||
resultColumn.post {
|
||||
if (!isAdded || generation != requestGeneration) return@post
|
||||
AgentForegroundService.start(requireContext())
|
||||
showPurchaseRetrySuccess(result.sourceTaskNo, result.taskNo, result.taskId)
|
||||
}
|
||||
}
|
||||
}
|
||||
.onFailure { error ->
|
||||
resultColumn.post {
|
||||
if (isAdded && generation == requestGeneration) {
|
||||
@@ -886,6 +895,24 @@ class TaskHistoryFragment : Fragment() {
|
||||
}.start()
|
||||
}
|
||||
|
||||
private fun showPurchaseResetSuccess(taskNo: String, taskId: Long, attemptNumber: Int) {
|
||||
resultColumn.removeAllViews()
|
||||
resultColumn.addView(requireContext().centeredMessage(
|
||||
"$taskNo 已进入第 $attemptNumber 次执行",
|
||||
"原采购任务已复用,并将由当前设备按正常队列执行;系统不会支付。",
|
||||
))
|
||||
resultColumn.addView(MaterialButton(requireContext()).apply {
|
||||
text = "查看当前任务"
|
||||
minimumHeight = requireContext().dp(48)
|
||||
setOnClickListener { loadPurchaseDetail(taskId) }
|
||||
}, collectionCardParams())
|
||||
resultColumn.addView(MaterialButton(requireContext(), null, com.google.android.material.R.attr.materialButtonOutlinedStyle).apply {
|
||||
text = "返回采购记录"
|
||||
minimumHeight = requireContext().dp(48)
|
||||
setOnClickListener { page = 1; load() }
|
||||
}, collectionCardParams())
|
||||
}
|
||||
|
||||
private fun showPurchaseRetrySuccess(sourceTaskNo: String, taskNo: String, taskId: Long) {
|
||||
resultColumn.removeAllViews()
|
||||
resultColumn.addView(requireContext().centeredMessage(
|
||||
|
||||
@@ -16,19 +16,22 @@ class PurchaseRetryPolicyTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `retry confirmation explains new task current archive and no payment`() {
|
||||
fun `ordinary retry uses same task new attempt and no payment`() {
|
||||
val message = PurchaseRetryPolicy.confirmationMessage()
|
||||
assertTrue(message.contains("保留原任务"))
|
||||
assertTrue(message.contains("当前商品档案"))
|
||||
assertTrue(message.contains("最新采购规则"))
|
||||
assertTrue(message.contains("新采购任务"))
|
||||
assertTrue(PurchaseRetryPolicy.usesInPlaceReset(continuing = false))
|
||||
assertTrue(message.contains("复用原采购任务"))
|
||||
assertTrue(message.contains("新一次执行"))
|
||||
assertTrue(message.contains("当前有效采购规则"))
|
||||
assertTrue(message.contains("任务快照保持不变"))
|
||||
assertTrue(message.contains("待付款订单"))
|
||||
assertTrue(message.contains("不会支付"))
|
||||
assertFalse(message.contains("新采购任务"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `continue confirmation remains a new purchase task`() {
|
||||
val message = PurchaseRetryPolicy.confirmationMessage(continuing = true)
|
||||
assertFalse(PurchaseRetryPolicy.usesInPlaceReset(continuing = true))
|
||||
assertTrue(message.contains("新采购任务"))
|
||||
assertTrue(message.contains("替代商品"))
|
||||
assertTrue(message.contains("不会支付"))
|
||||
|
||||
Reference in New Issue
Block a user