CNAS取数仪器端升级
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

523 行
21KB

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