using MeterVision.Config; using MeterVision.FreeAi; using MeterVision.model; using MeterVision.Util; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MeterVision.db { public class TPatchDetail { public string PatchDetailId { get; set; } public string PatchId { get; set; } public string CreateTime { get; set; } public string StandDetailId { get; set; } public string StandValue { get; set; } public string SrcImage { get; set; } public string SampleTime { get; set; } //图片的采样时间 public int RunFlag { get; set; } public string RunTime { get; set; } public string DstImage { get; set; } public int ResultType { get; set; } public long RawValue { get; set; } public long FinalValue { get; set; } public long CompleteValue { get; set; } //识别后的完整结果 public int ValueChanged { get; set; } public int ResultMeter { get; set; } //识别后的水表类型 //0:还未运行比较 1:比较后相等 2:比较后不等 3:比较后识别无效 public int EqualFlag { get; set; } public string AiVer { get; set; } public string DebugInfo { get; set; } public string LogPath { get; set; } public string Memo { get; set; } //--20250313 add by djs public string StationKey { get; set; } //站点表-主键 public string StationId { get; set; } //站点ID public int MeterType { get; set; } public double BrightVal { get; set; } //配置参数-图片亮度 public int FlowRate { get; set; } //配置参数-每小时最大水流 public int DigitCount { get; set; } public int PointerCount { get; set; } public double LastUnit { get; set; } public string MeterRegion { get; set; } //配置参数-表盘区域 public string FeatureRegion { get; set; } //配置参数-特征区域 public int LastCompress { get; set; } //上一次压缩大小 public long LatestValue { get; set; } //上次正确结果值 public string LatestTime { get; set; } //上次正确值的时间 public long LatestComplete { get; set; } //上次完整结果值 // 构造函数,初始化默认值 public TPatchDetail() { PatchDetailId = string.Empty; PatchId = string.Empty; CreateTime = string.Empty; StandDetailId = string.Empty; StandValue = string.Empty; SrcImage = string.Empty; RunFlag = 0; RunTime = string.Empty; DstImage = string.Empty; MeterType = -1; DigitCount = -1; PointerCount = -1; LastUnit = -1; ResultType = 0; RawValue = -1; FinalValue = -1; EqualFlag = 0; AiVer = string.Empty; DebugInfo = string.Empty; LogPath = string.Empty; Memo = string.Empty; StationKey = string.Empty; StationId = string.Empty; ResultMeter = -1; CompleteValue = -1; ValueChanged = -1; BrightVal = 1.2f; FlowRate = -1; MeterRegion = string.Empty; FeatureRegion = string.Empty; LastCompress = -1; LatestValue = -1; LatestTime = string.Empty; LatestComplete = -1; } public TPatchDetail(PatchDetailItem patchDetail, ResultModel resultModel) { //PatchDetailId = patchDetail.PatchDetailId; //PatchId = patchDetail.PatchId; //CreateTime = patchDetail.CreateTime; //StandDetailId = patchDetail.StandDetailId; //StandValue = patchDetail.StandValue; //SrcImage = patchDetail.SrcImage; ObjectHelper.CopyMatchingFields(patchDetail, this); RunFlag = 1; RunTime = ThisApp.GetNowTime_yyyyMMddHHmmss(); DstImage = resultModel.DstImage; ResultMeter = resultModel.ResultMeter; ResultType = resultModel.ResultType; RawValue = (long)resultModel.RawValue; //resultModel.SRawValue; FinalValue = (long)resultModel.FinalValue; //resultModel.sFinalValue; CompleteValue = (long)resultModel.CompleteValue; //resultModel.sCompleteValue; AiVer = resultModel.AiVer; LogPath = resultModel.LogPath; // 使用 LINQ 进行转换和条件判断 var formattedBytes = resultModel.DebugInfoBytes.Select(b => b == 88 ? "" : b.ToString()); DebugInfo = string.Join(",", formattedBytes); //EqualFlag,这里需要判断,是否相等、约等、不等 //先简单判断 //20250317 delte by djs (无标准值的数据不会进入到这里 if (string.IsNullOrWhiteSpace(StandValue)) { //EqualFlag = 2; EqualFlag = -1; //无标准值可供比较(理论上不会出现这种情况) } else { if (double.TryParse(StandValue, out double dStandValue)) { //EqualFlag = CheckEquailityWithStandValue(dStandValue, FinalValue) ? 1 : 0; EqualFlag = GetEqualFlag(dStandValue, FinalValue); }//if } } //设置结果 public void SetResult(ResultModel resultModel) { RunFlag = 1; RunTime = ThisApp.GetNowTime_yyyyMMddHHmmss(); DstImage = resultModel.DstImage; //MeterType = resultModel.MeterType; ResultMeter = resultModel.ResultMeter; ResultType = resultModel.ResultType; RawValue = (long)resultModel.RawValue; FinalValue = (long)resultModel.FinalValue; CompleteValue = (long)resultModel.CompleteValue; AiVer = resultModel.AiVer; LogPath = resultModel.LogPath; // 使用 LINQ 进行转换和条件判断 var formattedBytes = resultModel.DebugInfoBytes.Select(b => b == 88 ? "" : b.ToString()); DebugInfo = string.Join(",", formattedBytes); //EqualFlag,这里需要判断,是否相等、约等、不等 //先简单判断 if (string.IsNullOrWhiteSpace(StandValue)) { EqualFlag = -1; } else { //if (int.TryParse(StandValue, out int iStandValue)) if(double.TryParse(StandValue,out double dStandValue)) { //EqualFlag = CheckEquailityWithStandValue(dStandValue, FinalValue) ? 1 : 0; EqualFlag = GetEqualFlag(dStandValue, FinalValue); } } } public bool IsGoodResult() { bool isGood = false; if(MeterType == ResultMeter && (ResultType == 1 || ResultType == 2 || ResultType == 7 || ResultType == 8)) { isGood = true; } return isGood; } public bool CheckEquailityWithStandValue(double standValue, long finalValue) { bool isEqual = false; //比较结果值与标准值是否相等 if (MeterType == ResultMeter) { if (MeterType == 1) { //数字+指针(只比较数字部分) //获取真正数据部分的值 int standValue1 = (int)Math.Ceiling(standValue / LastUnit); int finalValue1 = (int)(finalValue / (FaConstant.CUBE_VALUE * LastUnit)); //isEqual = (standValue1 == finalValue1); //判断如何按最后一个单位差1,也认为正确(比如0.1单位,则差0.1是正确的,10单位的,差10也是正确的) //上面的值,也就规划为数字的整数 isEqual = (Math.Abs(standValue1 - finalValue1) <= 1); return isEqual; } else if (MeterType == 2) { //全指针 return (standValue * FaConstant.CUBE_VALUE) == finalValue; } else if (MeterType == 3) { //全数字 return (standValue * FaConstant.CUBE_VALUE) == finalValue; } } return isEqual; } public int GetEqualFlag(double standValue, long finalValue) { bool isEqual = false; //比较结果值与标准值是否相等 if (MeterType == ResultMeter) { if (MeterType == 1) { //数字+指针(只比较数字部分) //获取真正数据部分的值 int standValue1 = (int)Math.Ceiling(standValue / LastUnit); int finalValue1 = (int)(finalValue / (FaConstant.CUBE_VALUE * LastUnit)); //isEqual = (standValue1 == finalValue1); //判断如何按最后一个单位差1,也认为正确(比如0.1单位,则差0.1是正确的,10单位的,差10也是正确的) //上面的值,也就规划为数字的整数 isEqual = (Math.Abs(standValue1 - finalValue1) <= 1); return isEqual ? 1 : 0; } else if (MeterType == 2) { //全指针 isEqual = (standValue * FaConstant.CUBE_VALUE) == finalValue; return isEqual ? 1 : 0; } else if (MeterType == 3) { //全数字 //return (standValue * FaConstant.CUBE_VALUE) == finalValue; isEqual = (standValue * FaConstant.CUBE_VALUE) == finalValue; return isEqual ? 1 : 0; } else { return 2; } } else { return 2; } } //---------------------------------------------- } //////////////////////////////////////////////////////////// }