CNAS取数仪器端升级
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

533 строки
22KB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Windows.Forms;
  10. using System.Xml.Linq;
  11. using System.Xml.Serialization;
  12. namespace CNAS_DBSync
  13. {
  14. public delegate void ReferenceChangeSyncParamHanlder(SyncInstrumentItemInfo syncInstrumentItem);
  15. public partial class frmSyncParams : Form
  16. {
  17. public List<SyncInstrumentItemInfo> lstSyncInstrument = new List<SyncInstrumentItemInfo>();
  18. public SyncInstrumentItemInfo currentSyncItem = new SyncInstrumentItemInfo();
  19. public Dictionary<string, DataTable> dictInstruTables = new Dictionary<string, DataTable>();
  20. private log4net.ILog log = log4net.LogManager.GetLogger("frmSyncParams");
  21. private SyncInstrumentItemInfo syncInstrumentItem;
  22. private string strMode = "";
  23. public ReferenceChangeSyncParamHanlder ParamsChangedDelegate;
  24. //public frmSyncParams()
  25. //{
  26. // InitializeComponent();
  27. // dgvInstrument.AutoGenerateColumns = false;
  28. // dgvInstrument.RowHeadersVisible = false;
  29. // dgvInstruDS.AutoGenerateColumns = false;
  30. // dgvInstruDS.RowHeadersVisible = false;
  31. // dgvCnas.AutoGenerateColumns = false;
  32. // dgvCnas.RowHeadersVisible = false;
  33. // dgvMapping.AutoGenerateColumns = false;
  34. // dgvMapping.RowHeadersVisible = false;
  35. //}
  36. public frmSyncParams(SyncInstrumentItemInfo syncInstrumentItem=null)
  37. {
  38. InitializeComponent();
  39. dgvInstrument.AutoGenerateColumns = false;
  40. dgvInstrument.RowHeadersVisible = false;
  41. dgvInstruDS.AutoGenerateColumns = false;
  42. dgvInstruDS.RowHeadersVisible = false;
  43. dgvCnas.AutoGenerateColumns = false;
  44. dgvCnas.RowHeadersVisible = false;
  45. dgvMapping.AutoGenerateColumns = false;
  46. dgvMapping.RowHeadersVisible = false;
  47. if (syncInstrumentItem != null)
  48. {
  49. strMode = "Reference";
  50. this.syncInstrumentItem = syncInstrumentItem;
  51. this.btnAdd.Visible = false;
  52. this.btnDel.Visible = false;
  53. }
  54. }
  55. private void frmSyncParams_Load(object sender, EventArgs e)
  56. {
  57. if (syncInstrumentItem == null)
  58. {//读取本地文件中存储的配置信息
  59. XmlSerializer serializer = new XmlSerializer(lstSyncInstrument.GetType());
  60. FileStream stream = new FileStream(FileHelper.getBasePath() + "/Data/SyncInStrumentData.xml", FileMode.Open);
  61. lstSyncInstrument = (List<SyncInstrumentItemInfo>)serializer.Deserialize(stream);
  62. stream.Close();
  63. }
  64. else
  65. {
  66. lstSyncInstrument = new List<SyncInstrumentItemInfo>() { syncInstrumentItem };
  67. }
  68. //绑定数据源,填写相关内容
  69. if(lstSyncInstrument.Count!=0)
  70. dgvInstrument.DataSource = new BindingList<SyncInstrumentItemInfo>(lstSyncInstrument);
  71. }
  72. /// <summary>
  73. /// 保存当前设置到本地
  74. /// </summary>
  75. /// <param name="sender"></param>
  76. /// <param name="e"></param>
  77. private void btnSave_Click(object sender, EventArgs e)
  78. {
  79. //将配置好的信息存储到本地文件中
  80. try
  81. {
  82. if (strMode == "Reference")
  83. {
  84. ////使用Linq To XML 直接修改存储,不能直接全部保存,会覆盖其他操作
  85. //XDocument doc = XDocument.Load(FileHelper.getBasePath() + "/Data/SyncInStrumentData.xml");
  86. //var query = from p in doc.Elements("SyncInstrumentItemInfo")
  87. // where p.Element("GUID").Value == syncInstrumentItem.GUID
  88. // select p;
  89. //XElement item = query.SingleOrDefault();
  90. //if (item != null)
  91. //{
  92. //}
  93. //1.先加载所有数据 2.替换当前数据 3.重新保存
  94. List<SyncInstrumentItemInfo> lstDB = new List<SyncInstrumentItemInfo>();
  95. XmlSerializer serializer = new XmlSerializer(lstDB.GetType());
  96. FileStream stream = new FileStream(FileHelper.getBasePath() + "/Data/SyncInStrumentData.xml", FileMode.Open);
  97. lstDB = (List<SyncInstrumentItemInfo>)serializer.Deserialize(stream);
  98. stream.Close();
  99. var item = lstDB.Where(p => p.GUID == syncInstrumentItem.GUID).SingleOrDefault();
  100. if (item != null)
  101. {
  102. item = syncInstrumentItem;
  103. }
  104. else
  105. {
  106. lstDB.Add(syncInstrumentItem);
  107. }
  108. TextWriter writer = new StreamWriter(FileHelper.getBasePath() + "/Data/SyncInStrumentData.xml");
  109. serializer.Serialize(writer, lstDB);
  110. writer.Close();
  111. this.ParamsChangedDelegate(syncInstrumentItem);
  112. }
  113. else
  114. {
  115. XmlSerializer serializer = new XmlSerializer(lstSyncInstrument.GetType());
  116. TextWriter writer = new StreamWriter(FileHelper.getBasePath() + "/Data/SyncInStrumentData.xml");
  117. serializer.Serialize(writer, lstSyncInstrument);
  118. writer.Close();
  119. }
  120. MessageBox.Show("保存成功!");
  121. }
  122. catch (Exception ex)
  123. {
  124. MessageBox.Show("保存失败!错误信息为:"+ex.Message.ToString());
  125. }
  126. }
  127. /// <summary>
  128. /// 新增仪器
  129. /// </summary>
  130. /// <param name="sender"></param>
  131. /// <param name="e"></param>
  132. private void btnAdd_Click(object sender, EventArgs e)
  133. {
  134. frmInstrumentCode frmCode = new frmInstrumentCode(lstSyncInstrument);
  135. frmCode.InstrumentDelegate = delegate(SyncInstrumentItemInfo Instrumentitem)
  136. {
  137. lstSyncInstrument.Add(Instrumentitem);
  138. };
  139. frmCode.ShowDialog();
  140. //绑定数据
  141. dgvInstrument.DataSource = new BindingList<SyncInstrumentItemInfo>(lstSyncInstrument);
  142. }
  143. /// <summary>
  144. /// 删除仪器
  145. /// </summary>
  146. /// <param name="sender"></param>
  147. /// <param name="e"></param>
  148. private void btnDel_Click(object sender, EventArgs e)
  149. {
  150. if (dgvInstrument.Rows.Count <= 0) return;
  151. //当前选中行
  152. string strInstrumentCode = this.dgvInstrument.Rows[this.dgvInstrument.CurrentRow.Index].Cells[0].Value.ToString();
  153. //找到数据源中数据,删除
  154. var lstitem = lstSyncInstrument.Where(s => s.Code == strInstrumentCode).ToList<SyncInstrumentItemInfo>();
  155. if (lstitem == null)
  156. return;
  157. else if (lstitem.Count >= 1)
  158. {
  159. foreach (var item in lstitem)
  160. {
  161. lstSyncInstrument.Remove(item);
  162. }
  163. }
  164. //绑定数据
  165. dgvInstrument.DataSource = new BindingList<SyncInstrumentItemInfo>();
  166. dgvInstrument.DataSource = new BindingList<SyncInstrumentItemInfo>(lstSyncInstrument);
  167. }
  168. //双击单元格时,触发修改
  169. private void dgvInstrument_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
  170. {
  171. if (dgvInstrument.Rows.Count <= 0) return;
  172. //当前选中单元格
  173. string strInstrumentCode = this.dgvInstrument.Rows[this.dgvInstrument.CurrentRow.Index].Cells[0].Value.ToString();
  174. frmInstrumentCode frmCode = new frmInstrumentCode(lstSyncInstrument, strInstrumentCode);
  175. frmCode.InstrumentDelegate = delegate (SyncInstrumentItemInfo Instrumentitem)
  176. {
  177. var lstInstrument = lstSyncInstrument.Where(s => s.Code == strInstrumentCode).ToList<SyncInstrumentItemInfo>();
  178. if (lstInstrument.Count == 1)
  179. {
  180. lstInstrument[0].Code = Instrumentitem.Code;
  181. }
  182. };
  183. frmCode.ShowDialog();
  184. //绑定数据
  185. dgvInstrument.DataSource = new BindingList<SyncInstrumentItemInfo>(lstSyncInstrument);
  186. }
  187. private void dgvInstrument_SelectionChanged(object sender, EventArgs e)
  188. {
  189. if (dgvInstrument.Rows.Count <= 0) return;
  190. if (dgvInstrument.Rows[dgvInstrument.CurrentRow.Index].Cells[0].Value == null) return;
  191. //当前选中单元格
  192. string strInstrumentCode = this.dgvInstrument.Rows[this.dgvInstrument.CurrentRow.Index].Cells[0].Value.ToString();
  193. var lstInstrument = lstSyncInstrument.Where(s => s.Code == strInstrumentCode).ToList<SyncInstrumentItemInfo>();
  194. if (lstInstrument.Count == 1)
  195. {
  196. currentSyncItem = lstInstrument[0];
  197. if (currentSyncItem.SyncInstrumentDSInfo != null&& currentSyncItem.SyncInstrumentDSInfo.InstrumentDataSourceType!=DataSourceType.None)
  198. {
  199. dgvMapping.DataSource = new BindingList<SyncParamasInfo>(currentSyncItem.LstSyncPramas);
  200. }
  201. else
  202. {
  203. cbxCnas.DataSource = null;
  204. cbxInstrument.DataSource = null;
  205. dgvInstruDS.DataSource = null;
  206. dgvCnas.DataSource = null;
  207. dgvMapping.DataSource = new BindingList<SyncParamasInfo>();
  208. }
  209. }
  210. else
  211. {
  212. cbxCnas.DataSource = null;
  213. cbxInstrument.DataSource = null;
  214. dgvInstruDS.DataSource = null;
  215. dgvCnas.DataSource = null;
  216. dgvMapping.DataSource =new BindingList<SyncParamasInfo>();
  217. }
  218. }
  219. /// <summary>
  220. /// 切换选中表时发生
  221. /// </summary>
  222. /// <param name="sender"></param>
  223. /// <param name="e"></param>
  224. private void cbxInstrument_SelectedIndexChanged(object sender, EventArgs e)
  225. {
  226. if (cbxInstrument.SelectedValue == null) return;
  227. string strTableName_Instru = cbxInstrument.SelectedValue.ToString();
  228. if (dictInstruTables.ContainsKey(strTableName_Instru))
  229. {
  230. DataTable dt = dictInstruTables[strTableName_Instru];
  231. if (dt != null && dt.Rows.Count > 0)
  232. {
  233. //DataRow drColumn = dt.Rows[0]; //第一行是列名
  234. DataTable dtInstruShow = new DataTable();
  235. dtInstruShow.Columns.Add("InstruFieldName");
  236. dtInstruShow.Columns.Add("InstruDataType");
  237. //foreach (DataColumn dc in dt.Columns)
  238. //{
  239. // dtInstruShow.Rows.Add(new object[] { drColumn[dc.ColumnName] });
  240. //}
  241. foreach (DataColumn dc in dt.Columns)
  242. {
  243. dtInstruShow.Rows.Add(new object[] { dc.ColumnName,dc.DataType});
  244. }
  245. dgvInstruDS.DataSource = dtInstruShow;
  246. }
  247. }
  248. }
  249. /// <summary>
  250. /// 切换表时发生
  251. /// </summary>
  252. /// <param name="sender"></param>
  253. /// <param name="e"></param>
  254. private void cbxCnas_SelectedIndexChanged(object sender, EventArgs e)
  255. {
  256. if (cbxCnas.Text == null) return;
  257. string strTableName_Cnas = cbxCnas.Text.ToString();
  258. //从数据库中加载数据表结构
  259. //DataTable dtTableStruct = SQLDB2Helper.getDB2Table(string.Format("SELECT * FROM {0} Where 1=0", strTableName_Cnas));
  260. DataTable dtTableStruct = CnasDataOperationFact.CnasDataOperation().GetCNASTablesStruct(strTableName_Cnas,currentSyncItem);
  261. if (dtTableStruct != null)
  262. {
  263. DataTable dtCnasShow = new DataTable();
  264. dtCnasShow.Columns.Add("CnasFieldName");
  265. dtCnasShow.Columns.Add("CnasDataType");
  266. foreach (DataColumn dc in dtTableStruct.Columns)
  267. {
  268. dtCnasShow.Rows.Add(new object[] { dc.ColumnName ,dc.DataType});
  269. }
  270. dgvCnas.DataSource = dtCnasShow;
  271. }
  272. }
  273. //增加映射
  274. private void btnAddMapping_Click(object sender, EventArgs e)
  275. {
  276. if (cbxInstrument.SelectedValue == null) return;
  277. if (cbxCnas.SelectedValue == null) return;
  278. if (dgvInstruDS.Rows.Count <= 0) return;
  279. if (dgvCnas.Rows.Count <= 0) return;
  280. SyncParamasInfo syncParamas = new SyncParamasInfo();
  281. if (currentSyncItem.LstSyncPramas == null) currentSyncItem.LstSyncPramas = new List<SyncParamasInfo>();
  282. //检测选中表是否跟已有映射数据一致,如果不一致,则不允许继续
  283. var lst = currentSyncItem.LstSyncPramas.Where(s=>s.SourceTable== cbxInstrument.SelectedValue.ToString()&&s.TargetTable== cbxCnas.SelectedValue.ToString()).ToList<SyncParamasInfo>();
  284. if (currentSyncItem.LstSyncPramas.Count > 0 && lst.Count <= 0)
  285. {
  286. MessageBox.Show("已存在不同表单映射数据,无法添加!");
  287. return;
  288. }
  289. //检测是否已经存在这个数据(不允许存在重复数据)
  290. lst = currentSyncItem.LstSyncPramas.Where(s => s.SourceField == dgvInstruDS.Rows[dgvInstruDS.CurrentCell.RowIndex].Cells[0].Value.ToString()&&s.SourceTable== cbxInstrument.SelectedValue.ToString()).ToList<SyncParamasInfo>();
  291. if (lst.Count > 0)
  292. {
  293. MessageBox.Show("仪器数据库字段已分配,请重新选择!");
  294. return;
  295. }
  296. lst = currentSyncItem.LstSyncPramas.Where(s => s.TargetTable == cbxCnas.SelectedValue.ToString() && s.TargetField == dgvCnas.Rows[dgvCnas.CurrentCell.RowIndex].Cells[0].Value.ToString()).ToList<SyncParamasInfo>();
  297. if (lst.Count > 0)
  298. {
  299. MessageBox.Show("CNAS数据库字段已分配,请重新选择!");
  300. return;
  301. }
  302. if (dgvCnas.Rows[dgvCnas.CurrentCell.RowIndex].Cells[0].Value.ToString().ToUpper() == "ID")
  303. {
  304. MessageBox.Show("该字段为CNAS数据库保留字段,不允许插入数据,请重新选择!");
  305. return;
  306. }
  307. //仪器表名和选中行
  308. syncParamas.SourceTable = cbxInstrument.SelectedValue.ToString();
  309. syncParamas.SourceField = dgvInstruDS.Rows[dgvInstruDS.CurrentCell.RowIndex].Cells[0].Value.ToString();
  310. //CNAS表名和选中行
  311. syncParamas.TargetTable = cbxCnas.SelectedValue.ToString();
  312. syncParamas.TargetField = dgvCnas.Rows[dgvCnas.CurrentCell.RowIndex].Cells[0].Value.ToString();
  313. //绑定数据
  314. if (currentSyncItem.LstSyncPramas == null) currentSyncItem.LstSyncPramas = new List<SyncParamasInfo>();
  315. currentSyncItem.LstSyncPramas.Add(syncParamas);
  316. dgvMapping.DataSource= new BindingList<SyncParamasInfo>(currentSyncItem.LstSyncPramas);
  317. }
  318. /// <summary>
  319. /// 删除映射
  320. /// </summary>
  321. /// <param name="sender"></param>
  322. /// <param name="e"></param>
  323. private void btnDelMap_Click(object sender, EventArgs e)
  324. {
  325. //当前选中项
  326. string strSourceField = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["InstrumentField"].Value.ToString();
  327. string strTargetField = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["CnasField"].Value.ToString();
  328. var lstDelItems = currentSyncItem.LstSyncPramas.Where(s => s.SourceField == strSourceField && s.TargetField == strTargetField).ToList<SyncParamasInfo>();
  329. if (lstDelItems.Count > 0)
  330. {
  331. foreach (var item in lstDelItems)
  332. {
  333. currentSyncItem.LstSyncPramas.Remove(item);
  334. }
  335. dgvMapping.DataSource = new BindingList<SyncParamasInfo>(currentSyncItem.LstSyncPramas);
  336. }
  337. }
  338. private void btnRun_Click(object sender, EventArgs e)
  339. {
  340. ////根据映射字段获取准备上传的所有数据
  341. //if (!dictInstruTables.ContainsKey(currentSyncItem.LstSyncPramas[0].SourceTable)) return;
  342. //DataTable dtReadySource = dictInstruTables[currentSyncItem.LstSyncPramas[0].SourceTable];
  343. //if (dtReadySource == null || dtReadySource.Rows.Count <= 0) return;
  344. ////构建准备插入的数据
  345. //DataTable dtTarget = CnasDataOperationFact.CnasDataOperation().GetCNASTablesStruct(currentSyncItem.LstSyncPramas[0].TargetTable,currentSyncItem);
  346. //foreach (DataRow drSource in dtReadySource.Rows)
  347. //{
  348. // DataRow drNewTarget = dtTarget.NewRow();
  349. // //遍历映射表,把所有字段插入到目标表中
  350. // foreach (var item in currentSyncItem.LstSyncPramas)
  351. // {
  352. // var strSourceField = item.SourceField;
  353. // var strTargetField = item.TargetField;
  354. // //当列名存在于数据表中时才能继续
  355. // if (dtReadySource.Columns.Contains(strSourceField) && dtTarget.Columns.Contains(strTargetField))
  356. // {
  357. // drNewTarget[strTargetField] = drSource[strSourceField];
  358. // }
  359. // }
  360. // dtTarget.Rows.Add(drNewTarget);
  361. //}
  362. ////执行插入
  363. //int iReturn = CnasDataOperationFact.CnasDataOperation().InsertDataToCNASTable(dtTarget, currentSyncItem);
  364. //if (iReturn>0)
  365. // MessageBox.Show("上传完成!");
  366. //else
  367. // MessageBox.Show("上传过程中发生异常,请联系管理员!");
  368. }
  369. /// <summary>
  370. /// 配置数据库界面
  371. /// </summary>
  372. /// <param name="sender"></param>
  373. /// <param name="e"></param>
  374. private void btnDatabaseConfig_Click(object sender, EventArgs e)
  375. {
  376. frmDatabaseParams frmDatabase = new frmDatabaseParams(currentSyncItem);
  377. frmDatabase.InstrumentDelegate = delegate (SyncInstrumentItemInfo Instrumentitem)
  378. {
  379. this.currentSyncItem = Instrumentitem;
  380. };
  381. frmDatabase.InstrumentItemData = delegate (Dictionary<string, DataTable> dict)
  382. {
  383. this.dictInstruTables = dict;
  384. };
  385. frmDatabase.ShowDialog();
  386. LoadSourceAndTargetData();
  387. }
  388. private void btnLoadDBData_Click(object sender, EventArgs e)
  389. {
  390. int iReturn=LoadSourceAndTargetData(true);
  391. switch (iReturn)
  392. {
  393. case -1:
  394. MessageBox.Show("未能成功获取仪器数据库配置信息,请配置后重试!");
  395. break;
  396. case -2:
  397. MessageBox.Show("未能成功获取CNAS数据库配置信息,请配置后重试!");
  398. break;
  399. case -3:
  400. MessageBox.Show("未能成功获取仪器数据信息,请配置后重试!");
  401. break;
  402. case -4:
  403. MessageBox.Show("未能成功获取CNAS数据信息,请配置后重试!");
  404. break;
  405. default:
  406. break;
  407. }
  408. }
  409. public int LoadSourceAndTargetData(bool bIfLoading=false)
  410. {
  411. //检查配置信息
  412. if (currentSyncItem.SyncInstrumentDSInfo == null || currentSyncItem.SyncInstrumentDSInfo.LocalPath ==null|| currentSyncItem.SyncInstrumentDSInfo.LocalPath == "") return -1;
  413. if (currentSyncItem.SyncTargetDBInfo == null) return -2;
  414. //是否需要重新加载来源库
  415. if (bIfLoading)
  416. {
  417. if (currentSyncItem.SyncInstrumentDSInfo.LocalPath != null && currentSyncItem.SyncInstrumentDSInfo.LocalPath != "")
  418. {
  419. InstrumentData instrumentData = InstrumentDataFact.CreateInstrumentDataSource(currentSyncItem.SyncInstrumentDSInfo.InstrumentDataSourceType, new object[] { currentSyncItem.SyncInstrumentDSInfo.LocalPath, currentSyncItem.SyncInstrumentDSInfo.UserId, currentSyncItem.SyncInstrumentDSInfo.UserPwd });
  420. dictInstruTables = instrumentData.GetInstrumentData();
  421. }
  422. }
  423. if (dictInstruTables.Count <= 0) return -3;
  424. //绑定ComboBox
  425. List<string> lstTableName = new List<string>();
  426. foreach (var item in dictInstruTables)
  427. {
  428. lstTableName.Add(item.Key);
  429. }
  430. cbxInstrument.DataSource = lstTableName;
  431. cbxInstrument.ValueMember = "";
  432. //获取CNAS配置的数据库连接信息
  433. DataTable dtCNAS = CnasDataOperationFact.CnasDataOperation().GetAllCNASTablesName(currentSyncItem);
  434. if (dtCNAS != null && dtCNAS.Rows.Count > 0)
  435. {
  436. List<string> lstCnasTables = new List<string>();
  437. foreach (DataRow dr in dtCNAS.Rows)
  438. {
  439. lstCnasTables.Add(dr["TABNAME"].ToString());
  440. }
  441. cbxCnas.DataSource = lstCnasTables;
  442. cbxCnas.ValueMember = "";
  443. }
  444. else
  445. return -4;
  446. return 1;
  447. }
  448. }
  449. }