CNAS取数仪器端升级
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

4 月之前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. using CnasSynchronusClient;
  2. using CnasSynchrousModel;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.ComponentModel;
  6. using System.Data;
  7. using System.Drawing;
  8. using System.IO;
  9. using System.Linq;
  10. using System.Windows.Forms;
  11. using System.Xml.Serialization;
  12. namespace CNAS_BalanceClient
  13. {
  14. public partial class frmBalanceField : Form
  15. {
  16. SyncInstrumentItemInfo currentSyncItem = new SyncInstrumentItemInfo();
  17. //List<SyncParamasInfo> lstpramas = new List<SyncParamasInfo>();
  18. public List<SyncBalanceItem> syncBalanceItems = new List<SyncBalanceItem>();
  19. SyncBalanceItem currentBalanceItem = new SyncBalanceItem();
  20. DataBaseInfo targetDataBase = new DataBaseInfo();
  21. public frmBalanceField(List<SyncBalanceItem> syncBalanceItems, DataBaseInfo targetDataBase)
  22. {
  23. InitializeComponent();
  24. this.syncBalanceItems = syncBalanceItems;
  25. this.targetDataBase = targetDataBase;
  26. dgvMapping.AutoGenerateColumns = false;
  27. dgvMapping.RowHeadersVisible = false;
  28. dgvbalancefield.AutoGenerateColumns = false;
  29. dgvbalancefield.RowHeadersVisible = false;
  30. dgvCnas.AutoGenerateColumns = false;
  31. dgvCnas.RowHeadersVisible = false;
  32. }
  33. private void lstBalance_SelectedIndexChanged(object sender, EventArgs e)
  34. {
  35. if (lstBalance.SelectedItem == null) return;
  36. string strCurrentSelect = lstBalance.SelectedItem.ToString();
  37. dgvMapping.DataSource = new BindingList<SyncParamasInfo>();
  38. //根据选中项加载数据
  39. dgvbalancefield.DataSource = new BindingList<BalanceField>(BindBalanceField(strCurrentSelect));
  40. //绑定映射数据
  41. var syncItems = syncBalanceItems.Where(s => s.Type == strCurrentSelect).ToList<SyncBalanceItem>();
  42. if (syncItems != null && syncItems.Count >= 1)
  43. {
  44. currentBalanceItem = syncItems[0];
  45. if (!string.IsNullOrWhiteSpace(currentBalanceItem.CnasInstrumentColumn))
  46. txtInstrumentColumn.Text = currentBalanceItem.CnasInstrumentColumn;
  47. else
  48. txtInstrumentColumn.Text = "";
  49. if (syncItems[0].syncParamasInfos!=null)
  50. dgvMapping.DataSource = new BindingList<SyncParamasInfo>(syncItems[0].syncParamasInfos);
  51. else
  52. dgvMapping.DataSource = new BindingList<SyncParamasInfo>();
  53. }
  54. else
  55. {
  56. currentBalanceItem = new SyncBalanceItem()
  57. {
  58. GUID=Guid.NewGuid().ToString(),
  59. Type = strCurrentSelect
  60. };
  61. syncBalanceItems.Add(currentBalanceItem);
  62. }
  63. }
  64. private List<BalanceField> BindBalanceField(string strItem)
  65. {
  66. List<BalanceField> balanceFields = new List<BalanceField>();
  67. switch (strItem)
  68. {
  69. case "全水分":
  70. balanceFields=InitinalBalanceField("1");
  71. break;
  72. case "水分":
  73. balanceFields=InitinalBalanceField("2");
  74. break;
  75. case "灰分":
  76. balanceFields=InitinalBalanceField("3");
  77. break;
  78. case "挥发分":
  79. balanceFields=InitinalBalanceField("4");
  80. break;
  81. }
  82. return balanceFields;
  83. }
  84. private List<BalanceField> InitinalBalanceField(string strValue)
  85. {
  86. List<BalanceField> balanceFields = new List<BalanceField>();
  87. //得到类的所有属性
  88. var lstProperties = new LaboratoryTest().GetType().GetProperties();
  89. foreach (var oProperty in lstProperties)
  90. {
  91. balanceFields.Add(new BalanceField() { FieldName = oProperty.Name, FieldType = oProperty.PropertyType });
  92. ////得到每一个属性的特性类集合
  93. //IList<CustomAttributeData> lstAttr = oProperty.GetCustomAttributesData();
  94. //foreach (var oAttr in lstAttr)
  95. //{
  96. // var lstAttrArgu = oAttr.NamedArguments;
  97. // foreach (CustomAttributeNamedArgument oAttrAru in lstAttrArgu)
  98. // {
  99. // //if (oAttrAru.MemberInfo.Name == "ApplyType"&& oAttrAru.TypedValue.Value.ToString().Contains(strValue))
  100. // {
  101. // balanceFields.Add(new BalanceField() { FieldName = oProperty.Name, FieldType = oProperty.GetType() });
  102. // }
  103. // }
  104. //}
  105. }
  106. return balanceFields;
  107. }
  108. private void frmBalanceField_Load(object sender, EventArgs e)
  109. {
  110. ////1.加载数据
  111. DataTable dtCNAS = CnasDataOperationFact.CnasDataOperation().GetAllCNASTablesName(targetDataBase);
  112. if (dtCNAS != null && dtCNAS.Rows.Count > 0)
  113. {
  114. List<string> lstCnasTables = new List<string>();
  115. foreach (DataRow dr in dtCNAS.Rows)
  116. {
  117. lstCnasTables.Add(dr["TABNAME"].ToString());
  118. }
  119. cbxCnas.DataSource = lstCnasTables;
  120. cbxCnas.ValueMember = "";
  121. }
  122. ////2.初始化天平端数据
  123. lstBalance.SelectedIndex = 0;
  124. }
  125. public class BalanceField
  126. {
  127. public string FieldName { get; set; }
  128. public Type FieldType { get; set; }
  129. }
  130. private void cbxCnas_SelectedIndexChanged(object sender, EventArgs e)
  131. {
  132. if (cbxCnas.Text == null) return;
  133. string strTableName_Cnas = cbxCnas.Text.ToString();
  134. //从数据库中加载数据表结构
  135. //DataTable dtTableStruct = SQLDB2Helper.getDB2Table(string.Format("SELECT * FROM {0} Where 1=0", strTableName_Cnas));
  136. DataTable dtTableStruct = CnasDataOperationFact.CnasDataOperation().GetCNASTablesStruct(strTableName_Cnas, targetDataBase);
  137. if (dtTableStruct != null)
  138. {
  139. DataTable dtCnasShow = new DataTable();
  140. dtCnasShow.Columns.Add("CnasFieldName");
  141. dtCnasShow.Columns.Add("CnasDataType");
  142. foreach (DataColumn dc in dtTableStruct.Columns)
  143. {
  144. dtCnasShow.Rows.Add(new object[] { dc.ColumnName, dc.DataType });
  145. }
  146. dgvCnas.DataSource = dtCnasShow;
  147. //绑定数据
  148. cbxCNASColumn.DataSource = dtCnasShow.Copy();
  149. cbxCNASColumn.DisplayMember = "CnasFieldName";
  150. cbxCNASColumn.ValueMember = "CnasFieldName";
  151. if (dtTableStruct.Columns.Count > 0)
  152. {
  153. if (!string.IsNullOrWhiteSpace(currentSyncItem.CnasInstrumentColumn) && dtTableStruct.Columns.Contains(currentSyncItem.CnasInstrumentColumn))
  154. {
  155. cbxCNASColumn.Text = this.txtInstrumentColumn.Text = currentSyncItem.CnasInstrumentColumn;
  156. }
  157. else
  158. {
  159. cbxCNASColumn.Text = this.txtInstrumentColumn.Text = "";
  160. }
  161. }
  162. }
  163. }
  164. private void btnAddMapping_Click(object sender, EventArgs e)
  165. {
  166. if (currentBalanceItem.syncParamasInfos == null)
  167. currentBalanceItem.syncParamasInfos = new List<SyncParamasInfo>();
  168. SyncParamasInfo syncParamas = new SyncParamasInfo();
  169. //仪器表名和选中行
  170. syncParamas.SourceTable = lstBalance.SelectedItem.ToString();
  171. syncParamas.SourceField = dgvbalancefield.Rows[dgvbalancefield.CurrentCell.RowIndex].Cells[0].Value.ToString();
  172. //CNAS表名和选中行
  173. syncParamas.TargetTable = cbxCnas.SelectedValue.ToString().ToUpper();
  174. syncParamas.TargetField = dgvCnas.Rows[dgvCnas.CurrentCell.RowIndex].Cells[0].Value.ToString().ToUpper();
  175. //验证数据合法性
  176. SyncParamsOperation paramsOperation = new SyncParamsOperation();
  177. if (paramsOperation.CheckTableIfRepeat(currentBalanceItem.syncParamasInfos, syncParamas.SourceTable, syncParamas.TargetTable))
  178. {
  179. MessageBox.Show("已存在不同表单映射数据,无法添加!", "提示");
  180. return;
  181. }
  182. //if (paramsOperation.CheckSourceFieldRepeat(currentBalanceItem.syncParamasInfos, syncParamas.SourceTable, syncParamas.SourceField))
  183. //{
  184. // MessageBox.Show("天平端数据字段已分配,请重新选择!");
  185. // return;
  186. //}
  187. if (paramsOperation.CheckTargetFieldRepeat(currentBalanceItem.syncParamasInfos, syncParamas.TargetTable, syncParamas.TargetField))
  188. {
  189. MessageBox.Show("CNAS端数据字段已分配,请重新选择!", "提示");
  190. return;
  191. }
  192. if (paramsOperation.CheckTargetKeepField(syncParamas.TargetField))
  193. {
  194. MessageBox.Show("CNAS端数据字段为保留字段,请重新选择!", "提示");
  195. return;
  196. }
  197. //绑定数据
  198. currentBalanceItem.syncParamasInfos.Add(syncParamas);
  199. dgvMapping.DataSource = new BindingList<SyncParamasInfo>(currentBalanceItem.syncParamasInfos);
  200. //选中最后一行
  201. dgvMapping.CurrentCell = dgvMapping.Rows[dgvMapping.Rows.Count - 1].Cells[0];
  202. }
  203. private void btnDeleteMapping_Click(object sender, EventArgs e)
  204. {
  205. //当前选中项
  206. if (dgvMapping.CurrentCell == null) return;
  207. string strSourceField = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["InstrumentField"].Value.ToString();
  208. string strTargetField = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["CnasField"].Value.ToString();
  209. var lstDelItems = currentBalanceItem.syncParamasInfos.Where(s => s.SourceField == strSourceField && s.TargetField == strTargetField).ToList<SyncParamasInfo>();
  210. if (lstDelItems.Count > 0)
  211. {
  212. foreach (var item in lstDelItems)
  213. {
  214. currentBalanceItem.syncParamasInfos.Remove(item);
  215. }
  216. dgvMapping.DataSource = new BindingList<SyncParamasInfo>(currentBalanceItem.syncParamasInfos);
  217. }
  218. }
  219. private void btnOK_Click(object sender, EventArgs e)
  220. {
  221. if (!CheckIfHaveDateField())
  222. {
  223. if (MessageBox.Show("日期字段的缺失可能会导致后续不能准确数据传输。是否继续保存?", "",MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Cancel)
  224. return;
  225. }
  226. //将数据存储到本地
  227. if (FileOperation.SaveLocalBalanceData(syncBalanceItems))
  228. {
  229. this.DialogResult = DialogResult.OK;
  230. this.Close();
  231. }
  232. else
  233. {
  234. MessageBox.Show("保存配置失败!", "提示");
  235. }
  236. }
  237. private void dgvMapping_CellValueChanged(object sender, DataGridViewCellEventArgs e)
  238. {
  239. if (dgvMapping.CurrentCell == null) return;
  240. if (dgvMapping.CurrentCell.ColumnIndex == 2) //此时修改的主健列
  241. {
  242. string strSourceField = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["InstrumentField"].Value.ToString();
  243. string strTargetField = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["CnasField"].Value.ToString();
  244. string strPrimaryKey = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["PrimaryKey"].Value.ToString();
  245. var lstDelItems = currentBalanceItem.syncParamasInfos.Where(s => s.SourceField == strSourceField && s.TargetField == strTargetField).ToList<SyncParamasInfo>();
  246. if (lstDelItems.Count > 0)
  247. {
  248. foreach (var item in lstDelItems)
  249. {
  250. item.IfPrimaryKey = strPrimaryKey.ToLower() == "true" ? true : false;
  251. }
  252. }
  253. }
  254. if (dgvMapping.CurrentCell.ColumnIndex == 3) //此时修改的是日期字段列
  255. {
  256. string strSourceField = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["InstrumentField"].Value.ToString();
  257. string strTargetField = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["CnasField"].Value.ToString();
  258. string strDateKey = dgvMapping.Rows[dgvMapping.CurrentCell.RowIndex].Cells["DateKey"].Value.ToString();
  259. var lstDelItems = currentBalanceItem.syncParamasInfos.Where(s => s.SourceField == strSourceField && s.TargetField == strTargetField).ToList<SyncParamasInfo>();
  260. if (lstDelItems.Count ==1)
  261. {
  262. if (strDateKey.ToLower() == "true")
  263. {
  264. //datagridview显示列
  265. foreach (DataGridViewRow dgvRow in dgvMapping.Rows)
  266. {
  267. if (dgvRow.Cells["DateKey"].Value.ToString().ToLower() == "true")
  268. dgvRow.Cells["DateKey"].Value = false;
  269. }
  270. //内存数据源
  271. foreach (var item in currentBalanceItem.syncParamasInfos)
  272. {
  273. if (item.IfDateField)
  274. item.IfDateField = false;
  275. }
  276. lstDelItems[0].IfDateField = true;
  277. }
  278. else
  279. {
  280. lstDelItems[0].IfDateField = false;
  281. }
  282. }
  283. }
  284. }
  285. private void lstBalance_DrawItem(object sender, DrawItemEventArgs e)
  286. {
  287. Brush myBrush = Brushes.Black;
  288. if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
  289. {
  290. myBrush = new SolidBrush(Color.FromArgb(0, 0, 255));//选中时背景颜色
  291. }
  292. else//没有选中时的背景颜色
  293. {
  294. myBrush = new SolidBrush(Color.White);
  295. }
  296. e.Graphics.FillRectangle(myBrush, e.Bounds);//填满矩形背景颜色
  297. e.Graphics.DrawRectangle(new Pen(new SolidBrush(e.ForeColor)), e.Bounds);
  298. e.DrawFocusRectangle();//焦点框
  299. StringFormat stringformat = StringFormat.GenericDefault;
  300. stringformat.LineAlignment = StringAlignment.Center;
  301. e.Graphics.DrawString(lstBalance.Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds, stringformat);
  302. }
  303. private void dgvMapping_CurrentCellDirtyStateChanged(object sender, EventArgs e)
  304. {
  305. if (dgvMapping.IsCurrentCellDirty)
  306. {
  307. dgvMapping.CommitEdit(DataGridViewDataErrorContexts.Commit);
  308. }
  309. }
  310. private bool CheckIfHaveDateField()
  311. {
  312. bool bIfHave = true;
  313. foreach (var item in syncBalanceItems)
  314. {
  315. if (item.syncParamasInfos == null) continue;
  316. if (item.syncParamasInfos.Count <=0) continue;
  317. if (item.syncParamasInfos.Where(s => s.IfDateField == true).Count() != 1)
  318. {
  319. bIfHave = false;
  320. break;
  321. }
  322. }
  323. return bIfHave;
  324. }
  325. private void txtInstrumentColumn_DoubleClick(object sender, EventArgs e)
  326. {
  327. txtInstrumentColumn.Visible = false;
  328. cbxCNASColumn.Top = txtInstrumentColumn.Top;
  329. cbxCNASColumn.Height = txtInstrumentColumn.Height;
  330. cbxCNASColumn.Width = txtInstrumentColumn.Width;
  331. cbxCNASColumn.Location = txtInstrumentColumn.Location;
  332. cbxCNASColumn.Visible = true;
  333. }
  334. private void cbxCNASColumn_Leave(object sender, EventArgs e)
  335. {
  336. if (cbxCNASColumn.Visible)
  337. {
  338. txtInstrumentColumn.Visible = true;
  339. cbxCNASColumn.Visible = false;
  340. }
  341. }
  342. private void cbxCNASColumn_SelectedIndexChanged(object sender, EventArgs e)
  343. {
  344. if (cbxCNASColumn.Visible)
  345. {
  346. cbxCNASColumn.Visible = false;
  347. txtInstrumentColumn.Visible = true;
  348. currentBalanceItem.CnasInstrumentColumn = txtInstrumentColumn.Text = cbxCNASColumn.Text;
  349. }
  350. }
  351. private void btnConditionMap_Click(object sender, EventArgs e)
  352. {
  353. frmConditionMap frmCNAS = new frmConditionMap(currentBalanceItem, targetDataBase);
  354. if (frmCNAS.ShowDialog() == DialogResult.OK)
  355. {
  356. this.currentBalanceItem = frmCNAS.currentBalanceItem;
  357. }
  358. }
  359. }
  360. }