Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

975 строки
48 KiB

  1. using Newtonsoft.Json;
  2. using Newtonsoft.Json.Linq;
  3. using SqlSugar;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Net;
  9. using System.Text;
  10. using System.Text.RegularExpressions;
  11. using System.Threading.Tasks;
  12. using MaiMuControl.Utils;
  13. using MaiMuControl.Device;
  14. using System.Reflection;
  15. using Models;
  16. using MaiMuAOI.SysCtrl;
  17. using OpenCvSharp;
  18. using Yolo5;
  19. using HalconDotNet;
  20. namespace ProductionControl
  21. {
  22. public class WebService
  23. {
  24. private HttpListener svcHttpListener;
  25. public Action<WarningEnum, string> LogEvent;
  26. /// <summary>
  27. /// 缺陷图片和详情文件路径
  28. /// </summary>
  29. public string Defect_Compress_SavePath { get; set; }
  30. /// <summary>
  31. /// 比对图片和详情文件路径
  32. /// </summary>
  33. public string SizeBmp_Zoom_Image_SavePath { get; set; }
  34. /// <summary>
  35. /// 缺陷小图片和详情文件路径
  36. /// </summary>
  37. public string Defect_Small_SavePath { get; set; }
  38. Service.OrderService svcOrder = new Service.OrderService();
  39. private void logEvent(string msg, WarningEnum warn = WarningEnum.Normal)
  40. {
  41. LogEvent?.Invoke(warn, msg);
  42. }
  43. public void start(string HttpIP, int HttpPort)
  44. {
  45. try
  46. {
  47. if (HttpPort > 0)
  48. {
  49. //logEvent("Web服务启动...");
  50. this.svcHttpListener = new HttpListener();
  51. List<string> lstIp = HttpUtil.getLocalIPList();
  52. //logEvent($"Web服务已启动,运行于端口:{Config.LocalHttpPort.ToString()}, 监听Ip:{string.Join("|", lstIp)}");
  53. //if (!string.IsNullOrWhiteSpace(Config.LocalIp) && lstIp.FindIndex(m => m.Contains(Config.LocalIp)) >= 0)//没指定IP/指定的不对
  54. //{
  55. // lstIp.Clear();
  56. // lstIp.Add(Config.LocalIp);
  57. //}
  58. //lstIp.Clear();
  59. if (lstIp.Count < 1)
  60. {
  61. lstIp.Add(HttpIP);
  62. lstIp.Add("127.0.0.1");
  63. }
  64. logEvent($"Web服务已启动,运行于端口:{HttpPort.ToString()}, 监听Ip:{string.Join("|", lstIp)}");
  65. for (int i = 0; i < lstIp.Count; i++)
  66. this.svcHttpListener.Prefixes.Add("http://" + lstIp[i] + ":" + HttpPort.ToString() + "/");
  67. //svcHttpListener.Prefixes.Add($"https://+:{HttpPort}");
  68. this.svcHttpListener.Start();
  69. //logEvent($"Web服务已启动,运行于端口:{Config.LocalHttpPort.ToString()}, 监听Ip:{string.Join("|", lstIp)}");
  70. //this.svcHttpListener.GetContext().Response.AppendHeader("Access-Control-Allow-Origin", "*");//后台跨域请求,通常设置为配置文件
  71. //this.svcHttpListener.GetContext().Response.AppendHeader("Access-Control-Allow-Credentials", "true"); //后台跨域请求
  72. this.svcHttpListener.BeginGetContext(new AsyncCallback(this.GetContextCallBack), this.svcHttpListener);
  73. }
  74. //------WEB Socket
  75. //if (Config.localIp != "" && Config.localSocketPort > 0)
  76. //{
  77. // logEvent( "WebSocket服务启动...");
  78. // this.wssv = new WebSocketServer(Config.localSocketPort);
  79. // this.wssv.AddWebSocketService<Socket1>("/socket1");
  80. // this.wssv.Start();
  81. // logEvent( "WebSocket服务已启动。");
  82. //}
  83. }
  84. catch (Exception ex)
  85. {
  86. logEvent("Web服务启动失败,ex="+ex.Message);
  87. }
  88. }
  89. public void stop()
  90. {
  91. logEvent( "正在停止WEB服务...");
  92. try
  93. {
  94. if (this.svcHttpListener != null && this.svcHttpListener.IsListening)
  95. {
  96. this.svcHttpListener.Stop();
  97. this.svcHttpListener.Close();
  98. this.logEvent("Web服务已停止!");
  99. }
  100. //if (this.svcWebSocket != null && this.svcWebSocket.IsListening)
  101. //{
  102. // this.svcWebSocket.Stop();
  103. // this.svcWebSocket = null;
  104. // this.AddTextEvent("WebSocket", "WebSocket服务已停止!");
  105. //}
  106. }
  107. catch (Exception ex)
  108. {
  109. logEvent("Web服务停止失败,ex=" + ex.Message);
  110. }
  111. }
  112. //
  113. private void GetContextCallBack(IAsyncResult ar)
  114. {
  115. this.svcHttpListener = (ar.AsyncState as HttpListener);
  116. HttpListenerContext httpListenerContext;
  117. try
  118. {
  119. httpListenerContext = this.svcHttpListener.EndGetContext(ar);
  120. //httpListenerContext.Response.AppendHeader("Access-Control-Allow-Origin", "*");//后台跨域请求,通常设置为配置文件
  121. //httpListenerContext.Response.AppendHeader("Access-Control-Allow-Credentials", "true"); //后台跨域请求
  122. //httpListenerContext.Response.AppendHeader("Access-Control-Allow-Methods", "GET,POST");
  123. httpListenerContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
  124. httpListenerContext.Response.AddHeader("Access-Control-Allow-Headers", "*");
  125. httpListenerContext.Response.AddHeader("Access-Control-Allow-Methods", "*");
  126. this.svcHttpListener.BeginGetContext(new AsyncCallback(this.GetContextCallBack), this.svcHttpListener);
  127. }
  128. catch (Exception ex)
  129. {
  130. logEvent( "ex:" + ex.StackTrace);
  131. return;
  132. }
  133. //
  134. string sessionId = Convert.ToInt32(DateTime.Now.ToString("mmssfff")).ToString();//.ToString("X");
  135. string reqHttpMethod = httpListenerContext.Request.HttpMethod;
  136. string reqUrl = httpListenerContext.Request.RawUrl;
  137. string reqData = "";
  138. try
  139. {
  140. this.logEvent( $"{sessionId} / 收到请求:{reqHttpMethod} To Url:{reqUrl}");
  141. reqData = HttpUtil.getPostData(httpListenerContext.Request);
  142. this.logEvent( $"{sessionId} / 请求数据:{reqData}");
  143. var subUrls = reqUrl.Trim(new char[] { '/' }).Split(new char[] { '/' });
  144. if (subUrls[0].ToLower() == "static")
  145. {
  146. #region
  147. //string InputStream = ""; //上传的数据
  148. //using (var streamReader = new StreamReader(httpListenerContext.Request.InputStream))
  149. // InputStream = streamReader.ReadToEnd();
  150. // string filePath = Config.appBasePath;
  151. string filePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
  152. foreach (var sub in subUrls)
  153. filePath += "\\" + sub;
  154. if (!File.Exists(filePath)) filePath = filePath + "\\index.html";
  155. if (!File.Exists(filePath))
  156. {
  157. httpListenerContext.Response.ContentLength64 = 0;
  158. httpListenerContext.Response.StatusCode = 404;
  159. httpListenerContext.Response.Abort();
  160. }
  161. else
  162. {
  163. httpListenerContext.Response.StatusCode = 200;
  164. string exeName = Path.GetExtension(filePath);
  165. httpListenerContext.Response.ContentType = HttpUtil.GetContentType(exeName);
  166. FileStream fileStream = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read, FileShare.ReadWrite);
  167. int byteLength = (int)fileStream.Length;
  168. byte[] fileBytes = new byte[byteLength];
  169. fileStream.Read(fileBytes, 0, byteLength);
  170. fileStream.Close();
  171. fileStream.Dispose();
  172. httpListenerContext.Response.ContentLength64 = byteLength;
  173. httpListenerContext.Response.OutputStream.Write(fileBytes, 0, byteLength);
  174. //httpListenerContext.Response.OutputStream.Close();
  175. }
  176. #endregion
  177. return;
  178. }
  179. if (reqData == null)
  180. throw new Exception("请求数据不可为空!");
  181. httpListenerContext.Response.StatusCode = 200;
  182. JObject joReqData = JObject.Parse(reqData);
  183. string respText;
  184. JObject result = new JObject();
  185. string sourceSessionId;
  186. switch (subUrls[0].ToLower())
  187. {
  188. case "static": //上面已处理
  189. break;
  190. case "test":
  191. HttpUtil.writeToHttpContext_text(httpListenerContext.Response, "测试回应!");
  192. break;
  193. case "api":
  194. switch (subUrls[1].ToLower())
  195. {
  196. case "query_table":
  197. #region
  198. //if (httpListenerContext.Request.HttpMethod != "POST")
  199. // goto case "http_error";
  200. result = getTableList(joReqData);
  201. respText = JsonConvert.SerializeObject(result);
  202. this.logEvent($"{sessionId} / 返回:{(respText.Length > 30 ?respText.Substring(0,30):respText)}");
  203. if (!HttpUtil.writeToHttpContext_json(httpListenerContext.Response, respText))
  204. this.logEvent($"{sessionId} / http返回时连接已断开!");
  205. #endregion
  206. break;
  207. case "update_table"://insert+update
  208. #region
  209. //if (httpListenerContext.Request.HttpMethod != "POST")
  210. // goto case "http_error";
  211. result = updateTableList(joReqData);
  212. respText = JsonConvert.SerializeObject(result);
  213. this.logEvent($"{sessionId} / 返回:{(respText.Length > 30 ?respText.Substring(0,30):respText)}");
  214. if (!HttpUtil.writeToHttpContext_json(httpListenerContext.Response, respText))
  215. this.logEvent($"{sessionId} / http返回时连接已断开!");
  216. #endregion
  217. break;
  218. case "delete_table":
  219. #region
  220. //if (httpListenerContext.Request.HttpMethod != "POST")
  221. // goto case "http_error";
  222. result = delTableList(joReqData);
  223. respText = JsonConvert.SerializeObject(result);
  224. this.logEvent($"{sessionId} / 返回:{(respText.Length > 30 ? respText.Substring(0, 30) : respText)}");
  225. if (!HttpUtil.writeToHttpContext_json(httpListenerContext.Response, respText))
  226. this.logEvent($"{sessionId} / http返回时连接已断开!");
  227. #endregion
  228. break;
  229. case "getreport_qualified":
  230. #region
  231. //if (httpListenerContext.Request.HttpMethod != "POST")
  232. // goto case "http_error";
  233. result = getReport_Qualified(joReqData);
  234. respText = JsonConvert.SerializeObject(result);
  235. this.logEvent($"{sessionId} / 返回:{(respText.Length > 30 ? respText.Substring(0, 30) : respText)}");
  236. if (!HttpUtil.writeToHttpContext_json(httpListenerContext.Response, respText))
  237. this.logEvent($"{sessionId} / http返回时连接已断开!");
  238. #endregion
  239. break;
  240. case "getchart_qualified_rate"://图表:日月季年 合格率
  241. #region
  242. //if (httpListenerContext.Request.HttpMethod != "POST")
  243. // goto case "http_error";
  244. result = GetChart_Qualified_Rate(joReqData);
  245. respText = JsonConvert.SerializeObject(result);
  246. this.logEvent($"{sessionId} / 返回:{(respText.Length > 30 ? respText.Substring(0, 30) : respText)}");
  247. if (!HttpUtil.writeToHttpContext_json(httpListenerContext.Response, respText))
  248. this.logEvent($"{sessionId} / http返回时连接已断开!");
  249. #endregion
  250. break;
  251. case "getchart_qualified_date"://图表:合格率分析
  252. #region
  253. //if (httpListenerContext.Request.HttpMethod != "POST")
  254. // goto case "http_error";
  255. result = GetChart_Qualified_Date(joReqData);
  256. respText = JsonConvert.SerializeObject(result);
  257. this.logEvent($"{sessionId} / 返回:{(respText.Length > 30 ? respText.Substring(0, 30) : respText)}");
  258. if (!HttpUtil.writeToHttpContext_json(httpListenerContext.Response, respText))
  259. this.logEvent($"{sessionId} / http返回时连接已断开!");
  260. #endregion
  261. break;
  262. case "getchart_defects_date"://图表:按日期统计各缺陷数
  263. #region
  264. //if (httpListenerContext.Request.HttpMethod != "POST")
  265. // goto case "http_error";
  266. result = GetReport_Defects_Date(joReqData);
  267. respText = JsonConvert.SerializeObject(result);
  268. this.logEvent($"{sessionId} / 返回:{(respText.Length > 30 ? respText.Substring(0, 30) : respText)}");
  269. if (!HttpUtil.writeToHttpContext_json(httpListenerContext.Response, respText))
  270. this.logEvent($"{sessionId} / http返回时连接已断开!");
  271. #endregion
  272. break;
  273. case "getchart_defects_total"://图表:缺陷总数
  274. #region
  275. //if (httpListenerContext.Request.HttpMethod != "POST")
  276. // goto case "http_error";
  277. result = GetReport_Defects_Total(joReqData);
  278. respText = JsonConvert.SerializeObject(result);
  279. this.logEvent($"{sessionId} / 返回:{(respText.Length > 30 ? respText.Substring(0, 30) : respText)}");
  280. if (!HttpUtil.writeToHttpContext_json(httpListenerContext.Response, respText))
  281. this.logEvent($"{sessionId} / http返回时连接已断开!");
  282. #endregion
  283. break;
  284. //修复台
  285. case "get_defect_from_sn"://读取缺陷文件名列表和JSON数组
  286. #region
  287. //if (httpListenerContext.Request.HttpMethod != "POST")
  288. // goto case "http_error";
  289. result = getDefectFromSN(joReqData);
  290. respText = JsonConvert.SerializeObject(result);
  291. this.logEvent($"{sessionId} / 返回:{(respText.Length > 30 ? respText.Substring(0, 30) : respText)}");
  292. if (!HttpUtil.writeToHttpContext_json(httpListenerContext.Response, respText))
  293. this.logEvent($"{sessionId} / http返回时连接已断开!");
  294. #endregion
  295. break;
  296. case "get_defect_pic"://读取缺陷文件base64
  297. #region
  298. //if (httpListenerContext.Request.HttpMethod != "POST")
  299. // goto case "http_error";
  300. result = getDefectBmpBase64(joReqData);
  301. respText = JsonConvert.SerializeObject(result);
  302. this.logEvent($"{sessionId} / 返回BaseLen:{(respText.Length > 30 ? respText.Substring(0, 30) : respText)}");
  303. if (!HttpUtil.writeToHttpContext_json(httpListenerContext.Response, respText))
  304. this.logEvent($"{sessionId} / http返回时连接已断开!");
  305. #endregion
  306. break;
  307. case "get_smalldir_from_sn"://读取缺陷小图文件名列表
  308. #region
  309. //if (httpListenerContext.Request.HttpMethod != "POST")
  310. // goto case "http_error";
  311. result = getDefectSmallDirFromSN(joReqData);
  312. respText = JsonConvert.SerializeObject(result);
  313. this.logEvent($"{sessionId} / 返回:{(respText.Length > 30 ? respText.Substring(0, 30) : respText)}");
  314. if (!HttpUtil.writeToHttpContext_json(httpListenerContext.Response, respText))
  315. this.logEvent($"{sessionId} / http返回时连接已断开!");
  316. #endregion
  317. break;
  318. case "get_defect_smallpic"://读取缺陷小图
  319. #region
  320. //if (httpListenerContext.Request.HttpMethod != "POST")
  321. // goto case "http_error";
  322. result = getDefectSmallBmpBase64(joReqData);
  323. respText = JsonConvert.SerializeObject(result);
  324. this.logEvent($"{sessionId} / 返回BaseLen:{(respText.Length > 30 ? respText.Substring(0, 30) : respText)}");
  325. if (!HttpUtil.writeToHttpContext_json(httpListenerContext.Response, respText))
  326. this.logEvent($"{sessionId} / http返回时连接已断开!");
  327. #endregion
  328. break;
  329. default:
  330. HttpUtil.writeToHttpContext_text(httpListenerContext.Response, "未知请求!");
  331. break;
  332. }
  333. break;
  334. case "http_error":
  335. result.Add("code", -1);
  336. result.Add("msg", "不支持的请求协议!");
  337. respText = JsonConvert.SerializeObject(result);
  338. this.logEvent( $"{sessionId} / 返回:{respText}" );
  339. if (!HttpUtil.writeToHttpContext_json(httpListenerContext.Response, respText))
  340. {
  341. this.logEvent( $"{sessionId} / http返回时连接已断开!" );
  342. //this.logEvent( id + " /http连接已断开," + (string.IsNullOrWhiteSpace(callback_url) ? "无法返回结果!" : "通过回调返回" + callback_url), 1);
  343. //if (callback_url != null && callback_url != "")
  344. // HttpUtil.post(callback_url, respText);
  345. }
  346. break;
  347. case "url_error":
  348. result.Add("code", -2);
  349. result.Add("msg", "URL地址错误!");
  350. respText = JsonConvert.SerializeObject(result);
  351. this.logEvent( $"{sessionId} / 返回:{respText}" );
  352. if (!HttpUtil.writeToHttpContext_json(httpListenerContext.Response, respText))
  353. {
  354. this.logEvent( $"{sessionId} / http返回时连接已断开!" );
  355. //this.logEvent( id + " /http连接已断开," + (string.IsNullOrWhiteSpace(callback_url) ? "无法返回结果!" : "通过回调返回" + callback_url), 1);
  356. //if (callback_url != null && callback_url != "")
  357. // HttpUtil.post(callback_url, respText);
  358. }
  359. break;
  360. case "param_error":
  361. result.Add("code", -3);
  362. result.Add("msg", "参数错误!");
  363. respText = JsonConvert.SerializeObject(result);
  364. this.logEvent( $"{sessionId} / 返回:{respText}" );
  365. if (!HttpUtil.writeToHttpContext_json(httpListenerContext.Response, respText))
  366. {
  367. this.logEvent( $"{sessionId} / http返回时连接已断开!" );
  368. //this.logEvent( id + " /http连接已断开," + (string.IsNullOrWhiteSpace(callback_url) ? "无法返回结果!" : "通过回调返回" + callback_url), 1);
  369. //if (callback_url != null && callback_url != "")
  370. // HttpUtil.post(callback_url, respText);
  371. }
  372. break;
  373. default:
  374. HttpUtil.writeToHttpContext_text(httpListenerContext.Response, "未知请求!");
  375. break;
  376. }
  377. }
  378. catch (Exception ex)
  379. {
  380. this.logEvent( $"{sessionId} / 异常:{ex.Message}\r\n{ex.StackTrace}" );
  381. httpListenerContext.Response.StatusCode = 500;
  382. }
  383. finally
  384. {
  385. try
  386. {
  387. httpListenerContext.Response.OutputStream.Close();//客户端断开时会异常
  388. }
  389. catch { }
  390. }
  391. }
  392. //----
  393. private JObject getTableList(JObject req)
  394. {
  395. JObject res = new JObject();
  396. try
  397. {
  398. string model, fields = "", domain = "", order = "";
  399. int pageNum = 0, pageSize = 0, totalCount = 0;
  400. model = req.Value<string>("model");
  401. if (req.ContainsKey("fields")) fields = req.Value<string>("fields");
  402. if (req.ContainsKey("domain")) domain = req.Value<JArray>("domain").ToString();
  403. if (req.ContainsKey("order")) order = req.Value<string>("order");
  404. if (req.ContainsKey("pageNum")) pageNum = req.Value<int>("pageNum");
  405. if (req.ContainsKey("pageSize")) pageSize = req.Value<int>("pageSize");
  406. //创建表达式
  407. var exp1 = Expressionable.Create<Order>()
  408. //.AndIF((int)cobProductList.SelectedValue > 0, it => it.ProductId == (int)cobProductList.SelectedValue)
  409. //.AndIF((int)cobStepList.SelectedValue > 0, it => it.StepId == (int)cobStepList.SelectedValue)
  410. //.AndIF(dateTimePicker1.Checked, it => it.CreateTime >= dateTimePicker1.Value)
  411. //.AndIF(dateTimePicker2.Checked, it => it.CreateTime < dateTimePicker2.Value)
  412. .ToExpression();//注意 这一句 不能少
  413. var list = svcOrder.GetList(model, fields, domain, order, pageNum, pageSize, ref totalCount);
  414. //var list = svcOrder.GetListNav(pageNum, pageSize, ref totalCount, exp1);
  415. res.Add("code", 200);
  416. res.Add("data", JArray.FromObject(list));
  417. res.Add("totalCount", totalCount);
  418. }
  419. catch (Exception ex)
  420. {
  421. res.Add("code", -9);
  422. res.Add("data", ex.Message);
  423. }
  424. return res;
  425. }
  426. private JObject delTableList(JObject req)
  427. {
  428. JObject res = new JObject();
  429. try
  430. {
  431. string model = req.Value<string>("model");
  432. string domain = req.Value<JArray>("domain").ToString();
  433. //var idArr = req.Value<JArray>("idList");
  434. //List<int> ids = new List<int>();
  435. //foreach (int id in idArr) ids.Add(id);
  436. int result = svcOrder.DeleteList(model, domain);
  437. res.Add("code", 200);
  438. res.Add("data", result);
  439. }
  440. catch (Exception ex)
  441. {
  442. res.Add("code", -9);
  443. res.Add("data", ex.Message);
  444. }
  445. return res;
  446. }
  447. private JObject updateTableList(JObject req)
  448. {
  449. JObject res = new JObject();
  450. try
  451. {
  452. string model = req.Value<string>("model");
  453. var list = req.Value<JArray>("datas");
  454. string[] updateColumns = null;
  455. if (req.ContainsKey("columns"))
  456. updateColumns = req.Value<JArray>("columns").ToObject<List<string>>().ToArray();
  457. int result = svcOrder.UpdateableList(model, list.ToString(), updateColumns);
  458. res.Add("code", 200);
  459. res.Add("data", result);
  460. }
  461. catch (Exception ex)
  462. {
  463. res.Add("code", -9);
  464. res.Add("data", ex.Message);
  465. }
  466. return res;
  467. }
  468. private JObject getReport_Qualified(JObject req)
  469. {
  470. JObject res = new JObject();
  471. try
  472. {
  473. string domain = "", order = "";
  474. int pageNum = 0, pageSize = 0, totalCount = 0;
  475. if (req.ContainsKey("domain")) domain = req.Value<JArray>("domain").ToString();
  476. if (req.ContainsKey("order")) order = req.Value<string>("order");
  477. if (req.ContainsKey("pageNum")) pageNum = req.Value<int>("pageNum");
  478. if (req.ContainsKey("pageSize")) pageSize = req.Value<int>("pageSize");
  479. //创建表达式
  480. var list = svcOrder.GetReport_Qualified( domain, order, pageNum, pageSize, ref totalCount);
  481. res.Add("code", 200);
  482. res.Add("data", list);
  483. res.Add("totalCount", totalCount);
  484. }
  485. catch (Exception ex)
  486. {
  487. res.Add("code", -9);
  488. res.Add("data", ex.Message);
  489. }
  490. return res;
  491. }
  492. /// <summary>
  493. /// 获取缺陷数据
  494. /// </summary>
  495. /// <param name="req"></param>
  496. /// <returns>{文件名:[["4","3.9","-0.8","dk","0.39"],["index","X","Y","缺陷类型","缺陷的置信度"],...]}</returns>
  497. private JObject getDefectFromSN(JObject req)
  498. {
  499. JObject res = new JObject();
  500. try
  501. {
  502. string date = req.Value<string>("date");
  503. string sn = req.Value<string>("sn");
  504. JObject dataall = new JObject();
  505. string path, key;
  506. string[] files;
  507. List<List<string>> allData = new List<List<string>>();
  508. //文件名格式:$"Size_SN{order.SN}_I{res.index}_X{res.Defects_X}_Y{res.Defects_Y}_.....json/bmp
  509. //--缺陷
  510. JObject data = new JObject();
  511. path = $"{Defect_Compress_SavePath}\\{date}\\{sn}\\";
  512. if (Directory.Exists(path))
  513. {
  514. files = Directory.GetFiles(path, $"Defect_SN{sn}_*.json", SearchOption.TopDirectoryOnly);
  515. if (files.Length > 0)
  516. {
  517. //对文件名中的数字(index)进行大小排序
  518. files = files.OrderBy(s => int.Parse(Path.GetFileNameWithoutExtension(s).Split('_')[2].Substring(1))).ToArray();
  519. foreach (string file in files)
  520. {
  521. key = Path.GetFileNameWithoutExtension(file);
  522. if (File.Exists(path + key + ".jpg"))
  523. {
  524. data.Add(key, JArray.Parse(File.ReadAllText(file)));
  525. var temp = JsonConvert.DeserializeObject<List<List<string>>>(File.ReadAllText(file));
  526. allData.AddRange(temp);
  527. }
  528. else
  529. {
  530. string[] name_array = key.Split(new char[] { '_' });
  531. if (name_array.Length > 6)
  532. name_array[5] = "C0";
  533. string file_name = string.Join("_", name_array);
  534. if (File.Exists(path + file_name + ".jpg"))
  535. {
  536. data.Add(key, JArray.Parse(File.ReadAllText(file)));
  537. var temp = JsonConvert.DeserializeObject<List<List<string>>>(File.ReadAllText(file));
  538. allData.AddRange(temp);
  539. }
  540. }
  541. }
  542. }
  543. }
  544. //--缺陷 --比对
  545. List<List<string>> allDataTxt = new List<List<string>>();
  546. //JObject data = new JObject();
  547. path = $"{Defect_Compress_SavePath}\\{date}\\{sn}\\";
  548. if (Directory.Exists(path))
  549. {
  550. files = Directory.GetFiles(path, $"Defect_SN{sn}_*.txt", SearchOption.TopDirectoryOnly);
  551. if (files.Length > 0)
  552. {
  553. //对文件名中的数字(index)进行大小排序
  554. files = files.OrderBy(s => int.Parse(Path.GetFileNameWithoutExtension(s).Split('_')[2].Substring(1))).ToArray();
  555. foreach (string file in files)
  556. {
  557. key = Path.GetFileNameWithoutExtension(file);
  558. if (File.Exists(path + key + ".jpg"))
  559. {
  560. //data.Add(key, JArray.Parse(File.ReadAllText(file)));
  561. var temp = JsonConvert.DeserializeObject<List<List<string>>>(File.ReadAllText(file));
  562. allDataTxt.AddRange(temp);
  563. }
  564. else
  565. {
  566. string[] name_array = key.Split(new char[] { '_' });
  567. if (name_array.Length > 6)
  568. name_array[5] = "C0";
  569. string file_name = string.Join("_", name_array);
  570. if (File.Exists(path + file_name + ".jpg"))
  571. {
  572. //data.Add(key, JArray.Parse(File.ReadAllText(file)));
  573. var temp = JsonConvert.DeserializeObject<List<List<string>>>(File.ReadAllText(file));
  574. allDataTxt.AddRange(temp);
  575. }
  576. }
  577. }
  578. }
  579. }
  580. //--比对
  581. List<List<string>> allData2 = new List<List<string>>();
  582. JObject data2 = new JObject();
  583. path = $"{SizeBmp_Zoom_Image_SavePath}\\{date}\\{sn}\\";
  584. if (Directory.Exists(path))
  585. {
  586. files = Directory.GetFiles(path, $"Size_SN{sn}_*.json", SearchOption.TopDirectoryOnly);
  587. if (files.Length > 0)
  588. {
  589. //对文件名中的数字(index)进行大小排序
  590. files = files.OrderBy(s => int.Parse(Path.GetFileNameWithoutExtension(s).Split('_')[2].Substring(1))).ToArray();
  591. foreach (string file in files)
  592. {
  593. key = Path.GetFileNameWithoutExtension(file);
  594. if (File.Exists(path + key + ".jpg"))
  595. {
  596. data.Add(key, JArray.Parse(File.ReadAllText(file)));
  597. data2.Add(key, JArray.Parse(File.ReadAllText(file)));
  598. var temp = JsonConvert.DeserializeObject<List<List<string>>>(File.ReadAllText(file));
  599. allData2.AddRange(temp);
  600. }
  601. }
  602. }
  603. }
  604. ////--比对2
  605. path = $"{SizeBmp_Zoom_Image_SavePath}\\{date}\\{sn}\\";
  606. if (Directory.Exists(path))
  607. {
  608. //DefectSize_SN
  609. files = Directory.GetFiles(path, $"DefectSize_SN{sn}_*.json", SearchOption.TopDirectoryOnly);
  610. if (files.Length > 0)
  611. {
  612. //对文件名中的数字(index)进行大小排序
  613. files = files.OrderBy(s => int.Parse(Path.GetFileNameWithoutExtension(s).Split('_')[2].Substring(1))).ToArray();
  614. foreach (string file in files)
  615. {
  616. key = Path.GetFileNameWithoutExtension(file);
  617. if (File.Exists(path + key + ".jpg"))
  618. {
  619. data.Add(key, JArray.Parse(File.ReadAllText(file)));
  620. data2.Add(key, JArray.Parse(File.ReadAllText(file)));
  621. var temp = JsonConvert.DeserializeObject<List<List<string>>>(File.ReadAllText(file));
  622. allData2.AddRange(temp);
  623. }
  624. }
  625. }
  626. }
  627. Yolo_Class yolo = new Yolo_Class();
  628. File.WriteAllText("data.json", JsonConvert.SerializeObject(data));
  629. File.WriteAllText("defect.json", JsonConvert.SerializeObject(allData));
  630. File.WriteAllText("defectTxt.json", JsonConvert.SerializeObject(allDataTxt));
  631. File.WriteAllText("size.json", JsonConvert.SerializeObject(allData2));
  632. #if OpenSizeDefectComp
  633. var defectInfor2RestorationDesk = yolo.FilteringOverlappingDefects(allDataTxt, allData2);
  634. foreach (var kv in data)
  635. {
  636. dataall.Add(kv.Key, kv.Value);
  637. }
  638. foreach (var kv in data2)
  639. {
  640. var temp = JsonConvert.DeserializeObject<List<List<string>>>(kv.Value.ToString());
  641. List<List<string>> isexsist = temp.Intersect(defectInfor2RestorationDesk).ToList(); //交集 表示两个List都存在的集合
  642. List<List<string>> dlist = new List<List<string>>();
  643. foreach (var i in temp)
  644. {
  645. foreach (var j in defectInfor2RestorationDesk)
  646. {
  647. if (j[0] == i[0] && j[1] == i[1] && j[2] == i[2] && j[3] == i[3] && j[4] == i[4])
  648. dlist.Add(i);
  649. }
  650. }
  651. if (dlist != null && dlist.Count > 0)
  652. dataall.Add(kv.Key, JArray.Parse(JsonConvert.SerializeObject(dlist)));
  653. }
  654. #endif
  655. res.Add("code", 200);
  656. if(ConfMgr.Instance.SysConfigParams.OpenRemoveDuplicates)
  657. res.Add("data", dataall);
  658. else
  659. res.Add("data", data);
  660. }
  661. catch (Exception ex)
  662. {
  663. res.Add("code", -9);
  664. res.Add("data", ex.Message);
  665. }
  666. return res;
  667. }
  668. /// <summary>
  669. /// 获取修复台图片
  670. /// </summary>
  671. /// <param name="req"></param>
  672. /// <returns></returns>
  673. private JObject getDefectBmpBase64(JObject req)
  674. {
  675. JObject res = new JObject();
  676. try
  677. {
  678. string date = req.Value<string>("date");
  679. string sn = req.Value<string>("sn");
  680. string file_name = req.Value<string>("file_name");
  681. string file_path;
  682. //--缺陷
  683. if (file_name.ToLower().IndexOf("defect") == 0)
  684. {
  685. file_path = $"{Defect_Compress_SavePath}\\{date}\\{sn}\\{file_name}.jpg";
  686. //如果显示打标修改名称
  687. if (ConfMgr.Instance.SysConfigParams.OpenShowDB)
  688. {
  689. if (!File.Exists(file_path))
  690. {
  691. string[] name_array = file_name.Split(new char[] { '_' });
  692. if (name_array.Length > 6)
  693. name_array[5] = "C0";
  694. file_name = string.Join("_", name_array);
  695. }
  696. }
  697. file_path = $"{Defect_Compress_SavePath}\\{date}\\{sn}\\{file_name}.jpg";
  698. if (!File.Exists(file_path))
  699. throw new Exception(file_name + " 缺陷文件不存在!");
  700. res.Add("code", 200);
  701. res.Add("data", Convert.ToBase64String(File.ReadAllBytes(file_path)));
  702. }
  703. //--比对
  704. else if (file_name.ToLower().IndexOf("size") == 0)
  705. {
  706. file_path = $"{SizeBmp_Zoom_Image_SavePath}\\{date}\\{sn}\\{file_name}.jpg";
  707. if (!File.Exists(file_path))
  708. throw new Exception(file_name + " 比对文件不存在!");
  709. res.Add("code", 200);
  710. res.Add("data", Convert.ToBase64String(File.ReadAllBytes(file_path)));
  711. }
  712. else
  713. throw new Exception($"文件类型错误:file_name={file_name}");
  714. }
  715. catch (Exception ex)
  716. {
  717. res.Add("code", -9);
  718. res.Add("data", ex.Message);
  719. }
  720. return res;
  721. }
  722. /// <summary>
  723. /// 获取缺陷小图数据
  724. /// </summary>
  725. /// <param name="req"></param>
  726. /// <returns>{文件名:[["4","3.9","-0.8","dk","0.39"],["index","X","Y","缺陷类型","缺陷的置信度"],...]}</returns>
  727. private JObject getDefectSmallDirFromSN(JObject req)
  728. {
  729. JObject res = new JObject();
  730. try
  731. {
  732. string date = req.Value<string>("date");
  733. string sn = req.Value<string>("sn");
  734. JObject dataall = new JObject();
  735. string path, key;
  736. string[] files;
  737. List<List<string>> allData = new List<List<string>>();
  738. //文件名格式:$"Size_SN{order.SN}_I{res.index}_X{res.Defects_X}_Y{res.Defects_Y}_.....json/bmp
  739. //--缺陷
  740. JObject data = new JObject();
  741. path = $"{Defect_Small_SavePath}\\{date}\\{sn}\\";
  742. if (Directory.Exists(path))
  743. {
  744. files = Directory.GetFiles(path, $"Defect_SN{sn}_*.jpg", SearchOption.TopDirectoryOnly);
  745. if (files.Length > 0)
  746. {
  747. //对文件名中的数字(index)进行大小排序
  748. files = files.OrderBy(s => int.Parse(Path.GetFileNameWithoutExtension(s).Split('_')[2].Substring(1))).ToArray();
  749. foreach (string file in files)
  750. {
  751. key = Path.GetFileNameWithoutExtension(file);
  752. if (File.Exists(path + key + ".jpg"))
  753. {
  754. data.Add(key, "dir");
  755. //var temp = JsonConvert.DeserializeObject<List<List<string>>>(File.ReadAllText(file));
  756. //allData.AddRange(temp);
  757. }
  758. }
  759. }
  760. files = Directory.GetFiles(path, $"Size_SN{sn}_*.jpg", SearchOption.TopDirectoryOnly);
  761. if (files.Length > 0)
  762. {
  763. //对文件名中的数字(index)进行大小排序
  764. files = files.OrderBy(s => int.Parse(Path.GetFileNameWithoutExtension(s).Split('_')[2].Substring(1))).ToArray();
  765. foreach (string file in files)
  766. {
  767. key = Path.GetFileNameWithoutExtension(file);
  768. if (File.Exists(path + key + ".jpg"))
  769. {
  770. data.Add(key, "dir");
  771. //var temp = JsonConvert.DeserializeObject<List<List<string>>>(File.ReadAllText(file));
  772. //allData.AddRange(temp);
  773. }
  774. }
  775. }
  776. }
  777. res.Add("code", 200);
  778. res.Add("data", data);
  779. }
  780. catch (Exception ex)
  781. {
  782. res.Add("code", -9);
  783. res.Add("data", ex.Message);
  784. }
  785. return res;
  786. }
  787. /// <summary>
  788. /// 获取小图
  789. /// </summary>
  790. /// <param name="req"></param>
  791. /// <returns></returns>
  792. private JObject getDefectSmallBmpBase64(JObject req)
  793. {
  794. JObject res = new JObject();
  795. try
  796. {
  797. string date = req.Value<string>("date");
  798. string sn = req.Value<string>("sn");
  799. string file_name = req.Value<string>("file_name");
  800. string file_path;
  801. //--缺陷
  802. if (file_name.ToLower().IndexOf("defect") == 0)
  803. {
  804. file_path = $"{Defect_Small_SavePath}\\{date}\\{sn}\\{file_name}.jpg";
  805. if (!File.Exists(file_path))
  806. throw new Exception(file_name + " 缺陷文件不存在!");
  807. res.Add("code", 200);
  808. res.Add("data", Convert.ToBase64String(File.ReadAllBytes(file_path)));
  809. }
  810. //--比对
  811. else if (file_name.ToLower().IndexOf("size") == 0)
  812. {
  813. file_path = $"{Defect_Small_SavePath}\\{date}\\{sn}\\{file_name}.jpg";
  814. if (!File.Exists(file_path))
  815. throw new Exception(file_name + " 比对文件不存在!");
  816. res.Add("code", 200);
  817. res.Add("data", Convert.ToBase64String(File.ReadAllBytes(file_path)));
  818. }
  819. else
  820. throw new Exception($"文件类型错误:file_name={file_name}");
  821. }
  822. catch (Exception ex)
  823. {
  824. res.Add("code", -9);
  825. res.Add("data", ex.Message);
  826. }
  827. return res;
  828. }
  829. private JObject GetChart_Qualified_Rate(JObject req)
  830. {
  831. JObject res = new JObject();
  832. try
  833. {
  834. var list = svcOrder.GetReport_Qualified_Total();
  835. res.Add("code", 200);
  836. res.Add("data", JArray.FromObject(list));
  837. }
  838. catch (Exception ex)
  839. {
  840. res.Add("code", -9);
  841. res.Add("data", ex.Message);
  842. }
  843. return res;
  844. }
  845. private JObject GetReport_Defects_Date(JObject req)
  846. {
  847. JObject res = new JObject();
  848. try
  849. {
  850. string domain = "", order = "";
  851. int pageNum = 0, pageSize = 0, totalCount = 0;
  852. if (req.ContainsKey("domain")) domain = req.Value<JArray>("domain").ToString();
  853. if (req.ContainsKey("order")) order = req.Value<string>("order");
  854. if (req.ContainsKey("pageNum")) pageNum = req.Value<int>("pageNum");
  855. if (req.ContainsKey("pageSize")) pageSize = req.Value<int>("pageSize");
  856. //创建表达式
  857. var list = svcOrder.GetReport_Defects_Date(domain, order, pageNum, pageSize, ref totalCount);
  858. res.Add("code", 200);
  859. res.Add("data", list);
  860. }
  861. catch (Exception ex)
  862. {
  863. res.Add("code", -9);
  864. res.Add("data", ex.Message);
  865. }
  866. return res;
  867. }
  868. private JObject GetReport_Defects_Total(JObject req)
  869. {
  870. JObject res = new JObject();
  871. try
  872. {
  873. string domain = "", order = "";
  874. if (req.ContainsKey("domain")) domain = req.Value<JArray>("domain").ToString();
  875. var list = svcOrder.GetReport_Defects_Total(domain);
  876. res.Add("code", 200);
  877. res.Add("data", list);
  878. }
  879. catch (Exception ex)
  880. {
  881. res.Add("code", -9);
  882. res.Add("data", ex.Message);
  883. }
  884. return res;
  885. }
  886. private JObject GetChart_Qualified_Date(JObject req)
  887. {
  888. JObject res = new JObject();
  889. try
  890. {
  891. string domain = "", order = "";
  892. int pageNum = 0, pageSize = 0, totalCount = 0;
  893. if (req.ContainsKey("domain")) domain = req.Value<JArray>("domain").ToString();
  894. if (req.ContainsKey("order")) order = req.Value<string>("order");
  895. if (req.ContainsKey("pageNum")) pageNum = req.Value<int>("pageNum");
  896. if (req.ContainsKey("pageSize")) pageSize = req.Value<int>("pageSize");
  897. //创建表达式
  898. var list = svcOrder.GetReport_Qualified_Date( domain, order, pageNum, pageSize, ref totalCount);
  899. res.Add("code", 200);
  900. res.Add("data", list);
  901. res.Add("totalCount", totalCount);
  902. }
  903. catch (Exception ex)
  904. {
  905. res.Add("code", -9);
  906. res.Add("data", ex.Message);
  907. }
  908. return res;
  909. }
  910. }
  911. }