@@ -801,7 +826,7 @@ function TaskStatusPage({ history, onView }) {
) : (
filtered.map((item) => (
@@ -829,8 +854,8 @@ function TaskStatusPage({ history, onView }) {
{item.status === "待审核"
? "凭证已锁定,专员核验中"
- : item.status === "已通过"
- ? "审核已通过"
+ : ["已通过", "已完成"].includes(item.status)
+ ? item.status === "已完成" ? "任务已完成" : "审核已通过"
: item.status === "未通过"
? "需要重新提交"
: "等待选择问题"}
@@ -863,6 +888,7 @@ export default function AskUserPortal({ api }) {
const [claimEdit, setClaimEdit] = useState(false);
const [exhausted, setExhausted] = useState(false);
const [invalidTask, setInvalidTask] = useState("");
+ const [completedTask, setCompletedTask] = useState(false);
const [expiredAssignment, setExpiredAssignment] = useState(false);
const [selectionExpired, setSelectionExpired] = useState(false);
@@ -877,6 +903,7 @@ export default function AskUserPortal({ api }) {
setAssignment(result.data);
setExhausted(false);
setInvalidTask("");
+ setCompletedTask(false);
setExpiredAssignment(false);
setSelectionExpired(false);
// Keep the current view. In particular, polling a pending review must
@@ -901,6 +928,11 @@ export default function AskUserPortal({ api }) {
setExhausted(true);
setInvalidTask("");
setError("");
+ } else if (requestError.message === COMPLETED_TASK_MESSAGE) {
+ setAssignment(null);
+ setCompletedTask(true);
+ setInvalidTask("");
+ setError("");
} else if (isInvalidTaskError(requestError.message)) {
setAssignment(null);
setInvalidTask(requestError.message);
@@ -918,14 +950,18 @@ export default function AskUserPortal({ api }) {
}
}
async function loadHistory() {
+ setBusy(true);
try {
const result = await api(
`/api/ask/me/assignments?token=${encodeURIComponent(session.token)}`,
);
setHistory(result.data);
setView("status");
+ setError("");
} catch (requestError) {
setError(requestError.message);
+ } finally {
+ setBusy(false);
}
}
useEffect(() => {
@@ -944,12 +980,15 @@ export default function AskUserPortal({ api }) {
setAssignment(null);
setExhausted(false);
setInvalidTask("");
+ setCompletedTask(false);
setExpiredAssignment(false);
setSelectionExpired(false);
};
if (!session) return ;
if (exhausted)
return ;
+ if (completedTask && view !== "status" && !assignment)
+ return ;
if (invalidTask)
return loadAssignment()} />;
if (expiredAssignment)
diff --git a/frontend/src/TaskBoardPage.jsx b/frontend/src/TaskBoardPage.jsx
index 4b9f55b..f71c495 100644
--- a/frontend/src/TaskBoardPage.jsx
+++ b/frontend/src/TaskBoardPage.jsx
@@ -281,8 +281,8 @@ function TaskDetail({ task, close, onConfirmRefund, onCreateRefundUpload, onPoll
className={`task-detail-cell${index ? " row-border" : ""}`}
style={{ gridColumn: 3, gridRow: index + 1 }}
>
- {task.user_id}
- {task.phone && task.phone !== task.user_id && {maskPhone(task.phone)}}
+ {question.user_id || "--"}
+ {question.phone && question.phone !== question.user_id && {maskPhone(question.phone)}}