CNAS取数仪器端升级
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

CnasInsertOperation.cs 32KB

4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
4ヶ月前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694
  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.Management;
  8. using System.Net.NetworkInformation;
  9. using System.Text;
  10. using System.Text.RegularExpressions;
  11. namespace CnasSynchronusClient
  12. {
  13. public class CnasInsertOperation
  14. {
  15. /// <summary>
  16. /// 同步配置信息
  17. /// </summary>
  18. public SyncInstrumentItemInfo syncInstrumentItem { get; set; }
  19. /// <summary>
  20. /// 创建准备插入到CNAS的数据
  21. /// </summary>
  22. /// <param name="dtReadySource"></param>
  23. /// <param name="dtTarget"></param>
  24. /// <returns></returns>
  25. public string CreateInputData(DataTable dtReadySource, ref DataTable dtTarget)
  26. {
  27. string strErrorMsg = "";
  28. string strDateColumn = "";
  29. try
  30. {
  31. //获取日期字段
  32. strDateColumn = GetDateFieldOperation(ref strErrorMsg);
  33. if (strErrorMsg != "") return strErrorMsg;
  34. //新数据行的创建和插入数据
  35. foreach (DataRow drSource in dtReadySource.Rows)
  36. {
  37. DataRow drNewTarget = dtTarget.NewRow();
  38. //根据过滤器执行来源数据过滤
  39. AppLog.Info("过滤检测");
  40. if (!SourceDataFilterOperation(drSource)) continue;
  41. //根据映射字段尝试塞入数据到数据行,排除不合法数据。
  42. AppLog.Info("合法性检测");
  43. NormalParamsValueInsertOperation(dtReadySource, dtTarget, drSource, drNewTarget, strDateColumn, ref strErrorMsg);
  44. if (strErrorMsg != "") break;
  45. //根据固定值字段塞入数据到数据行
  46. AppLog.Info("条件映射数据更改");
  47. FixConditonParamsInsertOperation(dtReadySource, dtTarget, drSource, drNewTarget);
  48. //补充仪器信息数据
  49. AppLog.Info("补充仪器信息数据");
  50. if (syncInstrumentItem.CnasInstrumentColumn == null)
  51. {
  52. strErrorMsg = "未设置的CNAS仪器信息列,请先配置";
  53. break;
  54. }
  55. if (dtTarget.Columns.Contains(syncInstrumentItem.CnasInstrumentColumn))
  56. drNewTarget[syncInstrumentItem.CnasInstrumentColumn] = syncInstrumentItem.GUID+ GetMachineCode();
  57. else
  58. {
  59. strErrorMsg = "设置的CNAS仪器信息列没有在库中找到,请重新配置";
  60. break;
  61. }
  62. //塞入数据的数据行包含到dt中
  63. dtTarget.Rows.Add(drNewTarget);
  64. }
  65. AppLog.Info("构造数据行循环结束");
  66. }
  67. catch (Exception ex)
  68. {
  69. AppLog.Error(ex.Message);
  70. strErrorMsg = ex.Message;
  71. }
  72. return strErrorMsg;
  73. }
  74. private string GetMachineCode()
  75. {
  76. StringBuilder machineCode = new StringBuilder();
  77. // 获取CPU ID
  78. string cpuId = GetCPUId();
  79. machineCode.Append(cpuId);
  80. // 获取所有MAC地址
  81. List<string> macAddresses = GetMACAddresses();
  82. foreach (string mac in macAddresses)
  83. {
  84. machineCode.Append("_").Append(mac);
  85. }
  86. return machineCode.ToString();
  87. }
  88. private string GetCPUId()
  89. {
  90. try
  91. {
  92. using (ManagementClass mc = new ManagementClass("Win32_Processor"))
  93. {
  94. ManagementObjectCollection moc = mc.GetInstances();
  95. foreach (ManagementObject mo in moc)
  96. {
  97. return mo.Properties["ProcessorId"].Value.ToString();
  98. }
  99. }
  100. }
  101. catch (Exception ex)
  102. {
  103. throw new Exception("获取CPU ID失败: " + ex.Message);
  104. }
  105. return string.Empty;
  106. }
  107. private List<string> GetMACAddresses()
  108. {
  109. List<string> macAddresses = new List<string>();
  110. try
  111. {
  112. NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
  113. foreach (NetworkInterface adapter in nics)
  114. {
  115. // 只获取物理网卡的MAC地址
  116. if (adapter.NetworkInterfaceType == NetworkInterfaceType.Ethernet ||
  117. adapter.NetworkInterfaceType == NetworkInterfaceType.Wireless80211)
  118. {
  119. string mac = adapter.GetPhysicalAddress().ToString();
  120. if (!string.IsNullOrEmpty(mac))
  121. {
  122. macAddresses.Add(mac);
  123. }
  124. }
  125. }
  126. }
  127. catch (Exception ex)
  128. {
  129. throw new Exception("获取MAC地址失败: " + ex.Message);
  130. }
  131. return macAddresses;
  132. }
  133. /// <summary>
  134. /// 获取日期字段
  135. /// </summary>
  136. /// <param name="strErrorMsg"></param>
  137. /// <returns></returns>
  138. private string GetDateFieldOperation(ref string strErrorMsg)
  139. {
  140. string strDateColumn="";
  141. var query = syncInstrumentItem.LstSyncPramas.Where(s => s.IfDateField == true).ToList<SyncParamasInfo>();
  142. if (query.Count != 1)
  143. {
  144. strErrorMsg = "创建CNAS数据行失败,未找到日期字段。";
  145. }
  146. else
  147. {
  148. strDateColumn = query[0].TargetField;
  149. }
  150. return strDateColumn;
  151. }
  152. /// <summary>
  153. /// 普通值(非固定值)插入操作
  154. /// </summary>
  155. /// <param name="dtReadySource"></param>
  156. /// <param name="dtTarget"></param>
  157. /// <param name="drSource"></param>
  158. /// <param name="drNewTarget"></param>
  159. /// <param name="strDateField"></param>
  160. /// <param name="strErrorMsg"></param>
  161. private void NormalParamsValueInsertOperation(DataTable dtReadySource, DataTable dtTarget, DataRow drSource, DataRow drNewTarget,string strDateField,ref string strErrorMsg)
  162. {
  163. foreach (var item in syncInstrumentItem.LstSyncPramas)
  164. {
  165. var strSourceField = item.SourceField;
  166. var strTargetField = item.TargetField;
  167. //当列名存在于数据表中时才能继续
  168. if (dtReadySource.Columns.Contains(strSourceField) && dtTarget.Columns.Contains(strTargetField))
  169. {
  170. strErrorMsg = TestConvertValueToTarget(drNewTarget, drSource, strTargetField, strSourceField, strDateField);
  171. if (strErrorMsg != "")
  172. {
  173. strErrorMsg = string.Format("发生数据转换错误,请重新配置映射字段或修改字段值。错误信息如下:列【{0}】,值【{1}】,详情【{2}】", strSourceField, drSource[strSourceField].ToString(), strErrorMsg);
  174. break;
  175. }
  176. }
  177. }
  178. }
  179. /// <summary>
  180. /// 固定值插入数据操作
  181. /// </summary>
  182. /// <param name="dtReadySource"></param>
  183. /// <param name="dtTarget"></param>
  184. /// <param name="drSource"></param>
  185. /// <param name="drNewTarget"></param>
  186. public void FixConditonParamsInsertOperation(DataTable dtReadySource,DataTable dtTarget,DataRow drSource,DataRow drNewTarget)
  187. {
  188. try
  189. {
  190. foreach (var item in syncInstrumentItem.lstFixedValue)
  191. {
  192. if (dtTarget.Columns.Contains(item.ColumnName))
  193. {
  194. switch (item.Condition)
  195. {
  196. case MapCondition.Equal:
  197. drNewTarget[item.ColumnName] = item.Value;
  198. break;
  199. case MapCondition.Sub:
  200. ChangeSubConditionValue(item, dtReadySource, drSource, drNewTarget);
  201. break;
  202. case MapCondition.IFThen:
  203. ChangeIFThenConditionValue(item, dtReadySource, drSource, drNewTarget);
  204. break;
  205. case MapCondition.SubString:
  206. ChangeSubStringConditonValue(item, drNewTarget);
  207. break;
  208. case MapCondition.SubstringStartEnd:
  209. ChangeStartEndSubStringConditonValue(item, drNewTarget);
  210. break;
  211. case MapCondition.Divided:
  212. double db1, db2;
  213. if (double.TryParse(drNewTarget[item.ColumnName].ToString(), out db1))
  214. {
  215. if (double.TryParse(item.Value.ToString(), out db2))
  216. drNewTarget[item.ColumnName] = db1 / db2;
  217. }
  218. break;
  219. case MapCondition.Multiplied:
  220. double db3, db4;
  221. if (double.TryParse(drNewTarget[item.ColumnName].ToString(), out db3))
  222. {
  223. if (double.TryParse(item.Value.ToString(), out db4))
  224. drNewTarget[item.ColumnName] = db3 * db4;
  225. }
  226. break;
  227. case MapCondition.DecimalDigits:
  228. double db5;
  229. int count;
  230. if (double.TryParse(drNewTarget[item.ColumnName].ToString(), out db5))
  231. {
  232. if (int.TryParse(item.Value.ToString(), out count))
  233. drNewTarget[item.ColumnName] = Math.Round(db5, count);
  234. }
  235. break;
  236. case MapCondition.AddSubtract:
  237. ChangeAddSubtractConditonValue(syncInstrumentItem.lstFixedValue, item, dtReadySource, drSource, drNewTarget);
  238. break;
  239. }
  240. }
  241. }
  242. }
  243. catch (Exception ex)
  244. {
  245. AppLog.Error(ex.Message);
  246. }
  247. }
  248. private void ChangeStartEndSubStringConditonValue(CnasConditionMapValue item, DataRow drNewTarget)
  249. {
  250. try
  251. {
  252. if (item.Value != null && item.Value.ToString() != "")
  253. {
  254. string[] strValues = item.Value.ToString().Split(new string[] { "{", ",", "}" }, StringSplitOptions.RemoveEmptyEntries);
  255. if (strValues.Length == 2)
  256. {
  257. string[] strConfigValues = strValues[0].Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries);
  258. if (strValues[1] == "S")
  259. {
  260. //Regex reg = new Regex($"^[{strValues[0]}]");
  261. //if (reg.IsMatch(drNewTarget[item.ColumnName].ToString()))
  262. // drNewTarget[item.ColumnName] = drNewTarget[item.ColumnName].ToString().(0, drNewTarget[item.ColumnName].ToString().Length - 1);
  263. foreach (string strConfigValue in strConfigValues)
  264. {
  265. if (drNewTarget[item.ColumnName].ToString().StartsWith(strConfigValue))
  266. {
  267. drNewTarget[item.ColumnName] = drNewTarget[item.ColumnName].ToString().Substring(strConfigValue.Length, drNewTarget[item.ColumnName].ToString().Length - strConfigValue.Length);
  268. break;
  269. }
  270. }
  271. }
  272. else if (strValues[1] == "E")
  273. {
  274. //Regex reg = new Regex($"[{strValues[0]}]$");
  275. //if (reg.IsMatch(drNewTarget[item.ColumnName].ToString()))
  276. // drNewTarget[item.ColumnName] = drNewTarget[item.ColumnName].ToString().Substring(0, drNewTarget[item.ColumnName].ToString().Length-1);
  277. foreach (string strConfigValue in strConfigValues)
  278. {
  279. if (drNewTarget[item.ColumnName].ToString().EndsWith(strConfigValue))
  280. {
  281. drNewTarget[item.ColumnName] = drNewTarget[item.ColumnName].ToString().Substring(0, drNewTarget[item.ColumnName].ToString().Length - strConfigValue.Length);
  282. break;
  283. }
  284. }
  285. }
  286. }
  287. }
  288. }
  289. catch (Exception ex)
  290. {
  291. AppLog.Error(ex.Message);
  292. }
  293. }
  294. /// <summary>
  295. /// 处理SUB类型固定值
  296. /// </summary>
  297. /// <param name="item"></param>
  298. /// <param name="dtReadySource"></param>
  299. /// <param name="drSource"></param>
  300. /// <param name="drNewTarget"></param>
  301. private void ChangeSubConditionValue(CnasConditionMapValue item, DataTable dtReadySource, DataRow drSource, DataRow drNewTarget)
  302. {
  303. try
  304. {
  305. //解析Value值,如果不能解析,直接插入Value值
  306. if (item.Value != null && item.Value.ToString() != "")
  307. {
  308. string strInputValue = "";
  309. string[] strValues = item.Value.ToString().Split(new string[] { "+" }, StringSplitOptions.RemoveEmptyEntries);
  310. if (strValues.Length >= 1 && strValues.Length <= 3)
  311. {
  312. switch (strValues.Length)
  313. {
  314. case 1:
  315. string strColumnName1 = strValues[0].Split(new string[] { "{", "}" }, StringSplitOptions.RemoveEmptyEntries)[0];
  316. if (dtReadySource.Columns.Contains(strColumnName1))
  317. strInputValue = drSource[strColumnName1].ToString();
  318. else
  319. strInputValue = strValues[0];
  320. break;
  321. case 2:
  322. strColumnName1 = strValues[0].Split(new string[] { "{", "}" }, StringSplitOptions.RemoveEmptyEntries)[0];
  323. if (dtReadySource.Columns.Contains(strColumnName1))
  324. strInputValue = drSource[strColumnName1].ToString();
  325. else
  326. strInputValue = strValues[0];
  327. string strColumnName2 = strValues[1].Split(new string[] { "{", "}" }, StringSplitOptions.RemoveEmptyEntries)[0];
  328. if (dtReadySource.Columns.Contains(strColumnName2))
  329. strInputValue += drSource[strColumnName2].ToString();
  330. else
  331. strInputValue += strValues[1];
  332. break;
  333. case 3:
  334. strColumnName1 = strValues[0].Split(new string[] { "{", "}" }, StringSplitOptions.RemoveEmptyEntries)[0];
  335. if (dtReadySource.Columns.Contains(strColumnName1))
  336. strInputValue = drSource[strColumnName1].ToString();
  337. else
  338. strInputValue = strValues[0];
  339. strColumnName2 = strValues[1].Split(new string[] { "{", "}" }, StringSplitOptions.RemoveEmptyEntries)[0];
  340. if (dtReadySource.Columns.Contains(strColumnName2))
  341. strInputValue += drSource[strColumnName2].ToString();
  342. else
  343. strInputValue += strValues[1];
  344. string strColumnName3 = strValues[2].Split(new string[] { "{", "}" }, StringSplitOptions.RemoveEmptyEntries)[0];
  345. if (dtReadySource.Columns.Contains(strColumnName3))
  346. strInputValue += drSource[strColumnName3].ToString();
  347. else
  348. strInputValue += strValues[2];
  349. break;
  350. }
  351. }
  352. else
  353. {
  354. strInputValue = item.Value.ToString();
  355. }
  356. drNewTarget[item.ColumnName] = strInputValue;
  357. }
  358. }
  359. catch (Exception ex)
  360. {
  361. AppLog.Error(ex.Message);
  362. }
  363. }
  364. private bool SourceDataFilterOperation(DataRow dr)
  365. {
  366. //如果过滤器为空或没有任何条件,我们认为用户允许所有数据通过过滤审核
  367. if (syncInstrumentItem.SourceFilter == null) return true;
  368. if (syncInstrumentItem.SourceFilter.lstFilterConditions == null) return true;
  369. if (syncInstrumentItem.SourceFilter.lstFilterConditions.Count == 0) return true;
  370. bool bReturn = false;
  371. try
  372. {
  373. List<bool> lstMatch = new List<bool>();
  374. foreach (FilterCondition item in syncInstrumentItem.SourceFilter.lstFilterConditions)
  375. {
  376. bool bIsMatch = false;
  377. string strConditionValue = item.ConditionValue;
  378. if (strConditionValue == null) continue;
  379. if (strConditionValue.StartsWith("RegEx")) //此时使用正则表达式匹配
  380. {
  381. string[] strRegExs = strConditionValue.Split(new string[] { "RegEx:" }, StringSplitOptions.RemoveEmptyEntries);
  382. if (strRegExs.Length != 1) continue;
  383. bIsMatch = Regex.IsMatch(dr[item.ColumnName].ToString(), strRegExs[0]);
  384. }
  385. else
  386. {
  387. double result;
  388. double conditionresult;
  389. switch (item.Algorithm)
  390. {
  391. case "=":
  392. bIsMatch = dr[item.ColumnName].ToString() == item.ConditionValue ? true : false;
  393. break;
  394. case "<>":
  395. bIsMatch = dr[item.ColumnName].ToString() == item.ConditionValue ? false : true;
  396. break;
  397. case "like":
  398. bIsMatch = dr[item.ColumnName].ToString().Contains(item.ConditionValue) ? true : false;
  399. break;
  400. case "not like":
  401. bIsMatch = dr[item.ColumnName].ToString().Contains(item.ConditionValue) ? false : true;
  402. break;
  403. case ">":
  404. if (dr[item.ColumnName] != null)
  405. if (double.TryParse(dr[item.ColumnName].ToString(), out result) && double.TryParse(item.ConditionValue, out conditionresult))
  406. bIsMatch = result > conditionresult ? true : false;
  407. break;
  408. case "<":
  409. if (dr[item.ColumnName] != null)
  410. if (double.TryParse(dr[item.ColumnName].ToString(), out result) && double.TryParse(item.ConditionValue, out conditionresult))
  411. bIsMatch = result < conditionresult ? true : false;
  412. break;
  413. case ">=":
  414. if (dr[item.ColumnName] != null)
  415. if (double.TryParse(dr[item.ColumnName].ToString(), out result) && double.TryParse(item.ConditionValue, out conditionresult))
  416. bIsMatch = result >= conditionresult ? true : false;
  417. break;
  418. case "<=":
  419. if (dr[item.ColumnName] != null)
  420. if (double.TryParse(dr[item.ColumnName].ToString(), out result) && double.TryParse(item.ConditionValue, out conditionresult))
  421. bIsMatch = result <= conditionresult ? true : false;
  422. break;
  423. }
  424. }
  425. lstMatch.Add(bIsMatch);
  426. }
  427. if (syncInstrumentItem.SourceFilter.FilterConditionLinkType == "and")
  428. {
  429. //只要有一个为否,则返回否
  430. if (lstMatch.Where(x => x.Equals(false)).Count() > 0)
  431. bReturn = false;
  432. else
  433. bReturn = true;
  434. }
  435. else
  436. {
  437. //只要有一个为是,则返回是
  438. if (lstMatch.Where(x => x.Equals(true)).Count() > 0)
  439. bReturn = true;
  440. else
  441. bReturn = false;
  442. }
  443. }
  444. catch (Exception ex)
  445. {
  446. AppLog.Error(ex.Message);
  447. }
  448. return bReturn;
  449. }
  450. /// <summary>
  451. /// 处理IFThen类型固定值
  452. /// </summary>
  453. /// <param name="item"></param>
  454. /// <param name="dtReadySource"></param>
  455. /// <param name="drSource"></param>
  456. /// <param name="drNewTarget"></param>
  457. private void ChangeIFThenConditionValue(CnasConditionMapValue item, DataTable dtReadySource, DataRow drSource, DataRow drNewTarget)
  458. {
  459. try
  460. {
  461. if (item.Value != null && item.Value.ToString() != "")
  462. {
  463. List<IFThenConditionParams> lstParams = GlobalCommonOperation.AnanlysisIFThenString(item.Value.ToString());
  464. if (lstParams.Count > 0)
  465. {
  466. foreach (var conditionparams in lstParams)
  467. {
  468. if (!dtReadySource.Columns.Contains(conditionparams.ConditionColumnName)) continue;
  469. if (drSource[conditionparams.ConditionColumnName].ToString() == conditionparams.ConditionColumnValue)
  470. drNewTarget[item.ColumnName] = conditionparams.ColumnValue;
  471. }
  472. }
  473. }
  474. }
  475. catch (Exception ex)
  476. {
  477. AppLog.Error(ex.Message);
  478. }
  479. }
  480. /// <summary>
  481. /// 处理SubString类型固定值
  482. /// </summary>
  483. /// <param name="item"></param>
  484. /// <param name="dtReadySource"></param>
  485. /// <param name="drSource"></param>
  486. /// <param name="drNewTarget"></param>
  487. private void ChangeSubStringConditonValue(CnasConditionMapValue item, DataRow drNewTarget)
  488. {
  489. try
  490. {
  491. if (item.Value != null && item.Value.ToString() != "")
  492. {
  493. string[] strValues = item.Value.ToString().Split(new string[] { "{", ",", "}" }, StringSplitOptions.RemoveEmptyEntries);
  494. if (strValues.Length == 2)
  495. {
  496. string[] strInputValues = drNewTarget[item.ColumnName].ToString().Split(new string[] { strValues[0] }, StringSplitOptions.RemoveEmptyEntries);
  497. if (strInputValues.Length == 1)
  498. {
  499. drNewTarget[item.ColumnName] = strInputValues[0];
  500. }
  501. if (strInputValues.Length == 2) //只处理分割后有两部分的
  502. {
  503. if (strValues[1] == "L")
  504. {
  505. drNewTarget[item.ColumnName] = strInputValues[0];
  506. }
  507. else if (strValues[1] == "R")
  508. {
  509. drNewTarget[item.ColumnName] = strInputValues[1];
  510. }
  511. }
  512. }
  513. }
  514. }
  515. catch (Exception ex)
  516. {
  517. AppLog.Error(ex.Message);
  518. }
  519. }
  520. private void ChangeAddSubtractConditonValue(List<CnasConditionMapValue> lstConditionMaps, CnasConditionMapValue item, DataTable dtReadySource, DataRow drSource, DataRow drNewTarget)
  521. {
  522. try
  523. {
  524. if (item.Value != null && item.Value.ToString() != "")
  525. {
  526. string[] strValues = item.Value.ToString().Split(new string[] { "{", "}" }, StringSplitOptions.RemoveEmptyEntries);
  527. if (strValues.Length == 3)
  528. {
  529. string strParam1 = strValues[0];
  530. string strParam2 = strValues[2];
  531. double db1, db2;
  532. string[] strParam1s = strParam1.Split(new string[] { "[", "]" }, StringSplitOptions.RemoveEmptyEntries);
  533. if (strParam1s.Length >= 1)
  534. {
  535. string[] strParam2s = strParam2.Split(new string[] { "[", "]" }, StringSplitOptions.RemoveEmptyEntries);
  536. if (strParam2s.Length >= 1)
  537. {
  538. if (dtReadySource.Columns.Contains(strParam1s[0]) && dtReadySource.Columns.Contains(strParam2s[0]))
  539. if (double.TryParse(drSource[strParam1s[0]].ToString(), out db1))
  540. {
  541. if (double.TryParse(drSource[strParam2s[0]].ToString(), out db2))
  542. {
  543. if (strParam1s.Length == 3)
  544. db1 = GetDividedMultipliedData(db1, strParam1s[1], strParam1s[2]);
  545. if (strParam2s.Length == 3)
  546. db2 = GetDividedMultipliedData(db2, strParam2s[1], strParam2s[2]);
  547. drNewTarget[item.ColumnName] = strValues[1].ToLower() == "subtract" ? db1 - db2 : db1 + db2;
  548. }
  549. }
  550. }
  551. }
  552. }
  553. }
  554. }
  555. catch (Exception ex)
  556. {
  557. AppLog.Error(ex.Message);
  558. }
  559. }
  560. /// <summary>
  561. /// 在计算数值相加和相减之前,如果计算的列已经有乘以或除以的操作,则先进行乘以或除以,再进行相加或相减
  562. /// </summary>
  563. /// <param name="lstConditionMaps"></param>
  564. /// <param name="drSource"></param>
  565. /// <param name="db1"></param>
  566. /// <param name="strColumnName"></param>
  567. /// <returns></returns>
  568. public double GetDividedMultipliedData(double db1, string strExpresstion, string strValue)
  569. {
  570. double db2;
  571. if (double.TryParse(strValue, out db2))
  572. {
  573. db1 = strExpresstion == "*" ? db1 * db2 : db1 / db2;
  574. }
  575. return db1;
  576. }
  577. /// <summary>
  578. /// 对准备插入的数据进行格式上的检查
  579. /// </summary>
  580. /// <param name="dtTarget"></param>
  581. /// <param name="strErrorMsg"></param>
  582. public void CheckInsertDataFormat(DataTable dtTarget, ref string strErrorMsg)
  583. {
  584. //检查数据合法性
  585. CnasDataCheck check = new CnasDataCheck
  586. {
  587. DtReadyInsert = dtTarget,
  588. TargetDataBase = syncInstrumentItem.SyncTargetDBInfo,
  589. StrTableName = syncInstrumentItem.LstSyncPramas[0].TargetTable
  590. };
  591. check.CheckData();
  592. if (check.LstIllegalMsg != null && check.LstIllegalMsg.Count > 0)
  593. {
  594. var item = syncInstrumentItem.LstSyncPramas.Where(s => s.TargetField == check.LstIllegalMsg[0].ColumnName).ToList<SyncParamasInfo>();
  595. if (item.Count == 1)
  596. {
  597. strErrorMsg = string.Format("数据不满足上传条件,请修改后再上传。错误数据:当前列名【{0}】,列值【{1}】", item[0].SourceField, check.LstIllegalMsg[0].ColumnValue);
  598. }
  599. else
  600. {
  601. strErrorMsg = string.Format("数据不满足上传条件,请修改后再上传。错误数据:CNAS列名【{0}】,列值【{1}】", check.LstIllegalMsg[0].ColumnName, check.LstIllegalMsg[0].ColumnValue);
  602. }
  603. return;
  604. }
  605. }
  606. /// <summary>
  607. /// 尝试将值插入到目标表单的各个行中
  608. /// </summary>
  609. /// <returns></returns>
  610. private string TestConvertValueToTarget(DataRow drTarget, DataRow drSource, string strTargetColumn, string strSourceColumn, string strDateColumn)
  611. {
  612. string strErrorMsg = "";
  613. try
  614. {
  615. if (strTargetColumn.ToLower() != strDateColumn.ToLower())
  616. {
  617. string strTargetColumnType = drTarget.Table.Columns[strTargetColumn].DataType.ToString();
  618. switch (strTargetColumnType)
  619. {
  620. case "System.Decimal":
  621. if (drSource[strSourceColumn] == null || (drSource[strSourceColumn] != null && drSource[strSourceColumn].ToString() == ""))
  622. drTarget[strTargetColumn] = 0;
  623. else
  624. drTarget[strTargetColumn] = Convert.ToDouble(drSource[strSourceColumn]);
  625. break;
  626. default:
  627. drTarget[strTargetColumn] = drSource[strSourceColumn];
  628. break;
  629. }
  630. }
  631. else //日期字段需要单独处理
  632. {
  633. DateTime dt = DateTime.Now;
  634. if (DateTime.TryParse(drSource[strSourceColumn].ToString(), out dt))
  635. {
  636. drTarget[strTargetColumn] = dt.ToString("yyyy-MM-dd HH:mm:ss");
  637. }
  638. else
  639. {
  640. drTarget[strTargetColumn] = drSource[strSourceColumn];
  641. }
  642. }
  643. }
  644. catch (Exception ex)
  645. {
  646. strErrorMsg = ex.Message;
  647. }
  648. return strErrorMsg;
  649. }
  650. }
  651. }