修改轮询请求逻辑 添加imageUrls属性,通过第三方生成
修改 mj fetch,不转发API 而是用系统的数据
This commit is contained in:
lq1405 2025-06-21 22:22:54 +08:00
parent 6f580ff8eb
commit 3470ce9229
7 changed files with 169 additions and 21 deletions

View File

@ -1,4 +1,5 @@
using LMS.Repository.DB;
using LMS.Repository.MJPackage;
namespace LMS.Tools.MJPackage
@ -6,7 +7,7 @@ namespace LMS.Tools.MJPackage
// Services/ITaskConcurrencyManager.cs
public interface ITaskConcurrencyManager
{
Task CreateTaskAsync(string token, string thirdPartyTaskId);
Task CreateTaskAsync(string token, string thirdPartyTaskId, MJSubmitImageModel model);
Task UpdateTaskInDatabase(MJApiTasks mJApiTasks);
Task BatchUpdateTaskChaheToDatabaseAsync();

View File

@ -5,6 +5,7 @@ using LMS.Repository.MJPackage;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System.Collections.Concurrent;
using System.Text;
@ -34,7 +35,8 @@ namespace LMS.Tools.MJPackage
/// </summary>
public async Task CreateTaskAsync(
string token,
string thirdPartyTaskId)
string thirdPartyTaskId,
MJSubmitImageModel model)
{
try
{
@ -54,7 +56,33 @@ namespace LMS.Tools.MJPackage
StartTime = BeijingTimeExtension.GetBeijingTime(),
Status = MJTaskStatus.NOT_START,
ThirdPartyTaskId = thirdPartyTaskId,
Properties = null
Properties = JsonConvert.SerializeObject(new
{
id = thirdPartyTaskId,
action = "IMAGINE",
customId = "",
botType = "",
prompt = model.Prompt,
promptEn = "",
description = "提交成功",
state = "",
mode = "",
proxy = "",
submitTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
startTime = 0,
finishTime = 0,
imageUrl = "",
imageUrls = null as string[],
imageHeight = 0,
imageWidth = 0,
videoUrl = "",
status = "",
progress = "0%",
failReason = "",
buttons = null as object[],
maskBase64 = "",
properties = null as object,
}),
};
// 5. 持久化任务信息到数据库

View File

@ -47,31 +47,35 @@ namespace LMS.Tools.MJPackage
return null;
}
// 尝试备用API
var backupResult = await TryBackupApiAsync(mJApiTasks.ThirdPartyTaskId, useToken);
// 尝试原始API
var originResult = await TryOriginApiAsync(mJApiTasks.ThirdPartyTaskId);
var properties = new Dictionary<string, object>();
if (string.IsNullOrWhiteSpace(originResult))
{
originResult = await TryBackupApiAsync(mJApiTasks.ThirdPartyTaskId, useToken);
}
if (string.IsNullOrWhiteSpace(backupResult))
if (string.IsNullOrWhiteSpace(originResult))
{
// 没有找到数据
_logger.LogInformation($"备用API没有返回数据TaskId: {mJApiTasks.TaskId}");
return null;
}
var properties = new Dictionary<string, object>();
try
{
// 不为空 开始解析数据
properties = JsonConvert.DeserializeObject<Dictionary<string, object>>(backupResult);
properties = JsonConvert.DeserializeObject<Dictionary<string, object>>(originResult);
}
catch (JsonException ex)
{
_logger.LogError($"解析备用API返回数据失败: {ex.Message}");
_logger.LogError($"解析API返回数据失败: {ex.Message}");
return null;
}
if (properties == null)
{
_logger.LogInformation($"备用API返回数据为空TaskId: {mJApiTasks.TaskId}");
_logger.LogInformation($"API返回数据为空TaskId: {mJApiTasks.TaskId}");
return null;
}
return properties;
@ -83,6 +87,45 @@ namespace LMS.Tools.MJPackage
return null;
}
}
private async Task<string?> TryOriginApiAsync(string id)
{
string originUrl = $"https://mjapi.bzu.cn/mj/task/{id}/fetch";
// 判断 原始token 不存在 直接 返回空
string orginToken = await _tokenService.GetOriginToken();
if (string.IsNullOrWhiteSpace(orginToken))
{
return null;
}
try
{
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", orginToken);
client.Timeout = TimeSpan.FromSeconds(30);
var response = await client.GetAsync(originUrl);
var content = await response.Content.ReadAsStringAsync();
// 判断是不是返回空
if ((int)response.StatusCode == 204 || string.IsNullOrWhiteSpace(content))
{
return string.Empty;
}
if (!response.IsSuccessStatusCode)
{
_logger.LogWarning($"源API调用返回错误状态码TaskId: {id}, StatusCode: {response.StatusCode}");
return null;
}
return content;
}
catch (Exception ex)
{
_logger.LogWarning(ex, "原始API调用失败TaskId: {TaskId}准备尝试备用API", id);
return null;
}
}
private async Task<string?> TryBackupApiAsync(string id, string useToken)
{
string mjAPIBasicUrl = await _tokenService.GetMJAPIBasicUrl();

View File

@ -4,6 +4,7 @@ using LMS.Repository.DB;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Quartz;
namespace LMS.Tools.MJPackage
@ -79,6 +80,9 @@ namespace LMS.Tools.MJPackage
}
task.Status = status;
properties = ProcessTaskDataAsync(properties);
if (status == MJTaskStatus.SUCCESS || status == MJTaskStatus.FAILURE || status == MJTaskStatus.CANCEL)
{
// 当前任务已经被释放过了
@ -127,5 +131,76 @@ namespace LMS.Tools.MJPackage
_logger.LogError(ex, "Token同步失败耗时: {Duration}ms", duration.TotalMilliseconds);
}
}
/// <summary>
/// 单独处理生图包将参数xie'chu'l
/// </summary>
/// <param name="properties"></param>
/// <returns></returns>
public Dictionary<string, object> ProcessTaskDataAsync(Dictionary<string, object> properties)
{
try
{
// 转换为JObject以简化访问
string jsonStr = JsonConvert.SerializeObject(properties);
JObject jObj = JObject.Parse(jsonStr);
// 检查是否是合作伙伴任务
bool isPartner = jObj["isPartner"]?.Value<bool>() ?? false;
string? partnerTaskId = jObj["partnerTaskId"]?.ToString();
if (isPartner && !string.IsNullOrEmpty(partnerTaskId))
{
_logger.LogInformation($"处理合作伙伴任务: {partnerTaskId}");
// 获取partnerTaskInfo和imgUrls
JToken? partnerTaskInfo = jObj["partnerTaskInfo"];
if (partnerTaskInfo != null)
{
if (partnerTaskInfo["imgUrls"] is JArray imgUrlsArray && imgUrlsArray.Count > 0)
{
var imageUrls = new List<object>();
foreach (JToken item in imgUrlsArray)
{
string? url = item["url"]?.ToString();
if (!string.IsNullOrEmpty(url))
{
imageUrls.Add(new
{
url = url ?? string.Empty
});
}
}
if (imageUrls.Count > 0)
{
// 直接添加到原始properties字典
properties["imgUrls"] = imageUrls;
_logger.LogInformation($"成功提取了{imageUrls.Count}个图片URL");
}
}
else
{
_logger.LogInformation("未找到图片URL数组或数组为空");
}
}
else
{
_logger.LogInformation("未找到partnerTaskInfo信息");
}
}
else
{
_logger.LogInformation($"任务不是partner任务或缺少必要信息: isPartner={isPartner}, partnerTaskId={partnerTaskId}");
}
return properties;
}
catch (Exception ex)
{
_logger.LogError(ex, "处理任务数据时发生错误");
return properties; // 返回原始数据,避免处理错误导致数据丢失
}
}
}
}

