using System.Text.Json; namespace SHH.CameraDashboard { public partial class CameraRepository { public async Task UpdateImageProcessingAsync(CameraEditInfo dto) { if (dto == null) return false; var serviceNode = AppGlobal.UseServiceNode; if (serviceNode == null) return false; // 1. 使用专用的 Processing 路由 string requestUrl = $"http://{serviceNode.ServiceNodeIp}:{serviceNode.ServiceNodePort}{WebApiRoutes.Cameras.Processing(dto.Id.ToString())}"; // 2. 解析分辨率字符串 (例如 "1920x1080" -> 1920, 1080) int width = 1280; // 默认值 int height = 720; if (!string.IsNullOrWhiteSpace(dto.TargetResolution)) { var parts = dto.TargetResolution.ToLower().Split('x'); if (parts.Length == 2) { int.TryParse(parts[0], out width); int.TryParse(parts[1], out height); } } try { // 2. 构建精简的专用 JSON Payload // 只包含图像处理相关的字段,不发送其他干扰信息 var payload = new { // --- 分辨率 (拆分成 int) --- targetWidth = width, targetHeight = height, // 确保这些字段名与后端 Processing 接口的定义一致 useGrayscale = dto.UseGrayscale, enhanceImage = dto.EnhanceImage, // 缩放控制 allowShrink = dto.AllowShrink, allowEnlarge = dto.AllowEnlarge, // 这里使用你确认过的 AllowEnlarge // 目标分辨率 targetResolution = dto.TargetResolution ?? "" }; string jsonBody = JsonHelper.Serialize(payload); // 3. 发送请求 // 通常专用功能接口使用 POST 或 PUT。根据你的路由命名(Processing 是名词/动词), // 且是对资源的部分修改,PUT 的可能性较大;但如果是“执行处理”,也可能是 POST。 // 建议先试 PUT (因为是 Update 操作),如果报 405 则改 POST。 await WebApiService.Instance.PostAsync(requestUrl, jsonBody, "图像处理配置"); return true; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"更新图像处理配置失败: {ex.Message}"); return false; } } /// /// [新增] 获取指定设备的图像处理配置 /// 对应后端: GET /api/cameras/{id}/processing /// public async Task GetImageProcessingAsync(long id) { var serviceNode = AppGlobal.UseServiceNode; if (serviceNode == null) return null; // 1. 拼接 URL: http://.../api/Cameras/1001/processing string requestUrl = $"http://{serviceNode.ServiceNodeIp}:{serviceNode.ServiceNodePort}{WebApiRoutes.Cameras.Root}/{id}/processing"; try { // 2. 发送 GET 请求 string jsonResponse = await WebApiService.Instance.GetAsync(requestUrl, "获取图像处理配置"); if (string.IsNullOrEmpty(jsonResponse)) return null; // 3. 解析后端返回的 ProcessingOptions JSON // 注意:这里定义一个临时类来匹配后端 JSON 结构,确保字段名一致 var options = JsonHelper.Deserialize(jsonResponse); if (options == null) return null; // 4. 映射回 CameraEditInfo 给 ViewModel 使用 return new CameraEditInfo { Id = id, // 将宽高拼回 "1920x1080" 格式 TargetResolution = $"{options.targetWidth}x{options.targetHeight}", // 映射开关 (注意字段名对应关系) AllowShrink = options.enableShrink, AllowEnlarge = options.enableExpand, // 后端叫 EnableExpand EnhanceImage = options.enableBrightness }; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"[Repository] 获取图像配置失败: {ex.Message}"); return null; } } // [内部类] 用于接收后端 JSON 的 DTO // 字段名需与后端 ProcessingOptions 序列化出来的 JSON 字段一致 (通常是 camelCase) private class ProcessingOptionsDto { public int targetWidth { get; set; } public int targetHeight { get; set; } public bool enableShrink { get; set; } public bool enableExpand { get; set; } // 对应后端的 EnableExpand public bool enableBrightness { get; set; } // 对应后端的 EnableBrightness public int brightness { get; set; } } } }