Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import com.getjobs.application.entity.AiEntity;
import com.getjobs.application.service.AiService;
import com.getjobs.application.service.ChromeJobAnalysisQueueService;
import com.getjobs.application.service.JobAnalysisTaskStore;
import com.getjobs.application.service.JobAiAnalysisService;
import com.getjobs.application.service.ProfileService;
import lombok.Data;
Expand Down Expand Up @@ -34,6 +36,9 @@ public class AiConfigController {
@Autowired
private ProfileService profileService;

@Autowired
private ChromeJobAnalysisQueueService chromeJobAnalysisQueueService;

/**
* 获取AI配置
* @return AI配置信息
Expand Down Expand Up @@ -257,6 +262,50 @@ public ResponseEntity<Map<String, Object>> analyzeJob(@RequestBody JobAiAnalysis
}
}

@GetMapping("/job-analysis/tasks")
public ResponseEntity<Map<String, Object>> listJobAnalysisTasks(
@RequestParam(name = "limit", defaultValue = "50") int limit
) {
Map<String, Object> response = new HashMap<>();
try {
long profileId = profileService.getCurrentProfileId();
response.put("success", true);
response.put("data", chromeJobAnalysisQueueService.listTasks(profileId, limit));
response.put("queueSize", chromeJobAnalysisQueueService.queueSize(profileId));
response.put("message", "AI 分析任务读取成功");
return ResponseEntity.ok(response);
} catch (Exception e) {
log.error("读取 AI 分析任务失败", e);
response.put("success", false);
response.put("message", "读取 AI 分析任务失败: " + e.getMessage());
return ResponseEntity.internalServerError().body(response);
}
}

@PostMapping("/job-analysis/tasks/{taskId}/retry")
public ResponseEntity<Map<String, Object>> retryJobAnalysisTask(
@PathVariable long taskId,
@RequestParam(name = "confirmUnknown", defaultValue = "false") boolean confirmUnknown
) {
Map<String, Object> response = new HashMap<>();
try {
long profileId = profileService.getCurrentProfileId();
JobAnalysisTaskStore.RetryResult result = chromeJobAnalysisQueueService.retry(
taskId, profileId, confirmUnknown);
response.put("success", result.accepted());
response.put("data", result.task() == null ? null : result.task().toView());
response.put("message", result.message());
return result.accepted()
? ResponseEntity.ok(response)
: ResponseEntity.badRequest().body(response);
} catch (Exception e) {
log.error("重试 AI 分析任务失败", e);
response.put("success", false);
response.put("message", "重试 AI 分析任务失败: " + e.getMessage());
return ResponseEntity.internalServerError().body(response);
}
}

/**
* 健康检查接口
* @return 服务状态
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -205,11 +205,11 @@ public ResponseEntity<Map<String, Object>> receiveChromeJobs(@RequestBody Chrome
continue;
}

saved = bossService.updateDeliveryStatusById(saved.getId(), DeliveryStatus.AI_ANALYZING);
JobAiAnalysisService.JobAnalysisRequest analysisRequest = new JobAiAnalysisService.JobAnalysisRequest();
analysisRequest.setProfileId(profileId);
analysisRequest.setPlatform("boss");
analysisRequest.setJobKey(saved.getEncryptId());
analysisRequest.setJobRowId(saved.getId());
analysisRequest.setKeyword(dto.getKeyword() == null ? request.getKeyword() : dto.getKeyword());
analysisRequest.setCompanyName(saved.getCompanyName());
analysisRequest.setJobName(saved.getJobName());
Expand All @@ -230,7 +230,6 @@ public ResponseEntity<Map<String, Object>> receiveChromeJobs(@RequestBody Chrome

ChromeJobAnalysisQueueService.EnqueueResult enqueueResult = chromeJobAnalysisQueueService.enqueue(job);
if (enqueueResult.isRejected()) {
bossService.updateDeliveryStatusById(saved.getId(), firstNonBlank(currentStatus, DeliveryStatus.NOT_DELIVERED));
Map<String, Object> response = decorateListCollectionResponse(
bossChromeJobsResponse(false, false, received, insertedOrUpdated, queued, skipped, insufficient, restored, autoDeliver, analyses),
listOnlyCollection, listCollected, collectionWarnings
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -415,15 +415,11 @@ public ResponseEntity<Map<String, Object>> receiveChromeJobs(@RequestBody Chrome
sendZhilianProgress(JobProgressMessage.warning("zhilian", message));
continue;
}
if (!isFinalZhilianStatus(currentStatus)) {
zhilianService.updateDeliveryStatusById(saved.getId(), DeliveryStatus.AI_ANALYZING);
saved = zhilianService.getZhilianJobById(saved.getId());
}

JobAiAnalysisService.JobAnalysisRequest analysisRequest = new JobAiAnalysisService.JobAnalysisRequest();
analysisRequest.setProfileId(profileId);
analysisRequest.setPlatform("zhilian");
analysisRequest.setJobKey(saved.getJobId());
analysisRequest.setJobRowId(saved.getId());
analysisRequest.setKeyword(dto.getKeyword() == null ? request.getKeyword() : dto.getKeyword());
analysisRequest.setCompanyName(saved.getCompanyName());
analysisRequest.setJobName(saved.getJobTitle());
Expand All @@ -444,7 +440,6 @@ public ResponseEntity<Map<String, Object>> receiveChromeJobs(@RequestBody Chrome

ChromeJobAnalysisQueueService.EnqueueResult enqueueResult = chromeJobAnalysisQueueService.enqueue(job);
if (enqueueResult.isRejected()) {
zhilianService.updateDeliveryStatusById(saved.getId(), firstNonBlank(currentStatus, DeliveryStatus.NOT_DELIVERED));
Map<String, Object> response = zhilianChromeJobsResponse(
false, false, received, savedCount, queued, skipped, insufficient, restored, analyses
);
Expand Down
13 changes: 13 additions & 0 deletions src/main/java/com/getjobs/application/service/BossService.java
Original file line number Diff line number Diff line change
Expand Up @@ -1687,9 +1687,21 @@ public Map<String, Object> clearBossAnalysisData() {
conn.setAutoCommit(false);

int analysisDeleted;
int tasksDeleted;
int jobsDeleted;
try (Statement st = conn.createStatement()) {
Long profileId = profileService.getCurrentProfileId();
tasksDeleted = st.executeUpdate("DELETE FROM job_analysis_task WHERE lower(platform)='boss' " +
"AND profile_id=" + profileId + " AND status<>'LEASED'");
try (java.sql.ResultSet rs = st.executeQuery("SELECT COUNT(*) FROM job_analysis_task " +
"WHERE lower(platform)='boss' AND profile_id=" + profileId + " AND status='LEASED'")) {
if (rs.next() && rs.getLong(1) > 0) {
conn.rollback();
resp.put("success", false);
resp.put("message", "仍有 Boss AI 分析正在执行,已阻止清空;请等待完成或进入 UNKNOWN 后再试");
return resp;
}
}
analysisDeleted = st.executeUpdate("DELETE FROM job_ai_analysis WHERE lower(platform)='boss' AND profile_id=" + profileId);
jobsDeleted = st.executeUpdate("DELETE FROM boss_data WHERE profile_id=" + profileId);
}
Expand All @@ -1699,6 +1711,7 @@ public Map<String, Object> clearBossAnalysisData() {
resp.put("message", "Boss投递分析数据已清空");
resp.put("jobsDeleted", jobsDeleted);
resp.put("analysisDeleted", analysisDeleted);
resp.put("tasksDeleted", tasksDeleted);
resp.put("total", 0);
} catch (Exception e) {
try { if (conn != null) conn.rollback(); } catch (Exception ignore) {}
Expand Down
Loading
Loading