From 2f90db4808cdf6a6f3918860491a8e0238766adb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=A6=20=E8=B5=B5?= <89237069@qq.com> Date: Wed, 16 Jul 2025 09:03:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PublishProfiles/FolderProfile.pubxml.user | 2 +- ...ryRecurringJobInputPageExtendController.cs | 9 +-- .../CheryRecurringJobOutPageController.cs | 60 ++++++++++++++++++ .../Controllers/CherySupplierProCpsService.cs | 8 +-- .../Controllers/LogConsumerService.cs | 63 ++++++++++++++++--- .../Controllers/RecurringJobBaseController.cs | 9 +-- 6 files changed, 121 insertions(+), 30 deletions(-) diff --git a/API/Wood.Admin.WebApi/Properties/PublishProfiles/FolderProfile.pubxml.user b/API/Wood.Admin.WebApi/Properties/PublishProfiles/FolderProfile.pubxml.user index b2df66c..6b45ef1 100644 --- a/API/Wood.Admin.WebApi/Properties/PublishProfiles/FolderProfile.pubxml.user +++ b/API/Wood.Admin.WebApi/Properties/PublishProfiles/FolderProfile.pubxml.user @@ -3,7 +3,7 @@ <_PublishTargetUrl>D:\QRAPI20250528\API\Wood.Admin.WebApi\bin\Release\net8.0\publish\ - True|2025-07-08T03:09:12.4661351Z||;True|2025-07-08T10:48:35.1871554+08:00||;False|2025-07-08T10:47:14.6770264+08:00||;True|2025-07-04T13:12:49.8129504+08:00||;True|2025-07-04T11:57:19.4307706+08:00||;True|2025-07-03T09:24:39.8368797+08:00||;True|2025-07-02T17:18:03.6042427+08:00||;True|2025-07-02T10:15:44.3531626+08:00||;True|2025-07-02T10:14:19.3576521+08:00||;True|2025-07-01T18:51:45.0206266+08:00||;True|2025-06-30T15:39:43.7918723+08:00||;True|2025-06-30T14:40:36.2678533+08:00||;True|2025-06-30T14:22:36.2631903+08:00||;True|2025-06-30T09:23:23.0780295+08:00||;True|2025-06-28T10:37:00.4525422+08:00||;True|2025-06-27T14:51:18.0006510+08:00||;True|2025-06-27T14:46:36.7189818+08:00||;True|2025-06-25T10:54:54.0406425+08:00||;True|2025-06-24T15:53:07.6141315+08:00||;True|2025-06-24T15:48:22.4116425+08:00||;True|2025-06-24T15:47:33.3794364+08:00||;True|2025-06-24T15:21:28.5600646+08:00||;True|2025-06-23T17:18:30.1990173+08:00||;True|2025-06-23T17:12:33.6485743+08:00||;True|2025-06-19T17:18:07.6086155+08:00||; + True|2025-07-15T03:43:41.1216193Z||;True|2025-07-14T17:27:09.0814705+08:00||;True|2025-07-10T13:41:17.5416106+08:00||;True|2025-07-10T09:53:47.6480408+08:00||;True|2025-07-08T11:09:12.4661351+08:00||;True|2025-07-08T10:48:35.1871554+08:00||;False|2025-07-08T10:47:14.6770264+08:00||;True|2025-07-04T13:12:49.8129504+08:00||;True|2025-07-04T11:57:19.4307706+08:00||;True|2025-07-03T09:24:39.8368797+08:00||;True|2025-07-02T17:18:03.6042427+08:00||;True|2025-07-02T10:15:44.3531626+08:00||;True|2025-07-02T10:14:19.3576521+08:00||;True|2025-07-01T18:51:45.0206266+08:00||;True|2025-06-30T15:39:43.7918723+08:00||;True|2025-06-30T14:40:36.2678533+08:00||;True|2025-06-30T14:22:36.2631903+08:00||;True|2025-06-30T09:23:23.0780295+08:00||;True|2025-06-28T10:37:00.4525422+08:00||;True|2025-06-27T14:51:18.0006510+08:00||;True|2025-06-27T14:46:36.7189818+08:00||;True|2025-06-25T10:54:54.0406425+08:00||;True|2025-06-24T15:53:07.6141315+08:00||;True|2025-06-24T15:48:22.4116425+08:00||;True|2025-06-24T15:47:33.3794364+08:00||;True|2025-06-24T15:21:28.5600646+08:00||;True|2025-06-23T17:18:30.1990173+08:00||;True|2025-06-23T17:12:33.6485743+08:00||;True|2025-06-19T17:18:07.6086155+08:00||; \ No newline at end of file diff --git a/API/Wood.Service/Controllers/CheryRecurringJobInputPageExtendController.cs b/API/Wood.Service/Controllers/CheryRecurringJobInputPageExtendController.cs index 7c34c59..82df6e9 100644 --- a/API/Wood.Service/Controllers/CheryRecurringJobInputPageExtendController.cs +++ b/API/Wood.Service/Controllers/CheryRecurringJobInputPageExtendController.cs @@ -39,7 +39,7 @@ using static Dapper.SqlMapper; namespace TaskManager.Controllers { public class CheryRecurringJobInputPageExtendController : RecurringJobBaseController - where T : CherryWriteBaseEnity, new() + where T : CherryWriteBaseEnity, new() where TDTO : class, new() where TLOGS : CherryWriteLogsBaseEnity, new() { @@ -284,16 +284,13 @@ namespace TaskManager.Controllers log.InjectFrom(itm); log.RequestDate = requestDate; log.TaskId = taskId; - log.WriteState = true; log.ReadState = true; - logs.Add(log); } await _jobDbContext.BulkInsertAsync(logs); try { - var createtask = new TaskSub(); createtask.TaskId = taskId; createtask.TaskName = TaskName; @@ -309,12 +306,8 @@ namespace TaskManager.Controllers createtask.SyncedPageCount = i; createtask.ReadState = true; createtask.WriteState = true; - await _jobDbContext.AddAsync(createtask); - - _jobDbContext.SaveChanges(); - // 提交事务 await transaction.CommitAsync(); await _logger.AddSuccess($"成功同步数据第 {i} 页数据", TaskName, taskId, version); diff --git a/API/Wood.Service/Controllers/CheryRecurringJobOutPageController.cs b/API/Wood.Service/Controllers/CheryRecurringJobOutPageController.cs index 1a5a8d7..edd11cc 100644 --- a/API/Wood.Service/Controllers/CheryRecurringJobOutPageController.cs +++ b/API/Wood.Service/Controllers/CheryRecurringJobOutPageController.cs @@ -16,8 +16,10 @@ using Omu.ValueInjecter; using System; using System.Data; using System.Data.Common; +using System.IO; using System.Linq.Expressions; using System.Reflection; +using System.Reflection.Metadata; using System.Text; using System.Text.Json; using System.Text.Json.Serialization; @@ -316,8 +318,66 @@ namespace TaskManager.Controllers // 首次请求获取总条数和分页信息 return allData; } + [HttpGet] + public async Task> CustomFetchAllDataFormJsonAsync(string version,string taskName) + { + List allList = new List(); + string dateString = version; + string format = "yyyyMMdd"; + IFormatProvider provider = System.Globalization.CultureInfo.InvariantCulture; + try + { + // 使用 ParseExact 方法进行转换 + DateTime resultDate = DateTime.ParseExact(dateString, format, provider); + var alldata = _jobDbContext.TaskLogs.Where(p => p.TaskName == taskName && p.Version == version && p.Type == "应答").OrderBy(p => p.CreationTime).ToList(); + var responseLogDirectory = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "CustomLogs", "Responses"); + foreach (var item in alldata) + { + string fullDatePath = System.IO.Path.Combine(responseLogDirectory, item.Path); + string jsonContent = await System.IO.File.ReadAllTextAsync(fullDatePath); + if (!string.IsNullOrEmpty(jsonContent)) + { + var options = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + Converters = { + new JsonStringEnumConverter(), // 枚举转换 + new OutCustomDateTimeConverter("yyyy-MM-dd HH:mm:ss","yyyy-MM-dd") // 日期转换 + } + }; + var page = JsonSerializer.Deserialize>(jsonContent, options); + List list = new List(); + foreach (var itm in page.Data.Rows) + { + T entity = new T(); + entity.InjectFrom(itm); + entity.CreationTime = resultDate; + list.Add(entity); + entity.RequestDate = resultDate.ToString("yyyy-MM-dd"); + allList.Add(itm); + + } + if (list.Any()) + { + await InsertDataAsync(list); + } + } + } + } + catch (FormatException ex) + { + Console.WriteLine($"日期格式错误: {ex.Message}"); + Console.WriteLine("请确保输入的字符串格式为 'yyyyMMdd'"); + } + catch (Exception ex) + { + Console.WriteLine($"发生意外错误: {ex.Message}"); + } + + return allList; + } public async Task> CustomFetchAllDataAsync(string inputdate) diff --git a/API/Wood.Service/Controllers/CherySupplierProCpsService.cs b/API/Wood.Service/Controllers/CherySupplierProCpsService.cs index 9834521..18a9730 100644 --- a/API/Wood.Service/Controllers/CherySupplierProCpsService.cs +++ b/API/Wood.Service/Controllers/CherySupplierProCpsService.cs @@ -15,13 +15,7 @@ namespace TaskManager.Controllers } protected override Task DtoProperiesConvert(List dtos) { - - - - - - return base.DtoProperiesConvert(dtos); - + return base.DtoProperiesConvert(dtos); } } } diff --git a/API/Wood.Service/Controllers/LogConsumerService.cs b/API/Wood.Service/Controllers/LogConsumerService.cs index f58164a..40be888 100644 --- a/API/Wood.Service/Controllers/LogConsumerService.cs +++ b/API/Wood.Service/Controllers/LogConsumerService.cs @@ -40,7 +40,8 @@ namespace TaskManager.Controllers private const int BatchSize = 100; // 批量写入大小 private readonly string _logDirectory; private readonly IServiceProvider _serviceProvider; - + private readonly string _requestLogDirectory; + private readonly string _responseLogDirectory; private readonly List list = new List() { "来料检验数据", "排产数据", @@ -68,8 +69,13 @@ namespace TaskManager.Controllers _logger = logger; _serviceProvider = serviceProvider; ; - _logDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "CustomLogs"); // 使用更安全的路径获取方式 - EnsureDirectoryExists(_logDirectory); + + _requestLogDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "CustomLogs"); + _responseLogDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "CustomLogs", "Responses"); + + //_logDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "CustomLogs"); // 使用更安全的路径获取方式 + EnsureDirectoryExists(_requestLogDirectory); + EnsureDirectoryExists(_responseLogDirectory); } protected override async Task ExecuteAsync(CancellationToken stoppingToken) @@ -99,10 +105,23 @@ namespace TaskManager.Controllers List logsToSave = new List(); foreach (var log in logs) { - if (!string.IsNullOrEmpty(log.Remark)) + if (log.Type == "请求") + { + log.Path = WriteLogToFile(log.Remark, _requestLogDirectory); + } + else if (log.Type == "应答") { - log.Path = WriteLogToFile(log.Remark); + log.Path = WriteResponseLogToFile(log.Remark, _responseLogDirectory,log.TaskName); } + else + { + log.Path = WriteLogToFile(log.Remark, _requestLogDirectory); + } + + //if (!string.IsNullOrEmpty(log.Remark)) + //{ + // log.Path = WriteLogToFile(log.Remark,log.TaskName); + //} if (list.Contains(log.TaskName)) { log.Module = "生产质量"; @@ -144,13 +163,11 @@ namespace TaskManager.Controllers } } // 修改后的日志写入方法 - private string WriteLogToFile(string jsonContent) + private string WriteLogToFile(string jsonContent, string baseDirectory) { - //if string.IsNullOrEmpty(logMessage.RawRemark)) return null; // 必须提供JSON数据 - // 创建日期目录 string dateDirectory = DateTime.Now.ToString("yyyy-MM-dd"); - string fullDatePath = Path.Combine(_logDirectory, dateDirectory); + string fullDatePath = Path.Combine(baseDirectory, dateDirectory); EnsureDirectoryExists(fullDatePath); // 生成唯一文件名(时间戳+随机数) @@ -167,11 +184,37 @@ namespace TaskManager.Controllers catch (Exception ex) { Console.WriteLine($"JSON文件写入失败:{ex.Message}"); + return null; + } + } + private string WriteResponseLogToFile(string jsonContent, string baseDirectory, string taskName) + { + // 创建日期目录 + string dateDirectory = DateTime.Now.ToString("yyyy-MM-dd"); + string fullDatePath = Path.Combine(baseDirectory, dateDirectory, taskName); + EnsureDirectoryExists(fullDatePath); + // 生成唯一文件名(时间戳+随机数) + string fileName = $"log_{DateTime.Now.Ticks}_{Random.Shared.Next(1000, 9999)}.json"; + string fullPath = Path.Combine(fullDatePath, fileName); + try + { + // 写入文件(使用UTF-8无BOM格式) + File.WriteAllText(fullPath, jsonContent, new UTF8Encoding(false)); + + // 存储相对路径(从日志根目录开始,使用正斜杠兼容API) + return Path.Combine(dateDirectory,taskName, fileName).Replace('\\', '/'); + } + catch (Exception ex) + { + Console.WriteLine($"JSON文件写入失败:{ex.Message}"); return null; } } - + + + + } diff --git a/API/Wood.Service/Controllers/RecurringJobBaseController.cs b/API/Wood.Service/Controllers/RecurringJobBaseController.cs index 5b1f90a..c39bf2a 100644 --- a/API/Wood.Service/Controllers/RecurringJobBaseController.cs +++ b/API/Wood.Service/Controllers/RecurringJobBaseController.cs @@ -83,18 +83,16 @@ namespace TaskManager.Controllers { await _logger.AddError($"请求数据不一致body:{jsonData},singed:{requestContent}", TaskName, taskid, version, jsonData); } - request.Headers.Add("appKey", appKey); request.Headers.Add("appSecret", appSecret); request.Headers.Add("timestamp", timeStamp); request.Headers.Add("sign", sign); request.Headers.Add("nonce", nonce); - // 发送请求 var response = await _httpClient.SendAsync(request); response.EnsureSuccessStatusCode(); // 抛出异常处理状态码 var str = await response.Content.ReadAsStringAsync(); - //await _logger.AddPostResponse("响应", TaskName, taskid, version, str); + await _logger.AddPostResponse("响应", TaskName, taskid, version, str); return str; @@ -115,7 +113,10 @@ namespace TaskManager.Controllers ////string jsonContent4 = System.IO.File.ReadAllText("日MRP状态监控.json"); //string jsonContent = System.IO.File.ReadAllText("整车月度生产计划1.json"); ////string jsonContent = System.IO.File.ReadAllText("过涂装未过总装.json"); - //return jsonContent; + // await _logger.AddPostResponse("响应", TaskName, taskid, version, jsonContent); + + + // return jsonContent;