Initial commit: MSH System\n\n- msh_single_uniapp: Vue 2 + UniApp 前端(微信小程序/H5/App/支付宝小程序)\n- msh_crmeb_22: Spring Boot 2.2 后端(C端API/管理端/业务逻辑)\n- models-integration: AI服务集成(Coze/KieAI/腾讯ASR)\n- docs: 产品文档与设计稿
This commit is contained in:
256
.cursor/plans/诊断article_status_task异常问题_6bd03fd4.plan.md
Normal file
256
.cursor/plans/诊断article_status_task异常问题_6bd03fd4.plan.md
Normal file
@@ -0,0 +1,256 @@
|
||||
---
|
||||
name: ""
|
||||
overview: ""
|
||||
todos: []
|
||||
isProject: false
|
||||
---
|
||||
|
||||
# 诊断article.status_task异常和video_url未更新问题
|
||||
|
||||
## 问题描述
|
||||
|
||||
**问题1**:提交饮食打卡记录时,article表中的status_task字段保持为0或变成2,而不是预期的1(完成)
|
||||
|
||||
**问题2**:article表中的video_url字段始终为NULL,即使视频已经生成完成
|
||||
|
||||
**关键信息**:
|
||||
|
||||
- KieAI回调一般需要10秒以上才到达,不会立即回调
|
||||
- 两个问题有关联,都指向**KieAI回调没有正常执行或执行失败**
|
||||
|
||||
## 根因分析
|
||||
|
||||
### 核心问题:KieAI回调未正常执行
|
||||
|
||||
根据分析,最可能的原因是:
|
||||
|
||||
**原因1:回调反序列化失败**(最可能)
|
||||
|
||||
根据[修复kieai回调反序列化问题计划](修复kieai回调反序列化问题_85d41db5.plan.md),KieAI回调到达后端,但Jackson反序列化失败:
|
||||
|
||||
```
|
||||
Could not resolve parameter [0]... Problem deserializing 'setterless' property 'resultUrls':
|
||||
get method returned null
|
||||
```
|
||||
|
||||
这导致:
|
||||
|
||||
1. `handleCallback` 方法无法执行
|
||||
2. `handleTaskCallback` 中更新article的逻辑从未运行
|
||||
3. `video_url` 和 `status_task` 字段保持未更新状态
|
||||
|
||||
**原因2:回调URL配置错误**
|
||||
|
||||
- `kieAIConfig.getApiCallbackUrl()` 可能未配置或配置错误
|
||||
- KieAI服务无法访问回调地址(网络问题、防火墙等)
|
||||
- 回调地址格式不正确
|
||||
|
||||
**原因3:回调数据格式问题**
|
||||
|
||||
- KieAI返回的数据结构与`KieAIQueryTaskResponse`不匹配
|
||||
- `resultUrls`字段名称或格式异常
|
||||
|
||||
## 执行流程分析
|
||||
|
||||
### 预期流程(正常情况)
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Frontend as 前端
|
||||
participant Sora2 as ToolSora2ServiceImpl
|
||||
participant KieAI as KieAI服务
|
||||
participant Callback as KieAIController
|
||||
participant Service as ToolKieAIServiceImpl
|
||||
participant DB as 数据库
|
||||
|
||||
Frontend->>Sora2: createImageToVideoTask
|
||||
Sora2->>KieAI: POST createTask含callBackUrl
|
||||
KieAI-->>Sora2: 返回taskId
|
||||
Sora2->>DB: INSERT article status_task=0
|
||||
Note over DB: status_task = 0
|
||||
|
||||
Note over KieAI: 10秒以上视频生成中
|
||||
|
||||
KieAI->>Callback: POST callback含resultUrls
|
||||
Callback->>Callback: 反序列化KieAIQueryTaskResponse
|
||||
Callback->>Service: handleTaskCallback
|
||||
Service->>DB: SELECT article WHERE task_id
|
||||
Service->>Service: extractVideoUrl
|
||||
Service->>DB: UPDATE video_url status_task=1
|
||||
Note over DB: video_url有值 status_task=1
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 实际流程(异常情况)
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Frontend as 前端
|
||||
participant Sora2 as ToolSora2ServiceImpl
|
||||
participant KieAI as KieAI服务
|
||||
participant Callback as KieAIController
|
||||
participant DB as 数据库
|
||||
|
||||
Frontend->>Sora2: createImageToVideoTask
|
||||
Sora2->>KieAI: POST createTask
|
||||
KieAI-->>Sora2: 返回taskId
|
||||
Sora2->>DB: INSERT article status_task=0
|
||||
Note over DB: status_task = 0
|
||||
|
||||
Note over KieAI: 10秒以上...
|
||||
|
||||
KieAI->>Callback: POST callback
|
||||
Callback--xCallback: 反序列化失败
|
||||
Note over Callback: Jackson报错setterless property resultUrls
|
||||
Note over DB: video_url仍为NULL status_task仍为0
|
||||
|
||||
Note over Frontend,DB: 回调处理逻辑从未执行数据库未更新
|
||||
```
|
||||
|
||||
|
||||
|
||||
## 解决方案
|
||||
|
||||
### 方案1:修复回调反序列化问题(主要修复)
|
||||
|
||||
**文件**:[KieAIQueryTaskResponse.java](msh_crmeb_22/crmeb-common/src/main/java/com/zbkj/common/response/kieai/KieAIQueryTaskResponse.java)
|
||||
|
||||
**问题代码**(TaskData类):
|
||||
|
||||
```java
|
||||
@Data
|
||||
public static class TaskData implements Serializable {
|
||||
@ApiModelProperty(value = "结果URL数组(视频/图片地址)")
|
||||
private java.util.List<String> resultUrls; // Lombok生成的setter可能被Jackson忽略
|
||||
}
|
||||
```
|
||||
|
||||
**修复方法**:显式添加setter方法
|
||||
|
||||
```java
|
||||
@Data
|
||||
public static class TaskData implements Serializable {
|
||||
@ApiModelProperty(value = "结果URL数组(视频/图片地址)")
|
||||
private java.util.List<String> resultUrls;
|
||||
|
||||
// 显式添加setter以确保Jackson反序列化正常
|
||||
public void setResultUrls(java.util.List<String> resultUrls) {
|
||||
this.resultUrls = resultUrls;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 方案2:验证回调URL配置
|
||||
|
||||
**检查配置文件**(application.yml或application.properties):
|
||||
|
||||
```yaml
|
||||
kie-ai:
|
||||
api-callback-url: http://your-domain.com/api/front/kieai/callback
|
||||
```
|
||||
|
||||
**验证要点**:
|
||||
|
||||
1. URL必须是KieAI服务可访问的公网地址
|
||||
2. 确保没有防火墙阻止
|
||||
3. 路径正确:`/api/front/kieai/callback`
|
||||
|
||||
### 方案3:添加详细日志(辅助调试)
|
||||
|
||||
在[KieAIController.java](msh_crmeb_22/crmeb-front/src/main/java/com/zbkj/front/controller/KieAIController.java)的回调方法开头添加:
|
||||
|
||||
```java
|
||||
@PostMapping("/callback")
|
||||
public KieAINanoBananaResponse<String> handleCallback(
|
||||
@RequestBody KieAIQueryTaskResponse callbackData) {
|
||||
try {
|
||||
logger.info("======== KieAI回调原始数据 ========");
|
||||
logger.info("完整对象: {}", JSON.toJSONString(callbackData));
|
||||
logger.info("taskId: {}", callbackData.getTaskId());
|
||||
logger.info("state: {}", callbackData.getState());
|
||||
logger.info("resultUrls: {}", callbackData.getResultUrls());
|
||||
|
||||
String taskId = callbackData.getTaskId();
|
||||
logger.info("接收KieAI任务回调,任务ID: {}", taskId);
|
||||
toolKieAIService.handleTaskCallback(taskId, callbackData);
|
||||
return KieAINanoBananaResponse.success("回调处理成功");
|
||||
} catch (Exception e) {
|
||||
logger.error("处理任务回调失败", e);
|
||||
return KieAINanoBananaResponse.fail("回调处理失败");
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 诊断和修复步骤
|
||||
|
||||
### 步骤1:修复反序列化问题(优先级最高)
|
||||
|
||||
1. 修改`KieAIQueryTaskResponse.java`中的`TaskData`类,显式添加setter
|
||||
2. 重启后端服务
|
||||
3. 提交一次打卡测试
|
||||
|
||||
### 步骤2:检查后端日志
|
||||
|
||||
**如果回调仍未执行**,检查日志:
|
||||
|
||||
1. 搜索:`接收KieAI任务回调`
|
||||
- 找到:回调到达了,检查反序列化错误
|
||||
- 没找到:回调未到达,检查回调URL配置
|
||||
2. 搜索:`deserializing` 或 `Jackson` 或 `Could not resolve`
|
||||
- 找到:确认是反序列化问题
|
||||
3. 查看article创建日志:
|
||||
```
|
||||
文章新增成功, taskId: xxx
|
||||
```
|
||||
|
||||
### 步骤3:验证回调URL配置
|
||||
|
||||
1. 检查`application.yml`中的`kie-ai.api-callback-url`
|
||||
2. 确认URL可从外网访问
|
||||
3. 测试回调接口是否正常响应
|
||||
|
||||
### 步骤4:验证修复效果
|
||||
|
||||
提交打卡后,检查数据库:
|
||||
|
||||
```sql
|
||||
SELECT id, task_id, video_url, status_task, create_time, update_time
|
||||
FROM eb_article
|
||||
WHERE task_id = 'your_task_id'
|
||||
ORDER BY create_time DESC
|
||||
LIMIT 1;
|
||||
```
|
||||
|
||||
**预期结果**:
|
||||
|
||||
- `status_task = 1`(任务完成)
|
||||
- `video_url` 有值
|
||||
- `update_time` 在create_time的10秒以上后更新
|
||||
|
||||
## 问题总结
|
||||
|
||||
### 核心原因
|
||||
|
||||
KieAI回调无法被正确处理,导致:
|
||||
|
||||
1. `video_url`未更新(始终为NULL)
|
||||
2. `status_task`未更新(保持为0)
|
||||
|
||||
### 最可能的原因
|
||||
|
||||
根据[修复kieai回调反序列化问题计划](修复kieai回调反序列化问题_85d41db5.plan.md),Jackson反序列化失败导致回调处理方法无法执行。
|
||||
|
||||
### 修复优先级
|
||||
|
||||
1. **优先级1**:修复`KieAIQueryTaskResponse.TaskData`反序列化(添加显式setter)
|
||||
2. **优先级2**:验证回调URL配置
|
||||
3. **优先级3**:添加详细日志
|
||||
|
||||
## 涉及文件
|
||||
|
||||
- [KieAIQueryTaskResponse.java](msh_crmeb_22/crmeb-common/src/main/java/com/zbkj/common/response/kieai/KieAIQueryTaskResponse.java) - 主要修复
|
||||
- [KieAIController.java](msh_crmeb_22/crmeb-front/src/main/java/com/zbkj/front/controller/KieAIController.java) - 回调入口
|
||||
- [ToolKieAIServiceImpl.java](msh_crmeb_22/crmeb-service/src/main/java/com/zbkj/service/service/impl/tool/ToolKieAIServiceImpl.java) - 回调处理
|
||||
- [ToolSora2ServiceImpl.java](msh_crmeb_22/crmeb-service/src/main/java/com/zbkj/service/service/impl/tool/ToolSora2ServiceImpl.java) - article创建
|
||||
|
||||
Reference in New Issue
Block a user