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

726 行
33KB

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