v 1.1.5
修改轮询请求逻辑 添加imageUrls属性,通过第三方生成 修改 mj fetch,不转发API 而是用系统的数据
This commit is contained in:
parent
6f580ff8eb
commit
3470ce9229
@ -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();
|
||||
|
||||
@ -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. 持久化任务信息到数据库
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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; // 返回原始数据,避免处理错误导致数据丢失
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -78,6 +78,6 @@
|
||||
"image/webp"
|
||||
]
|
||||
},
|
||||
"Version": "1.1.4",
|
||||
"Version": "1.1.5",
|
||||
"AllowedHosts": "*"
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user