diff --git a/LMS.Tools/MJPackage/ITaskConcurrencyManager.cs b/LMS.Tools/MJPackage/ITaskConcurrencyManager.cs index 83fef90..a8d06eb 100644 --- a/LMS.Tools/MJPackage/ITaskConcurrencyManager.cs +++ b/LMS.Tools/MJPackage/ITaskConcurrencyManager.cs @@ -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(); diff --git a/LMS.Tools/MJPackage/TaskConcurrencyManager.cs b/LMS.Tools/MJPackage/TaskConcurrencyManager.cs index c877d62..f700d2d 100644 --- a/LMS.Tools/MJPackage/TaskConcurrencyManager.cs +++ b/LMS.Tools/MJPackage/TaskConcurrencyManager.cs @@ -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 /// 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. 持久化任务信息到数据库 diff --git a/LMS.Tools/MJPackage/TaskService.cs b/LMS.Tools/MJPackage/TaskService.cs index 3d65154..ededb4d 100644 --- a/LMS.Tools/MJPackage/TaskService.cs +++ b/LMS.Tools/MJPackage/TaskService.cs @@ -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(); + 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(); try { // 不为空 开始解析数据 - properties = JsonConvert.DeserializeObject>(backupResult); + properties = JsonConvert.DeserializeObject>(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 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 TryBackupApiAsync(string id, string useToken) { string mjAPIBasicUrl = await _tokenService.GetMJAPIBasicUrl(); diff --git a/LMS.Tools/MJPackage/TaskStatusCheckService.cs b/LMS.Tools/MJPackage/TaskStatusCheckService.cs index 0b4fcc8..afeadd4 100644 --- a/LMS.Tools/MJPackage/TaskStatusCheckService.cs +++ b/LMS.Tools/MJPackage/TaskStatusCheckService.cs @@ -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); } } + + /// + /// 单独处理生图包,将参数xie'chu'l + /// + /// + /// + public Dictionary ProcessTaskDataAsync(Dictionary properties) + { + try + { + // 转换为JObject以简化访问 + string jsonStr = JsonConvert.SerializeObject(properties); + JObject jObj = JObject.Parse(jsonStr); + + // 检查是否是合作伙伴任务 + bool isPartner = jObj["isPartner"]?.Value() ?? 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(); + + 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; // 返回原始数据,避免处理错误导致数据丢失 + } + } } } diff --git a/LMS.service/Controllers/MJPackageController.cs b/LMS.service/Controllers/MJPackageController.cs index e2e509b..d6c84ed 100644 --- a/LMS.service/Controllers/MJPackageController.cs +++ b/LMS.service/Controllers/MJPackageController.cs @@ -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; } diff --git a/LMS.service/Service/MJPackage/MJPackageService.cs b/LMS.service/Service/MJPackage/MJPackageService.cs index e88f14f..cd1ee18 100644 --- a/LMS.service/Service/MJPackage/MJPackageService.cs +++ b/LMS.service/Service/MJPackage/MJPackageService.cs @@ -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); diff --git a/LMS.service/appsettings.json b/LMS.service/appsettings.json index 0c89f3e..fea9c04 100644 --- a/LMS.service/appsettings.json +++ b/LMS.service/appsettings.json @@ -78,6 +78,6 @@ "image/webp" ] }, - "Version": "1.1.4", + "Version": "1.1.5", "AllowedHosts": "*" }