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

700 行
32KB

  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. string[] slist = item.Value.ToString().Split(',');
  216. if (slist.Length > 1)
  217. {
  218. drNewTarget[item.ColumnName] = Math.Round(db1 / Convert.ToDouble(slist[0].ToString()), Convert.ToInt32(slist[1]));
  219. //if (double.TryParse(item.Value.ToString(), out db2))
  220. // = db1 / db2;
  221. }
  222. }
  223. break;
  224. case MapCondition.Multiplied:
  225. double db3, db4;
  226. if (double.TryParse(drNewTarget[item.ColumnName].ToString(), out db3))
  227. {
  228. string[] slist = item.Value.ToString().Split(',');
  229. if (slist.Length > 1)
  230. { drNewTarget[item.ColumnName] = Math.Round(db3 * Convert.ToDouble(slist[0].ToString()), Convert.ToInt32(slist[1])); }
  231. }
  232. break;
  233. case MapCondition.DecimalDigits:
  234. double db5;
  235. int count;
  236. if (double.TryParse(drNewTarget[item.ColumnName].ToString(), out db5))
  237. {
  238. if (int.TryParse(item.Value.ToString(), out count))
  239. drNewTarget[item.ColumnName] = Math.Round(db5, count);
  240. }
  241. break;
  242. case MapCondition.AddSubtract:
  243. ChangeAddSubtractConditonValue(syncInstrumentItem.lstFixedValue, item, dtReadySource, drSource, drNewTarget);
  244. break;
  245. }
  246. }
  247. }
  248. }
  249. catch (Exception ex)
  250. {
  251. AppLog.Error(ex.Message);
  252. }
  253. }
  254. private void ChangeStartEndSubStringConditonValue(CnasConditionMapValue item, DataRow drNewTarget)
  255. {
  256. try
  257. {
  258. if (item.Value != null && item.Value.ToString() != "")
  259. {
  260. string[] strValues = item.Value.ToString().Split(new string[] { "{", ",", "}" }, StringSplitOptions.RemoveEmptyEntries);
  261. if (strValues.Length == 2)
  262. {
  263. string[] strConfigValues = strValues[0].Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries);
  264. if (strValues[1] == "S")
  265. {
  266. //Regex reg = new Regex($"^[{strValues[0]}]");
  267. //if (reg.IsMatch(drNewTarget[item.ColumnName].ToString()))
  268. // drNewTarget[item.ColumnName] = drNewTarget[item.ColumnName].ToString().(0, drNewTarget[item.ColumnName].ToString().Length - 1);
  269. foreach (string strConfigValue in strConfigValues)
  270. {
  271. if (drNewTarget[item.ColumnName].ToString().StartsWith(strConfigValue))
  272. {
  273. drNewTarget[item.ColumnName] = drNewTarget[item.ColumnName].ToString().Substring(strConfigValue.Length, drNewTarget[item.ColumnName].ToString().Length - strConfigValue.Length);
  274. break;
  275. }
  276. }
  277. }
  278. else if (strValues[1] == "E")
  279. {
  280. //Regex reg = new Regex($"[{strValues[0]}]$");
  281. //if (reg.IsMatch(drNewTarget[item.ColumnName].ToString()))
  282. // drNewTarget[item.ColumnName] = drNewTarget[item.ColumnName].ToString().Substring(0, drNewTarget[item.ColumnName].ToString().Length-1);
  283. foreach (string strConfigValue in strConfigValues)
  284. {
  285. if (drNewTarget[item.ColumnName].ToString().EndsWith(strConfigValue))
  286. {
  287. drNewTarget[item.ColumnName] = drNewTarget[item.ColumnName].ToString().Substring(0, drNewTarget[item.ColumnName].ToString().Length - strConfigValue.Length);
  288. break;
  289. }
  290. }
  291. }
  292. }
  293. }
  294. }
  295. catch (Exception ex)
  296. {
  297. AppLog.Error(ex.Message);
  298. }
  299. }
  300. /// <summary>
  301. /// 处理SUB类型固定值
  302. /// </summary>
  303. /// <param name="item"></param>
  304. /// <param name="dtReadySource"></param>
  305. /// <param name="drSource"></param>
  306. /// <param name="drNewTarget"></param>
  307. private void ChangeSubConditionValue(CnasConditionMapValue item, DataTable dtReadySource, DataRow drSource, DataRow drNewTarget)
  308. {
  309. try
  310. {
  311. //解析Value值,如果不能解析,直接插入Value值
  312. if (item.Value != null && item.Value.ToString() != "")
  313. {
  314. string strInputValue = "";
  315. string[] strValues = item.Value.ToString().Split(new string[] { "+" }, StringSplitOptions.RemoveEmptyEntries);
  316. if (strValues.Length >= 1 && strValues.Length <= 3)
  317. {
  318. switch (strValues.Length)
  319. {
  320. case 1:
  321. string strColumnName1 = strValues[0].Split(new string[] { "{", "}" }, StringSplitOptions.RemoveEmptyEntries)[0];
  322. if (dtReadySource.Columns.Contains(strColumnName1))
  323. strInputValue = drSource[strColumnName1].ToString();
  324. else
  325. strInputValue = strValues[0];
  326. break;
  327. case 2:
  328. strColumnName1 = strValues[0].Split(new string[] { "{", "}" }, StringSplitOptions.RemoveEmptyEntries)[0];
  329. if (dtReadySource.Columns.Contains(strColumnName1))
  330. strInputValue = drSource[strColumnName1].ToString();
  331. else
  332. strInputValue = strValues[0];
  333. string strColumnName2 = strValues[1].Split(new string[] { "{", "}" }, StringSplitOptions.RemoveEmptyEntries)[0];
  334. if (dtReadySource.Columns.Contains(strColumnName2))
  335. strInputValue += drSource[strColumnName2].ToString();
  336. else
  337. strInputValue += strValues[1];
  338. break;
  339. case 3:
  340. strColumnName1 = strValues[0].Split(new string[] { "{", "}" }, StringSplitOptions.RemoveEmptyEntries)[0];
  341. if (dtReadySource.Columns.Contains(strColumnName1))
  342. strInputValue = drSource[strColumnName1].ToString();
  343. else
  344. strInputValue = strValues[0];
  345. strColumnName2 = strValues[1].Split(new string[] { "{", "}" }, StringSplitOptions.RemoveEmptyEntries)[0];
  346. if (dtReadySource.Columns.Contains(strColumnName2))
  347. strInputValue += drSource[strColumnName2].ToString();
  348. else
  349. strInputValue += strValues[1];
  350. string strColumnName3 = strValues[2].Split(new string[] { "{", "}" }, StringSplitOptions.RemoveEmptyEntries)[0];
  351. if (dtReadySource.Columns.Contains(strColumnName3))
  352. strInputValue += drSource[strColumnName3].ToString();
  353. else
  354. strInputValue += strValues[2];
  355. break;
  356. }
  357. }
  358. else
  359. {
  360. strInputValue = item.Value.ToString();
  361. }
  362. drNewTarget[item.ColumnName] = strInputValue;
  363. }
  364. }
  365. catch (Exception ex)
  366. {
  367. AppLog.Error(ex.Message);
  368. }
  369. }
  370. private bool SourceDataFilterOperation(DataRow dr)
  371. {
  372. //如果过滤器为空或没有任何条件,我们认为用户允许所有数据通过过滤审核
  373. if (syncInstrumentItem.SourceFilter == null) return true;
  374. if (syncInstrumentItem.SourceFilter.lstFilterConditions == null) return true;
  375. if (syncInstrumentItem.SourceFilter.lstFilterConditions.Count == 0) return true;
  376. bool bReturn = false;
  377. try
  378. {
  379. List<bool> lstMatch = new List<bool>();
  380. foreach (FilterCondition item in syncInstrumentItem.SourceFilter.lstFilterConditions)
  381. {
  382. bool bIsMatch = false;
  383. string strConditionValue = item.ConditionValue;
  384. if (strConditionValue == null) continue;
  385. if (strConditionValue.StartsWith("RegEx")) //此时使用正则表达式匹配
  386. {
  387. string[] strRegExs = strConditionValue.Split(new string[] { "RegEx:" }, StringSplitOptions.RemoveEmptyEntries);
  388. if (strRegExs.Length != 1) continue;
  389. bIsMatch = Regex.IsMatch(dr[item.ColumnName].ToString(), strRegExs[0]);
  390. }
  391. else
  392. {
  393. double result;
  394. double conditionresult;
  395. switch (item.Algorithm)
  396. {
  397. case "=":
  398. bIsMatch = dr[item.ColumnName].ToString() == item.ConditionValue ? true : false;
  399. break;
  400. case "<>":
  401. bIsMatch = dr[item.ColumnName].ToString() == item.ConditionValue ? false : true;
  402. break;
  403. case "like":
  404. bIsMatch = dr[item.ColumnName].ToString().Contains(item.ConditionValue) ? true : false;
  405. break;
  406. case "not like":
  407. bIsMatch = dr[item.ColumnName].ToString().Contains(item.ConditionValue) ? false : true;
  408. break;
  409. case ">":
  410. if (dr[item.ColumnName] != null)
  411. if (double.TryParse(dr[item.ColumnName].ToString(), out result) && double.TryParse(item.ConditionValue, out conditionresult))
  412. bIsMatch = result > conditionresult ? true : false;
  413. break;
  414. case "<":
  415. if (dr[item.ColumnName] != null)
  416. if (double.TryParse(dr[item.ColumnName].ToString(), out result) && double.TryParse(item.ConditionValue, out conditionresult))
  417. bIsMatch = result < conditionresult ? true : false;
  418. break;
  419. case ">=":
  420. if (dr[item.ColumnName] != null)
  421. if (double.TryParse(dr[item.ColumnName].ToString(), out result) && double.TryParse(item.ConditionValue, out conditionresult))
  422. bIsMatch = result >= conditionresult ? true : false;
  423. break;
  424. case "<=":
  425. if (dr[item.ColumnName] != null)
  426. if (double.TryParse(dr[item.ColumnName].ToString(), out result) && double.TryParse(item.ConditionValue, out conditionresult))
  427. bIsMatch = result <= conditionresult ? true : false;
  428. break;
  429. }
  430. }
  431. lstMatch.Add(bIsMatch);
  432. }
  433. if (syncInstrumentItem.SourceFilter.FilterConditionLinkType == "and")
  434. {
  435. //只要有一个为否,则返回否
  436. if (lstMatch.Where(x => x.Equals(false)).Count() > 0)
  437. bReturn = false;
  438. else
  439. bReturn = true;
  440. }
  441. else
  442. {
  443. //只要有一个为是,则返回是
  444. if (lstMatch.Where(x => x.Equals(true)).Count() > 0)
  445. bReturn = true;
  446. else
  447. bReturn = false;
  448. }
  449. }
  450. catch (Exception ex)
  451. {
  452. AppLog.Error(ex.Message);
  453. }
  454. return bReturn;
  455. }
  456. /// <summary>
  457. /// 处理IFThen类型固定值
  458. /// </summary>
  459. /// <param name="item"></param>
  460. /// <param name="dtReadySource"></param>
  461. /// <param name="drSource"></param>
  462. /// <param name="drNewTarget"></param>
  463. private void ChangeIFThenConditionValue(CnasConditionMapValue item, DataTable dtReadySource, DataRow drSource, DataRow drNewTarget)
  464. {
  465. try
  466. {
  467. if (item.Value != null && item.Value.ToString() != "")
  468. {
  469. List<IFThenConditionParams> lstParams = GlobalCommonOperation.AnanlysisIFThenString(item.Value.ToString());
  470. if (lstParams.Count > 0)
  471. {
  472. foreach (var conditionparams in lstParams)
  473. {
  474. if (!dtReadySource.Columns.Contains(conditionparams.ConditionColumnName)) continue;
  475. if (drSource[conditionparams.ConditionColumnName].ToString() == conditionparams.ConditionColumnValue)
  476. drNewTarget[item.ColumnName] = conditionparams.ColumnValue;
  477. }
  478. }
  479. }
  480. }
  481. catch (Exception ex)
  482. {
  483. AppLog.Error(ex.Message);
  484. }
  485. }
  486. /// <summary>
  487. /// 处理SubString类型固定值
  488. /// </summary>
  489. /// <param name="item"></param>
  490. /// <param name="dtReadySource"></param>
  491. /// <param name="drSource"></param>
  492. /// <param name="drNewTarget"></param>
  493. private void ChangeSubStringConditonValue(CnasConditionMapValue item, DataRow drNewTarget)
  494. {
  495. try
  496. {
  497. if (item.Value != null && item.Value.ToString() != "")
  498. {
  499. string[] strValues = item.Value.ToString().Split(new string[] { "{", ",", "}" }, StringSplitOptions.RemoveEmptyEntries);
  500. if (strValues.Length == 2)
  501. {
  502. string[] strInputValues = drNewTarget[item.ColumnName].ToString().Split(new string[] { strValues[0] }, StringSplitOptions.RemoveEmptyEntries);
  503. if (strInputValues.Length == 1)
  504. {
  505. var list = strInputValues[0].Substring(Convert.ToInt32(strValues[0]), Convert.ToInt32(strValues[1]));
  506. drNewTarget[item.ColumnName] = list;
  507. }
  508. //if (strInputValues.Length == 2) //只处理分割后有两部分的
  509. //{
  510. // if (strValues[1] == "L")
  511. // {
  512. // drNewTarget[item.ColumnName] = strInputValues[0];
  513. // }
  514. // else if (strValues[1] == "R")
  515. // {
  516. // drNewTarget[item.ColumnName] = strInputValues[1];
  517. // }
  518. //}
  519. }
  520. }
  521. }
  522. catch (Exception ex)
  523. {
  524. AppLog.Error(ex.Message);
  525. }
  526. }
  527. private void ChangeAddSubtractConditonValue(List<CnasConditionMapValue> lstConditionMaps, CnasConditionMapValue item, DataTable dtReadySource, DataRow drSource, DataRow drNewTarget)
  528. {
  529. try
  530. {
  531. if (item.Value != null && item.Value.ToString() != "")
  532. {
  533. string[] strValues = item.Value.ToString().Split(new string[] { "{", "}" }, StringSplitOptions.RemoveEmptyEntries);
  534. if (strValues.Length == 3)
  535. {
  536. string strParam1 = strValues[0];
  537. string strParam2 = strValues[2];
  538. double db1, db2;
  539. string[] strParam1s = strParam1.Split(new string[] { "[", "]" }, StringSplitOptions.RemoveEmptyEntries);
  540. if (strParam1s.Length >= 1)
  541. {
  542. string[] strParam2s = strParam2.Split(new string[] { "[", "]" }, StringSplitOptions.RemoveEmptyEntries);
  543. if (strParam2s.Length >= 1)
  544. {
  545. if (dtReadySource.Columns.Contains(strParam1s[0]) && dtReadySource.Columns.Contains(strParam2s[0]))
  546. if (double.TryParse(drSource[strParam1s[0]].ToString(), out db1))
  547. {
  548. if (double.TryParse(drSource[strParam2s[0]].ToString(), out db2))
  549. {
  550. if (strParam1s.Length == 3)
  551. db1 = GetDividedMultipliedData(db1, strParam1s[1], strParam1s[2]);
  552. if (strParam2s.Length == 3)
  553. db2 = GetDividedMultipliedData(db2, strParam2s[1], strParam2s[2]);
  554. drNewTarget[item.ColumnName] = strValues[1].ToLower() == "subtract" ? db1 - db2 : db1 + db2;
  555. }
  556. }
  557. }
  558. }
  559. }
  560. }
  561. }
  562. catch (Exception ex)
  563. {
  564. AppLog.Error(ex.Message);
  565. }
  566. }
  567. /// <summary>
  568. /// 在计算数值相加和相减之前,如果计算的列已经有乘以或除以的操作,则先进行乘以或除以,再进行相加或相减
  569. /// </summary>
  570. /// <param name="lstConditionMaps"></param>
  571. /// <param name="drSource"></param>
  572. /// <param name="db1"></param>
  573. /// <param name="strColumnName"></param>
  574. /// <returns></returns>
  575. public double GetDividedMultipliedData(double db1, string strExpresstion, string strValue)
  576. {
  577. double db2;
  578. if (double.TryParse(strValue, out db2))
  579. {
  580. db1 = strExpresstion == "*" ? db1 * db2 : db1 / db2;
  581. }
  582. return db1;
  583. }
  584. /// <summary>
  585. /// 对准备插入的数据进行格式上的检查
  586. /// </summary>
  587. /// <param name="dtTarget"></param>
  588. /// <param name="strErrorMsg"></param>
  589. public void CheckInsertDataFormat(DataTable dtTarget, ref string strErrorMsg)
  590. {
  591. //检查数据合法性
  592. CnasDataCheck check = new CnasDataCheck
  593. {
  594. DtReadyInsert = dtTarget,
  595. TargetDataBase = syncInstrumentItem.SyncTargetDBInfo,
  596. StrTableName = syncInstrumentItem.LstSyncPramas[0].TargetTable
  597. };
  598. check.CheckData();
  599. if (check.LstIllegalMsg != null && check.LstIllegalMsg.Count > 0)
  600. {
  601. var item = syncInstrumentItem.LstSyncPramas.Where(s => s.TargetField == check.LstIllegalMsg[0].ColumnName).ToList<SyncParamasInfo>();
  602. if (item.Count == 1)
  603. {
  604. strErrorMsg = string.Format("数据不满足上传条件,请修改后再上传。错误数据:当前列名【{0}】,列值【{1}】", item[0].SourceField, check.LstIllegalMsg[0].ColumnValue);
  605. }
  606. else
  607. {
  608. strErrorMsg = string.Format("数据不满足上传条件,请修改后再上传。错误数据:CNAS列名【{0}】,列值【{1}】", check.LstIllegalMsg[0].ColumnName, check.LstIllegalMsg[0].ColumnValue);
  609. }
  610. return;
  611. }
  612. }
  613. /// <summary>
  614. /// 尝试将值插入到目标表单的各个行中
  615. /// </summary>
  616. /// <returns></returns>
  617. private string TestConvertValueToTarget(DataRow drTarget, DataRow drSource, string strTargetColumn, string strSourceColumn, string strDateColumn)
  618. {
  619. string strErrorMsg = "";
  620. try
  621. {
  622. if (strTargetColumn.ToLower() != strDateColumn.ToLower())
  623. {
  624. string strTargetColumnType = drTarget.Table.Columns[strTargetColumn].DataType.ToString();
  625. switch (strTargetColumnType)
  626. {
  627. case "System.Decimal":
  628. if (drSource[strSourceColumn] == null || (drSource[strSourceColumn] != null && drSource[strSourceColumn].ToString() == ""))
  629. drTarget[strTargetColumn] = 0;
  630. else
  631. drTarget[strTargetColumn] = Convert.ToDouble(drSource[strSourceColumn]);
  632. break;
  633. default:
  634. drTarget[strTargetColumn] = drSource[strSourceColumn];
  635. break;
  636. }
  637. }
  638. else //日期字段需要单独处理
  639. {
  640. DateTime dt = DateTime.Now;
  641. if (DateTime.TryParse(drSource[strSourceColumn].ToString(), out dt))
  642. {
  643. drTarget[strTargetColumn] = dt.ToString("yyyy-MM-dd HH:mm:ss");
  644. }
  645. else
  646. {
  647. drTarget[strTargetColumn] = drSource[strSourceColumn];
  648. }
  649. }
  650. }
  651. catch (Exception ex)
  652. {
  653. strErrorMsg = ex.Message;
  654. }
  655. return strErrorMsg;
  656. }
  657. }
  658. }