CNAS取数仪器端升级
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

857 rindas
33KB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Data;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using CnasSynchronusClient;
  10. using CnasSynchrousModel;
  11. using CnasSynchronousCommon;
  12. using log4net.Repository.Hierarchy;
  13. using System.Threading;
  14. using System.IO;
  15. using Newtonsoft.Json;
  16. using System.Diagnostics;
  17. namespace CNAS_RunSync
  18. {
  19. public partial class ucSynchrousMain : UserControl
  20. {
  21. private string delayDays = FileOperation.GetSystemFormatConfigData().ShowDelayDays;
  22. private SyncInstrumentItemInfo syncInstrumentItem = new SyncInstrumentItemInfo();
  23. //private Dictionary<string, DataTable> dictSourceTables = new Dictionary<string, DataTable>();
  24. private DataTable dtSource = new DataTable(); //当前显示数据源
  25. private Dictionary<string, DataRow> dictSource = new Dictionary<string, DataRow>();
  26. private Dictionary<string, Type> DictComboBox = new Dictionary<string, Type>(); //ComboBox数据源
  27. private List<string> lstIntOrDouble = new List<string>() { "等于", "不等于", "大于", "小于", "不大于", "不小于" };
  28. private List<string> lstText = new List<string>() { "等于", "不等于", "包含", "不包含" };
  29. private Color FinedBackColor = Color.LightCyan; //查询后选中项
  30. Dictionary<string, string> DictField = new Dictionary<string, string>();
  31. public ucSynchrousMain()
  32. {
  33. InitializeComponent();
  34. }
  35. //需要存在一个仪器才能正常显示数据
  36. public ucSynchrousMain(SyncInstrumentItemInfo syncInstrumentItem)
  37. {
  38. InitializeComponent();
  39. dgvSyncData.AutoGenerateColumns = false;
  40. dgvSyncData.RowHeadersVisible = false;
  41. //dgvSyncData.RowsDefaultCellStyle.BackColor = Color.Bisque;
  42. dgvSyncData.AlternatingRowsDefaultCellStyle.BackColor = Color.WhiteSmoke;
  43. this.syncInstrumentItem = syncInstrumentItem;
  44. }
  45. /// <summary>
  46. /// 控件加载时发生
  47. /// </summary>
  48. /// <param name="sender"></param>
  49. /// <param name="e"></param>
  50. private void ucSynchrousMain_Load(object sender, EventArgs e)
  51. {
  52. BindData();
  53. }
  54. /// <summary>
  55. /// 绑定数据
  56. /// </summary>
  57. public void BindData()
  58. {
  59. if (this.syncInstrumentItem == null) return;
  60. this.lblTitle.Text = string.Format("当前仪器:【{0}】", syncInstrumentItem.Code);
  61. if (syncInstrumentItem.LstSyncPramas == null) return;
  62. if (syncInstrumentItem.SyncInstrumentDSInfo == null) return;
  63. //if (syncInstrumentItem.SyncInstrumentDSInfo.Path == null) return;
  64. if (syncInstrumentItem.SyncInstrumentDSInfo.InstrumentDataSourceType == DataSourceType.None) return;
  65. this.lblTitleMsg.Text= string.Format("类型:{0} 路径:{1}", syncInstrumentItem.SyncInstrumentDSInfo.InstrumentDataSourceType.ToString(),syncInstrumentItem.SyncInstrumentDSInfo.Path);
  66. //获取目标表最近上传时间
  67. Dictionary<string, string> times = this.ReadSyncTime();
  68. if (true == times?.ContainsKey(this.syncInstrumentItem.Code))
  69. {
  70. this.lblTitleLastUpdateTime.Text = $"最近上传时间:{times[this.syncInstrumentItem.Code]}";
  71. }
  72. //获取配置
  73. SystemFormatConfig systemConfig = FileOperation.GetSystemFormatConfigData(this.syncInstrumentItem.Code);
  74. if (null != systemConfig)
  75. {
  76. this.delayDays = systemConfig.ShowDelayDays;
  77. }
  78. //清空现有绑定
  79. DictComboBox.Clear();
  80. dictSource.Clear();
  81. //加载相关数据
  82. //1.1根据仪器类型加载本地存储的中英文字段说明映射
  83. //if (syncInstrumentItem.LstSyncPramas.Count > 0)
  84. //{
  85. //InstrumentDescribeZH describeZH = new InstrumentDescribeZH(syncInstrumentItem.InstruType, syncInstrumentItem.LstSyncPramas[0].SourceTable);
  86. //describeZH.GetFieldDescribe();
  87. //DictField = describeZH.DictField;
  88. //}
  89. //2.datagridview中绑定数据(绑定的是从数据源中读取的数据)
  90. //2.1 根据映射表,创建datagridviewcolumn/和绑定数据列
  91. if (syncInstrumentItem.LstSyncPramas.Count <= 0) return;
  92. //创建选择列
  93. AddCheckBoxColumn(dgvSyncData, "selectedColumn", "选择", 80, true);
  94. //创建数据列
  95. foreach (var item in syncInstrumentItem.LstSyncPramas)
  96. {
  97. string strColumnName = item.SourceField;
  98. if (DictField.ContainsKey(strColumnName))
  99. strColumnName = DictField[strColumnName];
  100. AddDatagridColumn(dgvSyncData, item.SourceField, strColumnName, 150, bSort: item.IfDateField);
  101. }
  102. //创建GUID列
  103. AddDatagridColumn(dgvSyncData, "GridGuid", "GridGuid", 50, false);
  104. //2.2获取数据源数据
  105. this.RefreshData();
  106. //3.初始化查询相关内容
  107. //3.1 绑定Combobox数据源
  108. foreach (DataColumn dc in dtSource.Columns)
  109. {
  110. if (syncInstrumentItem.LstSyncPramas.Where(s => s.SourceField.ToUpper() == dc.ColumnName.ToUpper()).LongCount<SyncParamasInfo>() > 0)
  111. {
  112. string strColumnName = dc.ColumnName;
  113. if (DictField.ContainsKey(strColumnName))
  114. strColumnName = DictField[strColumnName];
  115. DictComboBox.Add(strColumnName, dc.DataType);
  116. }
  117. }
  118. if (DictComboBox.Count > 0)
  119. {
  120. BindingSource bsComboBox = new BindingSource
  121. {
  122. DataSource = DictComboBox
  123. };
  124. cmbColumns.DataSource = bsComboBox;
  125. cmbColumns.ValueMember = "Key";
  126. cmbColumns.DisplayMember = "Key";
  127. }
  128. }
  129. /// <summary>
  130. ///
  131. /// </summary>
  132. private void RefreshData()
  133. {
  134. //清空现有绑定
  135. dictSource?.Clear();
  136. dtSource?.Clear();
  137. dtSource?.Dispose();
  138. dtSource = null;
  139. dgvSyncData?.Rows?.Clear();
  140. //2.2 获取数据源数据,构建datagridviewcell
  141. //2.2.1 获取数据源数据
  142. var query = syncInstrumentItem.LstSyncPramas.Where(s => s.IfDateField == true).ToList<SyncParamasInfo>();
  143. if (query.Count == 1)
  144. {
  145. object[] obj = new object[]
  146. {
  147. syncInstrumentItem.LstSyncPramas[0].SourceTable,
  148. query[0].SourceField,
  149. DateTime.Now.AddDays(Convert.ToInt32(delayDays)).ToString("yyyy-MM-dd HH:mm:ss")
  150. };
  151. InstrumentData instrumentData = InstrumentDataFact.CreateInstrumentDataSource(syncInstrumentItem.SyncInstrumentDSInfo, obj);
  152. dtSource = instrumentData.GetInstrumentDataByDate();
  153. DataView dv = dtSource.DefaultView;
  154. try
  155. {
  156. dv.Sort = $"{query[0].SourceField} DESC";
  157. }
  158. catch
  159. {
  160. }
  161. dtSource = dv.ToTable();
  162. }
  163. //2.2.2 构建datagridviewcell
  164. foreach (DataRow dr in dtSource.Rows)
  165. {
  166. DataGridViewRow dataGridViewRow = new DataGridViewRow();
  167. foreach (DataGridViewColumn dataGridViewColumn in dgvSyncData.Columns)
  168. {
  169. if (dataGridViewColumn.Index == 0)
  170. {
  171. dataGridViewRow.Cells.Add(new DataGridViewCheckBoxCell());
  172. }
  173. if (dtSource.Columns.Contains(dataGridViewColumn.Name))
  174. AddDataTextCell(dataGridViewRow, dataGridViewColumn, dr);
  175. }
  176. //添加GUID值
  177. string strGuid = Guid.NewGuid().ToString();
  178. DataGridViewTextBoxCell txtCell = new DataGridViewTextBoxCell
  179. {
  180. Value = strGuid
  181. };
  182. dataGridViewRow.Cells.Add(txtCell);
  183. dgvSyncData.Rows.Add(dataGridViewRow);
  184. dictSource.Add(strGuid, dr);
  185. }
  186. }
  187. /// <summary>
  188. /// 添加datagridview的列
  189. /// </summary>
  190. /// <param name="dgvShow"></param>
  191. /// <param name="strColumnName"></param>
  192. /// <param name="strColumnHeaderText"></param>
  193. /// <param name="Width"></param>
  194. /// <param name="bVisible"></param>
  195. private void AddDatagridColumn(DataGridView dgvShow, string strColumnName, string strColumnHeaderText, int Width, bool bVisible = true, bool bSort = false)
  196. {
  197. DataGridViewColumn Column = new DataGridViewColumn()
  198. {
  199. Name = strColumnName,
  200. HeaderText = strColumnHeaderText,
  201. Width = Width,
  202. Visible = bVisible,
  203. CellTemplate = new DataGridViewTextBoxCell(),
  204. ReadOnly = true,
  205. SortMode = bSort ? DataGridViewColumnSortMode.Automatic : DataGridViewColumnSortMode.NotSortable
  206. };
  207. //设置文本对齐方式
  208. Column.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
  209. Column.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
  210. //设置该列背景颜色
  211. dgvShow.Columns.Add(Column);
  212. }
  213. private void AddCheckBoxColumn(DataGridView dgvShow, string strColumnName, string strColumnHeaderText, int Width, bool bVisible = true)
  214. {
  215. DataGridViewCheckBoxColumn selectedColumn = new DataGridViewCheckBoxColumn()
  216. {
  217. HeaderText = strColumnHeaderText,
  218. Name = strColumnName,
  219. Visible = bVisible,
  220. Width = Width,
  221. ReadOnly = false
  222. };
  223. //设置文本对齐方式
  224. selectedColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
  225. selectedColumn.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
  226. //设置该列背景颜色
  227. dgvShow.Columns.Add(selectedColumn);
  228. }
  229. /// <summary>
  230. /// 添加datagridview的单元格
  231. /// </summary>
  232. /// <param name="dataGridViewRow"></param>
  233. /// <param name="dataGridViewColumn"></param>
  234. /// <param name="dr"></param>
  235. private void AddDataTextCell(DataGridViewRow dataGridViewRow, DataGridViewColumn dataGridViewColumn, DataRow dr)
  236. {
  237. DataGridViewTextBoxCell txtCell = new DataGridViewTextBoxCell();
  238. txtCell.Value = Convert.ToString(dr[dataGridViewColumn.Name]);
  239. dataGridViewRow.Cells.Add(txtCell);
  240. }
  241. private void btnRunData_Click(object sender, EventArgs e)
  242. {
  243. //组织上传数据
  244. if (dgvSyncData.Columns.Count <= 0) return;
  245. DataTable dtReadySource = dtSource.Clone();
  246. GetUpLoadData(ref dtReadySource);
  247. if (dtReadySource.Rows.Count <= 0)
  248. {
  249. string strMsg = "未能获得上传数据,请查询筛选后重试!";
  250. MessageBox.Show(strMsg);
  251. WriteMsgToRichTextBox(strMsg);
  252. }
  253. //执行上传
  254. RunUpLoad(dtReadySource);
  255. }
  256. /// <summary>
  257. /// 获取上传数据
  258. /// </summary>
  259. /// <param name="dtReadySource">准备上传的数据</param>
  260. private void GetUpLoadData(ref DataTable dtReadySource)
  261. {
  262. foreach (DataGridViewRow dgvRow in dgvSyncData.Rows)
  263. {
  264. if (dgvRow.DefaultCellStyle.BackColor == FinedBackColor)
  265. {
  266. string strGuid = dgvRow.Cells["GridGuid"].Value.ToString();
  267. if (!dictSource.ContainsKey(strGuid)) continue;
  268. DataRow dr = dictSource[strGuid];
  269. DataRow drReady = dtReadySource.NewRow();
  270. foreach (DataColumn dc in dtReadySource.Columns)
  271. {
  272. if (dr.Table.Columns.Contains(dc.ColumnName))
  273. drReady[dc.ColumnName] = dr[dc.ColumnName];
  274. }
  275. dtReadySource.Rows.Add(drReady);
  276. }
  277. }
  278. }
  279. private void RunUpLoad(DataTable dtReadySource)
  280. {
  281. //根据映射字段获取准备上传的所有数据
  282. if (dtReadySource == null || dtReadySource.Rows.Count <= 0) return;
  283. //构建准备插入的数据
  284. DataTable dtTarget = CnasDataOperationFact.CnasDataOperation().GetCNASTablesStruct(syncInstrumentItem.LstSyncPramas[0].TargetTable, syncInstrumentItem.SyncTargetDBInfo);
  285. if (dtTarget.Columns.Count <= 0)
  286. {
  287. MessageBox.Show("未能成功读取CNAS数据库列,请检查数据库配置。");
  288. WriteMsgToRichTextBox("未能成功读取CNAS数据库列,请检查数据库配置。");
  289. return;
  290. }
  291. //创建插入操作类
  292. CnasInsertOperation insertOperation = new CnasInsertOperation { syncInstrumentItem = syncInstrumentItem };
  293. //逐行插入数据到内存表
  294. string strErrorMsg = insertOperation.CreateInputData(dtReadySource, ref dtTarget);
  295. if (strErrorMsg != "")
  296. {
  297. MessageBox.Show(strErrorMsg);
  298. return;
  299. }
  300. if (dtTarget.Rows.Count <= 0)
  301. {
  302. MessageBox.Show("未能获取到符合要求的数据,请检查配置或联系管理员。");
  303. WriteMsgToRichTextBox("未能获取到符合要求的数据,请检查配置或联系管理员。");
  304. return;
  305. }
  306. //检查数据合法性
  307. insertOperation.CheckInsertDataFormat(dtTarget, ref strErrorMsg);
  308. if (strErrorMsg != "")
  309. {
  310. MessageBox.Show(strErrorMsg);
  311. return;
  312. }
  313. //逐行执行插入内存表数据到数据库中
  314. int ErrorCount = 0;
  315. int SuccessCount = 0;
  316. int OtherCount = 0;
  317. List<DataRow> lstError = new List<DataRow>();
  318. int cols = dtTarget.Columns.Count;
  319. foreach (DataRow dr in dtTarget.Rows)
  320. {
  321. if (cols >= 11 && dr[11].ToString().Length > 1)
  322. {
  323. AppLog.Error($"逐行插入目标数据,最终准备插入(更新)数据行{dr[11]}");
  324. dr[11] = kxjsf(dr[11].ToString());
  325. }
  326. if (cols >= 12 && dr[12].ToString().Length > 1)
  327. {
  328. AppLog.Error($"逐行插入目标数据,最终准备插入(更新)数据行{dr[12]}");
  329. }
  330. if (cols >= 13 && dr[13].ToString().Length > 1)
  331. {
  332. AppLog.Error($"逐行插入目标数据,最终准备插入(更新)数据行{dr[13]}");
  333. }
  334. if (cols >= 14 && dr[14].ToString().Length > 1)
  335. {
  336. AppLog.Error($"逐行插入目标数据,最终准备插入(更新)数据行{dr[14]}");
  337. }
  338. if (cols >= 15 && dr[15].ToString().Length > 1)
  339. {
  340. AppLog.Error($"逐行插入目标数据,最终准备插入(更新)数据行{dr[15]}");
  341. }
  342. if (cols >= 16 && dr[16].ToString().Length > 1)
  343. {
  344. AppLog.Error($"逐行插入目标数据,最终准备插入(更新)数据行{dr[16]}");
  345. }
  346. dr.AcceptChanges();
  347. int iReturn = CnasDataOperationFact.CnasDataOperation().InsertDataToCNASTable(GlobalCommonOperation.ConvertDataRowToTable(dr), syncInstrumentItem.SyncTargetDBInfo, syncInstrumentItem.LstSyncPramas, syncInstrumentItem.CnasInstrumentColumn, syncInstrumentItem.lstFixedValue);
  348. if (iReturn <= 0) //此时出现问题
  349. {
  350. if (iReturn == -1)
  351. {
  352. AppLog.ServiceInfo("数据库连接中断,终止本次上传。");
  353. WriteMsgToRichTextBox("数据库连接中断,终止本次上传。");
  354. break; //此时数据库连接中断,直接跳出循环,结束本次数据同步传输
  355. }
  356. else if (iReturn == -2) //等于-2表示插入准备更新时发现数据一致,不再执行
  357. {
  358. OtherCount++;
  359. }
  360. else
  361. {
  362. ErrorCount++;
  363. /*需要转换一下,否则会将整个dt全部写入日志*/
  364. lstError.Add(GlobalCommonOperation.ConvertDataRowToTable(dr).Rows[0]);
  365. }
  366. }
  367. else
  368. {
  369. SuccessCount++;
  370. }
  371. }
  372. ////判断返回结果
  373. //if (lstError.Count <= 0)
  374. //{
  375. // MessageBox.Show("上传完成!");
  376. //}
  377. //else
  378. //{
  379. // AppLog.Error($"未成功上传的数据如下:{TransConvert.ListToString(lstError)}");
  380. // MessageBox.Show("上传过程中发生异常,存在部分数据未成功上传,请联系管理员!");
  381. //}
  382. MessageBox.Show($"上传操作完成!其中成功{SuccessCount}条,失败{ErrorCount}条,其他{OtherCount}条。");
  383. WriteMsgToRichTextBox($"上传操作完成!其中成功{SuccessCount}条,失败{ErrorCount}条,其他{OtherCount}条。");
  384. if (lstError.Count > 0)
  385. {
  386. AppLog.Error($"未成功上传的数据如下:{TransConvert.ListToString(lstError)}");
  387. WriteMsgToRichTextBox($"未成功上传的数据如下:{TransConvert.ListToString(lstError)}");
  388. }
  389. // 记录上传时间
  390. if (0 < SuccessCount)
  391. {
  392. DateTime time = DateTime.Now;
  393. this.lblTitleLastUpdateTime.Text = $"最近上传时间:{time.ToString("yyyy-MM-dd HH:mm:ss")}";
  394. this.WriteSyncTime(time);
  395. }
  396. }
  397. private string kxjsf(string sss)
  398. {
  399. double sd = Convert.ToDouble(sss);
  400. //double sd = 123.123456;
  401. string temps2 = "0";
  402. string temps3 = "0";
  403. string temps4 = "0";
  404. int tempi2 = 0;
  405. int tempi3 = 0;
  406. int tempi4 = 0;
  407. if (sss.Contains('.'))
  408. {
  409. string[] s1 = sss.Split('.');
  410. if (s1[1].Length > 2)
  411. {
  412. if (s1[1].Length > 2)
  413. {
  414. temps2 = s1[1].Substring(1, 1);
  415. temps3 = s1[1].Substring(2, 1);
  416. }
  417. tempi2 = int.Parse(temps2);
  418. tempi3 = int.Parse(temps3);
  419. if (s1[1].Length > 3)
  420. {
  421. temps4 = s1[1].Substring(3, 1);
  422. }
  423. tempi4 = int.Parse(temps4);
  424. if (tempi3 > 5 || tempi3 < 5)
  425. {
  426. return sd.ToString("0.00");
  427. }
  428. else
  429. {
  430. if (tempi4 != 0)
  431. {
  432. return sd.ToString("0.00");
  433. }
  434. else
  435. {
  436. if (tempi2 == 0 || tempi2 == 2 || tempi2 == 4 || tempi2 == 6 || tempi2 == 8)
  437. {
  438. return sss.Substring(0, 5);
  439. }
  440. else
  441. {
  442. return sd.ToString("0.00");
  443. }
  444. }
  445. }
  446. }
  447. }
  448. return sss;
  449. }
  450. private void cmbColumns_SelectedIndexChanged(object sender, EventArgs e)
  451. {
  452. if (cmbColumns.SelectedItem == null) return;
  453. KeyValuePair<string, Type> obj = (KeyValuePair<string, Type>)cmbColumns.SelectedItem;
  454. if (DictComboBox.ContainsKey(obj.Key))
  455. {
  456. Type selectType = DictComboBox[obj.Key];
  457. switch (selectType.ToString())
  458. {
  459. case "System.DateTime":
  460. UseDateTimeControl();
  461. break;
  462. case "System.Double":
  463. case "System.Int64":
  464. case "System.Int32":
  465. UseNormalControl();
  466. //绑定条件ComboBox
  467. combCondition.DataSource = lstIntOrDouble;
  468. break;
  469. case "System.Byte[]":
  470. case "System.String":
  471. default:
  472. UseNormalControl();
  473. //绑定条件ComboBox
  474. combCondition.DataSource = lstText;
  475. break;
  476. }
  477. }
  478. }
  479. /// <summary>
  480. /// 使用时间类型专用的查询控件组
  481. /// </summary>
  482. private void UseDateTimeControl()
  483. {
  484. if (pnlCheck.Controls.Contains(pnlText))
  485. pnlCheck.Controls.Remove(pnlText);
  486. if (!pnlCheck.Controls.Contains(pnlDate))
  487. {
  488. pnlCheck.Controls.Add(pnlDate);
  489. pnlDate.Visible = true;
  490. pnlDate.Dock = DockStyle.Fill;
  491. }
  492. }
  493. /// <summary>
  494. /// 使用标准的查询控件组
  495. /// </summary>
  496. private void UseNormalControl()
  497. {
  498. if (pnlCheck.Controls.Contains(pnlDate))
  499. pnlCheck.Controls.Remove(pnlDate);
  500. if (!pnlCheck.Controls.Contains(pnlText))
  501. {
  502. pnlCheck.Controls.Add(pnlText);
  503. pnlText.Visible = true;
  504. pnlText.Dock = DockStyle.Fill;
  505. }
  506. }
  507. private void btnFind_Click(object sender, EventArgs e)
  508. {
  509. if (cmbColumns.SelectedValue == null)
  510. {
  511. return;
  512. }
  513. //0.获取数据源数据
  514. this.RefreshData();
  515. //1.合法性检测
  516. if (DictComboBox[cmbColumns.SelectedValue.ToString()].ToString().Equals("System.DateTime"))
  517. {
  518. if (dtpTarget.Value < dtpSource.Value)
  519. {
  520. MessageBox.Show("查询时间需要一个有效的时间范围!");
  521. return;
  522. }
  523. }
  524. else
  525. {
  526. if (this.txtFind.Text.Trim() == "") //为空 认为是取消查询
  527. {
  528. btnCancelFind_Click(sender, e);
  529. return;
  530. }
  531. }
  532. //2.将datagridview中满足条件的项修改背景色
  533. //2.1 判断当前显示的datagridview是否含有旧的查询数据
  534. //2.2 将满足条件的项背景色改为特殊颜色
  535. for (int index = dgvSyncData.Rows.Count - 1; 0 <= index; --index)
  536. {
  537. DataGridViewRow row = dgvSyncData.Rows[index];
  538. //查询列的当前值
  539. string strGuid = row.Cells["GridGuid"].Value.ToString();
  540. if (DictField.Count > 0)
  541. {
  542. var query = DictField.Where(s => s.Value == cmbColumns.SelectedValue.ToString());
  543. if (query.Count() == 1)
  544. {
  545. string strValue = row.Cells[query.ElementAtOrDefault(0).Key].Value.ToString();
  546. //判断是否满足条件
  547. if (false == CheckMatchCondition(strValue))
  548. {
  549. dgvSyncData.Rows.RemoveAt(index);
  550. }
  551. }
  552. }
  553. else
  554. {
  555. string strValue = row.Cells[cmbColumns.SelectedValue.ToString()].Value.ToString();
  556. //判断是否满足条件
  557. if (false == CheckMatchCondition(strValue))
  558. {
  559. dgvSyncData.Rows.RemoveAt(index);
  560. }
  561. }
  562. }
  563. }
  564. private bool CheckMatchCondition(string strValue)
  565. {
  566. if (DictComboBox[cmbColumns.SelectedValue.ToString()].ToString().Equals("System.DateTime"))
  567. {
  568. DateTime dt = DateTime.Now;
  569. if (!DateTime.TryParse(strValue, out dt)) return false;
  570. DateTime dtSource = dtpSource.Value;
  571. DateTime dtTarget = dtpTarget.Value;
  572. DateTime dtValue = dt;
  573. if (dt >= dtSource && dt <= dtTarget)
  574. return true;
  575. else
  576. return false;
  577. }
  578. else
  579. {
  580. string strFindText = this.txtFind.Text.ToString();
  581. bool bReturn = false;
  582. try
  583. {
  584. switch (combCondition.SelectedValue.ToString())
  585. {
  586. case "等于":
  587. bReturn = strValue == strFindText ? true : false;
  588. break;
  589. case "不等于":
  590. bReturn = strValue != strFindText ? true : false;
  591. break;
  592. case "包含":
  593. bReturn = strValue.Contains(strFindText) ? true : false;
  594. break;
  595. case "不包含":
  596. bReturn = !strValue.Contains(strFindText) ? true : false;
  597. break;
  598. case "大于":
  599. bReturn = Convert.ToDouble(strValue) > Convert.ToDouble(strFindText) ? true : false;
  600. break;
  601. case "不小于":
  602. bReturn = Convert.ToDouble(strValue) >= Convert.ToDouble(strFindText) ? true : false;
  603. break;
  604. case "小于":
  605. bReturn = Convert.ToDouble(strValue) < Convert.ToDouble(strFindText) ? true : false;
  606. break;
  607. case "不大于":
  608. bReturn = Convert.ToDouble(strValue) <= Convert.ToDouble(strFindText) ? true : false;
  609. break;
  610. }
  611. }
  612. catch (Exception ex)
  613. {
  614. AppLog.Error(ex.Message);
  615. bReturn = false;
  616. }
  617. return bReturn;
  618. }
  619. }
  620. /// <summary>
  621. /// 获得查询语句(非日期类型)
  622. /// </summary>
  623. /// <param name="strColumnName"></param>
  624. /// <param name="strColumnType"></param>
  625. /// <param name="strCondition"></param>
  626. /// <param name="strValue"></param>
  627. /// <returns></returns>
  628. private string GetSelectString(string strColumnName, string strCondition, string strValue)
  629. {
  630. string strCondi = "";
  631. switch (strCondition)
  632. {
  633. case "等于":
  634. strCondi = "=";
  635. break;
  636. case "不等于":
  637. strCondi = "<>";
  638. break;
  639. case "包含":
  640. strCondi = "like";
  641. break;
  642. case "不包含":
  643. strCondi = "not like";
  644. break;
  645. case "大于":
  646. strCondi = ">";
  647. break;
  648. case "不小于":
  649. strCondi = ">=";
  650. break;
  651. case "小于":
  652. strCondi = "<";
  653. break;
  654. case "不大于":
  655. strCondi = "<=";
  656. break;
  657. }
  658. if (strCondi == "like" || strCondi == "not like")
  659. return string.Format("{0} {1} '%{2}%'", strColumnName, strCondi, strValue);
  660. else
  661. return string.Format("{0} {1} '{2}'", strColumnName, strCondi, strValue);
  662. }
  663. private void btnCancelFind_Click(object sender, EventArgs e)
  664. {
  665. foreach (DataGridViewRow dgvrow in dgvSyncData.Rows)
  666. {
  667. if (dgvrow.Cells[0].Value != null && dgvrow.Cells[0].Value.ToString() == "True")
  668. dgvrow.Cells[0].Value = false;
  669. if (dgvrow.Index % 2 == 1)
  670. {
  671. dgvrow.DefaultCellStyle.BackColor = Color.WhiteSmoke;
  672. }
  673. else
  674. {
  675. dgvrow.DefaultCellStyle.BackColor = Color.White;
  676. }
  677. }
  678. }
  679. private void dgvSyncData_CellValueChanged(object sender, DataGridViewCellEventArgs e)
  680. {
  681. //只有第一列“选择列”时触发
  682. if (e.ColumnIndex == 0)
  683. {
  684. if (dgvSyncData.Rows[e.RowIndex].Cells[0].Value.ToString() == "True")
  685. dgvSyncData.Rows[e.RowIndex].DefaultCellStyle.BackColor = FinedBackColor;
  686. else
  687. {
  688. if (e.RowIndex % 2 == 1)
  689. {
  690. dgvSyncData.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.WhiteSmoke;
  691. }
  692. else
  693. {
  694. dgvSyncData.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.White;
  695. }
  696. }
  697. }
  698. }
  699. public void WriteMsgToRichTextBox(string strMsg)
  700. {
  701. Invoke(new MethodInvoker(delegate ()
  702. {
  703. this.rtxtLog.Text += string.Format("{0} 日期: {1}\n", strMsg,DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  704. }));
  705. }
  706. /// <summary>
  707. ///
  708. /// </summary>
  709. /// <param name="message"></param>
  710. private void WriteSyncTime(DateTime time)
  711. {
  712. try
  713. {
  714. /* 创建文件夹 */
  715. string logDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Cache");
  716. if (!Directory.Exists(logDirectory))
  717. {
  718. Directory.CreateDirectory(logDirectory);
  719. }
  720. /* 更新时间 */
  721. string file = Path.Combine(logDirectory, $"SyncTime.bin");
  722. Dictionary<string, string> times = this.ReadSyncTime() ?? new Dictionary<string, string>();
  723. if (true == times.ContainsKey(this.syncInstrumentItem.Code))
  724. {
  725. times[this.syncInstrumentItem.Code] = time.ToString("yyyy-MM-dd HH:mm:ss");
  726. }
  727. else
  728. {
  729. times.Add(this.syncInstrumentItem.Code, time.ToString("yyyy-MM-dd HH:mm:ss"));
  730. }
  731. /* 写入文件 */
  732. File.WriteAllText(file, JsonConvert.SerializeObject(times, Formatting.Indented));
  733. }
  734. catch (Exception exception)
  735. {
  736. Invoke(new MethodInvoker(delegate ()
  737. {
  738. this.rtxtLog.Text += $"记录同步时间出错!错误信息:{exception.Message} 日期: {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}\n";
  739. }));
  740. }
  741. }
  742. /// <summary>
  743. ///
  744. /// </summary>
  745. private Dictionary<string, string> ReadSyncTime()
  746. {
  747. Dictionary<string, string> times = null;
  748. if (File.Exists(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Cache", $"SyncTime.bin")))
  749. {
  750. try
  751. {
  752. using (StreamReader reader = new StreamReader(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Cache", $"SyncTime.bin"), Encoding.UTF8))
  753. {
  754. try
  755. {
  756. string json = reader.ReadToEnd();
  757. times = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
  758. }
  759. catch
  760. {
  761. }
  762. finally
  763. {
  764. reader.Close();
  765. reader.Dispose();
  766. }
  767. }
  768. }
  769. catch (Exception exception)
  770. {
  771. Debug.WriteLine(exception.Message);
  772. }
  773. }
  774. return times;
  775. }
  776. }
  777. }