TPatchDetail.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. using MeterVision.Config;
  2. using MeterVision.FreeAi;
  3. using MeterVision.model;
  4. using MeterVision.Util;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. namespace MeterVision.db
  11. {
  12. public class TPatchDetail
  13. {
  14. public string PatchDetailId { get; set; }
  15. public string PatchId { get; set; }
  16. public string CreateTime { get; set; }
  17. public string StandDetailId { get; set; }
  18. public string StandValue { get; set; }
  19. public string SrcImage { get; set; }
  20. public string SampleTime { get; set; } //图片的采样时间
  21. public int RunFlag { get; set; }
  22. public string RunTime { get; set; }
  23. public string DstImage { get; set; }
  24. public int ResultType { get; set; }
  25. public long RawValue { get; set; }
  26. public long FinalValue { get; set; }
  27. public long CompleteValue { get; set; } //识别后的完整结果
  28. public int ValueChanged { get; set; }
  29. public int ResultMeter { get; set; } //识别后的水表类型
  30. //0:还未运行比较 1:比较后相等 2:比较后不等 3:比较后识别无效
  31. public int EqualFlag { get; set; }
  32. public string AiVer { get; set; }
  33. public string DebugInfo { get; set; }
  34. public string LogPath { get; set; }
  35. public string Memo { get; set; }
  36. //--20250313 add by djs
  37. public string StationKey { get; set; } //站点表-主键
  38. public string StationId { get; set; } //站点ID
  39. public int MeterType { get; set; }
  40. public double BrightVal { get; set; } //配置参数-图片亮度
  41. public int FlowRate { get; set; } //配置参数-每小时最大水流
  42. public int DigitCount { get; set; }
  43. public int PointerCount { get; set; }
  44. public double LastUnit { get; set; }
  45. //20250430新增项(数据区域是否在s
  46. public int NumInUpper { get; set; }
  47. public string MeterRegion { get; set; } //配置参数-表盘区域
  48. public string FeatureRegion { get; set; } //配置参数-特征区域
  49. public int LastCompress { get; set; } //上一次压缩大小
  50. public long LatestValue { get; set; } //上次正确结果值
  51. public string LatestTime { get; set; } //上次正确值的时间
  52. public long LatestComplete { get; set; } //上次完整结果值
  53. // 构造函数,初始化默认值
  54. public TPatchDetail()
  55. {
  56. PatchDetailId = string.Empty;
  57. PatchId = string.Empty;
  58. CreateTime = string.Empty;
  59. StandDetailId = string.Empty;
  60. StandValue = string.Empty;
  61. SrcImage = string.Empty;
  62. RunFlag = 0;
  63. RunTime = string.Empty;
  64. DstImage = string.Empty;
  65. MeterType = -1;
  66. DigitCount = -1;
  67. PointerCount = -1;
  68. LastUnit = -1;
  69. NumInUpper = -1;
  70. ResultType = 0;
  71. RawValue = -1;
  72. FinalValue = -1;
  73. EqualFlag = 0;
  74. AiVer = string.Empty;
  75. DebugInfo = string.Empty;
  76. LogPath = string.Empty;
  77. Memo = string.Empty;
  78. StationKey = string.Empty;
  79. StationId = string.Empty;
  80. ResultMeter = -1;
  81. CompleteValue = -1;
  82. ValueChanged = -1;
  83. BrightVal = 1.2f;
  84. FlowRate = -1;
  85. MeterRegion = string.Empty;
  86. FeatureRegion = string.Empty;
  87. LastCompress = -1;
  88. LatestValue = -1;
  89. LatestTime = string.Empty;
  90. LatestComplete = -1;
  91. }
  92. public TPatchDetail(PatchDetailItem patchDetail, ResultModel resultModel)
  93. {
  94. //PatchDetailId = patchDetail.PatchDetailId;
  95. //PatchId = patchDetail.PatchId;
  96. //CreateTime = patchDetail.CreateTime;
  97. //StandDetailId = patchDetail.StandDetailId;
  98. //StandValue = patchDetail.StandValue;
  99. //SrcImage = patchDetail.SrcImage;
  100. ObjectHelper.CopyMatchingFields(patchDetail, this);
  101. RunFlag = 1;
  102. RunTime = ThisApp.GetNowTime_yyyyMMddHHmmss();
  103. DstImage = resultModel.DstImage;
  104. ResultMeter = resultModel.ResultMeter;
  105. ResultType = resultModel.ResultType;
  106. RawValue = (long)resultModel.RawValue; //resultModel.SRawValue;
  107. FinalValue = (long)resultModel.FinalValue; //resultModel.sFinalValue;
  108. CompleteValue = (long)resultModel.CompleteValue; //resultModel.sCompleteValue;
  109. AiVer = resultModel.AiVer;
  110. LogPath = resultModel.LogPath;
  111. // 使用 LINQ 进行转换和条件判断
  112. //var formattedBytes = resultModel.DebugInfoBytes.Select(b => b == 88 ? "" : b.ToString());
  113. DebugInfo = ThisApp.GetDebugInfos(resultModel.DebugInfoBytes); //string.Join(",", formattedBytes);
  114. //EqualFlag,这里需要判断,是否相等、约等、不等
  115. //先简单判断
  116. //20250317 delte by djs (无标准值的数据不会进入到这里
  117. if (string.IsNullOrWhiteSpace(StandValue))
  118. {
  119. //EqualFlag = 2;
  120. EqualFlag = 3; //无标准值可供比较(理论上不会出现这种情况)
  121. }
  122. else
  123. {
  124. if (double.TryParse(StandValue, out double dStandValue))
  125. {
  126. //EqualFlag = CheckEquailityWithStandValue(dStandValue, FinalValue) ? 1 : 0;
  127. EqualFlag = GetEqualFlag(dStandValue, FinalValue);
  128. }//if
  129. }
  130. }
  131. //设置结果
  132. public void SetResult(ResultModel resultModel)
  133. {
  134. RunFlag = 1;
  135. RunTime = ThisApp.GetNowTime_yyyyMMddHHmmss();
  136. DstImage = resultModel.DstImage;
  137. //MeterType = resultModel.MeterType;
  138. ResultMeter = resultModel.ResultMeter;
  139. ResultType = resultModel.ResultType;
  140. RawValue = (long)resultModel.RawValue;
  141. FinalValue = (long)resultModel.FinalValue;
  142. CompleteValue = (long)resultModel.CompleteValue;
  143. AiVer = resultModel.AiVer;
  144. LogPath = resultModel.LogPath;
  145. // 使用 LINQ 进行转换和条件判断
  146. //var formattedBytes = resultModel.DebugInfoBytes.Select(b => b == 88 ? "" : b.ToString());
  147. DebugInfo = ThisApp.GetDebugInfos(resultModel.DebugInfoBytes); //string.Join(",", formattedBytes);
  148. //EqualFlag,这里需要判断,是否相等、约等、不等
  149. //先简单判断
  150. if (string.IsNullOrWhiteSpace(StandValue))
  151. {
  152. EqualFlag = 3;
  153. }
  154. else
  155. {
  156. //if (int.TryParse(StandValue, out int iStandValue))
  157. if(double.TryParse(StandValue,out double dStandValue))
  158. {
  159. //EqualFlag = CheckEquailityWithStandValue(dStandValue, FinalValue) ? 1 : 0;
  160. EqualFlag = GetEqualFlag(dStandValue, FinalValue);
  161. }
  162. }
  163. }
  164. public bool IsGoodResult()
  165. {
  166. bool isGood = false;
  167. if(MeterType == ResultMeter &&
  168. (ResultType == 1 || ResultType == 2 || ResultType == 7 || ResultType == 8))
  169. {
  170. isGood = true;
  171. }
  172. return isGood;
  173. }
  174. public bool CheckEquailityWithStandValue(double standValue, long finalValue)
  175. {
  176. bool isEqual = false;
  177. //比较结果值与标准值是否相等
  178. if (MeterType == ResultMeter)
  179. {
  180. if (MeterType == 1)
  181. {
  182. //数字+指针(只比较数字部分)
  183. //获取真正数据部分的值
  184. int standValue1 = (int)Math.Ceiling(standValue / LastUnit);
  185. int finalValue1 = (int)(finalValue / (FaConstant.CUBE_VALUE * LastUnit));
  186. //isEqual = (standValue1 == finalValue1);
  187. //判断如何按最后一个单位差1,也认为正确(比如0.1单位,则差0.1是正确的,10单位的,差10也是正确的)
  188. //上面的值,也就规划为数字的整数
  189. isEqual = (Math.Abs(standValue1 - finalValue1) <= 1);
  190. return isEqual;
  191. }
  192. else if (MeterType == 2)
  193. {
  194. //全指针
  195. return (standValue * FaConstant.CUBE_VALUE) == finalValue;
  196. }
  197. else if (MeterType == 3)
  198. {
  199. //全数字
  200. return (standValue * FaConstant.CUBE_VALUE) == finalValue;
  201. }
  202. }
  203. return isEqual;
  204. }
  205. public int GetEqualFlag2(string strStandValue,double standValue, long finalValue)
  206. {
  207. bool isEqual = false;
  208. //比较结果值与标准值是否相等
  209. if (MeterType == ResultMeter)
  210. {
  211. if (MeterType == 1)
  212. {
  213. //数字+指针(只比较数字部分)
  214. //获取真正数据部分的值
  215. int standValue1 = (int)Math.Ceiling(standValue / LastUnit);
  216. int finalValue1 = (int)(finalValue / (FaConstant.CUBE_VALUE * LastUnit));
  217. //isEqual = (standValue1 == finalValue1);
  218. //判断如何按最后一个单位差1,也认为正确(比如0.1单位,则差0.1是正确的,10单位的,差10也是正确的)
  219. //上面的值,也就规划为数字的整数
  220. //isEqual = (Math.Abs(standValue1 - finalValue1) <= 1);
  221. //位数长度相同,最后一个的数字字符串差1判定相等
  222. int lastStandNum = standValue1 % 10;
  223. int lastFinalNum = finalValue1 % 10;
  224. int preStandNum = standValue1 / 10;
  225. int preFinalNum = finalValue1 / 10;
  226. //前面数字相同,最后一位差1或相同,即判断为相等
  227. if(preFinalNum == preStandNum && Math.Abs(lastFinalNum - lastStandNum) <= 1)
  228. {
  229. isEqual = true;
  230. }
  231. return isEqual ? 1 : 0;
  232. }
  233. else if (MeterType == 2)
  234. {
  235. //全指针
  236. //数字+指针(只比较数字部分)
  237. //获取真正数据部分的值
  238. int standValue1; // = (int)Math.Ceiling(standValue / LastUnit);
  239. int finalValue1; // = (int)(finalValue / (FaConstant.CUBE_VALUE * LastUnit));
  240. //isEqual = (standValue1 == finalValue1);
  241. //isEqual = (standValue * FaConstant.CUBE_VALUE) == finalValue;
  242. /*if(finalValue == 22066060)
  243. {
  244. Console.WriteLine("测试");
  245. }*/
  246. if (strStandValue.Contains("."))
  247. {
  248. //标准值带有小数则全比较
  249. standValue1 = (int)Math.Ceiling(standValue / LastUnit);
  250. finalValue1 = (int)(finalValue / (FaConstant.CUBE_VALUE * LastUnit));
  251. isEqual = (Math.Abs(standValue1 - finalValue1) <= 1);
  252. }
  253. else
  254. {
  255. //标准值没有小数则只比较整数部分
  256. standValue1 = (int)standValue;
  257. finalValue1 = (int)(finalValue / FaConstant.CUBE_VALUE);
  258. isEqual = (Math.Abs(standValue1 - finalValue1) <= 1);
  259. }
  260. return isEqual ? 1 : 0;
  261. }
  262. else if (MeterType == 3)
  263. {
  264. //全数字
  265. //return (standValue * FaConstant.CUBE_VALUE) == finalValue;
  266. isEqual = (standValue * FaConstant.CUBE_VALUE) == finalValue;
  267. return isEqual ? 1 : 0;
  268. }
  269. else
  270. {
  271. return 2;
  272. }
  273. }
  274. else
  275. {
  276. return 2;
  277. }
  278. }
  279. public int GetEqualFlag(double standValue, long finalValue)
  280. {
  281. bool isEqual = false;
  282. //比较结果值与标准值是否相等
  283. if (MeterType == ResultMeter)
  284. {
  285. if (MeterType == 1 || MeterType == 3)
  286. {
  287. //数字+指针(只比较数字部分)
  288. //获取真正数据部分的值
  289. int standValue1 = (int)Math.Ceiling(standValue / LastUnit);
  290. int finalValue1 = (int)(finalValue / (FaConstant.CUBE_VALUE * LastUnit));
  291. //isEqual = (standValue1 == finalValue1);
  292. //判断如何按最后一个单位差1,也认为正确(比如0.1单位,则差0.1是正确的,10单位的,差10也是正确的)
  293. //上面的值,也就规划为数字的整数
  294. isEqual = (Math.Abs(standValue1 - finalValue1) <= 1);
  295. return isEqual ? 1 : 0;
  296. }
  297. else if (MeterType == 2)
  298. {
  299. int standValue1 = (int)standValue;
  300. int finalValue1 = (int)(finalValue / FaConstant.CUBE_VALUE);
  301. isEqual = (Math.Abs(standValue1 - finalValue1) <= 1);
  302. return isEqual ? 1 : 0;
  303. }
  304. }
  305. return 2;
  306. }
  307. //恢复运行时的默认值
  308. public void ResetRunValue()
  309. {
  310. RunFlag = 0;
  311. RunTime = string.Empty;
  312. DstImage = string.Empty;
  313. ResultMeter = -1;
  314. ResultType = 0;
  315. RawValue = -1;
  316. FinalValue = -1;
  317. CompleteValue = -1;
  318. ValueChanged = -1;
  319. EqualFlag = -1;
  320. AiVer = string.Empty;
  321. DebugInfo = string.Empty;
  322. LogPath = string.Empty;
  323. Memo = string.Empty;
  324. //说明这条数据是在模板中被配置的数据
  325. //latest_complete=-1,last_compress = 100
  326. LatestComplete = -1;
  327. if (LatestTime.Equals(SampleTime))
  328. {
  329. LastCompress = 100;
  330. }
  331. else
  332. {
  333. LastCompress = -1;
  334. LatestValue = -1;
  335. LatestTime = string.Empty;
  336. }
  337. }
  338. //----------------------------------------------
  339. }
  340. ////////////////////////////////////////////////////////////
  341. }