CNAS取数仪器端升级
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

CnasInsertOperation.cs 23KB

před 5 roky
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  1. using CnasSynchronousCommon;
  2. using CnasSynchrousModel;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Data;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Text.RegularExpressions;
  9. namespace CnasSynchronusClient
  10. {
  11. public class CnasInsertOperation
  12. {
  13. /// <summary>
  14. /// 同步配置信息
  15. /// </summary>
  16. public SyncInstrumentItemInfo syncInstrumentItem { get; set; }
  17. /// <summary>
  18. /// 创建准备插入到CNAS的数据
  19. /// </summary>
  20. /// <param name="dtReadySource"></param>
  21. /// <param name="dtTarget"></param>
  22. /// <returns></returns>
  23. public string CreateInputData(DataTable dtReadySource, ref DataTable dtTarget)
  24. {
  25. string strErrorMsg = "";
  26. string strDateColumn = "";
  27. try
  28. {
  29. //获取日期字段
  30. strDateColumn = GetDateFieldOperation(ref strErrorMsg);
  31. if (strErrorMsg != "") return strErrorMsg;
  32. //新数据行的创建和插入数据
  33. foreach (DataRow drSource in dtReadySource.Rows)
  34. {
  35. DataRow drNewTarget = dtTarget.NewRow();
  36. //根据过滤器执行来源数据过滤
  37. AppLog.Info("过滤检测");
  38. if (!SourceDataFilterOperation(drSource)) continue;
  39. //根据映射字段尝试塞入数据到数据行,排除不合法数据。
  40. AppLog.Info("合法性检测");
  41. NormalParamsValueInsertOperation(dtReadySource, dtTarget, drSource, drNewTarget, strDateColumn, ref strErrorMsg);
  42. if (strErrorMsg != "") break;
  43. //根据固定值字段塞入数据到数据行
  44. AppLog.Info("条件映射数据更改");
  45. FixConditonParamsInsertOperation(dtReadySource, dtTarget, drSource, drNewTarget);
  46. //补充仪器信息数据
  47. AppLog.Info("补充仪器信息数据");
  48. if (syncInstrumentItem.CnasInstrumentColumn == null)
  49. {
  50. strErrorMsg = "未设置的CNAS仪器信息列,请先配置";
  51. break;
  52. }
  53. if (dtTarget.Columns.Contains(syncInstrumentItem.CnasInstrumentColumn))
  54. drNewTarget[syncInstrumentItem.CnasInstrumentColumn] = syncInstrumentItem.GUID;
  55. else
  56. {
  57. strErrorMsg = "设置的CNAS仪器信息列没有在库中找到,请重新配置";
  58. break;
  59. }
  60. //塞入数据的数据行包含到dt中
  61. dtTarget.Rows.Add(drNewTarget);
  62. }
  63. AppLog.Info("构造数据行循环结束");
  64. }
  65. catch (Exception ex)
  66. {
  67. AppLog.Error(ex.Message);
  68. strErrorMsg = ex.Message;
  69. }
  70. return strErrorMsg;
  71. }
  72. /// <summary>
  73. /// 获取日期字段
  74. /// </summary>
  75. /// <param name="strErrorMsg"></param>
  76. /// <returns></returns>
  77. private string GetDateFieldOperation(ref string strErrorMsg)
  78. {
  79. string strDateColumn="";
  80. var query = syncInstrumentItem.LstSyncPramas.Where(s => s.IfDateField == true).ToList<SyncParamasInfo>();
  81. if (query.Count != 1)
  82. {
  83. strErrorMsg = "创建CNAS数据行失败,未找到日期字段。";
  84. }
  85. else
  86. {
  87. strDateColumn = query[0].TargetField;
  88. }
  89. return strDateColumn;
  90. }
  91. /// <summary>
  92. /// 普通值(非固定值)插入操作
  93. /// </summary>
  94. /// <param name="dtReadySource"></param>
  95. /// <param name="dtTarget"></param>
  96. /// <param name="drSource"></param>
  97. /// <param name="drNewTarget"></param>
  98. /// <param name="strDateField"></param>
  99. /// <param name="strErrorMsg"></param>
  100. private void NormalParamsValueInsertOperation(DataTable dtReadySource, DataTable dtTarget, DataRow drSource, DataRow drNewTarget,string strDateField,ref string strErrorMsg)
  101. {
  102. foreach (var item in syncInstrumentItem.LstSyncPramas)
  103. {
  104. var strSourceField = item.SourceField;
  105. var strTargetField = item.TargetField;
  106. //当列名存在于数据表中时才能继续
  107. if (dtReadySource.Columns.Contains(strSourceField) && dtTarget.Columns.Contains(strTargetField))
  108. {
  109. strErrorMsg = TestConvertValueToTarget(drNewTarget, drSource, strTargetField, strSourceField, strDateField);
  110. if (strErrorMsg != "")
  111. {
  112. strErrorMsg = string.Format("发生数据转换错误,请重新配置映射字段或修改字段值。错误信息如下:列【{0}】,值【{1}】,详情【{2}】", strSourceField, drSource[strSourceField].ToString(), strErrorMsg);
  113. break;
  114. }
  115. }
  116. }
  117. }
  118. /// <summary>
  119. /// 固定值插入数据操作
  120. /// </summary>
  121. /// <param name="dtReadySource"></param>
  122. /// <param name="dtTarget"></param>
  123. /// <param name="drSource"></param>
  124. /// <param name="drNewTarget"></param>
  125. private void FixConditonParamsInsertOperation(DataTable dtReadySource,DataTable dtTarget,DataRow drSource,DataRow drNewTarget)
  126. {
  127. try
  128. {
  129. foreach (var item in syncInstrumentItem.lstFixedValue)
  130. {
  131. if (dtTarget.Columns.Contains(item.ColumnName))
  132. {
  133. switch (item.Condition)
  134. {
  135. case MapCondition.Equal:
  136. drNewTarget[item.ColumnName] = item.Value;
  137. break;
  138. case MapCondition.Sub:
  139. ChangeSubConditionValue(item, dtReadySource, drSource, drNewTarget);
  140. break;
  141. case MapCondition.IFThen:
  142. ChangeIFThenConditionValue(item, dtReadySource, drSource, drNewTarget);
  143. break;
  144. case MapCondition.SubString:
  145. ChangeSubStringConditonValue(item, drNewTarget);
  146. break;
  147. case MapCondition.Divided:
  148. if (double.TryParse(drNewTarget[item.ColumnName].ToString(), out double db1))
  149. {
  150. if (double.TryParse(item.Value.ToString(), out double db2))
  151. drNewTarget[item.ColumnName] = db1 / db2;
  152. }
  153. break;
  154. case MapCondition.Multiplied:
  155. if (double.TryParse(drNewTarget[item.ColumnName].ToString(), out double db3))
  156. {
  157. if (double.TryParse(item.Value.ToString(), out double db4))
  158. drNewTarget[item.ColumnName] = db3 * db4;
  159. }
  160. break;
  161. case MapCondition.DecimalDigits:
  162. if (double.TryParse(drNewTarget[item.ColumnName].ToString(), out double db5))
  163. {
  164. if (int.TryParse(item.Value.ToString(), out int count))
  165. drNewTarget[item.ColumnName] = Math.Round(db5, count);
  166. }
  167. break;
  168. }
  169. }
  170. }
  171. }
  172. catch (Exception ex)
  173. {
  174. AppLog.Error(ex.Message);
  175. }
  176. }
  177. /// <summary>
  178. /// 尝试将值插入到目标表单的各个行中
  179. /// </summary>
  180. /// <returns></returns>
  181. private string TestConvertValueToTarget(DataRow drTarget, DataRow drSource, string strTargetColumn, string strSourceColumn, string strDateColumn)
  182. {
  183. string strErrorMsg = "";
  184. try
  185. {
  186. if (strTargetColumn.ToLower() != strDateColumn.ToLower())
  187. {
  188. string strTargetColumnType = drTarget.Table.Columns[strTargetColumn].DataType.ToString();
  189. switch (strTargetColumnType)
  190. {
  191. case "System.Decimal":
  192. if (drSource[strSourceColumn] == null || (drSource[strSourceColumn] != null && drSource[strSourceColumn].ToString() == ""))
  193. drTarget[strTargetColumn] = 0;
  194. else
  195. drTarget[strTargetColumn] = Convert.ToDouble(drSource[strSourceColumn]);
  196. break;
  197. default:
  198. drTarget[strTargetColumn] = drSource[strSourceColumn];
  199. break;
  200. }
  201. }
  202. else //日期字段需要单独处理
  203. {
  204. DateTime dt = DateTime.Now;
  205. if (DateTime.TryParse(drSource[strSourceColumn].ToString(), out dt))
  206. {
  207. drTarget[strTargetColumn] = dt.ToString("yyyy-MM-dd HH:mm:ss");
  208. }
  209. else
  210. {
  211. drTarget[strTargetColumn] = drSource[strSourceColumn];
  212. }
  213. }
  214. }
  215. catch (Exception ex)
  216. {
  217. strErrorMsg = ex.Message;
  218. }
  219. return strErrorMsg;
  220. }
  221. /// <summary>
  222. /// 处理SUB类型固定值
  223. /// </summary>
  224. /// <param name="item"></param>
  225. /// <param name="dtReadySource"></param>
  226. /// <param name="drSource"></param>
  227. /// <param name="drNewTarget"></param>
  228. private void ChangeSubConditionValue(CnasConditionMapValue item, DataTable dtReadySource, DataRow drSource, DataRow drNewTarget)
  229. {
  230. try
  231. {
  232. //解析Value值,如果不能解析,直接插入Value值
  233. if (item.Value != null && item.Value.ToString() != "")
  234. {
  235. string strInputValue = "";
  236. string[] strValues = item.Value.ToString().Split(new string[] { "+" }, StringSplitOptions.RemoveEmptyEntries);
  237. if (strValues.Length >= 1 && strValues.Length <= 3)
  238. {
  239. switch (strValues.Length)
  240. {
  241. case 1:
  242. string strColumnName1 = strValues[0].Split(new string[] { "{", "}" }, StringSplitOptions.RemoveEmptyEntries)[0];
  243. if (dtReadySource.Columns.Contains(strColumnName1))
  244. strInputValue = drSource[strColumnName1].ToString();
  245. else
  246. strInputValue = strValues[0];
  247. break;
  248. case 2:
  249. strColumnName1 = strValues[0].Split(new string[] { "{", "}" }, StringSplitOptions.RemoveEmptyEntries)[0];
  250. if (dtReadySource.Columns.Contains(strColumnName1))
  251. strInputValue = drSource[strColumnName1].ToString();
  252. else
  253. strInputValue = strValues[0];
  254. string strColumnName2 = strValues[1].Split(new string[] { "{", "}" }, StringSplitOptions.RemoveEmptyEntries)[0];
  255. if (dtReadySource.Columns.Contains(strColumnName2))
  256. strInputValue += drSource[strColumnName2].ToString();
  257. else
  258. strInputValue += strValues[1];
  259. break;
  260. case 3:
  261. strColumnName1 = strValues[0].Split(new string[] { "{", "}" }, StringSplitOptions.RemoveEmptyEntries)[0];
  262. if (dtReadySource.Columns.Contains(strColumnName1))
  263. strInputValue = drSource[strColumnName1].ToString();
  264. else
  265. strInputValue = strValues[0];
  266. strColumnName2 = strValues[1].Split(new string[] { "{", "}" }, StringSplitOptions.RemoveEmptyEntries)[0];
  267. if (dtReadySource.Columns.Contains(strColumnName2))
  268. strInputValue += drSource[strColumnName2].ToString();
  269. else
  270. strInputValue += strValues[1];
  271. string strColumnName3 = strValues[2].Split(new string[] { "{", "}" }, StringSplitOptions.RemoveEmptyEntries)[0];
  272. if (dtReadySource.Columns.Contains(strColumnName3))
  273. strInputValue += drSource[strColumnName3].ToString();
  274. else
  275. strInputValue += strValues[2];
  276. break;
  277. }
  278. }
  279. else
  280. {
  281. strInputValue = item.Value.ToString();
  282. }
  283. drNewTarget[item.ColumnName] = strInputValue;
  284. }
  285. }
  286. catch (Exception ex)
  287. {
  288. AppLog.Error(ex.Message);
  289. }
  290. }
  291. private bool SourceDataFilterOperation(DataRow dr)
  292. {
  293. //如果过滤器为空或没有任何条件,我们认为用户允许所有数据通过过滤审核
  294. if (syncInstrumentItem.SourceFilter == null) return true;
  295. if (syncInstrumentItem.SourceFilter.lstFilterConditions == null) return true;
  296. if (syncInstrumentItem.SourceFilter.lstFilterConditions.Count == 0) return true;
  297. bool bReturn = false;
  298. try
  299. {
  300. List<bool> lstMatch = new List<bool>();
  301. foreach (FilterCondition item in syncInstrumentItem.SourceFilter.lstFilterConditions)
  302. {
  303. bool bIsMatch = false;
  304. string strConditionValue = item.ConditionValue;
  305. if (strConditionValue == null) continue;
  306. if (strConditionValue.StartsWith("RegEx")) //此时使用正则表达式匹配
  307. {
  308. string[] strRegExs = strConditionValue.Split(new string[] { "RegEx:{", "}" }, StringSplitOptions.RemoveEmptyEntries);
  309. if (strRegExs.Length != 1) continue;
  310. bIsMatch = Regex.IsMatch(dr[item.ColumnName].ToString(), strRegExs[0]);
  311. }
  312. else
  313. {
  314. switch (item.Algorithm)
  315. {
  316. case "=":
  317. bIsMatch = dr[item.ColumnName].ToString() == item.ConditionValue ? true : false;
  318. break;
  319. case "<>":
  320. bIsMatch = dr[item.ColumnName].ToString() == item.ConditionValue ? false : true;
  321. break;
  322. case "like":
  323. bIsMatch = dr[item.ColumnName].ToString().Contains(item.ConditionValue) ? true : false;
  324. break;
  325. case "not like":
  326. bIsMatch = dr[item.ColumnName].ToString().Contains(item.ConditionValue) ? false : true;
  327. break;
  328. case ">":
  329. if (dr[item.ColumnName] != null)
  330. if (double.TryParse(dr[item.ColumnName].ToString(), out double result)&& double.TryParse(item.ConditionValue, out double conditionresult))
  331. bIsMatch = result > conditionresult ? true : false;
  332. break;
  333. case "<":
  334. if (dr[item.ColumnName] != null)
  335. if (double.TryParse(dr[item.ColumnName].ToString(), out double result) && double.TryParse(item.ConditionValue, out double conditionresult))
  336. bIsMatch = result < conditionresult ? true : false;
  337. break;
  338. case ">=":
  339. if (dr[item.ColumnName] != null)
  340. if (double.TryParse(dr[item.ColumnName].ToString(), out double result) && double.TryParse(item.ConditionValue, out double conditionresult))
  341. bIsMatch = result >= conditionresult ? true : false;
  342. break;
  343. case "<=":
  344. if (dr[item.ColumnName] != null)
  345. if (double.TryParse(dr[item.ColumnName].ToString(), out double result) && double.TryParse(item.ConditionValue, out double conditionresult))
  346. bIsMatch = result <= conditionresult ? true : false;
  347. break;
  348. }
  349. }
  350. lstMatch.Add(bIsMatch);
  351. }
  352. if (syncInstrumentItem.SourceFilter.FilterConditionLinkType == "and")
  353. {
  354. //只要有一个为否,则返回否
  355. if (lstMatch.Where(x => x.Equals(false)).Count() > 0)
  356. bReturn = false;
  357. else
  358. bReturn = true;
  359. }
  360. else
  361. {
  362. //只要有一个为是,则返回是
  363. if (lstMatch.Where(x => x.Equals(true)).Count() > 0)
  364. bReturn = true;
  365. else
  366. bReturn = false;
  367. }
  368. }
  369. catch (Exception ex)
  370. {
  371. AppLog.Error(ex.Message);
  372. }
  373. return bReturn;
  374. }
  375. /// <summary>
  376. /// 处理IFThen类型固定值
  377. /// </summary>
  378. /// <param name="item"></param>
  379. /// <param name="dtReadySource"></param>
  380. /// <param name="drSource"></param>
  381. /// <param name="drNewTarget"></param>
  382. private void ChangeIFThenConditionValue(CnasConditionMapValue item, DataTable dtReadySource, DataRow drSource, DataRow drNewTarget)
  383. {
  384. try
  385. {
  386. if (item.Value != null && item.Value.ToString() != "")
  387. {
  388. List<IFThenConditionParams> lstParams = GlobalCommonOperation.AnanlysisIFThenString(item.Value.ToString());
  389. if (lstParams.Count > 0)
  390. {
  391. foreach (var conditionparams in lstParams)
  392. {
  393. if (!dtReadySource.Columns.Contains(conditionparams.ConditionColumnName)) continue;
  394. if (drSource[conditionparams.ConditionColumnName].ToString() == conditionparams.ConditionColumnValue)
  395. drNewTarget[item.ColumnName] = conditionparams.ColumnValue;
  396. }
  397. }
  398. }
  399. }
  400. catch (Exception ex)
  401. {
  402. AppLog.Error(ex.Message);
  403. }
  404. }
  405. /// <summary>
  406. /// 处理SubString类型固定值
  407. /// </summary>
  408. /// <param name="item"></param>
  409. /// <param name="dtReadySource"></param>
  410. /// <param name="drSource"></param>
  411. /// <param name="drNewTarget"></param>
  412. private void ChangeSubStringConditonValue(CnasConditionMapValue item, DataRow drNewTarget)
  413. {
  414. try
  415. {
  416. if (item.Value != null && item.Value.ToString() != "")
  417. {
  418. string[] strValues = item.Value.ToString().Split(new string[] { "{", ",", "}" }, StringSplitOptions.RemoveEmptyEntries);
  419. if (strValues.Length == 2)
  420. {
  421. string[] strInputValues = drNewTarget[item.ColumnName].ToString().Split(new string[] { strValues[0] }, StringSplitOptions.RemoveEmptyEntries);
  422. if (strInputValues.Length == 1)
  423. {
  424. drNewTarget[item.ColumnName] = strInputValues[0];
  425. }
  426. if (strInputValues.Length == 2) //只处理分割后有两部分的
  427. {
  428. if (strValues[1] == "L")
  429. {
  430. drNewTarget[item.ColumnName] = strInputValues[0];
  431. }
  432. else if (strValues[1] == "R")
  433. {
  434. drNewTarget[item.ColumnName] = strInputValues[1];
  435. }
  436. }
  437. }
  438. }
  439. }
  440. catch (Exception ex)
  441. {
  442. AppLog.Error(ex.Message);
  443. }
  444. }
  445. /// <summary>
  446. /// 对准备插入的数据进行格式上的检查
  447. /// </summary>
  448. /// <param name="dtTarget"></param>
  449. /// <param name="strErrorMsg"></param>
  450. public void CheckInsertDataFormat(DataTable dtTarget,ref string strErrorMsg)
  451. {
  452. //检查数据合法性
  453. CnasDataCheck check = new CnasDataCheck
  454. {
  455. DtReadyInsert = dtTarget,
  456. TargetDataBase = syncInstrumentItem.SyncTargetDBInfo,
  457. StrTableName = syncInstrumentItem.LstSyncPramas[0].TargetTable
  458. };
  459. check.CheckData();
  460. if (check.LstIllegalMsg != null && check.LstIllegalMsg.Count > 0)
  461. {
  462. var item = syncInstrumentItem.LstSyncPramas.Where(s => s.TargetField == check.LstIllegalMsg[0].ColumnName).ToList<SyncParamasInfo>();
  463. if (item.Count == 1)
  464. {
  465. strErrorMsg=string.Format("数据不满足上传条件,请修改后再上传。错误数据:当前列名【{0}】,列值【{1}】", item[0].SourceField, check.LstIllegalMsg[0].ColumnValue);
  466. }
  467. else
  468. {
  469. strErrorMsg = string.Format("数据不满足上传条件,请修改后再上传。错误数据:CNAS列名【{0}】,列值【{1}】", check.LstIllegalMsg[0].ColumnName, check.LstIllegalMsg[0].ColumnValue);
  470. }
  471. return;
  472. }
  473. }
  474. }
  475. }