CNAS取数仪器端升级
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

574 lines
23KB

  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 Newtonsoft.Json;
  10. using CnasSynchronusClient;
  11. using CNAS_DBSync;
  12. using System.Configuration;
  13. using CnasSynchrousModel;
  14. using CnasSynchronousCommon;
  15. namespace CNAS_RunSync
  16. {
  17. public partial class ucSyncShow : UserControl
  18. {
  19. private string delayDays= FileOperation.GetSystemFormatConfigData().ShowDelayDays;
  20. private SyncInstrumentItemInfo syncInstrumentItem = new SyncInstrumentItemInfo();
  21. //private Dictionary<string, DataTable> dictSourceTables = new Dictionary<string, DataTable>();
  22. private DataTable dtSource = new DataTable(); //当前显示数据源
  23. private Dictionary<string, DataRow> dictSource = new Dictionary<string, DataRow>();
  24. private Dictionary<string, Type> DictComboBox = new Dictionary<string, Type>(); //ComboBox数据源
  25. private List<string> lstIntOrDouble = new List<string>() {"等于","不等于","大于","小于","不大于","不小于" };
  26. private List<string> lstText = new List<string>() { "等于", "不等于", "包含", "不包含"};
  27. private Color FinedBackColor = Color.LightCyan; //查询后选中项
  28. Dictionary<string, string> DictField = new Dictionary<string, string>();
  29. //需要存在一个仪器才能正常显示数据
  30. public ucSyncShow(SyncInstrumentItemInfo syncInstrumentItem)
  31. {
  32. InitializeComponent();
  33. dgvSyncData.AutoGenerateColumns = false;
  34. dgvSyncData.RowHeadersVisible = false;
  35. this.syncInstrumentItem = syncInstrumentItem;
  36. }
  37. private void ucSyncShow_Load(object sender, EventArgs e)
  38. {
  39. BindData();
  40. }
  41. /// <summary>
  42. /// 绑定数据
  43. /// </summary>
  44. private void BindData()
  45. {
  46. if (this.syncInstrumentItem == null) return;
  47. this.lblTitle.Text = string.Format("当前仪器:【{0}】", syncInstrumentItem.Code);
  48. if (syncInstrumentItem.LstSyncPramas == null) return;
  49. if (syncInstrumentItem.SyncInstrumentDSInfo == null) return;
  50. //if (syncInstrumentItem.SyncInstrumentDSInfo.Path == null) return;
  51. if (syncInstrumentItem.SyncInstrumentDSInfo.InstrumentDataSourceType == DataSourceType.None) return;
  52. //清空现有绑定
  53. DictComboBox.Clear();
  54. dictSource.Clear();
  55. //加载相关数据
  56. //1.1根据仪器类型加载本地存储的中英文字段说明映射
  57. if (syncInstrumentItem.LstSyncPramas.Count > 0)
  58. {
  59. InstrumentDescribeZH describeZH = new InstrumentDescribeZH(syncInstrumentItem.InstruType, syncInstrumentItem.LstSyncPramas[0].SourceTable);
  60. describeZH.GetFieldDescribe();
  61. DictField = describeZH.DictField;
  62. }
  63. //2.datagridview中绑定数据(绑定的是从数据源中读取的数据)
  64. //2.1 根据映射表,创建datagridviewcolumn/和绑定数据列
  65. if (syncInstrumentItem.LstSyncPramas.Count <= 0) return;
  66. foreach (var item in syncInstrumentItem.LstSyncPramas)
  67. {
  68. string strColumnName = item.SourceField;
  69. if (DictField.ContainsKey(strColumnName))
  70. strColumnName = DictField[strColumnName];
  71. AddDatagridColumn(dgvSyncData, item.SourceField, strColumnName, 100);
  72. }
  73. AddDatagridColumn(dgvSyncData, "GridGuid", "GridGuid", 100, false);
  74. //2.2 获取数据源数据,构建datagridviewcell
  75. //2.2.1 获取数据源数据
  76. var query = syncInstrumentItem.LstSyncPramas.Where(s => s.IfDateField == true).ToList<SyncParamasInfo>();
  77. if (query.Count == 1)
  78. {
  79. object[] obj = new object[]
  80. {
  81. syncInstrumentItem.LstSyncPramas[0].SourceTable,
  82. query[0].SourceField,
  83. DateTime.Now.AddDays(Convert.ToInt32(delayDays)).ToString("yyyy-MM-dd HH:mm:ss")
  84. };
  85. InstrumentData instrumentData = InstrumentDataFact.CreateInstrumentDataSource(syncInstrumentItem.SyncInstrumentDSInfo, obj);
  86. dtSource = instrumentData.GetInstrumentDataByDate();
  87. }
  88. //2.2.2 构建datagridviewcell
  89. foreach (DataRow dr in dtSource.Rows)
  90. {
  91. DataGridViewRow dataGridViewRow = new DataGridViewRow();
  92. foreach (DataGridViewColumn dataGridViewColumn in dgvSyncData.Columns)
  93. {
  94. if (dtSource.Columns.Contains(dataGridViewColumn.Name))
  95. AddDataTextCell(dataGridViewRow, dataGridViewColumn, dr);
  96. }
  97. //添加GUID值
  98. string strGuid = Guid.NewGuid().ToString();
  99. DataGridViewTextBoxCell txtCell = new DataGridViewTextBoxCell
  100. {
  101. Value = strGuid
  102. };
  103. dataGridViewRow.Cells.Add(txtCell);
  104. dgvSyncData.Rows.Add(dataGridViewRow);
  105. dictSource.Add(strGuid, dr);
  106. }
  107. //3.初始化查询相关内容
  108. //3.1 绑定Combobox数据源
  109. foreach (DataColumn dc in dtSource.Columns)
  110. {
  111. if (syncInstrumentItem.LstSyncPramas.Where(s => s.SourceField == dc.ColumnName.ToUpper()).LongCount<SyncParamasInfo>() > 0)
  112. {
  113. string strColumnName = dc.ColumnName.ToUpper();
  114. if (DictField.ContainsKey(strColumnName))
  115. strColumnName = DictField[strColumnName];
  116. DictComboBox.Add(strColumnName, dc.DataType);
  117. }
  118. }
  119. if (DictComboBox.Count > 0)
  120. {
  121. BindingSource bsComboBox = new BindingSource
  122. {
  123. DataSource = DictComboBox
  124. };
  125. cmbColumns.DataSource = bsComboBox;
  126. cmbColumns.ValueMember = "Key";
  127. cmbColumns.DisplayMember = "Key";
  128. }
  129. }
  130. /// <summary>
  131. /// 添加datagridview的列
  132. /// </summary>
  133. /// <param name="dgvShow"></param>
  134. /// <param name="strColumnName"></param>
  135. /// <param name="strColumnHeaderText"></param>
  136. /// <param name="Width"></param>
  137. /// <param name="bVisible"></param>
  138. private void AddDatagridColumn(DataGridView dgvShow,string strColumnName,string strColumnHeaderText,int Width,bool bVisible=true)
  139. {
  140. DataGridViewColumn Column = new DataGridViewColumn()
  141. {
  142. Name = strColumnName,
  143. HeaderText = strColumnHeaderText,
  144. Width = Width,
  145. Visible = bVisible,
  146. CellTemplate = new DataGridViewTextBoxCell()
  147. };
  148. //设置文本对齐方式
  149. Column.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
  150. //设置该列背景颜色
  151. dgvShow.Columns.Add(Column);
  152. }
  153. /// <summary>
  154. /// 添加datagridview的单元格
  155. /// </summary>
  156. /// <param name="dataGridViewRow"></param>
  157. /// <param name="dataGridViewColumn"></param>
  158. /// <param name="dr"></param>
  159. private void AddDataTextCell(DataGridViewRow dataGridViewRow, DataGridViewColumn dataGridViewColumn,DataRow dr)
  160. {
  161. DataGridViewTextBoxCell txtCell = new DataGridViewTextBoxCell();
  162. txtCell.Value = Convert.ToString(dr[dataGridViewColumn.Name]);
  163. dataGridViewRow.Cells.Add(txtCell);
  164. }
  165. private void btnRunData_Click(object sender, EventArgs e)
  166. {
  167. //组织上传数据
  168. if (dgvSyncData.Columns.Count <= 0) return;
  169. DataTable dtReadySource = dtSource.Clone();
  170. GetUpLoadData(ref dtReadySource);
  171. if (dtReadySource.Rows.Count <= 0)
  172. MessageBox.Show("未能获得上传数据,请查询筛选后重试!");
  173. //执行上传
  174. RunUpLoad(dtReadySource);
  175. }
  176. /// <summary>
  177. /// 获取上传数据
  178. /// </summary>
  179. /// <param name="dtReadySource">准备上传的数据</param>
  180. private void GetUpLoadData(ref DataTable dtReadySource)
  181. {
  182. foreach (DataGridViewRow dgvRow in dgvSyncData.Rows)
  183. {
  184. if (dgvRow.DefaultCellStyle.BackColor == FinedBackColor)
  185. {
  186. string strGuid = dgvRow.Cells["GridGuid"].Value.ToString();
  187. if (!dictSource.ContainsKey(strGuid)) continue;
  188. DataRow dr = dictSource[strGuid];
  189. DataRow drReady = dtReadySource.NewRow();
  190. foreach (DataColumn dc in dtReadySource.Columns)
  191. {
  192. if (dr.Table.Columns.Contains(dc.ColumnName))
  193. drReady[dc.ColumnName] = dr[dc.ColumnName];
  194. }
  195. dtReadySource.Rows.Add(drReady);
  196. }
  197. }
  198. }
  199. private void RunUpLoad(DataTable dtReadySource)
  200. {
  201. //根据映射字段获取准备上传的所有数据
  202. if (dtReadySource == null || dtReadySource.Rows.Count <= 0) return;
  203. //构建准备插入的数据
  204. DataTable dtTarget = CnasDataOperationFact.CnasDataOperation().GetCNASTablesStruct(syncInstrumentItem.LstSyncPramas[0].TargetTable, syncInstrumentItem.SyncTargetDBInfo);
  205. if (dtTarget.Columns.Count <= 0)
  206. {
  207. MessageBox.Show("未能成功读取CNAS数据库列,请检查数据库配置。");
  208. return;
  209. }
  210. //创建插入操作类
  211. CnasInsertOperation insertOperation = new CnasInsertOperation{syncInstrumentItem = syncInstrumentItem};
  212. //逐行插入数据到内存表
  213. string strErrorMsg = insertOperation.CreateInputData(dtReadySource,ref dtTarget);
  214. if (strErrorMsg != "")
  215. {
  216. MessageBox.Show(strErrorMsg);
  217. return;
  218. }
  219. if (dtTarget.Rows.Count <= 0)
  220. {
  221. MessageBox.Show("未能获取到符合要求的数据,请检查配置或联系管理员。");
  222. return;
  223. }
  224. //检查数据合法性
  225. insertOperation.CheckInsertDataFormat(dtTarget, ref strErrorMsg);
  226. if (strErrorMsg != "")
  227. {
  228. MessageBox.Show(strErrorMsg);
  229. return;
  230. }
  231. //逐行执行插入内存表数据到数据库中
  232. int ErrorCount = 0;
  233. int SuccessCount = 0;
  234. int OtherCount = 0;
  235. List<DataRow> lstError = new List<DataRow>();
  236. foreach (DataRow dr in dtTarget.Rows)
  237. {
  238. dr.AcceptChanges();
  239. int iReturn = CnasDataOperationFact.CnasDataOperation().InsertDataToCNASTable(GlobalCommonOperation.ConvertDataRowToTable(dr), syncInstrumentItem.SyncTargetDBInfo,syncInstrumentItem.LstSyncPramas, syncInstrumentItem.CnasInstrumentColumn,syncInstrumentItem.lstFixedValue);
  240. if (iReturn <= 0) //此时出现问题
  241. {
  242. if (iReturn == -1)
  243. {
  244. AppLog.ServiceInfo("数据库连接中断,终止本次上传。");
  245. break; //此时数据库连接中断,直接跳出循环,结束本次数据同步传输
  246. }
  247. else if (iReturn == -2) //等于-2表示插入准备更新时发现数据一致,不再执行
  248. {
  249. OtherCount++;
  250. }
  251. else
  252. {
  253. ErrorCount++;
  254. /*需要转换一下,否则会将整个dt全部写入日志*/
  255. lstError.Add(GlobalCommonOperation.ConvertDataRowToTable(dr).Rows[0]);
  256. }
  257. }
  258. else
  259. {
  260. SuccessCount++;
  261. }
  262. }
  263. ////判断返回结果
  264. //if (lstError.Count <= 0)
  265. //{
  266. // MessageBox.Show("上传完成!");
  267. //}
  268. //else
  269. //{
  270. // AppLog.Error($"未成功上传的数据如下:{TransConvert.ListToString(lstError)}");
  271. // MessageBox.Show("上传过程中发生异常,存在部分数据未成功上传,请联系管理员!");
  272. //}
  273. MessageBox.Show( $"上传操作完成!其中成功{SuccessCount}条,失败{ErrorCount}条,其他{OtherCount}条。");
  274. if(lstError.Count> 0)
  275. AppLog.Error($"未成功上传的数据如下:{TransConvert.ListToString(lstError)}");
  276. }
  277. private void cmbColumns_SelectedIndexChanged(object sender, EventArgs e)
  278. {
  279. if (cmbColumns.SelectedItem == null) return;
  280. KeyValuePair<string, Type> obj = (KeyValuePair<string, Type>)cmbColumns.SelectedItem;
  281. if (DictComboBox.ContainsKey(obj.Key))
  282. {
  283. Type selectType = DictComboBox[obj.Key];
  284. switch (selectType.ToString())
  285. {
  286. case "System.DateTime":
  287. UseDateTimeControl();
  288. break;
  289. case "System.Double":
  290. case "System.Int64":
  291. case "System.Int32":
  292. UseNormalControl();
  293. //绑定条件ComboBox
  294. combCondition.DataSource = lstIntOrDouble ;
  295. break;
  296. case "System.Byte[]":
  297. case "System.String":
  298. default:
  299. UseNormalControl();
  300. //绑定条件ComboBox
  301. combCondition.DataSource = lstText;
  302. break;
  303. }
  304. }
  305. }
  306. /// <summary>
  307. /// 使用时间类型专用的查询控件组
  308. /// </summary>
  309. private void UseDateTimeControl()
  310. {
  311. if (pnlCheck.Controls.Contains(pnlText))
  312. pnlCheck.Controls.Remove(pnlText);
  313. if (!pnlCheck.Controls.Contains(pnlDate))
  314. {
  315. pnlCheck.Controls.Add(pnlDate);
  316. pnlDate.Visible = true;
  317. pnlDate.Dock = DockStyle.Fill;
  318. }
  319. }
  320. /// <summary>
  321. /// 使用标准的查询控件组
  322. /// </summary>
  323. private void UseNormalControl()
  324. {
  325. if (pnlCheck.Controls.Contains(pnlDate))
  326. pnlCheck.Controls.Remove(pnlDate);
  327. if (!pnlCheck.Controls.Contains(pnlText))
  328. {
  329. pnlCheck.Controls.Add(pnlText);
  330. pnlText.Visible = true;
  331. pnlText.Dock = DockStyle.Fill;
  332. }
  333. }
  334. /// <summary>
  335. /// 查询满足满足条件的项
  336. /// </summary>
  337. /// <param name="sender"></param>
  338. /// <param name="e"></param>
  339. private void btnFind_Click(object sender, EventArgs e)
  340. {
  341. if (cmbColumns.SelectedValue == null) return;
  342. //1.合法性检测
  343. if (DictComboBox[cmbColumns.SelectedValue.ToString()].ToString().Equals("System.DateTime"))
  344. {
  345. if (dtpTarget.Value < dtpSource.Value)
  346. {
  347. MessageBox.Show("查询时间需要一个有效的时间范围!");
  348. return;
  349. }
  350. }
  351. else
  352. {
  353. if (this.txtFind.Text.Trim() == "") //为空 认为是取消查询
  354. {
  355. btnCancelFind_Click(sender, e);
  356. return;
  357. }
  358. }
  359. //2.将datagridview中满足条件的项修改背景色
  360. //2.1 判断当前显示的datagridview是否含有旧的查询数据
  361. //2.2 将满足条件的项背景色改为特殊颜色
  362. foreach (DataGridViewRow dgvrow in dgvSyncData.Rows)
  363. {
  364. dgvrow.DefaultCellStyle.BackColor = Color.White;
  365. //查询列的当前值
  366. string strGuid = dgvrow.Cells["GridGuid"].Value.ToString();
  367. if (DictField.Count > 0)
  368. {
  369. var query = DictField.Where(s => s.Value == cmbColumns.SelectedValue.ToString());
  370. if (query.Count() == 1)
  371. {
  372. string strValue = dgvrow.Cells[query.ElementAtOrDefault(0).Key].Value.ToString();
  373. //判断是否满足条件
  374. if (CheckMatchCondition(strValue))
  375. {
  376. dgvrow.DefaultCellStyle.BackColor = FinedBackColor;
  377. }
  378. }
  379. }
  380. else
  381. {
  382. string strValue = dgvrow.Cells[cmbColumns.SelectedValue.ToString()].Value.ToString();
  383. //判断是否满足条件
  384. if (CheckMatchCondition(strValue))
  385. {
  386. dgvrow.DefaultCellStyle.BackColor = FinedBackColor;
  387. }
  388. }
  389. }
  390. }
  391. private bool CheckMatchCondition(string strValue)
  392. {
  393. if (DictComboBox[cmbColumns.SelectedValue.ToString()].ToString().Equals("System.DateTime"))
  394. {
  395. DateTime dt= DateTime.Now;
  396. if (!DateTime.TryParse(strValue, out dt)) return false;
  397. DateTime dtSource = dtpSource.Value;
  398. DateTime dtTarget = dtpTarget.Value;
  399. DateTime dtValue = dt;
  400. if (dt >= dtSource && dt <= dtTarget)
  401. return true;
  402. else
  403. return false;
  404. }
  405. else
  406. {
  407. string strFindText = this.txtFind.Text.ToString();
  408. bool bReturn = false;
  409. try
  410. {
  411. switch (combCondition.SelectedValue.ToString())
  412. {
  413. case "等于":
  414. bReturn = strValue == strFindText ? true : false;
  415. break;
  416. case "不等于":
  417. bReturn = strValue != strFindText ? true : false;
  418. break;
  419. case "包含":
  420. bReturn = strValue.Contains(strFindText) ? true : false;
  421. break;
  422. case "不包含":
  423. bReturn = !strValue.Contains(strFindText) ? true : false;
  424. break;
  425. case "大于":
  426. bReturn = Convert.ToDouble(strValue) > Convert.ToDouble(strFindText) ? true : false;
  427. break;
  428. case "不小于":
  429. bReturn = Convert.ToDouble(strValue) >= Convert.ToDouble(strFindText) ? true : false;
  430. break;
  431. case "小于":
  432. bReturn = Convert.ToDouble(strValue) < Convert.ToDouble(strFindText) ? true : false;
  433. break;
  434. case "不大于":
  435. bReturn = Convert.ToDouble(strValue) <= Convert.ToDouble(strFindText) ? true : false;
  436. break;
  437. }
  438. }
  439. catch (Exception ex)
  440. {
  441. AppLog.Error(ex.Message);
  442. bReturn = false;
  443. }
  444. return bReturn;
  445. }
  446. }
  447. /// <summary>
  448. /// 获得查询语句(非日期类型)
  449. /// </summary>
  450. /// <param name="strColumnName"></param>
  451. /// <param name="strColumnType"></param>
  452. /// <param name="strCondition"></param>
  453. /// <param name="strValue"></param>
  454. /// <returns></returns>
  455. private string GetSelectString(string strColumnName,string strCondition, string strValue)
  456. {
  457. string strCondi = "";
  458. switch (strCondition)
  459. {
  460. case "等于":
  461. strCondi = "=";
  462. break;
  463. case "不等于":
  464. strCondi = "<>";
  465. break;
  466. case "包含":
  467. strCondi = "like";
  468. break;
  469. case "不包含":
  470. strCondi = "not like";
  471. break;
  472. case "大于":
  473. strCondi = ">";
  474. break;
  475. case "不小于":
  476. strCondi = ">=";
  477. break;
  478. case "小于":
  479. strCondi = "<";
  480. break;
  481. case "不大于":
  482. strCondi = "<=";
  483. break;
  484. }
  485. if (strCondi == "like" || strCondi == "not like")
  486. return string.Format("{0} {1} '%{2}%'", strColumnName, strCondi, strValue);
  487. else
  488. return string.Format("{0} {1} '{2}'",strColumnName,strCondi,strValue);
  489. }
  490. private void btnConfig_Click(object sender, EventArgs e)
  491. {
  492. if (new frmOperationPwd().ShowDialog() == DialogResult.OK)
  493. {
  494. frmSyncParams frmSyncConfig = new frmSyncParams(syncInstrumentItem);
  495. frmSyncConfig.ParamsChangedDelegate = delegate (SyncInstrumentItemInfo instrumentItemInfo)
  496. {
  497. syncInstrumentItem = instrumentItemInfo;
  498. //重新绑定数据
  499. dgvSyncData.DataSource = null;
  500. dgvSyncData.Rows.Clear();
  501. dgvSyncData.Columns.Clear();
  502. combCondition.DataSource = null;
  503. cmbColumns.DataSource = null;
  504. BindData();
  505. };
  506. frmSyncConfig.ShowDialog();
  507. }
  508. }
  509. private void btnCancelFind_Click(object sender, EventArgs e)
  510. {
  511. foreach (DataGridViewRow dgvrow in dgvSyncData.Rows)
  512. {
  513. if (dgvrow.DefaultCellStyle.BackColor != Color.White)
  514. dgvrow.DefaultCellStyle.BackColor = Color.White;
  515. }
  516. }
  517. private void btnAutoService_Click(object sender, EventArgs e)
  518. {
  519. if (new frmOperationPwd().ShowDialog() == DialogResult.OK)
  520. {
  521. frmServiceConfig frmServiceConfig = new frmServiceConfig();
  522. frmServiceConfig.ShowDialog();
  523. }
  524. }
  525. }
  526. }