版博士V2.0程序
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.
 
 
 
 

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