DataAnalysisClass.cs 65 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using DevExpress.XtraGrid.Views.Grid;
  8. using DevExpress.XtraGrid;
  9. using Uninpho.DBOperation.Model;
  10. using Uninpho.DBOperation.Operation;
  11. using System.Windows.Forms;
  12. using DevExpress.XtraEditors;
  13. using MathWorks.MATLAB.NET.Arrays;
  14. using System.Globalization;
  15. using System.Threading;
  16. //数据库表重置;
  17. //TRUNCATE TABLE public.t_jihefenxi_boxing;//删除表内所有数据
  18. //ALTER TABLE public.t_jihefenxi_boxing DROP COLUMN id;//删除id序号
  19. //alter table public.t_jihefenxi_boxing add id serial PRIMARY KEY;//重置新加id序号
  20. namespace Uninpho.Tools.components.DataAnalysis
  21. {
  22. /// <summary>
  23. /// 进行算法处理的类
  24. /// </summary>
  25. public class DataAnalysisClass
  26. {
  27. GridControl GC;
  28. GridView GV;
  29. string type;
  30. int[] selectrow;
  31. bool iszhengc = true;
  32. /// <summary>
  33. /// 算法执行
  34. /// </summary>
  35. /// <param name="type">算法类型;“几何”、“轮轨力”、“微小”</param>
  36. /// <param name="selectrow">table中选择的数据的索引</param>
  37. /// <param name="GC">GridControl</param>
  38. /// <param name="GV">GridView</param>
  39. public DataAnalysisClass(string type, int[] selectrow, ref GridControl GC, ref GridView GV)
  40. {
  41. DataAnalysisToPG.InitBXID();
  42. this.GC = GC;
  43. this.GV = GV;
  44. this.type = type;
  45. this.selectrow = selectrow;
  46. DataAnalysisFun();
  47. }
  48. private void DataAnalysisFun()
  49. {
  50. //1.检查任务状态
  51. checkedStatus();
  52. //2.执行算法
  53. if (iszhengc)
  54. {
  55. bool boo = true;
  56. if (type != "微小" && type != "功率" && type != "缺口")
  57. {
  58. SuanFaFrom frm = new SuanFaFrom();
  59. frm.StartPosition = FormStartPosition.CenterParent;
  60. frm.changeLabel(type == "几何" ? true : false);
  61. if (frm.ShowDialog() != DialogResult.OK)
  62. {
  63. boo = false;
  64. }
  65. }
  66. if (boo)
  67. {
  68. AsyncFun();
  69. }
  70. }
  71. }
  72. /// <summary>
  73. /// 检查任务状态
  74. /// </summary>
  75. private void checkedStatus()
  76. {
  77. bool b = true;
  78. if (selectrow.Length <= 0)
  79. {
  80. XtraMessageBox.Show("请先选择要执行的文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  81. iszhengc = false;
  82. }
  83. else
  84. {
  85. if (type == "功率"|| type == "缺口")
  86. {
  87. for (int i = 0; i < selectrow.Length; i++)
  88. {
  89. var a = GV.GetRowCellValue(selectrow[i], "Taskstatus").ToString();
  90. if (GV.GetRowCellValue(selectrow[i], "Filestatus").ToString().Trim() != "正常")
  91. {
  92. XtraMessageBox.Show("存在文件状态异常文件,请检查后再执行算法!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  93. iszhengc = false;
  94. break;
  95. }
  96. else if (GV.GetRowCellValue(selectrow[i], "Taskstatus").ToString() == type + "算法执行完毕" || GV.GetRowCellValue(selectrow[i], "Taskstatus").ToString() == "算法执行失败")
  97. {
  98. if (b)
  99. {
  100. if (XtraMessageBox.Show(type + "算法已执行,是否重新执行?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK)
  101. {
  102. iszhengc = false;
  103. break;
  104. }
  105. else
  106. {
  107. b = false;
  108. }
  109. }
  110. if(type == "功率")
  111. {
  112. DataAnalysisToPG.DelUpdataDataDWGL(GV.GetRowCellValue(selectrow[i], "Id").ToString(), type);
  113. }
  114. else
  115. {
  116. DataAnalysisToPG.DelUpdataDataDWQK(GV.GetRowCellValue(selectrow[i], "Id").ToString(), type);
  117. }
  118. }
  119. }
  120. }
  121. else
  122. {
  123. for (int i = 0; i < selectrow.Length; i++)
  124. {
  125. var a = GV.GetRowCellValue(selectrow[i], "Rwzt").ToString();
  126. if (GV.GetRowCellValue(selectrow[i], "Wjzt").ToString().Trim() != "正常")
  127. {
  128. XtraMessageBox.Show("存在文件状态异常文件,请检查后再执行算法!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  129. iszhengc = false;
  130. break;
  131. }
  132. else if (GV.GetRowCellValue(selectrow[i], "Jccxx").ToString() == " " || GV.GetRowCellValue(selectrow[i], "Jccxx").ToString() == "")
  133. {
  134. XtraMessageBox.Show("没有选定检测车信息,请检查!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  135. iszhengc = false;
  136. break;
  137. }
  138. else if (GV.GetRowCellValue(selectrow[i], "Rwzt").ToString() == type + "算法执行完毕" || GV.GetRowCellValue(selectrow[i], "Rwzt").ToString() == "算法执行失败")
  139. {
  140. if (type != "微小")
  141. {
  142. if (b)
  143. {
  144. if (XtraMessageBox.Show(type + "算法已执行,是否重新执行?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK)
  145. {
  146. iszhengc = false;
  147. break;
  148. }
  149. else
  150. {
  151. b = false;
  152. }
  153. }
  154. DataAnalysisToPG.DelUpdataData(GV.GetRowCellValue(selectrow[i], "Id").ToString(), type);
  155. }
  156. else
  157. {
  158. XtraMessageBox.Show("微小算法不能重新执行", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  159. iszhengc = false;
  160. break;
  161. }
  162. }
  163. else if (GV.GetRowCellValue(selectrow[i], "Rwzt").ToString() == "算法未执行" && type == "微小")
  164. {
  165. XtraMessageBox.Show("请先执行几何算法!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  166. iszhengc = false;
  167. break;
  168. }
  169. }
  170. }
  171. }
  172. }
  173. private async Task AsyncFun()
  174. {
  175. bool boo = true;
  176. if (type == "几何" || type == "轮轨力")
  177. {
  178. for (int i = 0; i < selectrow.Length; i++)
  179. {
  180. boo = true;
  181. GV.SetRowCellValue(selectrow[i], "Rwzt", "正在执行" + type + "算法...");
  182. T_file_account whichfile = (T_file_account)DataAnalysisToPG.QueryToPGById(Convert.ToInt32(GV.GetRowCellValue(selectrow[i], "Id").ToString().Trim()));
  183. try
  184. {
  185. await Task.Run(() =>
  186. {
  187. if (type == "几何")
  188. {
  189. JHMain(whichfile);
  190. }
  191. else if (type == "轮轨力")
  192. {
  193. LGLMain(whichfile);
  194. }
  195. });
  196. }
  197. catch (Exception ex)
  198. {
  199. boo = false;
  200. throw;
  201. }
  202. if (boo)
  203. {
  204. GV.SetRowCellValue(selectrow[i], "Rwzt", type + "算法执行完毕");
  205. }
  206. else
  207. {
  208. GV.SetRowCellValue(selectrow[i], "Rwzt", "算法执行失败");
  209. }
  210. }
  211. }
  212. else if (type == "微小")
  213. {
  214. boo = true;
  215. List<T_file_account> whichfile = new List<T_file_account>();
  216. for (int i = 0; i < selectrow.Length; i++)
  217. {
  218. whichfile.Add((T_file_account)DataAnalysisToPG.QueryToPGById(Convert.ToInt32(GV.GetRowCellValue(selectrow[i], "Id").ToString().Trim())));
  219. GV.SetRowCellValue(selectrow[i], "Rwzt", "正在执行" + type + "算法...");
  220. }
  221. try
  222. {
  223. await Task.Run(() => { WXSFMain(whichfile); });
  224. }
  225. catch (Exception ex)
  226. {
  227. boo = false;
  228. throw;
  229. }
  230. for (int i = 0; i < selectrow.Length; i++)
  231. {
  232. if (boo)
  233. {
  234. GV.SetRowCellValue(selectrow[i], "Rwzt", type + "算法执行完毕");
  235. }
  236. else
  237. {
  238. GV.SetRowCellValue(selectrow[i], "Rwzt", type + "算法执行失败");
  239. }
  240. }
  241. }
  242. else if (type == "功率")
  243. {
  244. for (int i = 0; i < selectrow.Length; i++)
  245. {
  246. boo = true;
  247. GV.SetRowCellValue(selectrow[i], "Taskstatus", "正在执行" + type + "算法...");
  248. T_dwfile_account whichfile = (T_dwfile_account)DataAnalysisToPG.QueryToPGByIdGL(Convert.ToInt32(GV.GetRowCellValue(selectrow[i], "Id").ToString().Trim()));
  249. try
  250. {
  251. await Task.Run(() =>
  252. {
  253. GL_new(whichfile);
  254. });
  255. }
  256. catch (Exception ex)
  257. {
  258. boo = false;
  259. throw;
  260. }
  261. if (boo)
  262. {
  263. GV.SetRowCellValue(selectrow[i], "Taskstatus", type + "算法执行完毕");
  264. }
  265. else
  266. {
  267. GV.SetRowCellValue(selectrow[i], "Taskstatus", "算法执行失败");
  268. }
  269. }
  270. }
  271. else if (type == "缺口")
  272. {
  273. for (int i = 0; i < selectrow.Length; i++)
  274. {
  275. boo = true;
  276. GV.SetRowCellValue(selectrow[i], "Taskstatus", "正在执行" + type + "算法...");
  277. T_dwqkfile_account whichfile = (T_dwqkfile_account)DataAnalysisToPG.QueryToPGByIdQK(Convert.ToInt32(GV.GetRowCellValue(selectrow[i], "Id").ToString().Trim()));
  278. try
  279. {
  280. await Task.Run(() =>
  281. {
  282. QK_new(whichfile);
  283. });
  284. }
  285. catch (Exception ex)
  286. {
  287. boo = false;
  288. throw;
  289. }
  290. if (boo)
  291. {
  292. GV.SetRowCellValue(selectrow[i], "Taskstatus", type + "算法执行完毕");
  293. }
  294. else
  295. {
  296. GV.SetRowCellValue(selectrow[i], "Taskstatus", "算法执行失败");
  297. }
  298. }
  299. }
  300. //提示
  301. if (boo)
  302. {
  303. XtraMessageBox.Show(type + "算法执行完毕", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  304. }
  305. else
  306. {
  307. XtraMessageBox.Show("算法执行失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
  308. }
  309. }
  310. private void JHMain(T_file_account whichfile)
  311. {
  312. JH_new(whichfile);
  313. }
  314. private void LGLMain(T_file_account whichfile)
  315. {
  316. LGL_new(whichfile);
  317. }
  318. private void WXSFMain(List<T_file_account> whichfile)
  319. {
  320. WXSFFun(whichfile);
  321. }
  322. #region 几何算法
  323. public void JH_new(T_file_account whichfile)
  324. {
  325. List<T_daocha_account> daochabiao = (List<T_daocha_account>)DataAnalysisToPG.QueryDCTZ(whichfile.Xlm, whichfile.Yswjm.Split('-')[0].ToCharArray());
  326. List<T_quxian_account> quxianbiao = (List<T_quxian_account>)DataAnalysisToPG.QueryQXTZ(whichfile.Xlm, whichfile.Yswjm.Split('-')[0].ToCharArray());
  327. string fname_dir0 = Path.GetDirectoryName(whichfile.Srlj) + "\\";
  328. string fname0 = Path.GetFileName(whichfile.Srlj);
  329. T_xianlulicheng_sf sf = (T_xianlulicheng_sf)DataAnalysisToPG.QueryToString(fname0.Split('-')[0]);
  330. double mile_min = sf.Qslc == null ? Convert.ToDouble(0) : Convert.ToDouble(sf.Qslc);
  331. double mile_max = sf.Zzlc == null ? Convert.ToDouble(180) : Convert.ToDouble(sf.Zzlc);
  332. int mile_id = DACommon.xzlcBool ? 0 : 1;
  333. string line_name = fname0.Split('-')[0];
  334. double[] tz_curv = getTZQX(quxianbiao, true);
  335. double[] tz_turnout = getTZDC(daochabiao);
  336. double[] distance_table = getTZJGJX();
  337. string carname = whichfile.Jccxx;
  338. try
  339. {
  340. var data = AnalysisAlgorithmcs.JHFX(fname_dir0, fname0, mile_id, line_name, mile_min, mile_max, tz_curv, tz_turnout, distance_table, carname);
  341. readJHFX(data, whichfile);
  342. }
  343. catch (Exception ex)
  344. {
  345. XtraMessageBox.Show("文件:" + whichfile.Yswjm + "执行失败!" + ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  346. throw;
  347. }
  348. }
  349. /// <summary>
  350. /// 读几何分析数据
  351. /// </summary>
  352. /// <param name="agrsOut"></param>
  353. /// <param name="whichfile"></param>
  354. private void readJHFX(MWArray[] agrsOut, T_file_account whichfile)
  355. {
  356. MWCellArray output1 = agrsOut[0] as MWCellArray;//第1个输出参数
  357. MWNumericArray output2 = agrsOut[1] as MWNumericArray;//第2个输出参数
  358. MWArray output3 = agrsOut[2] as MWArray;//第3个输出参数
  359. MWCellArray output4 = agrsOut[3] as MWCellArray;//第4个输出参数
  360. MWCellArray output5 = agrsOut[4] as MWCellArray;//第5个输出参数
  361. MWNumericArray output6 = agrsOut[5] as MWNumericArray;//第6个输出参数
  362. MWCellArray output7 = agrsOut[6] as MWCellArray;//第7个输出参数
  363. MWCellArray output10 = agrsOut[7] as MWCellArray;//第7个输出参数
  364. MWCellArray output11 = agrsOut[8] as MWCellArray;//第7个输出参数
  365. MWNumericArray output8 = agrsOut[9] as MWNumericArray;//第8个输出参数
  366. MWNumericArray output9 = agrsOut[10] as MWNumericArray;//第9个输出参数
  367. MWNumericArray output12 = agrsOut[11] as MWNumericArray;//第12个输出参数
  368. var table_header = output1.ToArray();
  369. var table_data = (double[,])output2.ToArray();
  370. var table_zc = (object[,])output3.ToArray();
  371. var table_date = (object[,])output4.ToArray();
  372. var table_zf = (object[,])output5.ToArray();
  373. var table_tqi = (double[,])output6.ToArray();
  374. var table_car = (object[,])output7.ToArray();
  375. var table_name = (object[,])output10.ToArray();
  376. var table_xb = (object[,])output11.ToArray();
  377. var wave_id = (double[,])output8.ToArray();
  378. var wave_sw = (double[,])output9.ToArray();
  379. var wave_loc = (double[,])output12.ToArray();
  380. List<T_jihefenxi_account> JHobjs = new List<T_jihefenxi_account>();
  381. DataAnalysisToPG.InsertGetIdMAX(new T_jihefenxi_boxing() { Yswjm = "?????" });
  382. int idindex = DataAnalysisToPG.QueryMaxID("jh") + 1;
  383. #region 录入T_jihefenxi_account
  384. for (int i = 0; i < table_data.GetLength(0); i++)
  385. {
  386. int bxidq = (int)wave_id[i, 0];
  387. int bxidz = (int)wave_id[i, 1];
  388. int bxindex = bxidz - bxidq;
  389. T_jihefenxi_account jhojb = new T_jihefenxi_account();
  390. jhojb.Xuhao = table_data[i, 0].ToString();
  391. jhojb.Jgjlc = Convert.ToDecimal(table_data[i, 1]);
  392. jhojb.Sudu_jhfx = Convert.ToDecimal(table_data[i, 2]);
  393. jhojb.Cthjfz = Convert.ToDecimal(table_data[i, 3]);
  394. jhojb.Cthjffz = Convert.ToDecimal(table_data[i, 4]);
  395. jhojb.Ctcjfz = Convert.ToDecimal(table_data[i, 5]);
  396. jhojb.Ctcjffz = Convert.ToDecimal(table_data[i, 6]);
  397. jhojb.Zgjfz = Convert.ToDecimal(table_data[i, 7]);
  398. jhojb.Zgjffz_jhfx = Convert.ToDecimal(table_data[i, 8]);
  399. jhojb.Ygjfz = Convert.ToDecimal(table_data[i, 9]);
  400. jhojb.Ygjffz = Convert.ToDecimal(table_data[i, 10]);
  401. jhojb.Zgdfz = Convert.ToDecimal(table_data[i, 11]);
  402. jhojb.Ygdfz = Convert.ToDecimal(table_data[i, 12]);
  403. jhojb.Zgxfz = Convert.ToDecimal(table_data[i, 13]);
  404. jhojb.Ygxfz = Convert.ToDecimal(table_data[i, 14]);
  405. jhojb.Spfz = Convert.ToDecimal(table_data[i, 15]);
  406. jhojb.Sjkfz = Convert.ToDecimal(table_data[i, 16]);
  407. jhojb.Cbzgdfz = Convert.ToDecimal(table_data[i, 17]);
  408. jhojb.Cbygdfz = Convert.ToDecimal(table_data[i, 18]);
  409. jhojb.Cbzgxfz = Convert.ToDecimal(table_data[i, 19]);
  410. jhojb.Cbygxfz = Convert.ToDecimal(table_data[i, 20]);
  411. jhojb.Zcx = Char2String((char[,])table_zc[i, 0]);
  412. jhojb.Riqi = Char2String((char[,])table_date[i, 0]);
  413. jhojb.Zfx = Char2String((char[,])table_zf[i, 0]);
  414. jhojb.Dcqtqi = Convert.ToDecimal(table_tqi[i, 0]);
  415. jhojb.Jcc = Char2String((char[,])table_car[i, 0]);
  416. jhojb.Filename_jh = whichfile.Id.ToString();
  417. jhojb.Boxingid_jhfx = wave_id[i, 0].ToString() + "," + wave_id[i, 1].ToString();
  418. jhojb.Jgjcydxh = Convert.ToDecimal(wave_loc[i, 0]);
  419. jhojb.Xgjcydxh = Convert.ToDecimal(wave_loc[i, 1]);
  420. jhojb.Xlm = whichfile.Xlm;
  421. //jhojb.Xlm = Char2String((char[,])table_name[i, 0]);
  422. jhojb.Yswjm_jhfx = idindex.ToString() + "," + (idindex + bxindex).ToString();
  423. jhojb.Xingbie = whichfile.Hangbie;
  424. //jhojb.Xingbie = Char2String((char[,])table_xb[i, 0]);
  425. jhojb.Gjhy = Math.Abs(jhojb.Zgjfz) > Math.Abs(jhojb.Ygjfz) ? jhojb.Zgjfz : jhojb.Ygjfz;
  426. jhojb.Gjhyffz = Math.Abs(jhojb.Zgjffz_jhfx) > Math.Abs(jhojb.Ygjffz) ? jhojb.Zgjffz_jhfx : jhojb.Ygjffz;
  427. jhojb.Gdfz = Math.Abs(jhojb.Zgdfz) > Math.Abs(jhojb.Ygdfz) ? jhojb.Zgdfz : jhojb.Ygdfz;
  428. jhojb.Gxfz = Math.Abs(jhojb.Zgxfz) > Math.Abs(jhojb.Ygxfz) ? jhojb.Zgxfz : jhojb.Ygxfz;
  429. jhojb.Cbgdfz = Math.Abs(jhojb.Cbzgdfz) > Math.Abs(jhojb.Cbygdfz) ? jhojb.Cbzgdfz : jhojb.Cbygdfz;
  430. jhojb.Cbgxfz = Math.Abs(jhojb.Cbzgxfz) > Math.Abs(jhojb.Cbygxfz) ? jhojb.Cbzgxfz : jhojb.Cbygxfz;
  431. JHobjs.Add(jhojb);
  432. idindex += bxindex + 1;
  433. }
  434. DataAnalysisToPG.InsertJHDataToPG(JHobjs);
  435. #endregion
  436. #region 录入波形
  437. List<T_jihefenxi_boxing> Bolist = new List<T_jihefenxi_boxing>();
  438. for (int i = 0; i < wave_sw.GetLength(0); i++)
  439. {
  440. T_jihefenxi_boxing bolist = new T_jihefenxi_boxing();
  441. bolist.Licheng = Convert.ToDecimal(wave_sw[i, 0]);
  442. bolist.Sudu_jhbx = Convert.ToDecimal(wave_sw[i, 1]);
  443. bolist.Cthj = Convert.ToDecimal(wave_sw[i, 2]);
  444. bolist.Ctcj = Convert.ToDecimal(wave_sw[i, 3]);
  445. bolist.Gjzhy = Convert.ToDecimal(wave_sw[i, 4]);
  446. bolist.Gjyhy = Convert.ToDecimal(wave_sw[i, 5]);
  447. bolist.Zgd = Convert.ToDecimal(wave_sw[i, 6]);
  448. bolist.Ygd = Convert.ToDecimal(wave_sw[i, 7]);
  449. bolist.Zgx = Convert.ToDecimal(wave_sw[i, 8]);
  450. bolist.Ygx = Convert.ToDecimal(wave_sw[i, 9]);
  451. bolist.Gj = Convert.ToDecimal(wave_sw[i, 10]);
  452. bolist.Sp = Convert.ToDecimal(wave_sw[i, 11]);
  453. bolist.Sjk = Convert.ToDecimal(wave_sw[i, 12]);
  454. bolist.Cbzgd = Convert.ToDecimal(wave_sw[i, 13]);
  455. bolist.Cbygd = Convert.ToDecimal(wave_sw[i, 14]);
  456. bolist.Cbzgx = Convert.ToDecimal(wave_sw[i, 15]);
  457. bolist.Cbygx = Convert.ToDecimal(wave_sw[i, 16]);
  458. bolist.Dcdw = Convert.ToDecimal(wave_sw[i, 17]);
  459. bolist.Bxid = i + 1;
  460. Bolist.Add(bolist);
  461. }
  462. DataAnalysisToPG.InsertJHBXDataToPG(Bolist);
  463. DataAnalysisToPG.updataRWZT(new string[] { whichfile.Id.ToString(), type + "算法执行完毕" });
  464. #endregion
  465. }
  466. #endregion
  467. #region 轮轨力算法
  468. public void LGL_new(T_file_account whichfile)
  469. {
  470. List<T_daocha_account> daochabiao = (List<T_daocha_account>)DataAnalysisToPG.QueryDCTZ(whichfile.Xlm, whichfile.Yswjm.Split('_')[2].Split('.')[0].ToCharArray());
  471. List<T_quxian_account> quxianbiao = (List<T_quxian_account>)DataAnalysisToPG.QueryQXTZ(whichfile.Xlm, whichfile.Yswjm.Split('_')[2].Split('.')[0].ToCharArray());
  472. string fname_dir0 = Path.GetDirectoryName(whichfile.Srlj) + "\\";
  473. string fname0 = Path.GetFileName(whichfile.Srlj);
  474. string line_name = fname0.Split('_')[2].Split('.')[0];
  475. T_xianlulicheng_sf sf = (T_xianlulicheng_sf)DataAnalysisToPG.QueryToString(line_name);
  476. double mile_min = Convert.ToDouble(sf.Qslc);
  477. double mile_max = Convert.ToDouble(sf.Zzlc);
  478. double[] tz_curv = getTZQX(quxianbiao, false);
  479. double[] tz_turnout = getTZDC(daochabiao);
  480. double[] distance_table = getTZJGJX();
  481. string carname = whichfile.Jccxx;
  482. try
  483. {
  484. var data = AnalysisAlgorithmcs.LGLFX(fname_dir0, fname0, line_name, mile_min, mile_max, tz_curv, tz_turnout, distance_table, carname);
  485. readLGLFX(data, whichfile);
  486. }
  487. catch (Exception ex)
  488. {
  489. if (quxianbiao.Count == 0)
  490. {
  491. XtraMessageBox.Show("曲线表缺少数据!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  492. }
  493. else if (daochabiao.Count == 0)
  494. {
  495. XtraMessageBox.Show("道岔表缺少数据!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  496. }
  497. else
  498. {
  499. XtraMessageBox.Show("文件:" + whichfile.Yswjm + "执行失败!" + ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  500. }
  501. throw;
  502. }
  503. }
  504. /// <summary>
  505. /// 读轮轨力分析数据
  506. /// </summary>
  507. /// <param name="agrsOut"></param>
  508. /// <param name="whichfile"></param>
  509. private void readLGLFX(MWArray[] agrsOut, T_file_account whichfile)
  510. {
  511. MWCellArray output1 = agrsOut[0] as MWCellArray;//第1个输出参数
  512. MWNumericArray output2 = agrsOut[1] as MWNumericArray;//第2个输出参数
  513. MWNumericArray output3 = agrsOut[6] as MWNumericArray;//第3个输出参数
  514. MWNumericArray output4 = agrsOut[7] as MWNumericArray;//第4个输出参数
  515. MWCellArray output5 = agrsOut[2] as MWCellArray;//第3个输出参数
  516. MWCellArray output6 = agrsOut[4] as MWCellArray;//第4个输出参数
  517. MWCellArray output7 = agrsOut[5] as MWCellArray;//第4个输出参数
  518. MWCellArray output8 = agrsOut[3] as MWCellArray;//第4个输出参数
  519. var table_header = (object[,])output1.ToArray();
  520. var table_data = (double[,])output2.ToArray();
  521. var table_name = (object[,])output5.ToArray();
  522. var table_xb = (object[,])output6.ToArray();
  523. var table_date = (object[,])output7.ToArray();
  524. var wave_sw = (double[,])output4.ToArray();
  525. var boxingid = (double[,])output3.ToArray();
  526. var table_car = (object[,])output8.ToArray();
  527. List<T_lunguili_account> JHobjs = new List<T_lunguili_account>();
  528. DataAnalysisToPG.InsertGetIdMAX(new T_lunguili_boxing() { Yswjm = "?????" });
  529. int idindex = DataAnalysisToPG.QueryMaxID("lgl") + 1;
  530. for (int i = 0; i < table_data.GetLength(0); i++)
  531. {
  532. int bxidq = (int)boxingid[i, 0];
  533. int bxidz = (int)boxingid[i, 1];
  534. int bxindex = bxidz - bxidq;
  535. T_lunguili_account jhojb = new T_lunguili_account();
  536. jhojb.Xuhao = table_data[i, 0].ToString();
  537. jhojb.Jgjlc = Convert.ToDecimal(table_data[i, 1]);
  538. jhojb.Sudu_lgl = Convert.ToDecimal(table_data[i, 2]);
  539. jhojb.Zzcfz = Convert.ToDecimal(table_data[i, 3]);
  540. jhojb.Zzhfz = Convert.ToDecimal(table_data[i, 4]);
  541. jhojb.Yzcfz = Convert.ToDecimal(table_data[i, 5]);
  542. jhojb.Yzhfz = Convert.ToDecimal(table_data[i, 6]);
  543. jhojb.Lzlfz = Convert.ToDecimal(table_data[i, 7]);
  544. jhojb.Lzjzl = Convert.ToDecimal(table_data[i, 8]);
  545. jhojb.Ztgxs = Convert.ToDecimal(table_data[i, 9]);
  546. jhojb.Ytgxs = Convert.ToDecimal(table_data[i, 10]);
  547. jhojb.Filename_lgl = whichfile.Id.ToString();
  548. jhojb.Boxingid_lgl = bxidq.ToString() + "," + bxidz.ToString();
  549. //jhojb.Xlm = Char2String((char[,])table_name[i, 0]);
  550. jhojb.Xlm = whichfile.Xlm;
  551. //jhojb.Xingbie = Char2String((char[,])table_xb[i, 0]);
  552. jhojb.Xingbie = whichfile.Hangbie;
  553. jhojb.Yswjm = idindex.ToString() + "," + (idindex + bxindex).ToString();
  554. jhojb.Jcrq = Char2String((char[,])table_date[i, 0]);
  555. jhojb.Lgcxl = Math.Abs(jhojb.Zzcfz) > Math.Abs(jhojb.Yzcfz) ? jhojb.Zzcfz : jhojb.Yzcfz;
  556. jhojb.Lghxl = Math.Abs(jhojb.Zzhfz) > Math.Abs(jhojb.Yzhfz) ? jhojb.Zzhfz : jhojb.Yzhfz;
  557. jhojb.Tgxs = jhojb.Ztgxs > jhojb.Ytgxs ? jhojb.Ztgxs : jhojb.Ytgxs;
  558. JHobjs.Add(jhojb);
  559. idindex += bxindex + 1;
  560. }
  561. DataAnalysisToPG.InsertLGLDataToPG(JHobjs);
  562. #region 录入波形
  563. List<T_lunguili_boxing> Bolist = new List<T_lunguili_boxing>();
  564. for (int i = 0; i < wave_sw.GetLength(0); i++)
  565. {
  566. T_lunguili_boxing bolist = new T_lunguili_boxing();
  567. bolist.Licheng = Convert.ToDecimal(wave_sw[i, 0]);
  568. bolist.Sudu_lglbx = Convert.ToDecimal(wave_sw[i, 1]);
  569. bolist.Zzc = Convert.ToDecimal(wave_sw[i, 2]);
  570. bolist.Zzh = Convert.ToDecimal(wave_sw[i, 3]);
  571. bolist.Yzc = Convert.ToDecimal(wave_sw[i, 4]);
  572. bolist.Yzh = Convert.ToDecimal(wave_sw[i, 5]);
  573. bolist.Bxid = i + 1;
  574. Bolist.Add(bolist);
  575. }
  576. DataAnalysisToPG.InsertLGLBXDataToPG(Bolist);
  577. DataAnalysisToPG.updataRWZT(new string[] { whichfile.Id.ToString(), type + "算法执行完毕" });
  578. #endregion
  579. }
  580. #endregion
  581. #region 微小算法
  582. /// <summary>
  583. /// 微小算法
  584. /// </summary>
  585. /// <param name="whichfile"></param>
  586. public void WXSFFun(List<T_file_account> whichfile)
  587. {
  588. //1.采集数据
  589. List<T_jihefenxi_account> jhfe_account = new List<T_jihefenxi_account>();
  590. for (int i = 0; i < whichfile.Count; i++)
  591. {
  592. var aa = DataAnalysisToPG.QueryToPGByNameWXSF(whichfile[i].Id.ToString()) as List<T_jihefenxi_account>;
  593. jhfe_account = jhfe_account.Union(aa).ToList();
  594. }
  595. //2.添加参考数据
  596. addWXSFReference(ref jhfe_account);
  597. //3.构造参数及执行微小算法
  598. string[] date = new string[jhfe_account.Count];
  599. string[] car = new string[jhfe_account.Count];
  600. double[] mile = new double[jhfe_account.Count];
  601. List<double> wave_data = new List<double>();
  602. List<double> id_wave_all = new List<double>();
  603. List<double> jx_loc_all = new List<double>();
  604. string[] line = new string[jhfe_account.Count];
  605. double[] velo = new double[jhfe_account.Count];
  606. string[] zc = new string[jhfe_account.Count];
  607. getdataWXSF(jhfe_account, ref date, ref car, ref mile, ref wave_data, ref id_wave_all, ref jx_loc_all, ref line, ref velo, ref zc);
  608. try
  609. {//存在问题,wave_data
  610. if (date.Distinct().ToArray().Length > 1)
  611. {
  612. var data = AnalysisAlgorithmcs.WXSF(date, car, mile, wave_data.ToArray(), id_wave_all.ToArray(), jx_loc_all.ToArray(), line, velo, zc);
  613. readWXSF(data, jhfe_account);
  614. for (int i = 0; i < whichfile.Count; i++)
  615. {
  616. DataAnalysisToPG.updataRWZT(new string[] { whichfile[i].Id.ToString(), type + "算法执行完毕" });
  617. }
  618. }
  619. else
  620. {
  621. XtraMessageBox.Show("日期相同,不能执行微小算法", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
  622. }
  623. }
  624. catch (Exception ex)
  625. {
  626. throw;
  627. }
  628. }
  629. //读取微小算法分析数据
  630. private void readWXSF(MWArray[] agrsOut, List<T_jihefenxi_account> jhfe_account)
  631. {
  632. List<T_jihefenxi_account> GeoJHReturn = new List<T_jihefenxi_account>();
  633. MWCellArray output1 = agrsOut[0] as MWCellArray;//第1个输出参数
  634. MWCellArray output2 = agrsOut[1] as MWCellArray;//第2个输出参数
  635. MWCellArray output3 = agrsOut[2] as MWCellArray;//第3个输出参数
  636. MWNumericArray output4 = agrsOut[3] as MWNumericArray;//第4个输出参数
  637. MWNumericArray output5 = agrsOut[4] as MWNumericArray;//第5个输出参数
  638. MWCellArray output6 = agrsOut[5] as MWCellArray;//第6个输出参数
  639. MWCellArray output7 = agrsOut[6] as MWCellArray;//第7个输出参数
  640. MWNumericArray output8 = agrsOut[7] as MWNumericArray;//第8个输出参数
  641. MWNumericArray output9 = agrsOut[8] as MWNumericArray;//第9个输出参数
  642. MWNumericArray output10 = agrsOut[9] as MWNumericArray;//第10个输出参数
  643. MWCellArray output11 = agrsOut[10] as MWCellArray;//第11个输出参数
  644. var table_header = (object[,])output1.ToArray();
  645. var tableline = (object[,])output2.ToArray();
  646. var table_xb = (object[,])output3.ToArray();
  647. var table_milej = (double[,])output4.ToArray();
  648. var table_milex = (double[,])output5.ToArray();
  649. var table_date = (object[,])output6.ToArray();
  650. var table_car = (object[,])output7.ToArray();
  651. var table_data = (double[,])output8.ToArray();
  652. var wave_id = (double[,])output9.ToArray();
  653. var wave_sw = (double[,])output10.ToArray();
  654. var table_check = (object[,])output11.ToArray();
  655. List<T_jihefenxi_account> JHWXobjs = new List<T_jihefenxi_account>();
  656. #region 录入T_jihefenxi_account
  657. for (int i = 0; i < table_data.GetLength(0); i++)
  658. {
  659. T_jihefenxi_account jhwxojb = new T_jihefenxi_account();
  660. jhwxojb.Xlm = (DataAnalysisToPG.QueryToXlm(Char2String((char[,])tableline[i, 0])) as T_luxianming_sf).Xlm;
  661. if (Char2String((char[,])table_xb[i, 0]) == "X")
  662. {
  663. jhwxojb.Xingbie = "下";
  664. }
  665. else if (Char2String((char[,])table_xb[i, 0]) == "S")
  666. {
  667. jhwxojb.Xingbie = "上";
  668. }
  669. else
  670. {
  671. //待定
  672. jhwxojb.Xingbie = "上";
  673. }
  674. jhwxojb.Jgjlc = Convert.ToDecimal(table_milej[i, 0]);
  675. jhwxojb.Jcc = Char2String((char[,])table_car[i, 0]) == "轨检车" ? "轨检车" : GetJccFun(Char2String((char[,])table_car[i, 0]));
  676. jhwxojb.Riqi = DateTime.Parse(Char2String((char[,])table_date[i, 0])).ToString("yyyy年MM月dd日");
  677. jhwxojb.Boxingid_jhfx = wave_id[i, 0].ToString() + "," + wave_id[i, 1].ToString();
  678. //心轨尖里程
  679. jhwxojb.Wx_xgjlc = Convert.ToDecimal(table_milex[i, 0]);
  680. //轨道几何变化量
  681. jhwxojb.Wx_bhl_gd = Convert.ToDecimal(table_data[i, 0]);
  682. jhwxojb.Wx_bhl_gx = Convert.ToDecimal(table_data[i, 1]);
  683. jhwxojb.Wx_bhl_sp = Convert.ToDecimal(table_data[i, 2]);
  684. jhwxojb.Wx_bhl_sjk = Convert.ToDecimal(table_data[i, 3]);
  685. jhwxojb.Wx_bhl_gj = Convert.ToDecimal(table_data[i, 4]);
  686. jhwxojb.Wx_check = Char2String((char[,])table_check[i, 0]);
  687. JHWXobjs.Add(jhwxojb);
  688. }
  689. DataAnalysisToPG.UpdataJHDataToPG(JHWXobjs);
  690. #endregion
  691. #region 更新波形
  692. //记录成功运算的数据
  693. foreach (var it in jhfe_account)
  694. {
  695. foreach (var item in JHWXobjs)
  696. {
  697. if (it.Xlm == item.Xlm && it.Xingbie == item.Xingbie && it.Jgjlc == item.Jgjlc
  698. && it.Jcc == item.Jcc && it.Riqi == item.Riqi)
  699. {
  700. it.Boxingid_jhfx = item.Boxingid_jhfx;
  701. GeoJHReturn.Add(it);
  702. break;
  703. }
  704. }
  705. }
  706. //使用线路名、行别、尖轨尖里程匹配得到的波形数据,去更新范围、id
  707. for (int k = 0; k < GeoJHReturn.Count; k++)
  708. {
  709. string[] bxxuhaostring = GeoJHReturn[k].Boxingid_jhfx.Split(',');
  710. int[] bxxuhaos = new int[] { Convert.ToInt32(bxxuhaostring[0]), Convert.ToInt32(bxxuhaostring[1]) };
  711. string[] bxidsstring = GeoJHReturn[k].Yswjm_jhfx.Split(',');
  712. int[] bxids = new int[] { Convert.ToInt32(bxidsstring[0]), Convert.ToInt32(bxidsstring[1]) };
  713. int id = bxids[0];
  714. List<T_jihefenxi_boxing> Bolist = new List<T_jihefenxi_boxing>();
  715. for (int i = bxxuhaos[0] - 1; i < bxxuhaos[1]; i++)
  716. {
  717. T_jihefenxi_boxing bolist = new T_jihefenxi_boxing();
  718. bolist.Licheng = Convert.ToDecimal(wave_sw[i, 0]);
  719. bolist.Sudu_jhbx = Convert.ToDecimal(wave_sw[i, 1]);
  720. bolist.Cthj = Convert.ToDecimal(wave_sw[i, 2]);
  721. bolist.Ctcj = Convert.ToDecimal(wave_sw[i, 3]);
  722. bolist.Gjzhy = Convert.ToDecimal(wave_sw[i, 4]);
  723. bolist.Gjyhy = Convert.ToDecimal(wave_sw[i, 5]);
  724. bolist.Zgd = Convert.ToDecimal(wave_sw[i, 6]);
  725. bolist.Ygd = Convert.ToDecimal(wave_sw[i, 7]);
  726. bolist.Zgx = Convert.ToDecimal(wave_sw[i, 8]);
  727. bolist.Ygx = Convert.ToDecimal(wave_sw[i, 9]);
  728. bolist.Gj = Convert.ToDecimal(wave_sw[i, 10]);
  729. bolist.Sp = Convert.ToDecimal(wave_sw[i, 11]);
  730. bolist.Sjk = Convert.ToDecimal(wave_sw[i, 12]);
  731. bolist.Cbzgd = Convert.ToDecimal(wave_sw[i, 13]);
  732. bolist.Cbygd = Convert.ToDecimal(wave_sw[i, 14]);
  733. bolist.Cbzgx = Convert.ToDecimal(wave_sw[i, 15]);
  734. bolist.Cbygx = Convert.ToDecimal(wave_sw[i, 16]);
  735. bolist.Dcdw = Convert.ToDecimal(wave_sw[i, 17]);
  736. bolist.Id = bxids[0];
  737. bolist.Bxid = i + 1;
  738. bolist.Id = id;
  739. bolist.Yswjm = "微小算法执行了";
  740. id++;
  741. Bolist.Add(bolist);
  742. }
  743. DataAnalysisToPG.UpdataJHBXDataToPG(Bolist);
  744. }
  745. #endregion
  746. }
  747. /// <summary>
  748. /// 添加每条道岔之前最新一次微小算法执行结果(添加参考数据)
  749. /// </summary>
  750. public static void addWXSFReference(ref List<T_jihefenxi_account> jhfe_account)
  751. {
  752. try
  753. {
  754. //按照线路名、行别、尖轨尖里程匹配最新一次执行的数据
  755. // 1.去重,获取未执行微小算法的数据的线路名、行别、尖轨尖里程
  756. List<T_jihefenxi_account> quchong = WXSFquchong(jhfe_account);
  757. // 2.查数据(条件:线路名、行别、尖轨尖里程、未执行微小算法wx_isload = 1)
  758. List<List<T_jihefenxi_account>> datalist = DataAnalysisToPG.QueryToPGByNameWXSFZDReference(quchong);
  759. // 3.date比大小,保留每条线路名、行别、尖轨尖里程匹配的最新参考数据
  760. List<T_jihefenxi_account> cankao = dateCompare(datalist);
  761. for (int i = 0; i < cankao.Count; i++)
  762. {
  763. jhfe_account.Add(cankao[i]);
  764. }
  765. }
  766. catch (Exception ex)
  767. {
  768. throw;
  769. }
  770. }
  771. /// <summary>
  772. /// 去重,获取未执行微小算法的数据的线路名、行别、尖轨尖里程
  773. /// </summary>
  774. /// <param name="datalist"></param>
  775. /// <returns></returns>
  776. public static List<T_jihefenxi_account> WXSFquchong(List<T_jihefenxi_account> datalist)
  777. {
  778. List<T_jihefenxi_account> cankaolist = new List<T_jihefenxi_account>();
  779. foreach (var item in datalist)
  780. {
  781. cankaolist.Add(new T_jihefenxi_account()
  782. {
  783. Xlm = item.Xlm,
  784. Xingbie = item.Xingbie,
  785. Jgjlc = item.Jgjlc,
  786. Riqi = item.Riqi,
  787. Jcc = item.Jcc
  788. });
  789. }
  790. cankaolist = cankaolist.Distinct().ToList();
  791. return cankaolist;
  792. }
  793. /// <summary>
  794. /// date比大小,可以理解为去重
  795. /// </summary>
  796. public static List<T_jihefenxi_account> dateCompare(List<List<T_jihefenxi_account>> datalist)
  797. {
  798. List<T_jihefenxi_account> cankaolist = new List<T_jihefenxi_account>();
  799. foreach (var item in datalist)
  800. {
  801. T_jihefenxi_account cancan = new T_jihefenxi_account();
  802. cancan.Riqi = "1800年1月1日";
  803. foreach (var it in item)
  804. {
  805. var date1 = DateTime.Parse(cancan.Riqi);
  806. var date2 = DateTime.Parse(it.Riqi);
  807. if (DateTime.Compare(date1, date2) < 0)
  808. {
  809. cancan = it;
  810. }
  811. }
  812. cankaolist.Add(cancan);
  813. }
  814. return cankaolist; //大概看一下
  815. }
  816. /// <summary>
  817. /// 查询检测车
  818. /// </summary>
  819. /// <returns></returns>
  820. public string GetJccFun(string str)
  821. {
  822. foreach (var item in DACommon.jccList)
  823. {
  824. if (item.Split('-')[1] == str)
  825. {
  826. return item;
  827. }
  828. }
  829. return "轨检车";
  830. }
  831. #endregion
  832. /// 功率算法
  833. public void GL_new(T_dwfile_account whichfile)
  834. {
  835. string fname_dir0 = Path.GetDirectoryName(whichfile.Srlj) + "\\";
  836. string fname0 = Path.GetFileName(whichfile.Srlj);
  837. //Console.Write(fname_dir0);
  838. //Console.Write(fname0);
  839. string xianlu = whichfile.Xianlu;
  840. string chezhan = whichfile.Chezhan;
  841. string filename = whichfile.Filename;
  842. try
  843. {
  844. var data = AnalysisAlgorithmcs.GLFX(fname_dir0, fname0, xianlu, chezhan, filename);
  845. readGLFX(data, whichfile);
  846. }
  847. catch (Exception ex)
  848. {
  849. XtraMessageBox.Show("文件:" + whichfile.Filename + "执行失败!" + ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  850. throw;
  851. }
  852. }
  853. /// 读功率分析数据
  854. private void readGLFX(MWArray[] agrsOut, T_dwfile_account whichfile)
  855. {
  856. try
  857. {
  858. MWCellArray output1 = agrsOut[0] as MWCellArray;//数据
  859. MWCellArray output2 = agrsOut[1] as MWCellArray;//时间
  860. var table_data = output1.ToArray();
  861. var table_date = (object[,])output2.ToArray();
  862. List<T_glanalysis_account> GLobjs = new List<T_glanalysis_account>();
  863. // 假设是二维数组,从第2行开始
  864. for (int i = 1; i < (table_data as Array).GetLength(0); i++)
  865. {
  866. T_glanalysis_account gldata = new T_glanalysis_account();
  867. gldata.Filename = whichfile.Filename;
  868. gldata.Xianlu = whichfile.Xianlu;
  869. gldata.Chezhan = whichfile.Chezhan;
  870. // 安全地获取每列数据
  871. gldata.Curvenumber = SafeExtractInt(table_data, i, 2);
  872. gldata.Directionalmarker = SafeExtractInt(table_data, i, 3);
  873. gldata.Curvetype = SafeExtractInt(table_data, i, 4);
  874. gldata.Totalwork = SafeExtractDecimal(table_data, i, 5);
  875. gldata.Changerate = SafeExtractDecimal(table_data, i, 6);
  876. gldata.Offsetvalue = SafeExtractDecimal(table_data, i, 7);
  877. gldata.Powervariance = SafeExtractDecimal(table_data, i, 8);
  878. // 解析时间
  879. try
  880. {
  881. // 检查时间是否为空
  882. if (table_date[i, 0] is char[,])
  883. {
  884. string timeString = Char2String((char[,])table_date[i, 0]);
  885. if (!string.IsNullOrEmpty(timeString))
  886. {
  887. DateTime parsedTime = DateTime.Parse(timeString); // 解析为 DateTime
  888. gldata.Time = parsedTime.ToString("yyyy-MM-dd HH:mm:ss"); // 格式化为字符串
  889. }
  890. else
  891. {
  892. gldata.Time = null; // 或者设置为默认值
  893. }
  894. }
  895. else
  896. {
  897. gldata.Time = null; // 或者设置为默认值
  898. }
  899. }
  900. catch (FormatException ex)
  901. {
  902. Console.WriteLine($"时间解析失败: {ex.Message}");
  903. gldata.Time = null; // 或者设置为默认值
  904. }
  905. // 检查关键字段是否为空或默认值
  906. if (gldata.Curvenumber != 0 && gldata.Directionalmarker != 0 && gldata.Curvetype != 0 &&
  907. gldata.Totalwork != 0 && gldata.Changerate != 0 && gldata.Offsetvalue != 0 &&
  908. gldata.Powervariance != 0 && gldata.Time != null)
  909. {
  910. GLobjs.Add(gldata);
  911. }
  912. // GLobjs.Add(gldata);
  913. }
  914. //Console.WriteLine("解析完成,共 " + GLobjs.Count + " 条记录");
  915. DataAnalysisToPG.updataTaskstatus(new string[] { whichfile.Id.ToString(), type + "算法执行完毕" });
  916. DataAnalysisToPG.InsertGLFXDataToPG(GLobjs);
  917. CalculateAndInsertAnalysisProData(whichfile.Filename);
  918. }
  919. catch (Exception ex)
  920. {
  921. //Console.WriteLine("解析出错: " + ex.Message);
  922. // Console.WriteLine("堆栈跟踪: " + ex.StackTrace);
  923. }
  924. }
  925. private int SafeExtractInt(object table_data, int row, int col)
  926. {
  927. try
  928. {
  929. // 尝试直接获取数组元素
  930. var cellArray = (table_data as Array).GetValue(row, col);
  931. // 处理 MWNumericArray
  932. if (cellArray is MWNumericArray)
  933. {
  934. var numArray = cellArray as MWNumericArray;
  935. return (int)Math.Round(numArray.ToScalarDouble());
  936. }
  937. // 处理 double 数组
  938. if (cellArray is double[,])
  939. {
  940. var doubleArray = cellArray as double[,];
  941. return (int)Math.Round(doubleArray[0, 0]);
  942. }
  943. // 其他转换尝试
  944. return Convert.ToInt32(cellArray);
  945. }
  946. catch (Exception ex)
  947. {
  948. //Console.WriteLine($"提取整数失败(row:{row},col:{col}): {ex.Message}");
  949. return 0;
  950. }
  951. }
  952. private decimal SafeExtractDecimal(object table_data, int row, int col)
  953. {
  954. try
  955. {
  956. // 尝试直接获取数组元素
  957. var cellArray = (table_data as Array).GetValue(row, col);
  958. // 处理 MWNumericArray
  959. if (cellArray is MWNumericArray)
  960. {
  961. var numArray = cellArray as MWNumericArray;
  962. return (decimal)Math.Round(numArray.ToScalarDouble(), 15);
  963. }
  964. // 处理 double 数组
  965. if (cellArray is double[,])
  966. {
  967. var doubleArray = cellArray as double[,];
  968. return (decimal)Math.Round(doubleArray[0, 0], 15);
  969. }
  970. // 其他转换尝试
  971. return Convert.ToDecimal(cellArray);
  972. }
  973. catch (Exception ex)
  974. {
  975. // Console.WriteLine($"提取小数失败(row:{row},col:{col}): {ex.Message}");
  976. return 0;
  977. }
  978. }
  979. private void CalculateAndInsertAnalysisProData(string filename)
  980. {
  981. try
  982. {
  983. // 1. 从 T_glanalysis_account 表中获取数据
  984. var analysisData = DataAnalysisToPG.QueryAllGLAnalysisData(filename) as List<T_glanalysis_account>; ;
  985. if (analysisData == null || !analysisData.Any())
  986. {
  987. Console.WriteLine($"没有找到文件 {filename} 的分析数据");
  988. return;
  989. }
  990. // 2. 按日期分组
  991. var groupedData = analysisData
  992. .GroupBy(x => DateTime.Parse(x.Time).Date.ToString("yyyy-MM-dd"))
  993. .ToList();
  994. foreach (var group in groupedData)
  995. {
  996. var proAccount = new T_glanalysispro_account
  997. {
  998. Xianlu = group.First().Xianlu,
  999. Chezhan = group.First().Chezhan,
  1000. Time = group.Key,
  1001. Filename = filename,
  1002. Curvetype = group.First().Curvetype,
  1003. Curvenumber = group.First().Curvenumber,
  1004. // 计算总功率的最大、最小、平均值
  1005. Totalworkmax = group.Max(x => x.Totalwork),
  1006. Totalworkmin = group.Min(x => x.Totalwork),
  1007. Totalworkavg = group.Average(x => x.Totalwork),
  1008. // 计算变化率的最大、最小、平均值
  1009. Changeratemax = group.Max(x => x.Changerate),
  1010. Changeratemin = group.Min(x => x.Changerate),
  1011. Changerateavg = group.Average(x => x.Changerate),
  1012. // 计算偏差值的最大、最小、平均值
  1013. Offsetvaluemax = group.Max(x => x.Offsetvalue),
  1014. Offsetvaluemin = group.Min(x => x.Offsetvalue),
  1015. Offsetvalueavg = group.Average(x => x.Offsetvalue),
  1016. // 计算功率方差的最大、最小、平均值
  1017. Powervariancemax = group.Max(x => x.Powervariance),
  1018. Powervariancemin = group.Min(x => x.Powervariance),
  1019. Powervarianceavg = group.Average(x => x.Powervariance)
  1020. };
  1021. // 3. 插入数据到 T_glanalysispro_account 表
  1022. try
  1023. {
  1024. DataAnalysisToPG.InsertGLAnalysisProData(proAccount);
  1025. Console.WriteLine($"成功插入日期 {group.Key} 的统计数据");
  1026. }
  1027. catch (Exception ex)
  1028. {
  1029. Console.WriteLine($"插入数据失败: {ex.Message}");
  1030. }
  1031. }
  1032. }
  1033. catch (Exception ex)
  1034. {
  1035. Console.WriteLine($"处理数据时出错: {ex.Message}");
  1036. Console.WriteLine($"堆栈跟踪: {ex.StackTrace}");
  1037. }
  1038. }
  1039. ///
  1040. /// 缺口算法
  1041. public void QK_new(T_dwqkfile_account whichfile)
  1042. {
  1043. string fname_dir0 = Path.GetDirectoryName(whichfile.Srlj) + "\\";
  1044. string fname0 = Path.GetFileName(whichfile.Srlj);
  1045. //Console.Write(fname_dir0);
  1046. //Console.Write(fname0);
  1047. string xianlu = whichfile.Xianlu;
  1048. string chezhan = whichfile.Chezhan;
  1049. string filename = whichfile.Filename;
  1050. try
  1051. {
  1052. var data = AnalysisAlgorithmcs.QKFX(fname_dir0, fname0, xianlu, chezhan, filename);
  1053. readQKFX(data, whichfile);
  1054. }
  1055. catch (Exception ex)
  1056. {
  1057. XtraMessageBox.Show("文件:" + whichfile.Filename + "执行失败!" + ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  1058. throw;
  1059. }
  1060. }
  1061. /// 读缺口分析数据
  1062. private void readQKFX(MWArray[] agrsOut, T_dwqkfile_account whichfile)
  1063. {
  1064. try
  1065. {
  1066. MWCellArray output1 = agrsOut[0] as MWCellArray;//数据
  1067. MWCellArray output2 = agrsOut[1] as MWCellArray;//时间
  1068. var table_data = output1.ToArray();
  1069. var table_date = (object[,])output2.ToArray();
  1070. List<T_qkanalysis_account> QKobjs = new List<T_qkanalysis_account>();
  1071. // 假设是二维数组,从第2行开始
  1072. for (int i = 1; i < (table_data as Array).GetLength(0); i++)
  1073. {
  1074. T_qkanalysis_account qkdata = new T_qkanalysis_account();
  1075. qkdata.Filename = whichfile.Filename;
  1076. qkdata.Xianlu = whichfile.Xianlu;
  1077. qkdata.Chezhan = whichfile.Chezhan;
  1078. // 安全地获取每列数据
  1079. qkdata.Gapnumber = SafeExtractInt(table_data, i, 0);
  1080. qkdata.Gaptype = SafeExtractInt(table_data, i, 1);
  1081. qkdata.Movechange = SafeExtractDecimal(table_data, i, 3);
  1082. qkdata.Change = SafeExtractDecimal(table_data, i, 4);
  1083. qkdata.Passchange = SafeExtractDecimal(table_data, i, 5);
  1084. // 解析时间
  1085. try
  1086. {
  1087. if (table_date[i, 0] is char[,])
  1088. {
  1089. string timeString = Char2String((char[,])table_date[i, 0]);
  1090. if (!string.IsNullOrEmpty(timeString))
  1091. {
  1092. DateTime parsedTime;
  1093. // 尝试解析两种格式
  1094. if (DateTime.TryParseExact(timeString, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedTime))
  1095. {
  1096. qkdata.Time = parsedTime.ToString("yyyy-MM-dd HH:mm:ss"); // 格式化为字符串
  1097. }
  1098. else if (DateTime.TryParseExact(timeString, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedTime))
  1099. {
  1100. qkdata.Time = parsedTime.ToString("yyyy-MM-dd HH:mm:ss"); // 格式化为字符串
  1101. }
  1102. else
  1103. {
  1104. qkdata.Time = null; // 或者设置为默认值
  1105. }
  1106. }
  1107. else
  1108. {
  1109. qkdata.Time = null; // 或者设置为默认值
  1110. }
  1111. }
  1112. else
  1113. {
  1114. qkdata.Time = null; // 或者设置为默认值
  1115. }
  1116. }
  1117. catch (FormatException ex)
  1118. {
  1119. Console.WriteLine($"时间解析失败: {ex.Message}");
  1120. qkdata.Time = null; // 或者设置为默认值
  1121. }
  1122. QKobjs.Add(qkdata);
  1123. }
  1124. //Console.WriteLine("解析完成,共 " + GLobjs.Count + " 条记录");
  1125. DataAnalysisToPG.updataTaskstatusQK(new string[] { whichfile.Id.ToString(), type + "算法执行完毕" });
  1126. DataAnalysisToPG.InsertQKFXDataToPG(QKobjs);
  1127. }
  1128. catch (Exception ex)
  1129. {
  1130. //Console.WriteLine("解析出错: " + ex.Message);
  1131. // Console.WriteLine("堆栈跟踪: " + ex.StackTrace);
  1132. }
  1133. }
  1134. ///
  1135. /// <summary>
  1136. ///
  1137. /// </summary>
  1138. /// <param name="jhfe_account"></param>
  1139. /// <param name="date"></param>
  1140. /// <param name="car"></param>
  1141. /// <param name="mile"></param>
  1142. /// <param name="wave_data"></param>
  1143. /// <param name="id_wave_all"></param>
  1144. /// <param name="jx_loc_all"></param>
  1145. /// <param name="line"></param>
  1146. /// <param name="velo"></param>
  1147. /// <param name="zc"></param>
  1148. private void getdataWXSF(List<T_jihefenxi_account> jhfe_account, ref string[] date, ref string[] car, ref double[] mile, ref List<double> wave_data, ref List<double> id_wave_all, ref List<double> jx_loc_all, ref string[] line, ref double[] velo, ref string[] zc)
  1149. {
  1150. int bxindex = 0;
  1151. for (int i = 0; i < jhfe_account.Count; i++)
  1152. {
  1153. date[i] = jhfe_account[i].Riqi;
  1154. car[i] = jhfe_account[i].Jcc== "轨检车" ? "轨检车" : jhfe_account[i].Jcc.Split('-')[1];
  1155. mile[i] = Convert.ToDouble(jhfe_account[i].Jgjlc);
  1156. jx_loc_all.Add(Convert.ToDouble(jhfe_account[i].Jgjcydxh));
  1157. jx_loc_all.Add(Convert.ToDouble(jhfe_account[i].Xgjcydxh));
  1158. line[i] = ((T_file_account)DataAnalysisToPG.QueryToPGById(Convert.ToInt32(jhfe_account[i].Filename_jh.Trim()))).Yswjm.Split('-')[0];
  1159. velo[i] = Convert.ToDouble(jhfe_account[i].Sudu_jhfx);
  1160. zc[i] = jhfe_account[i].Zcx;
  1161. getWXSFBXdata(jhfe_account[i].Yswjm_jhfx, ref bxindex, ref wave_data, ref id_wave_all);
  1162. }
  1163. }
  1164. private void getWXSFBXdata(string ids, ref int index, ref List<double> wave_data, ref List<double> id_wave_all)
  1165. {
  1166. List<T_jihefenxi_boxing> bolist = DMControl.GetJHFX_BXDataByIDS(ids);
  1167. index = index + 1;
  1168. id_wave_all.Add(index);
  1169. for (int i = 0; i < bolist.Count; i++)
  1170. {
  1171. wave_data.Add((double)(bolist[i].Licheng));
  1172. wave_data.Add((double)(bolist[i].Sudu_jhbx));
  1173. wave_data.Add((double)(bolist[i].Cthj));
  1174. wave_data.Add((double)(bolist[i].Ctcj));
  1175. wave_data.Add((double)(bolist[i].Gjzhy));
  1176. wave_data.Add((double)(bolist[i].Gjyhy));
  1177. wave_data.Add((double)(bolist[i].Zgd));
  1178. wave_data.Add((double)(bolist[i].Ygd));
  1179. wave_data.Add((double)(bolist[i].Zgx));
  1180. wave_data.Add((double)(bolist[i].Ygx));
  1181. wave_data.Add((double)(bolist[i].Gj));
  1182. wave_data.Add((double)(bolist[i].Sp));
  1183. wave_data.Add((double)(bolist[i].Sjk));
  1184. wave_data.Add((double)(bolist[i].Cbzgd));
  1185. wave_data.Add((double)(bolist[i].Cbygd));
  1186. wave_data.Add((double)(bolist[i].Cbzgx));
  1187. wave_data.Add((double)(bolist[i].Cbygx));
  1188. wave_data.Add((double)(bolist[i].Dcdw));
  1189. }
  1190. index += bolist.Count - 1;
  1191. id_wave_all.Add(index);
  1192. }
  1193. /// <summary>
  1194. /// 从数据库获取对应符合要求的道岔台账信息
  1195. /// </summary>
  1196. private double[] getTZDC(List<T_daocha_account> taizhang)
  1197. {
  1198. //StreamWriter FileWriter = new StreamWriter("E://get2pgTZ.txt", true); //写文件
  1199. string txtDetail = "";
  1200. //StreamWriter sr = new StreamWriter("E://DDD.txt");
  1201. List<double> result = new List<double>();
  1202. for (int i = 0; i < taizhang.Count; i++)
  1203. {
  1204. result.Add(Convert.ToDouble(taizhang[i].Jgjlc));
  1205. result.Add(Convert.ToDouble(taizhang[i].Zch));
  1206. result.Add(Convert.ToDouble(taizhang[i].Quanchang));
  1207. txtDetail += taizhang[i].Jgjlc + "\t" + taizhang[i].Zch + "\t" + taizhang[i].Quanchang + "\n";
  1208. }
  1209. //FileWriter.Write(txtDetail);//将字符串写入
  1210. //FileWriter.Close(); //关闭StreamWriter对象k
  1211. //******构造二维数组******
  1212. double[] ret = new double[result.Count];
  1213. for (int i = 0; i < result.Count; i++)
  1214. {
  1215. ret[i] = result[i];
  1216. }
  1217. return ret;
  1218. }
  1219. /// <summary>
  1220. /// 从数据库获取对应符合要求的曲线台账信息
  1221. /// </summary>
  1222. private double[] getTZQX(List<T_quxian_account> taizhang, bool isjh)
  1223. {
  1224. List<double> result = new List<double>();
  1225. for (int i = 0; i < taizhang.Count; i++)
  1226. {
  1227. result.Add(Convert.ToDouble(taizhang[i].Qzlc));
  1228. result.Add(Convert.ToDouble(taizhang[i].Jslc));
  1229. if (taizhang[i].Qxfx.Trim() == "左")
  1230. {
  1231. result.Add(1);
  1232. }
  1233. else
  1234. {
  1235. result.Add(-1);
  1236. }
  1237. if (isjh)
  1238. {
  1239. result.Add(Convert.ToDouble(taizhang[i].Chaogao));
  1240. }
  1241. else
  1242. {
  1243. result.Add(Convert.ToDouble(taizhang[i].Qxbj));
  1244. }
  1245. result.Add(Convert.ToDouble(taizhang[i].Qhhxc));
  1246. result.Add(Convert.ToDouble(taizhang[i].Zhhxc));
  1247. }
  1248. //******构造二维数组******
  1249. double[] ret = new double[result.Count];
  1250. for (int i = 0; i < result.Count; i++)
  1251. {
  1252. ret[i] = result[i];
  1253. }
  1254. return ret;
  1255. }
  1256. /// <summary>
  1257. /// 从数据库获取对应符合要求的曲线台账信息
  1258. /// </summary>
  1259. private double[] getTZJGJX()
  1260. {
  1261. List<T_jgjdistance_table> tabledata = new List<T_jgjdistance_table>();
  1262. List<T_jgjdistance_table> tablelist = DataAnalysisToPG.QueryJGJXGJJ();
  1263. List<T_jgjdistance_table> GS = tablelist.Where(i => i.Sudutype == 0).ToList();
  1264. List<T_jgjdistance_table> DS = tablelist.Where(i => i.Sudutype == 1).ToList();
  1265. if (DACommon.gdsBool == 0)
  1266. {
  1267. tabledata = GS;
  1268. }
  1269. else if (DACommon.gdsBool == 1)
  1270. {
  1271. tabledata = DS;
  1272. }
  1273. else
  1274. {
  1275. tabledata = tablelist;
  1276. }
  1277. List<double> result = new List<double>();
  1278. for (int i = 0; i < tabledata.Count; i++)
  1279. {
  1280. result.Add(Convert.ToDouble(tabledata[i].Zch));
  1281. result.Add(Convert.ToDouble(tabledata[i].Dcqc));
  1282. result.Add(Convert.ToDouble(tabledata[i].Gdjxgjj));
  1283. }
  1284. //******构造二维数组******
  1285. double[] ret = new double[result.Count];
  1286. for (int i = 0; i < result.Count; i++)
  1287. {
  1288. ret[i] = result[i];
  1289. }
  1290. return ret;
  1291. }
  1292. private double[] getTZXX1(List<T_daocha_account> taizhang)
  1293. {
  1294. List<double> result = new List<double>();
  1295. for (int i = 0; i < taizhang.Count; i++)
  1296. {
  1297. result.Add(Convert.ToDouble(taizhang[i].Jgjlc));
  1298. }
  1299. //******构造二维数组******
  1300. double[] ret = new double[result.Count];
  1301. for (int i = 0; i < result.Count; i++)
  1302. {
  1303. ret[i] = result[i];
  1304. }
  1305. return ret;
  1306. }
  1307. /// <summary>
  1308. /// 几何读台账txt
  1309. /// </summary>
  1310. private double[] readtxt(string txtPath)
  1311. {
  1312. List<double> result = new List<double>();
  1313. StreamReader SR = new StreamReader(txtPath);
  1314. while (!SR.EndOfStream)
  1315. {
  1316. string[] str = SR.ReadLine().Replace("\t", " ").Split(' ');
  1317. for (int i = 0; i < str.Length; i++)
  1318. {
  1319. result.Add(Convert.ToDouble(str[i]));
  1320. }
  1321. }
  1322. //******构造二维数组******
  1323. double[] ret = new double[result.Count];
  1324. for (int i = 0; i < result.Count; i++)
  1325. {
  1326. ret[i] = result[i];
  1327. }
  1328. return ret;
  1329. }
  1330. /// <summary>
  1331. /// 轮轨力读台账txt获取尖轨尖里程
  1332. /// </summary>
  1333. private double[] readtxt2(string txtPath)
  1334. {
  1335. List<double> result = new List<double>();
  1336. StreamReader SR = new StreamReader(txtPath);
  1337. while (!SR.EndOfStream)
  1338. {
  1339. string[] str = SR.ReadLine().Replace("\t", " ").Split(' ');
  1340. result.Add(Convert.ToDouble(str[0]));
  1341. }
  1342. //******构造二维数组******
  1343. double[] ret = new double[result.Count];
  1344. for (int i = 0; i < result.Count; i++)
  1345. {
  1346. ret[i] = result[i];
  1347. }
  1348. return ret;
  1349. }
  1350. /// <summary>
  1351. /// char[]转string
  1352. /// </summary>
  1353. private string Char2String(char[,] chararr)
  1354. {
  1355. string arr = "";
  1356. for (int j = 0; j < chararr.GetLength(1); j++)
  1357. {
  1358. arr += chararr[0, j].ToString();
  1359. }
  1360. return arr;
  1361. }
  1362. }
  1363. }