From 7662935368baacb088234f969d03e9446db1e05b Mon Sep 17 00:00:00 2001 From: zpc Date: Mon, 6 Apr 2026 14:14:48 +0800 Subject: [PATCH] 21 --- .../Business/OdfCableFaultsController.cs | 27 +++++++++++++++++++ .../Business/OdfCableFaultsService.cs | 26 ++++++++++++++++-- server/ZR.Vue/.env.development | 6 ++--- 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/server/ZR.Admin.WebApi/Controllers/Business/OdfCableFaultsController.cs b/server/ZR.Admin.WebApi/Controllers/Business/OdfCableFaultsController.cs index 6d32086..24f8561 100644 --- a/server/ZR.Admin.WebApi/Controllers/Business/OdfCableFaultsController.cs +++ b/server/ZR.Admin.WebApi/Controllers/Business/OdfCableFaultsController.cs @@ -166,14 +166,30 @@ namespace ZR.Admin.WebApi.Controllers.Business return ToResponse(ResultCode.FAIL, "请选择要导入的文件"); } + var logger = NLog.LogManager.GetCurrentClassLogger(); List list = new(); using (var stream = formFile.OpenReadStream()) { // 使用动态查询读取原始数据,避免MiniExcel强类型映射丢失单元格内多行文本 var rows = stream.Query(useHeaderRow: true, startCell: "A1").ToList(); + logger.Info($"[导入调试] 共读取到 {rows.Count} 行数据"); + + int rowIndex = 0; foreach (var row in rows) { + rowIndex++; var dict = (IDictionary)row; + + // 打印所有列名和值,用于调试 + foreach (var kv in dict) + { + var valType = kv.Value?.GetType()?.Name ?? "null"; + var valStr = kv.Value?.ToString() ?? "(null)"; + // 转义换行符以便在日志中可见 + var valEscaped = valStr.Replace("\r", "\\r").Replace("\n", "\\n"); + logger.Info($"[导入调试] 行{rowIndex} 列[{kv.Key}] 类型={valType} 值=[{valEscaped}]"); + } + var dto = new OdfCableFaultImportDto(); if (dict.TryGetValue("编号", out var idVal) && idVal != null && int.TryParse(idVal.ToString(), out var id)) @@ -185,9 +201,20 @@ namespace ZR.Admin.WebApi.Controllers.Business if (dict.TryGetValue("故障时间", out var ftVal) && ftVal != null) { if (ftVal is DateTime dt) + { dto.FaultTime = dt.ToString("yyyy-MM-dd HH:mm:ss"); + logger.Info($"[导入调试] 行{rowIndex} 故障时间是DateTime类型,值={dt:yyyy-MM-dd HH:mm:ss}"); + } else + { dto.FaultTime = ftVal.ToString(); + var escaped = dto.FaultTime.Replace("\r", "\\r").Replace("\n", "\\n"); + logger.Info($"[导入调试] 行{rowIndex} 故障时间是{ftVal.GetType().Name}类型,值=[{escaped}]"); + } + } + else + { + logger.Info($"[导入调试] 行{rowIndex} 未找到故障时间列"); } if (dict.TryGetValue("故障发生频次", out var fcVal) && fcVal != null && int.TryParse(fcVal.ToString(), out var fc)) diff --git a/server/ZR.Service/Business/OdfCableFaultsService.cs b/server/ZR.Service/Business/OdfCableFaultsService.cs index 490a9fa..1cadf9d 100644 --- a/server/ZR.Service/Business/OdfCableFaultsService.cs +++ b/server/ZR.Service/Business/OdfCableFaultsService.cs @@ -338,6 +338,7 @@ namespace ZR.Service.Business /// public (int successCount, int errorCount, string errorMsg) ImportFaults(List list) { + var logger = NLog.LogManager.GetCurrentClassLogger(); int successCount = 0; int errorCount = 0; var errorMsgs = new List(); @@ -373,15 +374,36 @@ namespace ZR.Service.Business var allTimes = new List(); if (!string.IsNullOrWhiteSpace(item.FaultTime)) { + var rawFaultTime = item.FaultTime; + var escapedRaw = rawFaultTime.Replace("\r", "\\r").Replace("\n", "\\n"); + logger.Info($"[导入调试] 行{rowNum} FaultTime原始值=[{escapedRaw}] 长度={rawFaultTime.Length}"); + + // 打印每个字符的Unicode编码,排查隐藏字符 + var charCodes = string.Join(",", rawFaultTime.Select(c => $"U+{(int)c:X4}")); + logger.Info($"[导入调试] 行{rowNum} FaultTime字符编码=[{charCodes}]"); + var timeParts = item.FaultTime.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries); - foreach (var part in timeParts) + logger.Info($"[导入调试] 行{rowNum} Split后得到 {timeParts.Length} 段"); + for (int k = 0; k < timeParts.Length; k++) { - if (DateTime.TryParse(part.Trim(), out var parsed)) + logger.Info($"[导入调试] 行{rowNum} 时间段[{k}]=[{timeParts[k].Trim()}]"); + if (DateTime.TryParse(timeParts[k].Trim(), out var parsed)) { allTimes.Add(parsed); + logger.Info($"[导入调试] 行{rowNum} 时间段[{k}] 解析成功={parsed:yyyy-MM-dd HH:mm:ss}"); + } + else + { + logger.Info($"[导入调试] 行{rowNum} 时间段[{k}] 解析失败"); } } } + else + { + logger.Info($"[导入调试] 行{rowNum} FaultTime为空"); + } + + logger.Info($"[导入调试] 行{rowNum} 共解析到 {allTimes.Count} 个有效时间"); // 按时间排序,第一个作为主故障时间 allTimes.Sort(); diff --git a/server/ZR.Vue/.env.development b/server/ZR.Vue/.env.development index ef4946d..fbaf4eb 100644 --- a/server/ZR.Vue/.env.development +++ b/server/ZR.Vue/.env.development @@ -1,10 +1,10 @@ # 开发环境配置 ENV = 'development' -VITE_APP_API_HOST = 'http://localhost:11082/' +VITE_APP_API_HOST = 'http://localhost:8888' # 开发环境 -VITE_APP_BASE_API = 'http://localhost:8888/' +VITE_APP_BASE_API = 'http://localhost:8888' # VITE_APP_BASE_API = 'http://49.233.115.141:11082/' # 路由前缀 @@ -14,4 +14,4 @@ VITE_APP_ROUTER_PREFIX = '/' VITE_APP_UPLOAD_URL = 'Common/UploadFile' #socket API -VITE_APP_SOCKET_API = 'http://localhost:11082/msghub' +VITE_APP_SOCKET_API = 'http://localhost:8888/msghub'