| 563 | } |
| 564 | |
| 565 | def get_cached_generation_events(self, record_id: str, pages: list) -> List[Dict[str, Any]]: |
| 566 | record = self.history_service.get_record(record_id, sync_images=True) |
| 567 | if not record: |
| 568 | return [] |
| 569 | |
| 570 | images = record.get("images") or {} |
| 571 | task_id = images.get("task_id") |
| 572 | generated = images.get("generated") or [] |
| 573 | if not task_id or not HistoryImageMerger.has_images(generated): |
| 574 | return [] |
| 575 | |
| 576 | total = len(pages) |
| 577 | completed = 0 |
| 578 | failed_indices = [] |
| 579 | events: List[Dict[str, Any]] = [] |
| 580 | |
| 581 | for page in pages: |
| 582 | index = page.get("index") |
| 583 | filename = generated[index] if isinstance(index, int) and index < len(generated) else "" |
| 584 | if filename: |
| 585 | completed += 1 |
| 586 | events.append({ |
| 587 | "event": "complete", |
| 588 | "data": { |
| 589 | "index": index, |
| 590 | "status": "done", |
| 591 | "image_url": f"/api/images/{task_id}/{filename}", |
| 592 | "phase": "cached", |
| 593 | "cached": True, |
| 594 | } |
| 595 | }) |
| 596 | else: |
| 597 | failed_indices.append(index) |
| 598 | events.append({ |
| 599 | "event": "error", |
| 600 | "data": { |
| 601 | "index": index, |
| 602 | "status": "error", |
| 603 | "message": "历史记录中缺少该页图片,可手动补全", |
| 604 | "retryable": True, |
| 605 | "phase": "cached", |
| 606 | "cached": True, |
| 607 | } |
| 608 | }) |
| 609 | |
| 610 | events.append({ |
| 611 | "event": "finish", |
| 612 | "data": { |
| 613 | "success": len(failed_indices) == 0, |
| 614 | "task_id": task_id, |
| 615 | "images": generated, |
| 616 | "total": total, |
| 617 | "completed": completed, |
| 618 | "failed": len(failed_indices), |
| 619 | "failed_indices": failed_indices, |
| 620 | "cached": True, |
| 621 | } |
| 622 | }) |