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

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