View File

@ -83,7 +83,7 @@ namespace LMS.service.Controllers
}
// 开始写入任务
await _taskConcurrencyManager.CreateTaskAsync(requestToken, result.result.ToString());
await _taskConcurrencyManager.CreateTaskAsync(requestToken, result.result.ToString(), model);
return res;
}

View File

@ -48,9 +48,8 @@ namespace LMS.service.Service.MJPackage
}
bool hasProperties = !string.IsNullOrWhiteSpace(mJApiTasks.Properties);
// 判断状态 和 是不是有数据
// 状态不是已完成 并且有数据 直接返回数据库数据 要是已完成 直接就请求原始数据
if (mJApiTasks.Status != MJTaskStatus.SUCCESS && mJApiTasks.Status != MJTaskStatus.CANCEL && mJApiTasks.Status != MJTaskStatus.FAILURE && hasProperties)
// 数据库有相关的数据,直接返回,要是没有,尝试从上游获取数据
if (hasProperties)
{
return new ContentResult
{
@ -59,13 +58,15 @@ namespace LMS.service.Service.MJPackage
StatusCode = 200
};
}
else
{
// 尝试备用API防止报错
var originResult = await TryOriginApiAsync(id);
if (originResult != null) return originResult;
// 尝试备用API防止报错
var originResult = await TryOriginApiAsync(id);
if (originResult != null) return originResult;
var backupResult = await TryBackupApiAsync(id, tokenConfig.UseToken);
if (backupResult != null) return backupResult;
var backupResult = await TryBackupApiAsync(id, tokenConfig.UseToken);
if (backupResult != null) return backupResult;
}
// 从数据库获取缓存数据
return await GetTaskFromDatabaseAsync(id, token);

View File

@ -78,6 +78,6 @@
"image/webp"
]
},
"Version": "1.1.4",
"Version": "1.1.5",
"AllowedHosts": "*"
}