feat:ai生成图文

This commit is contained in:
bx1834938347-prog 2025-12-05 09:02:44 +08:00
parent d9233a0606
commit eb33d725eb
2 changed files with 50 additions and 26 deletions

View File

@ -111,8 +111,18 @@ func ImageContentImport(c *gin.Context) {
return return
} }
processor.SetStatus(StatusProcessing) processor.SetStatus(StatusProcessing)
processor = GetBatchProcessorRead()
qps := 10
interval := time.Second / time.Duration(qps)
for i, v := range readExcelResult { for i, v := range readExcelResult {
if err := GetBatchProcessorRead().submitSingleTask(v, i); err != nil { // 在每次请求前等待
if i > 0 {
time.Sleep(interval)
}
if err := processor.submitSingleTask(v, i); err != nil {
task := &ImageTask{ task := &ImageTask{
Data: v, Data: v,
TaskID: strconv.Itoa(i), TaskID: strconv.Itoa(i),
@ -156,22 +166,33 @@ func readExcel(excelPath string) ([]excelData, error) {
var result []excelData var result []excelData
for i := 1; i < len(rows); i++ { // 从第2行开始跳过表头 for i := 1; i < len(rows); i++ { // 从第2行开始跳过表头
row := rows[i] row := rows[i]
// 跳过空行
if len(row) == 0 || strings.TrimSpace(row[0]) == "" { if len(row) == 0 || strings.TrimSpace(row[0]) == "" {
continue continue
} }
var num int
artistName := getCellValue(f, sheetName, i, 0)
subNum := getCellValue(f, sheetName, i, 1)
tikTok := getCellValue(f, sheetName, i, 2)
instagram := getCellValue(f, sheetName, i, 3)
youtube := getCellValue(f, sheetName, i, 4)
desc := getCellValue(f, sheetName, i, 5)
titleRequire := getCellValue(f, sheetName, i, 6)
contentRequire := getCellValue(f, sheetName, i, 7)
photoRequire := getCellValue(f, sheetName, i, 8)
photoUrl := getCellValue(f, sheetName, i, 9) photoUrl := getCellValue(f, sheetName, i, 9)
if photoUrl == "" { //如果没有关联画作,数量有用 var num int
if photoUrl == "" { //如果没有关联画作,数量必须有,需求必须有
//需求必须有
if photoRequire == "" {
return nil, fmt.Errorf("第%d行应该有图片需求", i+1)
}
photoNumStr := getCellValue(f, sheetName, i, 10) photoNumStr := getCellValue(f, sheetName, i, 10)
//转换成功
photoNum, err := strconv.Atoi(strings.TrimSpace(photoNumStr)) photoNum, err := strconv.Atoi(strings.TrimSpace(photoNumStr))
if err != nil { if err != nil {
// 提供详细的错误信息
return nil, fmt.Errorf("第%d行图片数量格式错误: '%s',必须是整数", i+1, photoNumStr) return nil, fmt.Errorf("第%d行图片数量格式错误: '%s',必须是整数", i+1, photoNumStr)
} }
// 数量大于
// 验证图片数量范围
if photoNum <= 0 { if photoNum <= 0 {
return nil, fmt.Errorf("第%d行图片数量必须大于0当前值: %d", i+1, photoNum) return nil, fmt.Errorf("第%d行图片数量必须大于0当前值: %d", i+1, photoNum)
} }
@ -179,18 +200,17 @@ func readExcel(excelPath string) ([]excelData, error) {
} }
data := excelData{ data := excelData{
ArtistName: getCellValue(f, sheetName, i, 0), ArtistName: artistName,
SubNum: getCellValue(f, sheetName, i, 1), SubNum: subNum,
TikTok: getCellValue(f, sheetName, i, 2), TikTok: tikTok,
Instagram: getCellValue(f, sheetName, i, 3), Instagram: instagram,
Youtube: getCellValue(f, sheetName, i, 4), Youtube: youtube,
Desc: getCellValue(f, sheetName, i, 5), Desc: desc,
TitleRequire: getCellValue(f, sheetName, i, 6), TitleRequire: titleRequire,
ContentRequire: getCellValue(f, sheetName, i, 7), ContentRequire: contentRequire,
PhotoRequire: getCellValue(f, sheetName, i, 8), PhotoUrl: photoRequire,
PhotoUrl: photoUrl,
PhotoNum: num, PhotoNum: num,
LineNum: i, LineNum: i, //行数
} }
result = append(result, data) result = append(result, data)

View File

@ -384,7 +384,8 @@ func (p *BatchProcessor) UpdateTaskStatuses(taskId string) (err error) {
p.tasks[taskId].Status = TaskFailed p.tasks[taskId].Status = TaskFailed
p.inProgress[taskId] = true p.inProgress[taskId] = true
p.tasks[taskId].EndTime = time.Now() p.tasks[taskId].EndTime = time.Now()
return fmt.Errorf("生成标题和内容失败: %v", err) p.tasks[taskId].Error = fmt.Errorf("生成标题和内容失败: %v", err)
return err
} }
p.tasks[taskId].Title = title p.tasks[taskId].Title = title
p.tasks[taskId].Content = content p.tasks[taskId].Content = content
@ -396,10 +397,10 @@ func (p *BatchProcessor) UpdateTaskStatuses(taskId string) (err error) {
Content: p.tasks[taskId].Content, Content: p.tasks[taskId].Content,
GeneratePhotoUrl: []string{p.tasks[taskId].Data.PhotoUrl}, GeneratePhotoUrl: []string{p.tasks[taskId].Data.PhotoUrl},
}); err != nil { }); err != nil {
p.tasks[taskId].Error = err
p.tasks[taskId].Status = TaskFailed p.tasks[taskId].Status = TaskFailed
p.inProgress[taskId] = true p.inProgress[taskId] = true
p.tasks[taskId].EndTime = time.Now() p.tasks[taskId].EndTime = time.Now()
p.tasks[taskId].Error = fmt.Errorf("发布内容失败: %v", err)
} }
p.tasks[taskId].Status = TaskSuccessful p.tasks[taskId].Status = TaskSuccessful
p.inProgress[taskId] = true p.inProgress[taskId] = true
@ -554,15 +555,18 @@ func downloadAndUploadToBucket(imageURL string) (string, error) {
// 上传到桶 // 上传到桶
BOSClient, err := objstorage.NewOSS( BOSClient, err := objstorage.NewOSS(
os.Getenv(config.ConfigData.Oss.AccessKeyId), //os.Getenv(config.ConfigData.Oss.AccessKeyId),
os.Getenv(config.ConfigData.Oss.AccessKeySecret), //os.Getenv(config.ConfigData.Oss.AccessKeySecret),
os.Getenv(config.ConfigData.Oss.Endpoint), //os.Getenv(config.ConfigData.Oss.Endpoint),
config.ConfigData.Oss.AccessKeyId,
config.ConfigData.Oss.AccessKeySecret,
config.ConfigData.Oss.Endpoint,
) )
_, err = BOSClient.PutObjectFromBytes(os.Getenv(config.ConfigData.Oss.BucketName), fileName, fileBytes) _, err = BOSClient.PutObjectFromBytes(config.ConfigData.Oss.BucketName, fileName, fileBytes)
if err != nil { if err != nil {
return "", fmt.Errorf("上传文件失败: %v", err) return "", fmt.Errorf("上传文件失败: %v", err)
} }
url := fmt.Sprintf("%s/%s", os.Getenv(config.ConfigData.Oss.CdnHost), fileName) url := fmt.Sprintf("%s/%s", config.ConfigData.Oss.CdnHost, fileName)
return url, nil return url, nil
} }