diff --git a/admin-web/src/api/admin.ts b/admin-web/src/api/admin.ts index d608ffd..6599143 100644 --- a/admin-web/src/api/admin.ts +++ b/admin-web/src/api/admin.ts @@ -515,6 +515,9 @@ export interface AdminReportListItem { report_entry_admin_name: string; report_entered_at: string; trace_info_visible: boolean; + reject_reason: string; + rejected_by_name: string; + rejected_at: string; product_name: string; category_name: string; brand_name: string; @@ -542,6 +545,9 @@ export interface AdminReportDetail { report_entry_admin_name: string; report_entered_at: string; trace_info_visible: boolean; + reject_reason: string; + rejected_by_name: string; + rejected_at: string; }; product_info: Record; result_info: Record; @@ -565,6 +571,8 @@ export interface AdminReportDetail { report_page_url: string; verify_count: number; }; + audit_logs: AdminReportLog[]; + change_logs: AdminReportLog[]; } export interface AdminPublishReportResponse { @@ -575,6 +583,18 @@ export interface AdminPublishReportResponse { report_page_url: string; } +export interface AdminReportLog { + id: number; + action: string; + action_text: string; + operator_id: number; + operator_name: string; + before_data: Record; + after_data: Record; + remark: string; + created_at: string; +} + export interface AdminManualInspectionPayload { id?: number; report_header: { @@ -1864,6 +1884,16 @@ export const adminApi = { data: AdminPublishReportResponse & { material_tag?: AdminMaterialTagCode | null }; }>; }, + rejectReport(id: number, reason: string) { + return request.post("/api/admin/report/reject", { + id, + reason, + }) as Promise<{ + code: number; + message: string; + data: { id: number; report_status: string; reject_reason: string }; + }>; + }, updateReportTraceVisibility(id: number, visible: boolean) { return request.post("/api/admin/report/trace-visibility", { id, diff --git a/admin-web/src/pages/appraisal-tasks/index.vue b/admin-web/src/pages/appraisal-tasks/index.vue index 59e43e3..a1980cf 100644 --- a/admin-web/src/pages/appraisal-tasks/index.vue +++ b/admin-web/src/pages/appraisal-tasks/index.vue @@ -256,6 +256,15 @@ const isTaskReadonly = computed(() => { if (!detail.value) { return false; } + + const reportStatus = detail.value.report_summary?.report_status || ""; + if (["draft", "pending_publish", "updated", "rejected"].includes(reportStatus)) { + return false; + } + if (reportStatus === "published") { + return true; + } + return ( ["submitted", "completed"].includes(detail.value.task_info.status) || (Boolean(detail.value.task_info.submitted_at) && Boolean(detail.value.report_summary)) @@ -799,7 +808,7 @@ async function submitResult(action: "save" | "submit") { key_points: normalizedKeyPoints(), ...(qrInput ? { qr_input: qrInput } : {}), }); - ElMessage.success(response.message || (action === "submit" ? "验真吊牌已绑定,报告已发布" : "结论已保存")); + ElMessage.success(response.message || (action === "submit" ? "验真吊牌已绑定,报告待管理员发布" : "结论已保存")); await loadDetail(detail.value.task_info.id); await fetchTasks(); } catch (error) { @@ -817,7 +826,7 @@ async function publishCurrentTaskWithMaterialTag(qrInput: string) { id: detail.value.task_info.id, qr_input: qrInput, }); - ElMessage.success("验真吊牌已绑定,报告已发布"); + ElMessage.success("验真吊牌已绑定,报告待管理员发布"); await loadDetail(detail.value.task_info.id); await fetchTasks(); } @@ -835,7 +844,7 @@ async function bindMaterialTag() { materialTagInput.value = ""; } catch (error: any) { console.error(error); - ElMessage.error(error?.message || "验真吊牌绑定或报告发布失败"); + ElMessage.error(error?.message || "验真吊牌绑定失败"); } finally { materialTagBinding.value = false; } @@ -843,12 +852,12 @@ async function bindMaterialTag() { async function promptPublishMaterialTagInput() { try { - const result = await ElMessageBox.prompt("是否已鉴定完成并确定发布报告?", "绑定验真吊牌并发布报告", { + const result = await ElMessageBox.prompt("是否已鉴定完成并提交报告待发布?", "绑定验真吊牌并提交报告", { type: "warning", inputPlaceholder: "请扫描验真吊牌二维码", inputPattern: /\S+/, inputErrorMessage: "请扫描验真吊牌二维码", - confirmButtonText: "是的,去绑定验真吊牌", + confirmButtonText: "是的,绑定并提交", cancelButtonText: "取消", closeOnClickModal: false, }); @@ -904,7 +913,7 @@ async function submitZhongjianReport() { report_files: zhongjianReportFiles.value, qr_input: qrInput, }); - ElMessage.success(response.message || "验真吊牌已绑定,报告已发布"); + ElMessage.success(response.message || "验真吊牌已绑定,报告待管理员发布"); await loadDetail(detail.value.task_info.id); await fetchTasks(); } catch (error: any) { @@ -1124,7 +1133,7 @@ onMounted(async () => { 分配处理人 认领给我 重置内容 - 提交并发布报告 + 提交待发布报告