智慧建筑第三方功能集成微服务,目的是聚集所有涉及到第三方厂商调用的功能,按照业务功能划分不同微服务
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

158 lines
4.9 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
namespace Common.Shared.Application.DaHua
{
using System.Text.Json;
using System.Text.Json.Serialization;
/// <summary>
/// 请求DTO,用于控制摄像头云台操作(变倍、变焦、光圈)
/// </summary>
public class CameraControlReqDto
{
/// <summary>
/// 数据体,包含摄像头控制的详细参数
/// </summary>
[JsonPropertyName("data")]
public CameraControlData Data { get; set; }
}
/// <summary>
/// 摄像头控制参数(data字段)
/// </summary>
public class CameraControlData
{
/// <summary>
/// 视频通道编码(格式如:1004325$1$0$0)
/// 要求:第一个$后的数字必须是1,且cameraType为2(球机)
/// </summary>
[JsonPropertyName("channelId")]
public string ChannelId { get; set; }
/// <summary>
/// 操作类型:1 = 变倍,2 = 变焦,3 = 光圈
/// </summary>
[JsonPropertyName("operateType")]
[JsonConverter(typeof(JsonStringEnumConverterWithNumberMapping<OperateTypeEnum>))]
public OperateTypeEnum OperateType { get; set; }
/// <summary>
/// 方向:1 = 增加,2 = 减小
/// </summary>
[JsonPropertyName("direct")]
[JsonConverter(typeof(JsonStringEnumConverterWithNumberMapping<DirectionEnum>))]
public DirectionEnum Direct { get; set; }
/// <summary>
/// 转动速度(范围:1-8,越大越快)
/// </summary>
[JsonPropertyName("step")]
public string Step { get; set; }
/// <summary>
/// 命令:0 = 停止动作,1 = 开启动作
/// ⚠ 停止时其余参数需与启动时一致
/// </summary>
[JsonPropertyName("command")]
public string Command { get; set; }
/// <summary>
/// 扩展字段(预留)
/// </summary>
[JsonPropertyName("extend")]
public string Extend { get; set; }
}
/// <summary>
/// 操作类型枚举:变倍 / 变焦 / 光圈
/// </summary>
public enum OperateTypeEnum
{
[EnumValue("1")]
Zoom = 1, // 变倍
[EnumValue("2")]
Focus = 2, // 变焦
[EnumValue("3")]
Iris = 3 // 光圈
}
/// <summary>
/// 操作方向枚举:增加 / 减小
/// </summary>
public enum DirectionEnum
{
[EnumValue("1")]
Increase = 1,
[EnumValue("2")]
Decrease = 2
}
public class JsonStringEnumConverterWithNumberMapping<T> : JsonConverter<T> where T : struct, Enum
{
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
try
{
string rawValue = reader.TokenType switch
{
JsonTokenType.String => reader.GetString(),
JsonTokenType.Number => reader.GetInt32().ToString(), // 👈 新增对数值的处理
_ => throw new JsonException($"无法解析 {typeof(T).Name}:不支持的 JSON 类型 {reader.TokenType}")
};
foreach (T enumValue in Enum.GetValues(typeof(T)))
{
var attr = typeof(T).GetField(enumValue.ToString())
?.GetCustomAttributes(typeof(EnumValueAttribute), false)
?.FirstOrDefault() as EnumValueAttribute;
if (attr?.Value == rawValue)
{
return enumValue;
}
}
throw new JsonException($"无效的枚举值: {rawValue}");
}
catch (Exception ex)
{
throw new JsonException($"反序列化 {typeof(T).Name} 失败: {ex.Message}", ex);
}
}
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
{
var attr = typeof(T).GetField(value.ToString())
?.GetCustomAttributes(typeof(EnumValueAttribute), false)
?.FirstOrDefault() as EnumValueAttribute;
if (attr != null)
{
writer.WriteStringValue(attr.Value);
}
else
{
writer.WriteStringValue(value.ToString());
}
}
}
/// <summary>
/// 自定义Enum值标记为特定字符串(如"1")
/// </summary>
[AttributeUsage(AttributeTargets.Field)]
public class EnumValueAttribute : Attribute
{
public string Value { get; }
public EnumValueAttribute(string value) => Value = value;
}
}